From 7434fcc6dfc51229afd11c094c2932f931873b8a Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 8 Dec 2016 19:57:22 -0800 Subject: [PATCH] Make prepared transactions available if not configured. --- .../transaction/transaction_management.c | 38 +++++++++++++++++++ src/test/regress/pg_regress_multi.pl | 1 - 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/transaction/transaction_management.c b/src/backend/distributed/transaction/transaction_management.c index ef0dcc2e3..20d6227f4 100644 --- a/src/backend/distributed/transaction/transaction_management.c +++ b/src/backend/distributed/transaction/transaction_management.c @@ -17,11 +17,13 @@ #include "miscadmin.h" +#include "access/twophase.h" #include "access/xact.h" #include "distributed/connection_management.h" #include "distributed/hash_helpers.h" #include "distributed/transaction_management.h" #include "utils/hsearch.h" +#include "utils/guc.h" CoordinatedTransactionState CurrentCoordinatedTransactionState = COORD_TRANS_NONE; @@ -41,6 +43,9 @@ static void CoordinatedTransactionCallback(XactEvent event, void *arg); static void CoordinatedSubTransactionCallback(SubXactEvent event, SubTransactionId subId, SubTransactionId parentSubid, void *arg); +/* remaining functions */ +static void AdjustMaxPreparedTransactions(void); + void InitializeTransactionManagement(void) @@ -48,6 +53,8 @@ InitializeTransactionManagement(void) /* hook into transaction machinery */ RegisterXactCallback(CoordinatedTransactionCallback, NULL); RegisterSubXactCallback(CoordinatedSubTransactionCallback, NULL); + + AdjustMaxPreparedTransactions(); } @@ -142,3 +149,34 @@ CoordinatedSubTransactionCallback(SubXactEvent event, SubTransactionId subId, subXactAbortAttempted = true; } } + + +/* + * AdjustMaxPreparedTransactions configures the number of available prepared + * transaction slots at startup. + */ +static void +AdjustMaxPreparedTransactions(void) +{ + /* + * As Citus uses 2PC internally, there always should be some available. As + * the default is 0, we increase it to something appropriate + * (connections * 2 currently). If the user explicitly configured 2PC, we + * leave the configuration alone - there might have been intent behind the + * decision. + */ + if (max_prepared_xacts == 0) + { + char newvalue[12]; + + snprintf(newvalue, sizeof(newvalue), "%d", MaxConnections * 2); + + SetConfigOption("max_prepared_transactions", newvalue, PGC_POSTMASTER, + PGC_S_OVERRIDE); + + ereport(LOG, (errmsg("number of prepared transactions has not been " + "configured, overriding"), + errdetail("max_prepared_transactions is now set to %s", + newvalue))); + } +} diff --git a/src/test/regress/pg_regress_multi.pl b/src/test/regress/pg_regress_multi.pl index ad9d55c18..161e69e70 100755 --- a/src/test/regress/pg_regress_multi.pl +++ b/src/test/regress/pg_regress_multi.pl @@ -129,7 +129,6 @@ push(@pgOptions, '-c', "listen_addresses='${host}'"); push(@pgOptions, '-c', "unix_socket_directories="); push(@pgOptions, '-c', "fsync=off"); push(@pgOptions, '-c', "shared_preload_libraries=citus"); -push(@pgOptions, '-c', "max_prepared_transactions=100"); # Citus options set for the tests push(@pgOptions, '-c', "citus.shard_max_size=300kB");