20130317_reindexdb_concurrently.patch
application/octet-stream
Filename: 20130317_reindexdb_concurrently.patch
Type: application/octet-stream
Part: 0
Message:
Re: Support for REINDEX CONCURRENTLY
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/bin/scripts/reindexdb.c | 33 | 17 |
diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index 342e4c9..a36a016 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -18,12 +18,12 @@ static void reindex_one_database(const char *name, const char *dbname,
const char *type, const char *host,
const char *port, const char *username,
enum trivalue prompt_password, const char *progname,
- bool echo);
+ bool echo, bool concurrently);
static void reindex_all_databases(const char *maintenance_db,
const char *host, const char *port,
const char *username, enum trivalue prompt_password,
const char *progname, bool echo,
- bool quiet);
+ bool quiet, bool concurrently);
static void reindex_system_catalogs(const char *dbname,
const char *host, const char *port,
const char *username, enum trivalue prompt_password,
@@ -46,6 +46,7 @@ main(int argc, char *argv[])
{"system", no_argument, NULL, 's'},
{"table", required_argument, NULL, 't'},
{"index", required_argument, NULL, 'i'},
+ {"concurrently", no_argument, NULL, 'c'},
{"maintenance-db", required_argument, NULL, 2},
{NULL, 0, NULL, 0}
};
@@ -64,6 +65,7 @@ main(int argc, char *argv[])
bool alldb = false;
bool echo = false;
bool quiet = false;
+ bool concurrently = false;
SimpleStringList indexes = {NULL, NULL};
SimpleStringList tables = {NULL, NULL};
@@ -73,7 +75,7 @@ main(int argc, char *argv[])
handle_help_version_opts(argc, argv, "reindexdb", help);
/* process command-line options */
- while ((c = getopt_long(argc, argv, "h:p:U:wWeqd:ast:i:", long_options, &optindex)) != -1)
+ while ((c = getopt_long(argc, argv, "h:p:U:wWeqd:ast:i:c", long_options, &optindex)) != -1)
{
switch (c)
{
@@ -113,6 +115,9 @@ main(int argc, char *argv[])
case 'i':
simple_string_list_append(&indexes, optarg);
break;
+ case 'c':
+ concurrently = true;
+ break;
case 2:
maintenance_db = pg_strdup(optarg);
break;
@@ -166,7 +171,8 @@ main(int argc, char *argv[])
}
reindex_all_databases(maintenance_db, host, port, username,
- prompt_password, progname, echo, quiet);
+ prompt_password, progname, echo, quiet,
+ concurrently);
}
else if (syscatalog)
{
@@ -180,6 +186,11 @@ main(int argc, char *argv[])
fprintf(stderr, _("%s: cannot reindex specific index(es) and system catalogs at the same time\n"), progname);
exit(1);
}
+ if (concurrently)
+ {
+ fprintf(stderr, _("%s: cannot reindex concurrently system catalogs\n"), progname);
+ exit(1);
+ }
if (dbname == NULL)
{
@@ -213,7 +224,8 @@ main(int argc, char *argv[])
for (cell = indexes.head; cell; cell = cell->next)
{
reindex_one_database(cell->val, dbname, "INDEX", host, port,
- username, prompt_password, progname, echo);
+ username, prompt_password, progname, echo,
+ concurrently);
}
}
if (tables.head != NULL)
@@ -223,13 +235,15 @@ main(int argc, char *argv[])
for (cell = tables.head; cell; cell = cell->next)
{
reindex_one_database(cell->val, dbname, "TABLE", host, port,
- username, prompt_password, progname, echo);
+ username, prompt_password, progname, echo,
+ concurrently);
}
}
/* reindex database only if neither index nor table is specified */
if (indexes.head == NULL && tables.head == NULL)
reindex_one_database(dbname, dbname, "DATABASE", host, port,
- username, prompt_password, progname, echo);
+ username, prompt_password, progname, echo,
+ concurrently);
}
exit(0);
@@ -238,7 +252,8 @@ main(int argc, char *argv[])
static void
reindex_one_database(const char *name, const char *dbname, const char *type,
const char *host, const char *port, const char *username,
- enum trivalue prompt_password, const char *progname, bool echo)
+ enum trivalue prompt_password, const char *progname, bool echo,
+ bool concurrently)
{
PQExpBufferData sql;
@@ -246,13 +261,12 @@ reindex_one_database(const char *name, const char *dbname, const char *type,
initPQExpBuffer(&sql);
- appendPQExpBuffer(&sql, "REINDEX");
- if (strcmp(type, "TABLE") == 0)
- appendPQExpBuffer(&sql, " TABLE %s", name);
- else if (strcmp(type, "INDEX") == 0)
- appendPQExpBuffer(&sql, " INDEX %s", name);
- else if (strcmp(type, "DATABASE") == 0)
- appendPQExpBuffer(&sql, " DATABASE %s", fmtId(name));
+ appendPQExpBuffer(&sql, "REINDEX %s", type);
+ if (concurrently)
+ appendPQExpBuffer(&sql, " CONCURRENTLY");
+
+ appendPQExpBuffer(&sql, " %s",
+ strcmp(type, "DATABASE") == 0 ? fmtId(name) : name);
appendPQExpBuffer(&sql, ";\n");
conn = connectDatabase(dbname, host, port, username, prompt_password,
@@ -281,7 +295,8 @@ static void
reindex_all_databases(const char *maintenance_db,
const char *host, const char *port,
const char *username, enum trivalue prompt_password,
- const char *progname, bool echo, bool quiet)
+ const char *progname, bool echo, bool quiet,
+ bool concurrently)
{
PGconn *conn;
PGresult *result;
@@ -303,7 +318,7 @@ reindex_all_databases(const char *maintenance_db,
}
reindex_one_database(dbname, dbname, "DATABASE", host, port, username,
- prompt_password, progname, echo);
+ prompt_password, progname, echo, concurrently);
}
PQclear(result);
@@ -343,6 +358,7 @@ help(const char *progname)
printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
printf(_("\nOptions:\n"));
printf(_(" -a, --all reindex all databases\n"));
+ printf(_(" -c, --concurrently reindex concurrently\n"));
printf(_(" -d, --dbname=DBNAME database to reindex\n"));
printf(_(" -e, --echo show the commands being sent to the server\n"));
printf(_(" -i, --index=INDEX recreate specific index(es) only\n"));