diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/transam/xact.c | 2 | ||||
-rw-r--r-- | src/backend/storage/ipc/procarray.c | 17 | ||||
-rw-r--r-- | src/backend/utils/misc/guc.c | 2 | ||||
-rw-r--r-- | src/include/storage/procarray.h | 2 |
4 files changed, 15 insertions, 8 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index d2e2e119970..79c9c0d8446 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -1052,7 +1052,7 @@ RecordTransactionCommit(void) * fewer than CommitSiblings other backends with active transactions. */ if (CommitDelay > 0 && enableFsync && - CountActiveBackends() >= CommitSiblings) + MinimumActiveBackends(CommitSiblings)) pg_usleep(CommitDelay); XLogFlush(XactLastRecEnd); diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index ff08f869e2c..980996e5eb8 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -1886,20 +1886,25 @@ CancelVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode) } /* - * CountActiveBackends --- count backends (other than myself) that are in - * active transactions. This is used as a heuristic to decide if + * MinimumActiveBackends --- count backends (other than myself) that are + * in active transactions. Return true if the count exceeds the + * minimum threshold passed. This is used as a heuristic to decide if * a pre-XLOG-flush delay is worthwhile during commit. * * Do not count backends that are blocked waiting for locks, since they are * not going to get to run until someone else commits. */ -int -CountActiveBackends(void) +bool +MinimumActiveBackends(int min) { ProcArrayStruct *arrayP = procArray; int count = 0; int index; + /* Quick short-circuit if no minimum is specified */ + if (min == 0) + return true; + /* * Note: for speed, we don't acquire ProcArrayLock. This is a little bit * bogus, but since we are only testing fields for zero or nonzero, it @@ -1932,9 +1937,11 @@ CountActiveBackends(void) if (proc->waitLock != NULL) continue; /* do not count if blocked on a lock */ count++; + if (count >= min) + break; } - return count; + return count >= min; } /* diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index dd19fe9e386..942acb9eeb1 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -1816,7 +1816,7 @@ static struct config_int ConfigureNamesInt[] = NULL }, &CommitSiblings, - 5, 1, 1000, NULL, NULL + 5, 0, 1000, NULL, NULL }, { diff --git a/src/include/storage/procarray.h b/src/include/storage/procarray.h index 49ef8cc832b..ea030d695dc 100644 --- a/src/include/storage/procarray.h +++ b/src/include/storage/procarray.h @@ -60,7 +60,7 @@ extern VirtualTransactionId *GetCurrentVirtualXIDs(TransactionId limitXmin, extern VirtualTransactionId *GetConflictingVirtualXIDs(TransactionId limitXmin, Oid dbOid); extern pid_t CancelVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode); -extern int CountActiveBackends(void); +extern bool MinimumActiveBackends(int min); extern int CountDBBackends(Oid databaseid); extern void CancelDBBackends(Oid databaseid, ProcSignalReason sigmode, bool conflictPending); extern int CountUserBackends(Oid roleid); |