Re: Autovacuum launcher - Mailing list pgsql-patches
From | Alvaro Herrera |
---|---|
Subject | Re: Autovacuum launcher |
Date | |
Msg-id | 20070215152351.GH4682@alvh.no-ip.org Whole thread Raw |
In response to | Re: Autovacuum launcher (Tom Lane <tgl@sss.pgh.pa.us>) |
List | pgsql-patches |
I've fixed all other problems according to suggestions, including adding a SignalSomeChildren(int signal, bool only_autovac) function to postmaster so that it can shut autovac workers down in case of smart shutdown. Tom Lane wrote: > Making InitPostgres's call API vary depending on > IsAutoVacuumWorkerProcess seems really ugly, and unnecessary. > Why not just test for dbname == NULL or some other convention > expressed by the arguments themselves? Hmm, yeah. Modified version below. In BootstrapMain, it surprises me that the dbname is getting computed, and seems to be a required parameter, when it doesn't seem to be used at all. That code needs a serious refactoring ... /* -------------------------------- * InitPostgres * Initialize POSTGRES. * * The database can be specified by name, using the in_dbname parameter, or by * OID, using the dboid parameter. In the latter case, the computed database * name is passed out to the caller as a palloc'ed string in out_dbname. * * In bootstrap mode no parameters are used. * * The return value indicates whether the userID is a superuser. (That * can only be tested inside a transaction, so we want to do it during * the startup transaction rather than doing a separate one in postgres.c.) * * As of PostgreSQL 8.2, we expect InitProcess() was already called, so we * already have a PGPROC struct ... but it's not filled in yet. * * Note: * Be very careful with the order of calls in the InitPostgres function. * -------------------------------- */ bool InitPostgres(const char *in_dbname, Oid dboid, const char *username, char **out_dbname) { bool bootstrap = IsBootstrapProcessingMode(); bool autovacuum = IsAutoVacuumWorkerProcess(); bool am_superuser; char *fullpath; char dbname[NAMEDATALEN]; /* * Set up the global variables holding database id and path. But note we * won't actually try to touch the database just yet. * * We take a shortcut in the bootstrap case, otherwise we have to look up * the db name in pg_database. */ if (bootstrap) { MyDatabaseId = TemplateDbOid; MyDatabaseTableSpace = DEFAULTTABLESPACE_OID; } else { /* * Find tablespace of the database we're about to open. Since we're not * yet up and running we have to use one of the hackish FindMyDatabase * variants, which look in the flat-file copy of pg_database. * * If the in_dbname param is NULL, lookup database by OID. */ if (in_dbname == NULL) { if (!FindMyDatabaseByOid(dboid, dbname, &MyDatabaseTableSpace)) ereport(FATAL, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database %u does not exist", dboid))); MyDatabaseId = dboid; /* pass the database name to the caller */ *out_dbname = pstrdup(dbname); } else { if (!FindMyDatabase(in_dbname, &MyDatabaseId, &MyDatabaseTableSpace)) ereport(FATAL, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database \"%s\" does not exist", in_dbname))); /* our database name is gotten from the caller */ strlcpy(dbname, in_dbname, NAMEDATALEN); } } -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Attachment
pgsql-patches by date: