mirror of
https://github.com/postgres/postgres.git
synced 2025-08-28 18:48:04 +03:00
Optimize commit_siblings in two ways to improve group commit.
First, avoid scanning the whole ProcArray once we know there are at least commit_siblings active; second, skip the check altogether if commit_siblings = 0. Greg Smith
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user