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

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.
 * --------------------------------
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;
         * 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))
                         errmsg("database %u does not exist", dboid)));
            MyDatabaseId = dboid;
            /* pass the database name to the caller */
            *out_dbname = pstrdup(dbname);
            if (!FindMyDatabase(in_dbname, &MyDatabaseId, 
                         errmsg("database \"%s\" does not exist",
            /* 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: autovac-launcher-2.patch.gz
Description: Binary data

---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at


Reply via email to