I wrote: > * the startup/shutdown hooks will be installed in the postmaster > process, but the patch expects them to be executed in a child process. > I think nothing will happen.
OK, I figured out what is happening there: the patch makes it work by means of this expedient: diff -cprN HEAD/src/backend/storage/lmgr/proc.c pg_stat_statements/src/backend/storage/lmgr/proc.c *** HEAD/src/backend/storage/lmgr/proc.c 2008-12-10 02:03:02.366590000 +0900 --- pg_stat_statements/src/backend/storage/lmgr/proc.c 2008-12-26 14:51:58.062500000 +0900 *************** InitAuxiliaryProcess(void) *** 381,386 **** --- 381,390 ---- if (MyProc != NULL) elog(ERROR, "you already exist"); + #ifdef EXEC_BACKEND + process_shared_preload_libraries(); + #endif + /* * We use the ProcStructLock to protect assignment and releasing of * AuxiliaryProcs entries. I find this mighty Rube Goldbergian. We have a startup hook which is declared in include/storage/ipc.h, but defined and called in bootstrap.c (whence it will actually be executed down inside the startup process). We have a shutdown hook which is also declared in include/storage/ipc.h, but defined and called in bgwriter.c (executed in the bgwriter process, of course). And to make those hooks work in the EXEC_BACKEND case, we have a kluge inserted in proc.c, miles away from where the existing process_shared_preload_libraries() calls are (in postmaster.c), and with extremely high probability of someday resulting in duplicate preload operations if the postmaster.c code gets shuffled. I don't really care for the idea of initializing the pg_stat_statements shared memory down inside the startup process. All the rest of shared memory is initialized by the postmaster process itself, and I think pg_stat_statements should probably work the same way. Normally I am against having more functionality in the postmaster than absolutely necessary, but I don't see any robustness loss in this situation: if we have the pg_stat_statements init code in the startup subprocess, and it dies, we'll abort startup anyway. So we might as well run it directly in the postmaster. I think the right place is probably at the bottom of CreateSharedMemoryAndSemaphores(). This will serve two purposes: to create the pg_stat_statements shared memory when run in the postmaster, or to re-attach to it when starting an EXEC_BACKEND child. The existing coding in the patch that will try to create or attach to the shared memory at any old random instant ought to go away --- if one of these functions is called and doesn't find the pgss shared memory pointer ready-to-go, it should error out or return quietly as appropriate. That would indicate that pg_stat_statements.so got loaded into an already-running backend, which means that the shared memory situation can't possibly be right. As for the shutdown hook, I don't think we need it at all in this design. When loaded into the postmaster process, pg_stat_statements can insert itself into the on_proc_exit or on_shmem_exit hook lists ... it doesn't need a private hook. BTW, as for the question of where to call process_shared_preload_libraries: we currently have postmaster.c doing this for itself, and when spawning a regular backend child in the EXEC_BACKEND case. We don't do it for other child process types; which is the omission that Itagaki-san tried to work around with the above diff hunk. You could argue that this is a case of premature optimization (a/k/a the root of all evil). I think the idea was that we'd not possibly need any loadable libraries installed in special child processes --- but that seems more than a little bit dubious if you think about a loadable library whose goal is to monitor system activity, as opposed to implementing some SQL-callable functionality. Moreover it fails to duplicate what will happen in the non-EXEC_BACKEND case; all child processes will inherit loadable libraries then. So I'm thinking that Itagaki-san had the right idea in wanting to make auxiliary processes load libraries, just the wrong implementation. The right way to make that happen is to rearrange the coding in SubPostmasterMain() so that process_shared_preload_libraries is done in all cases, just after the read_nondefault_variables call. Comments? regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers