Thread: Building Postgresql under Windows question

Building Postgresql under Windows question

From
"Dann Corbit"
Date:
We are still having trouble with the service controller pg_ctl.exe
vanishing after some period of time.

Hence I am doing debug builds from the source tree according to the
instructions found at:
http://developer.postgresql.org/pgdocs/postgres/install-win32-full.html

Specifically, I am using this method:
It is also possible to build from inside the Visual Studio GUI. In this
case, you need to run:         perl mkvcbuild.pl

There are a few projects that will not build (only 7 out of 99).

I have not installed ossp-uuid yet, so one of the failures is expected.
On the CONTRIB projects I am not concerned at all.
However, on the internationalization failures, I want to know what the
failures mean.
Here is the output of the debug build process from the Visual Studio IDE
(includes all failures):

1>------ Build started: Project: utf8_and_euc_kr, Configuration: Debug
Win32 ------
1>Generate DEF file
1>Not re-generating UTF8_AND_EUC_KR.DEF, file already exists.
1>Linking...
1>utf8_and_euc_kr.def : error LNK2001: unresolved external symbol
euc_jp_to_utf8
1>utf8_and_euc_kr.def : error LNK2001: unresolved external symbol
pg_finfo_euc_jp_to_utf8
1>utf8_and_euc_kr.def : error LNK2001: unresolved external symbol
pg_finfo_utf8_to_euc_jp
1>utf8_and_euc_kr.def : error LNK2001: unresolved external symbol
utf8_to_euc_jp
1>Debug\utf8_and_euc_kr\utf8_and_euc_kr.lib : fatal error LNK1120: 4
unresolved externals
2>------ Build started: Project: utf8_and_euc_cn, Configuration: Debug
Win32 ------
3>------ Build started: Project: euc_kr_and_mic, Configuration: Debug
Win32 ------
1>Build log was saved at
"file://c:\dcorbit64\postgresql\postgresql-8.3.7\Debug\utf8_and_euc_kr\B
uildLog.htm"
1>utf8_and_euc_kr - 5 error(s), 0 warning(s)
2>Generate DEF file
3>Generate DEF file
3>Not re-generating EUC_KR_AND_MIC.DEF, file already exists.
2>Not re-generating UTF8_AND_EUC_CN.DEF, file already exists.
3>Linking...
2>Linking...
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
euc_jp_to_mic
2>utf8_and_euc_cn.def : error LNK2001: unresolved external symbol
koi8r_to_utf8
2>utf8_and_euc_cn.def : error LNK2001: unresolved external symbol
pg_finfo_koi8r_to_utf8
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
euc_jp_to_sjis
2>utf8_and_euc_cn.def : error LNK2001: unresolved external symbol
pg_finfo_utf8_to_koi8r
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
mic_to_euc_jp
2>utf8_and_euc_cn.def : error LNK2001: unresolved external symbol
utf8_to_koi8r
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
mic_to_sjis
2>Debug\utf8_and_euc_cn\utf8_and_euc_cn.lib : fatal error LNK1120: 4
unresolved externals
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
pg_finfo_euc_jp_to_mic
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
pg_finfo_euc_jp_to_sjis
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
pg_finfo_mic_to_euc_jp
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
pg_finfo_mic_to_sjis
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
pg_finfo_sjis_to_euc_jp
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
pg_finfo_sjis_to_mic
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
sjis_to_euc_jp
3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
sjis_to_mic
3>Debug\euc_kr_and_mic\euc_kr_and_mic.lib : fatal error LNK1120: 12
unresolved externals
2>Build log was saved at
"file://c:\dcorbit64\postgresql\postgresql-8.3.7\Debug\utf8_and_euc_cn\B
uildLog.htm"
2>utf8_and_euc_cn - 5 error(s), 0 warning(s)
4>------ Build started: Project: utf8_and_shift_jis_2004, Configuration:
Debug Win32 ------
4>Generate DEF file
3>Build log was saved at
"file://c:\dcorbit64\postgresql\postgresql-8.3.7\Debug\euc_kr_and_mic\Bu
ildLog.htm"
3>euc_kr_and_mic - 13 error(s), 0 warning(s)
4>Not re-generating UTF8_AND_SHIFT_JIS_2004.DEF, file already exists.
5>------ Build started: Project: uuid-ossp, Configuration: Debug Win32
------
5>Compiling...
4>Linking...
5>uuid-ossp.c
4>utf8_and_shift_jis_2004.def : error LNK2001: unresolved external
symbol pg_finfo_uhc_to_utf8
4>utf8_and_shift_jis_2004.def : error LNK2001: unresolved external
symbol pg_finfo_utf8_to_uhc
4>utf8_and_shift_jis_2004.def : error LNK2001: unresolved external
symbol uhc_to_utf8
4>utf8_and_shift_jis_2004.def : error LNK2001: unresolved external
symbol utf8_to_uhc
4>Debug\utf8_and_shift_jis_2004\utf8_and_shift_jis_2004.lib : fatal
error LNK1120: 4 unresolved externals
5>.\contrib\uuid-ossp\uuid-ossp.c(27) : fatal error C1083: Cannot open
include file: 'uuid.h': No such file or directory
5>Build log was saved at
"file://c:\dcorbit64\postgresql\postgresql-8.3.7\Debug\uuid-ossp\BuildLo
g.htm"
5>uuid-ossp - 1 error(s), 0 warning(s)
4>Build log was saved at
"file://c:\dcorbit64\postgresql\postgresql-8.3.7\Debug\utf8_and_shift_ji
s_2004\BuildLog.htm"
4>utf8_and_shift_jis_2004 - 5 error(s), 0 warning(s)
6>------ Build started: Project: hstore, Configuration: Debug Win32
------
6>Generate DEF file
6>Not re-generating HSTORE.DEF, file already exists.
7>------ Build started: Project: cube, Configuration: Debug Win32 ------
7>Generate DEF file
6>Linking...
6>hstore.def : error LNK2001: unresolved external symbol lo_manage
6>hstore.def : error LNK2001: unresolved external symbol
pg_finfo_lo_manage
6>Debug\hstore\hstore.lib : fatal error LNK1120: 2 unresolved externals
6>Build log was saved at
"file://c:\dcorbit64\postgresql\postgresql-8.3.7\Debug\hstore\BuildLog.h
tm"
6>hstore - 3 error(s), 0 warning(s)
7>Not re-generating CUBE.DEF, file already exists.
7>Linking...
7>cube.def : error LNK2001: unresolved external symbol chkpass_eq
7>cube.def : error LNK2001: unresolved external symbol chkpass_in
7>cube.def : error LNK2001: unresolved external symbol chkpass_ne
7>cube.def : error LNK2001: unresolved external symbol chkpass_out
7>cube.def : error LNK2001: unresolved external symbol chkpass_rout
7>cube.def : error LNK2001: unresolved external symbol
pg_finfo_chkpass_eq
7>cube.def : error LNK2001: unresolved external symbol
pg_finfo_chkpass_in
7>cube.def : error LNK2001: unresolved external symbol
pg_finfo_chkpass_ne
7>cube.def : error LNK2001: unresolved external symbol
pg_finfo_chkpass_out
7>cube.def : error LNK2001: unresolved external symbol
pg_finfo_chkpass_rout
7>Debug\cube\cube.lib : fatal error LNK1120: 10 unresolved externals
7>Build log was saved at
"file://c:\dcorbit64\postgresql\postgresql-8.3.7\Debug\cube\BuildLog.htm
"
7>cube - 11 error(s), 0 warning(s)
========== Build: 0 succeeded, 7 failed, 92 up-to-date, 0 skipped
==========



Re: Building Postgresql under Windows question

From
"Dann Corbit"
Date:
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.

> -----Original Message-----
> From: pgsql-hackers-owner@postgresql.org [mailto:pgsql-hackers-
> owner@postgresql.org] On Behalf Of Dann Corbit
> Sent: Tuesday, April 28, 2009 11:47 AM
> To: pgsql-hackers@postgresql.org
> Subject: [HACKERS] Building Postgresql under Windows question
>
> We are still having trouble with the service controller pg_ctl.exe
> vanishing after some period of time.
>
> Hence I am doing debug builds from the source tree according to the
> instructions found at:
>
http://developer.postgresql.org/pgdocs/postgres/install-win32-full.html
>
> Specifically, I am using this method:
> It is also possible to build from inside the Visual Studio GUI. In
this
> case, you need to run:
>          perl mkvcbuild.pl
>
> There are a few projects that will not build (only 7 out of 99).
>
> I have not installed ossp-uuid yet, so one of the failures is
expected.
> On the CONTRIB projects I am not concerned at all.
> However, on the internationalization failures, I want to know what the
> failures mean.
> Here is the output of the debug build process from the Visual Studio
> IDE
> (includes all failures):
>
> 1>------ Build started: Project: utf8_and_euc_kr, Configuration: Debug
> Win32 ------
> 1>Generate DEF file
> 1>Not re-generating UTF8_AND_EUC_KR.DEF, file already exists.
> 1>Linking...
> 1>utf8_and_euc_kr.def : error LNK2001: unresolved external symbol
> euc_jp_to_utf8
> 1>utf8_and_euc_kr.def : error LNK2001: unresolved external symbol
> pg_finfo_euc_jp_to_utf8
> 1>utf8_and_euc_kr.def : error LNK2001: unresolved external symbol
> pg_finfo_utf8_to_euc_jp
> 1>utf8_and_euc_kr.def : error LNK2001: unresolved external symbol
> utf8_to_euc_jp
> 1>Debug\utf8_and_euc_kr\utf8_and_euc_kr.lib : fatal error LNK1120: 4
> unresolved externals
> 2>------ Build started: Project: utf8_and_euc_cn, Configuration: Debug
> Win32 ------
> 3>------ Build started: Project: euc_kr_and_mic, Configuration: Debug
> Win32 ------
> 1>Build log was saved at
> "file://c:\dcorbit64\postgresql\postgresql-
> 8.3.7\Debug\utf8_and_euc_kr\B
> uildLog.htm"
> 1>utf8_and_euc_kr - 5 error(s), 0 warning(s)
> 2>Generate DEF file
> 3>Generate DEF file
> 3>Not re-generating EUC_KR_AND_MIC.DEF, file already exists.
> 2>Not re-generating UTF8_AND_EUC_CN.DEF, file already exists.
> 3>Linking...
> 2>Linking...
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> euc_jp_to_mic
> 2>utf8_and_euc_cn.def : error LNK2001: unresolved external symbol
> koi8r_to_utf8
> 2>utf8_and_euc_cn.def : error LNK2001: unresolved external symbol
> pg_finfo_koi8r_to_utf8
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> euc_jp_to_sjis
> 2>utf8_and_euc_cn.def : error LNK2001: unresolved external symbol
> pg_finfo_utf8_to_koi8r
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> mic_to_euc_jp
> 2>utf8_and_euc_cn.def : error LNK2001: unresolved external symbol
> utf8_to_koi8r
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> mic_to_sjis
> 2>Debug\utf8_and_euc_cn\utf8_and_euc_cn.lib : fatal error LNK1120: 4
> unresolved externals
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> pg_finfo_euc_jp_to_mic
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> pg_finfo_euc_jp_to_sjis
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> pg_finfo_mic_to_euc_jp
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> pg_finfo_mic_to_sjis
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> pg_finfo_sjis_to_euc_jp
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> pg_finfo_sjis_to_mic
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> sjis_to_euc_jp
> 3>euc_kr_and_mic.def : error LNK2001: unresolved external symbol
> sjis_to_mic
> 3>Debug\euc_kr_and_mic\euc_kr_and_mic.lib : fatal error LNK1120: 12
> unresolved externals
> 2>Build log was saved at
> "file://c:\dcorbit64\postgresql\postgresql-
> 8.3.7\Debug\utf8_and_euc_cn\B
> uildLog.htm"
> 2>utf8_and_euc_cn - 5 error(s), 0 warning(s)
> 4>------ Build started: Project: utf8_and_shift_jis_2004,
> Configuration:
> Debug Win32 ------
> 4>Generate DEF file
> 3>Build log was saved at
> "file://c:\dcorbit64\postgresql\postgresql-
> 8.3.7\Debug\euc_kr_and_mic\Bu
> ildLog.htm"
> 3>euc_kr_and_mic - 13 error(s), 0 warning(s)
> 4>Not re-generating UTF8_AND_SHIFT_JIS_2004.DEF, file already exists.
> 5>------ Build started: Project: uuid-ossp, Configuration: Debug Win32
> ------
> 5>Compiling...
> 4>Linking...
> 5>uuid-ossp.c
> 4>utf8_and_shift_jis_2004.def : error LNK2001: unresolved external
> symbol pg_finfo_uhc_to_utf8
> 4>utf8_and_shift_jis_2004.def : error LNK2001: unresolved external
> symbol pg_finfo_utf8_to_uhc
> 4>utf8_and_shift_jis_2004.def : error LNK2001: unresolved external
> symbol uhc_to_utf8
> 4>utf8_and_shift_jis_2004.def : error LNK2001: unresolved external
> symbol utf8_to_uhc
> 4>Debug\utf8_and_shift_jis_2004\utf8_and_shift_jis_2004.lib : fatal
> error LNK1120: 4 unresolved externals
> 5>.\contrib\uuid-ossp\uuid-ossp.c(27) : fatal error C1083: Cannot open
> include file: 'uuid.h': No such file or directory
> 5>Build log was saved at
> "file://c:\dcorbit64\postgresql\postgresql-8.3.7\Debug\uuid-
> ossp\BuildLo
> g.htm"
> 5>uuid-ossp - 1 error(s), 0 warning(s)
> 4>Build log was saved at
> "file://c:\dcorbit64\postgresql\postgresql-
> 8.3.7\Debug\utf8_and_shift_ji
> s_2004\BuildLog.htm"
> 4>utf8_and_shift_jis_2004 - 5 error(s), 0 warning(s)
> 6>------ Build started: Project: hstore, Configuration: Debug Win32
> ------
> 6>Generate DEF file
> 6>Not re-generating HSTORE.DEF, file already exists.
> 7>------ Build started: Project: cube, Configuration: Debug Win32
-----
> -
> 7>Generate DEF file
> 6>Linking...
> 6>hstore.def : error LNK2001: unresolved external symbol lo_manage
> 6>hstore.def : error LNK2001: unresolved external symbol
> pg_finfo_lo_manage
> 6>Debug\hstore\hstore.lib : fatal error LNK1120: 2 unresolved
externals
> 6>Build log was saved at
> "file://c:\dcorbit64\postgresql\postgresql-
> 8.3.7\Debug\hstore\BuildLog.h
> tm"
> 6>hstore - 3 error(s), 0 warning(s)
> 7>Not re-generating CUBE.DEF, file already exists.
> 7>Linking...
> 7>cube.def : error LNK2001: unresolved external symbol chkpass_eq
> 7>cube.def : error LNK2001: unresolved external symbol chkpass_in
> 7>cube.def : error LNK2001: unresolved external symbol chkpass_ne
> 7>cube.def : error LNK2001: unresolved external symbol chkpass_out
> 7>cube.def : error LNK2001: unresolved external symbol chkpass_rout
> 7>cube.def : error LNK2001: unresolved external symbol
> pg_finfo_chkpass_eq
> 7>cube.def : error LNK2001: unresolved external symbol
> pg_finfo_chkpass_in
> 7>cube.def : error LNK2001: unresolved external symbol
> pg_finfo_chkpass_ne
> 7>cube.def : error LNK2001: unresolved external symbol
> pg_finfo_chkpass_out
> 7>cube.def : error LNK2001: unresolved external symbol
> pg_finfo_chkpass_rout
> 7>Debug\cube\cube.lib : fatal error LNK1120: 10 unresolved externals
> 7>Build log was saved at
> "file://c:\dcorbit64\postgresql\postgresql-
> 8.3.7\Debug\cube\BuildLog.htm
> "
> 7>cube - 11 error(s), 0 warning(s)
> ========== Build: 0 succeeded, 7 failed, 92 up-to-date, 0 skipped
> ==========
>
>
> --
> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers


Re: Building Postgresql under Windows question

From
Andrew Dunstan
Date:

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.

cheers

andrew





Re: Building Postgresql under Windows question

From
"Dann Corbit"
Date:
> -----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 is interesting that it happens even if I run no queries at all.

This is the only reference to the service control dispatcher I can find
in pg_ctl.c:

static void
pgwin32_doRunAsService(void)
{SERVICE_TABLE_ENTRY st[] = {{register_servicename,
pgwin32_ServiceMain},{NULL, NULL}};
if (StartServiceCtrlDispatcher(st) == 0){    write_stderr(_("%s: could not start service \"%s\":
error code %d\n"), progname, register_servicename, (int)
GetLastError());    exit(1);}
}

BTW, the exit(1) calls should be exit(EXIT_FAILURE) though there will be
no difficulty on any POSIX system.



Re: Building Postgresql under Windows question

From
"Dann Corbit"
Date:
> -----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.



Re: Building Postgresql under Windows question

From
"Dann Corbit"
Date:
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

Re: Building Postgresql under Windows question

From
"Dann Corbit"
Date:
In this function:
static bool
test_postmaster_connection(bool do_checkpoint)

This code will never succeed:snprintf(connstr, sizeof(connstr),         "dbname=postgres port=%s connect_timeout=5",
portstr);
for (i = 0; i < wait_seconds; i++){    if ((conn = PQconnectdb(connstr)) != NULL &&        (PQstatus(conn) ==
CONNECTION_OK||         PQconnectionNeedsPassword(conn)))    {        PQfinish(conn);        success = true;
break;   } 


Because pg_hba.conf has this:
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
# IPv6 local connections:
host    all         all         ::1/128               trust

to allow connections from the local machine.

(A password is not needed to connect, so the code always fails).




Re: Building Postgresql under Windows question

From
Andrew Dunstan
Date:

Dann Corbit wrote:
> In this function:
> static bool
> test_postmaster_connection(bool do_checkpoint)
>
> This code will never succeed:
>     snprintf(connstr, sizeof(connstr),
>              "dbname=postgres port=%s connect_timeout=5",
> portstr);
>
>     for (i = 0; i < wait_seconds; i++)
>     {
>         if ((conn = PQconnectdb(connstr)) != NULL &&
>             (PQstatus(conn) == CONNECTION_OK ||
>              PQconnectionNeedsPassword(conn)))
>         {
>             PQfinish(conn);
>             success = true;
>             break;
>         }
>
>
> Because pg_hba.conf has this:
> # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
>
> # IPv4 local connections:
> host    all         all         127.0.0.1/32          trust
> # IPv6 local connections:
> host    all         all         ::1/128               trust
>
> to allow connections from the local machine.
>
> (A password is not needed to connect, so the code always fails).
>
>   


Why won't
PQstatus(conn) == CONNECTION_OK 

be true and thus the code will succeed without requiring a password?

cheers

andrew



Re: Building Postgresql under Windows question

From
"Dann Corbit"
Date:
> -----Original Message-----
> From: Andrew Dunstan [mailto:andrew@dunslane.net]
> Sent: Tuesday, April 28, 2009 2:27 PM
> To: Dann Corbit
> Cc: pgsql-hackers@postgresql.org
> Subject: Re: [HACKERS] Building Postgresql under Windows question
>
>
>
> Dann Corbit wrote:
> > In this function:
> > static bool
> > test_postmaster_connection(bool do_checkpoint)
> >
> > This code will never succeed:
> >     snprintf(connstr, sizeof(connstr),
> >              "dbname=postgres port=%s connect_timeout=5",
> > portstr);
> >
> >     for (i = 0; i < wait_seconds; i++)
> >     {
> >         if ((conn = PQconnectdb(connstr)) != NULL &&
> >             (PQstatus(conn) == CONNECTION_OK ||
> >              PQconnectionNeedsPassword(conn)))
> >         {
> >             PQfinish(conn);
> >             success = true;
> >             break;
> >         }
> >
> >
> > Because pg_hba.conf has this:
> > # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
> >
> > # IPv4 local connections:
> > host    all         all         127.0.0.1/32          trust
> > # IPv6 local connections:
> > host    all         all         ::1/128               trust
> >
> > to allow connections from the local machine.
> >
> > (A password is not needed to connect, so the code always fails).
> >
> >
>
>
> Why won't
>
>     PQstatus(conn) == CONNECTION_OK
>
> be true and thus the code will succeed without requiring a password?

It returns the value CONNECTION_STARTED

I have found a work-around for now.

If I set the method to password in pg_hba.conf, the service starts and
runs correctly.

It is only when the method is set to trust that we get 100% failures.



Re: Building Postgresql under Windows question

From
Andrew Dunstan
Date:

Dann Corbit wrote:
>> -----Original Message-----
>> From: Andrew Dunstan [mailto:andrew@dunslane.net]
>> Sent: Tuesday, April 28, 2009 2:27 PM
>> To: Dann Corbit
>> Cc: pgsql-hackers@postgresql.org
>> Subject: Re: [HACKERS] Building Postgresql under Windows question
>>
>>
>>
>> Dann Corbit wrote:
>>     
>>> In this function:
>>> static bool
>>> test_postmaster_connection(bool do_checkpoint)
>>>
>>> This code will never succeed:
>>>     snprintf(connstr, sizeof(connstr),
>>>              "dbname=postgres port=%s connect_timeout=5",
>>> portstr);
>>>
>>>     for (i = 0; i < wait_seconds; i++)
>>>     {
>>>         if ((conn = PQconnectdb(connstr)) != NULL &&
>>>             (PQstatus(conn) == CONNECTION_OK ||
>>>              PQconnectionNeedsPassword(conn)))
>>>         {
>>>             PQfinish(conn);
>>>             success = true;
>>>             break;
>>>         }
>>>
>>>
>>> Because pg_hba.conf has this:
>>> # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
>>>
>>> # IPv4 local connections:
>>> host    all         all         127.0.0.1/32          trust
>>> # IPv6 local connections:
>>> host    all         all         ::1/128               trust
>>>
>>> to allow connections from the local machine.
>>>
>>> (A password is not needed to connect, so the code always fails).
>>>
>>>
>>>       
>> Why won't
>>
>>     PQstatus(conn) == CONNECTION_OK
>>
>> be true and thus the code will succeed without requiring a password?
>>     
>
> It returns the value CONNECTION_STARTED
>
> I have found a work-around for now.
>
> If I set the method to password in pg_hba.conf, the service starts and
> runs correctly.
>
> It is only when the method is set to trust that we get 100% failures.
>
>
>   

Then that looks like a libpq bug :-( According to the docs:

"The status can be one of a number of values. However, only two of these 
are seen outside of an asynchronous connection procedure: CONNECTION_OK 
and CONNECTION_BAD."

cheers

andrew


Re: Building Postgresql under Windows question

From
Tom Lane
Date:
"Dann Corbit" <DCorbit@connx.com> writes:
>> From: Andrew Dunstan [mailto:andrew@dunslane.net]

>> Why won't
>> PQstatus(conn) == CONNECTION_OK
>> be true and thus the code will succeed without requiring a password?

> It returns the value CONNECTION_STARTED

It certainly shouldn't.  You're effectively asserting that PQconnectdb
is broken for everyone on every platform, which is demonstrably not the
case.  Are you fooling with modified libpq code by any chance?
        regards, tom lane