Re: Building Postgresql under Windows question

From: "Dann Corbit" <DCorbit(at)connx(dot)com>
To: "Dann Corbit" <DCorbit(at)connx(dot)com>, "Andrew Dunstan" <andrew(at)dunslane(dot)net>
Cc: <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Building Postgresql under Windows question
Date: 2009-04-28 19:54:44
Message-ID: D425483C2C5C9F49B5B7A41F8944154702962198@postal.corporate.connx.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

It's this one:

if (do_wait)
{
write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Waiting for server
startup...\n"));
if (test_postmaster_connection(true) == false)
{
write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Timed out
waiting for server startup\n"));
pgwin32_SetServiceStatus(SERVICE_STOPPED); //
<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE!
return;
}
write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Server started and
accepting connections\n"));
}

The attached bitmap shows that the servers are running, though
pg_ctl.exe has exited.

I am also able to attach and query.

> -----Original Message-----
> From: pgsql-hackers-owner(at)postgresql(dot)org [mailto:pgsql-hackers-
> owner(at)postgresql(dot)org] On Behalf Of Dann Corbit
> Sent: Tuesday, April 28, 2009 12:49 PM
> To: Andrew Dunstan
> Cc: pgsql-hackers(at)postgresql(dot)org
> Subject: Re: [HACKERS] Building Postgresql under Windows question
>
> > -----Original Message-----
> > From: Andrew Dunstan [mailto:andrew(at)dunslane(dot)net]
> > Sent: Tuesday, April 28, 2009 12:42 PM
> > To: Dann Corbit
> > Cc: pgsql-hackers(at)postgresql(dot)org
> > Subject: Re: [HACKERS] Building Postgresql under Windows question
> >
> >
> >
> > Dann Corbit wrote:
> > > Pg_ctl.exe is exiting with a success code from line 1946 of
> PG_CTL.C
> > >
> > > This is not appropriate behavior for a service unless shutdown has
> > been
> > > requested.
> > >
> >
> > pg_ctl calls *StartServiceCtrlDispatcher*(). It can only get to the
> > line
> > you mention when called as a service after that call returns. MSDN
> > states:
> >
> > "If *StartServiceCtrlDispatcher* succeeds, it connects the calling
> > thread to the service control manager and does not return until all
> > running services in the process have entered the SERVICE_STOPPED
> > state."
> >
> > So it appears that something is causing your service to enter that
> > state.
>
> It appears that SERVICE_STOPPED comes from here:
>
> static void WINAPI
> pgwin32_ServiceMain(DWORD argc, LPTSTR * argv)
> {
> PROCESS_INFORMATION pi;
> DWORD ret;
> DWORD check_point_start;
>
> /* Initialize variables */
> status.dwWin32ExitCode = S_OK;
> status.dwCheckPoint = 0;
> status.dwWaitHint = 60000;
> status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
> status.dwControlsAccepted = SERVICE_ACCEPT_STOP |
> SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
> status.dwServiceSpecificExitCode = 0;
> status.dwCurrentState = SERVICE_START_PENDING;
>
> memset(&pi, 0, sizeof(pi));
>
> read_post_opts();
>
> /* Register the control request handler */
> if ((hStatus = RegisterServiceCtrlHandler(register_servicename,
> pgwin32_ServiceHandler)) == (SERVICE_STATUS_HANDLE) 0)
> return;
>
> if ((shutdownEvent = CreateEvent(NULL, true, false, NULL)) ==
> NULL)
> return;
>
> /* Start the postmaster */
> pgwin32_SetServiceStatus(SERVICE_START_PENDING);
> if (!CreateRestrictedProcess(pgwin32_CommandLine(false), &pi,
> true))
> {
> pgwin32_SetServiceStatus(SERVICE_STOPPED);
> return;
> }
> postmasterPID = pi.dwProcessId;
> postmasterProcess = pi.hProcess;
> CloseHandle(pi.hThread);
>
> if (do_wait)
> {
> write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Waiting for
> server startup...\n"));
> if (test_postmaster_connection(true) == false)
> {
> write_eventlog(EVENTLOG_INFORMATION_TYPE,
> _("Timed out waiting for server startup\n"));
> pgwin32_SetServiceStatus(SERVICE_STOPPED);
> return;
> }
> write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Server
> started and accepting connections\n"));
> }
>
> /*
> * Save the checkpoint value as it might have been incremented
> in
> * test_postmaster_connection
> */
> check_point_start = status.dwCheckPoint;
>
> pgwin32_SetServiceStatus(SERVICE_RUNNING);
>
> /* Wait for quit... */
> ret = WaitForMultipleObjects(2, shutdownHandles, FALSE,
> INFINITE);
>
> pgwin32_SetServiceStatus(SERVICE_STOP_PENDING);
> switch (ret)
> {
> case WAIT_OBJECT_0: /* shutdown event */
> kill(postmasterPID, SIGINT);
>
> /*
> * Increment the checkpoint and try again Abort
> after 12
> * checkpoints as the postmaster has probably
> hung
> */
> while (WaitForSingleObject(postmasterProcess,
> 5000) == WAIT_TIMEOUT && status.dwCheckPoint < 12)
> status.dwCheckPoint++;
> break;
>
> case (WAIT_OBJECT_0 + 1): /* postmaster
> went down */
> break;
>
> default:
> /* shouldn't get here? */
> break;
> }
>
> CloseHandle(shutdownEvent);
> CloseHandle(postmasterProcess);
>
> pgwin32_SetServiceStatus(SERVICE_STOPPED);
> }
>
> I will set a breakpoint on every place that the status is set to
> SERVICE_STOPPED and report what I have found.
>
>
> --
> Sent via pgsql-hackers mailing list (pgsql-hackers(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers

Attachment Content-Type Size
pg-servers.jpg image/jpeg 92.5 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message vadim 2009-04-28 20:13:54
Previous Message Dann Corbit 2009-04-28 19:48:39 Re: Building Postgresql under Windows question