Re: Building Postgresql under Windows question - Mailing list pgsql-hackers

From Dann Corbit
Subject Re: Building Postgresql under Windows question
Date
Msg-id D425483C2C5C9F49B5B7A41F8944154702962198@postal.corporate.connx.com
Whole thread Raw
In response to Re: Building Postgresql under Windows question  ("Dann Corbit" <DCorbit@connx.com>)
Responses Re: Building Postgresql under Windows question  ("Dann Corbit" <DCorbit@connx.com>)
List 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@postgresql.org [mailto:pgsql-hackers-
> owner@postgresql.org] On Behalf Of Dann Corbit
> Sent: Tuesday, April 28, 2009 12:49 PM
> To: Andrew Dunstan
> Cc: pgsql-hackers@postgresql.org
> Subject: Re: [HACKERS] Building Postgresql under Windows question
>
> > -----Original Message-----
> > From: Andrew Dunstan [mailto:andrew@dunslane.net]
> > Sent: Tuesday, April 28, 2009 12:42 PM
> > To: Dann Corbit
> > Cc: pgsql-hackers@postgresql.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@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers

Attachment

pgsql-hackers by date:

Previous
From: "Dann Corbit"
Date:
Subject: Re: Building Postgresql under Windows question
Next
From: "Dann Corbit"
Date:
Subject: Re: Building Postgresql under Windows question