mirror of
https://github.com/postgres/postgres.git
synced 2025-12-10 14:22:35 +03:00
vacuumdb: Move some variables to the vacuumingOptions struct.
Presently, the "echo" and "quiet" variables are carted around to various functions, which is a bit tedious. To simplify things, this commit moves them into the vacuumingOptions struct and removes the related function parameters. While at it, remove some redundant initialization code in vacuumdb's main() function. This is preparatory work for a follow-up commit that will add a --dry-run option to vacuumdb. Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Reviewed-by: Kirill Reshke <reshkekirill@gmail.com> Reviewed-by: Chao Li <li.evan.chao@gmail.com> Discussion: https://postgr.es/m/CADkLM%3DckHkX7Of5SrK7g0LokPUwJ%3Dkk8JU1GXGF5pZ1eBVr0%3DQ%40mail.gmail.com
This commit is contained in:
@@ -68,8 +68,6 @@ main(int argc, char *argv[])
|
|||||||
const char *dbname = NULL;
|
const char *dbname = NULL;
|
||||||
const char *maintenance_db = NULL;
|
const char *maintenance_db = NULL;
|
||||||
ConnParams cparams;
|
ConnParams cparams;
|
||||||
bool echo = false;
|
|
||||||
bool quiet = false;
|
|
||||||
vacuumingOptions vacopts;
|
vacuumingOptions vacopts;
|
||||||
SimpleStringList objects = {NULL, NULL};
|
SimpleStringList objects = {NULL, NULL};
|
||||||
int concurrentCons = 1;
|
int concurrentCons = 1;
|
||||||
@@ -78,11 +76,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
/* initialize options */
|
/* initialize options */
|
||||||
memset(&vacopts, 0, sizeof(vacopts));
|
memset(&vacopts, 0, sizeof(vacopts));
|
||||||
vacopts.objfilter = 0; /* no filter */
|
|
||||||
vacopts.parallel_workers = -1;
|
vacopts.parallel_workers = -1;
|
||||||
vacopts.buffer_usage_limit = NULL;
|
|
||||||
vacopts.no_index_cleanup = false;
|
|
||||||
vacopts.force_index_cleanup = false;
|
|
||||||
vacopts.do_truncate = true;
|
vacopts.do_truncate = true;
|
||||||
vacopts.process_main = true;
|
vacopts.process_main = true;
|
||||||
vacopts.process_toast = true;
|
vacopts.process_toast = true;
|
||||||
@@ -110,7 +104,7 @@ main(int argc, char *argv[])
|
|||||||
dbname = pg_strdup(optarg);
|
dbname = pg_strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
echo = true;
|
vacopts.echo = true;
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
vacopts.full = true;
|
vacopts.full = true;
|
||||||
@@ -143,7 +137,7 @@ main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
quiet = true;
|
vacopts.quiet = true;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
vacopts.objfilter |= OBJFILTER_TABLE;
|
vacopts.objfilter |= OBJFILTER_TABLE;
|
||||||
@@ -312,7 +306,7 @@ main(int argc, char *argv[])
|
|||||||
ret = vacuuming_main(&cparams, dbname, maintenance_db, &vacopts,
|
ret = vacuuming_main(&cparams, dbname, maintenance_db, &vacopts,
|
||||||
&objects, tbl_count,
|
&objects, tbl_count,
|
||||||
concurrentCons,
|
concurrentCons,
|
||||||
progname, echo, quiet);
|
progname);
|
||||||
exit(ret);
|
exit(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,21 +30,20 @@ static int vacuum_one_database(ConnParams *cparams,
|
|||||||
SimpleStringList *objects,
|
SimpleStringList *objects,
|
||||||
SimpleStringList **found_objs,
|
SimpleStringList **found_objs,
|
||||||
int concurrentCons,
|
int concurrentCons,
|
||||||
const char *progname, bool echo, bool quiet);
|
const char *progname);
|
||||||
static int vacuum_all_databases(ConnParams *cparams,
|
static int vacuum_all_databases(ConnParams *cparams,
|
||||||
vacuumingOptions *vacopts,
|
vacuumingOptions *vacopts,
|
||||||
SimpleStringList *objects,
|
SimpleStringList *objects,
|
||||||
int concurrentCons,
|
int concurrentCons,
|
||||||
const char *progname, bool echo, bool quiet);
|
const char *progname);
|
||||||
static SimpleStringList *retrieve_objects(PGconn *conn,
|
static SimpleStringList *retrieve_objects(PGconn *conn,
|
||||||
vacuumingOptions *vacopts,
|
vacuumingOptions *vacopts,
|
||||||
SimpleStringList *objects,
|
SimpleStringList *objects);
|
||||||
bool echo);
|
|
||||||
static void free_retrieved_objects(SimpleStringList *list);
|
static void free_retrieved_objects(SimpleStringList *list);
|
||||||
static void prepare_vacuum_command(PGconn *conn, PQExpBuffer sql,
|
static void prepare_vacuum_command(PGconn *conn, PQExpBuffer sql,
|
||||||
vacuumingOptions *vacopts, const char *table);
|
vacuumingOptions *vacopts, const char *table);
|
||||||
static void run_vacuum_command(PGconn *conn, const char *sql, bool echo,
|
static void run_vacuum_command(PGconn *conn, vacuumingOptions *vacopts,
|
||||||
const char *table);
|
const char *sql, const char *table);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Executes vacuum/analyze as indicated. Returns 0 if the plan is carried
|
* Executes vacuum/analyze as indicated. Returns 0 if the plan is carried
|
||||||
@@ -56,7 +55,7 @@ vacuuming_main(ConnParams *cparams, const char *dbname,
|
|||||||
const char *maintenance_db, vacuumingOptions *vacopts,
|
const char *maintenance_db, vacuumingOptions *vacopts,
|
||||||
SimpleStringList *objects,
|
SimpleStringList *objects,
|
||||||
unsigned int tbl_count, int concurrentCons,
|
unsigned int tbl_count, int concurrentCons,
|
||||||
const char *progname, bool echo, bool quiet)
|
const char *progname)
|
||||||
{
|
{
|
||||||
setup_cancel_handler(NULL);
|
setup_cancel_handler(NULL);
|
||||||
|
|
||||||
@@ -71,7 +70,7 @@ vacuuming_main(ConnParams *cparams, const char *dbname,
|
|||||||
return vacuum_all_databases(cparams, vacopts,
|
return vacuum_all_databases(cparams, vacopts,
|
||||||
objects,
|
objects,
|
||||||
concurrentCons,
|
concurrentCons,
|
||||||
progname, echo, quiet);
|
progname);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -100,7 +99,7 @@ vacuuming_main(ConnParams *cparams, const char *dbname,
|
|||||||
objects,
|
objects,
|
||||||
vacopts->missing_stats_only ? &found_objs : NULL,
|
vacopts->missing_stats_only ? &found_objs : NULL,
|
||||||
concurrentCons,
|
concurrentCons,
|
||||||
progname, echo, quiet);
|
progname);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
{
|
{
|
||||||
free_retrieved_objects(found_objs);
|
free_retrieved_objects(found_objs);
|
||||||
@@ -116,7 +115,7 @@ vacuuming_main(ConnParams *cparams, const char *dbname,
|
|||||||
ANALYZE_NO_STAGE,
|
ANALYZE_NO_STAGE,
|
||||||
objects, NULL,
|
objects, NULL,
|
||||||
concurrentCons,
|
concurrentCons,
|
||||||
progname, echo, quiet);
|
progname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +166,7 @@ vacuum_one_database(ConnParams *cparams,
|
|||||||
SimpleStringList *objects,
|
SimpleStringList *objects,
|
||||||
SimpleStringList **found_objs,
|
SimpleStringList **found_objs,
|
||||||
int concurrentCons,
|
int concurrentCons,
|
||||||
const char *progname, bool echo, bool quiet)
|
const char *progname)
|
||||||
{
|
{
|
||||||
PQExpBufferData sql;
|
PQExpBufferData sql;
|
||||||
PGconn *conn;
|
PGconn *conn;
|
||||||
@@ -192,7 +191,7 @@ vacuum_one_database(ConnParams *cparams,
|
|||||||
Assert(stage == ANALYZE_NO_STAGE ||
|
Assert(stage == ANALYZE_NO_STAGE ||
|
||||||
(stage >= 0 && stage < ANALYZE_NUM_STAGES));
|
(stage >= 0 && stage < ANALYZE_NUM_STAGES));
|
||||||
|
|
||||||
conn = connectDatabase(cparams, progname, echo, false, true);
|
conn = connectDatabase(cparams, progname, vacopts->echo, false, true);
|
||||||
|
|
||||||
if (vacopts->disable_page_skipping && PQserverVersion(conn) < 90600)
|
if (vacopts->disable_page_skipping && PQserverVersion(conn) < 90600)
|
||||||
{
|
{
|
||||||
@@ -281,7 +280,7 @@ vacuum_one_database(ConnParams *cparams,
|
|||||||
/* skip_database_stats is used automatically if server supports it */
|
/* skip_database_stats is used automatically if server supports it */
|
||||||
vacopts->skip_database_stats = (PQserverVersion(conn) >= 160000);
|
vacopts->skip_database_stats = (PQserverVersion(conn) >= 160000);
|
||||||
|
|
||||||
if (!quiet)
|
if (!vacopts->quiet)
|
||||||
{
|
{
|
||||||
if (vacopts->mode == MODE_ANALYZE_IN_STAGES)
|
if (vacopts->mode == MODE_ANALYZE_IN_STAGES)
|
||||||
printf(_("%s: processing database \"%s\": %s\n"),
|
printf(_("%s: processing database \"%s\": %s\n"),
|
||||||
@@ -302,7 +301,7 @@ vacuum_one_database(ConnParams *cparams,
|
|||||||
retobjs = *found_objs;
|
retobjs = *found_objs;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
retobjs = retrieve_objects(conn, vacopts, objects, echo);
|
retobjs = retrieve_objects(conn, vacopts, objects);
|
||||||
if (found_objs)
|
if (found_objs)
|
||||||
*found_objs = retobjs;
|
*found_objs = retobjs;
|
||||||
else
|
else
|
||||||
@@ -341,7 +340,7 @@ vacuum_one_database(ConnParams *cparams,
|
|||||||
if (vacopts->mode == MODE_ANALYZE_IN_STAGES)
|
if (vacopts->mode == MODE_ANALYZE_IN_STAGES)
|
||||||
{
|
{
|
||||||
initcmd = stage_commands[stage];
|
initcmd = stage_commands[stage];
|
||||||
executeCommand(conn, initcmd, echo);
|
executeCommand(conn, initcmd, vacopts->echo);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
initcmd = NULL;
|
initcmd = NULL;
|
||||||
@@ -351,7 +350,8 @@ vacuum_one_database(ConnParams *cparams,
|
|||||||
* for the first slot. If not in parallel mode, the first slot in the
|
* for the first slot. If not in parallel mode, the first slot in the
|
||||||
* array contains the connection.
|
* array contains the connection.
|
||||||
*/
|
*/
|
||||||
sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, initcmd);
|
sa = ParallelSlotsSetup(concurrentCons, cparams, progname,
|
||||||
|
vacopts->echo, initcmd);
|
||||||
ParallelSlotsAdoptConn(sa, conn);
|
ParallelSlotsAdoptConn(sa, conn);
|
||||||
|
|
||||||
initPQExpBuffer(&sql);
|
initPQExpBuffer(&sql);
|
||||||
@@ -383,8 +383,7 @@ vacuum_one_database(ConnParams *cparams,
|
|||||||
* through ParallelSlotsGetIdle.
|
* through ParallelSlotsGetIdle.
|
||||||
*/
|
*/
|
||||||
ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
|
ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
|
||||||
run_vacuum_command(free_slot->connection, sql.data,
|
run_vacuum_command(free_slot->connection, vacopts, sql.data, tabname);
|
||||||
echo, tabname);
|
|
||||||
|
|
||||||
cell = cell->next;
|
cell = cell->next;
|
||||||
} while (cell != NULL);
|
} while (cell != NULL);
|
||||||
@@ -408,7 +407,7 @@ vacuum_one_database(ConnParams *cparams,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
|
ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
|
||||||
run_vacuum_command(free_slot->connection, cmd, echo, NULL);
|
run_vacuum_command(free_slot->connection, vacopts, cmd, NULL);
|
||||||
|
|
||||||
if (!ParallelSlotsWaitCompletion(sa))
|
if (!ParallelSlotsWaitCompletion(sa))
|
||||||
ret = EXIT_FAILURE; /* error already reported by handler */
|
ret = EXIT_FAILURE; /* error already reported by handler */
|
||||||
@@ -436,17 +435,17 @@ vacuum_all_databases(ConnParams *cparams,
|
|||||||
vacuumingOptions *vacopts,
|
vacuumingOptions *vacopts,
|
||||||
SimpleStringList *objects,
|
SimpleStringList *objects,
|
||||||
int concurrentCons,
|
int concurrentCons,
|
||||||
const char *progname, bool echo, bool quiet)
|
const char *progname)
|
||||||
{
|
{
|
||||||
int ret = EXIT_SUCCESS;
|
int ret = EXIT_SUCCESS;
|
||||||
PGconn *conn;
|
PGconn *conn;
|
||||||
PGresult *result;
|
PGresult *result;
|
||||||
int numdbs;
|
int numdbs;
|
||||||
|
|
||||||
conn = connectMaintenanceDatabase(cparams, progname, echo);
|
conn = connectMaintenanceDatabase(cparams, progname, vacopts->echo);
|
||||||
result = executeQuery(conn,
|
result = executeQuery(conn,
|
||||||
"SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
|
"SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
|
||||||
echo);
|
vacopts->echo);
|
||||||
numdbs = PQntuples(result);
|
numdbs = PQntuples(result);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
|
|
||||||
@@ -474,7 +473,7 @@ vacuum_all_databases(ConnParams *cparams,
|
|||||||
objects,
|
objects,
|
||||||
vacopts->missing_stats_only ? &found_objs[i] : NULL,
|
vacopts->missing_stats_only ? &found_objs[i] : NULL,
|
||||||
concurrentCons,
|
concurrentCons,
|
||||||
progname, echo, quiet);
|
progname);
|
||||||
if (ret != EXIT_SUCCESS)
|
if (ret != EXIT_SUCCESS)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -499,7 +498,7 @@ vacuum_all_databases(ConnParams *cparams,
|
|||||||
objects,
|
objects,
|
||||||
NULL,
|
NULL,
|
||||||
concurrentCons,
|
concurrentCons,
|
||||||
progname, echo, quiet);
|
progname);
|
||||||
if (ret != EXIT_SUCCESS)
|
if (ret != EXIT_SUCCESS)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -524,7 +523,7 @@ vacuum_all_databases(ConnParams *cparams,
|
|||||||
*/
|
*/
|
||||||
static SimpleStringList *
|
static SimpleStringList *
|
||||||
retrieve_objects(PGconn *conn, vacuumingOptions *vacopts,
|
retrieve_objects(PGconn *conn, vacuumingOptions *vacopts,
|
||||||
SimpleStringList *objects, bool echo)
|
SimpleStringList *objects)
|
||||||
{
|
{
|
||||||
PQExpBufferData buf;
|
PQExpBufferData buf;
|
||||||
PQExpBufferData catalog_query;
|
PQExpBufferData catalog_query;
|
||||||
@@ -776,10 +775,10 @@ retrieve_objects(PGconn *conn, vacuumingOptions *vacopts,
|
|||||||
* query for consistency with table lookups done elsewhere by the user.
|
* query for consistency with table lookups done elsewhere by the user.
|
||||||
*/
|
*/
|
||||||
appendPQExpBufferStr(&catalog_query, " ORDER BY c.relpages DESC;");
|
appendPQExpBufferStr(&catalog_query, " ORDER BY c.relpages DESC;");
|
||||||
executeCommand(conn, "RESET search_path;", echo);
|
executeCommand(conn, "RESET search_path;", vacopts->echo);
|
||||||
res = executeQuery(conn, catalog_query.data, echo);
|
res = executeQuery(conn, catalog_query.data, vacopts->echo);
|
||||||
termPQExpBuffer(&catalog_query);
|
termPQExpBuffer(&catalog_query);
|
||||||
PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL, echo));
|
PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL, vacopts->echo));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Build qualified identifiers for each table, including the column list
|
* Build qualified identifiers for each table, including the column list
|
||||||
@@ -1001,12 +1000,12 @@ prepare_vacuum_command(PGconn *conn, PQExpBuffer sql,
|
|||||||
* Any errors during command execution are reported to stderr.
|
* Any errors during command execution are reported to stderr.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
run_vacuum_command(PGconn *conn, const char *sql, bool echo,
|
run_vacuum_command(PGconn *conn, vacuumingOptions *vacopts,
|
||||||
const char *table)
|
const char *sql, const char *table)
|
||||||
{
|
{
|
||||||
bool status;
|
bool status;
|
||||||
|
|
||||||
if (echo)
|
if (vacopts->echo)
|
||||||
printf("%s\n", sql);
|
printf("%s\n", sql);
|
||||||
|
|
||||||
status = PQsendQuery(conn, sql) == 1;
|
status = PQsendQuery(conn, sql) == 1;
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ typedef struct vacuumingOptions
|
|||||||
bool skip_database_stats;
|
bool skip_database_stats;
|
||||||
char *buffer_usage_limit;
|
char *buffer_usage_limit;
|
||||||
bool missing_stats_only;
|
bool missing_stats_only;
|
||||||
|
bool echo;
|
||||||
|
bool quiet;
|
||||||
} vacuumingOptions;
|
} vacuumingOptions;
|
||||||
|
|
||||||
/* Valid values for vacuumingOptions->objfilter */
|
/* Valid values for vacuumingOptions->objfilter */
|
||||||
@@ -65,7 +67,7 @@ extern int vacuuming_main(ConnParams *cparams, const char *dbname,
|
|||||||
SimpleStringList *objects,
|
SimpleStringList *objects,
|
||||||
unsigned int tbl_count,
|
unsigned int tbl_count,
|
||||||
int concurrentCons,
|
int concurrentCons,
|
||||||
const char *progname, bool echo, bool quiet);
|
const char *progname);
|
||||||
|
|
||||||
extern char *escape_quotes(const char *src);
|
extern char *escape_quotes(const char *src);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user