Add "-X" option to avoid waiting for other transactions

There was a conservative wait[1] for all existing transaction to
finish before repacking a table. This may not be desired on a busy
database on which you have long running transaction, which may block
pg_repack to do the job. This option will display a warning message,
but continues the process in such cases.

[1] http://lists.pgfoundry.org/pipermail/reorg-general/2015-October/000318.html
This commit is contained in:
Babak Farrokhi 2017-06-03 11:07:23 +04:30
parent cbb3b7f916
commit 098f569eb8

View File

@ -239,6 +239,7 @@ static bool sqlstate_equals(PGresult *res, const char *state)
static bool analyze = true;
static bool alldb = false;
static bool no_paranoia = false;
static bool noorder = false;
static SimpleStringList parent_table_list = {NULL, NULL};
static SimpleStringList table_list = {NULL, NULL};
@ -268,6 +269,7 @@ utoa(unsigned int value, char *buffer)
static pgut_option options[] =
{
{ 'b', 'a', "all", &alldb },
{ 'b', 'X', "disable-paranoia", &no_paranoia },
{ 'l', 't', "table", &table_list },
{ 'l', 'I', "parent-table", &parent_table_list },
{ 'l', 'c', "schema", &schema_list },
@ -1440,6 +1442,15 @@ repack_one_table(repack_table *table, const char *orderby)
res = execute(SQL_XID_ALIVE, 1, params);
num = PQntuples(res);
/* display a warning if there are still one or more transactions
* alive, but continue
*/
if (no_paranoia)
{
elog(NOTICE, "There are %d transactions waiting to finish, but skipping.", num);
break;
}
if (num > 0)
{
/* Wait for old transactions.
@ -2224,4 +2235,5 @@ pgut_help(bool details)
printf(" -Z, --no-analyze don't analyze at end\n");
printf(" -k, --no-superuser-check skip superuser checks in client\n");
printf(" -C, --exclude-extension don't repack tables which belong to specific extension\n");
printf(" -X, --disable-paranoia don't wait for other existing transactions (use with care)\n");
}