diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 4f209ea..5bcde05 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -193,10 +193,16 @@ ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist, TimestampTz waitStart; char *new_status; + /* Return immediately if list is empty, to avoid extra work. */ + if (!VirtualTransactionIdIsValid(*waitlist)) + return; + + /* At least one conflict, so do initialization. */ waitStart = GetCurrentTimestamp(); new_status = NULL; /* we haven't changed the ps display */ - while (VirtualTransactionIdIsValid(*waitlist)) + /* Loop test at bottom, since we already checked it the first time. */ + do { /* reset standbyWait_us for each xact we wait for */ standbyWait_us = STANDBY_INITIAL_WAIT_US; @@ -245,7 +251,7 @@ ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist, /* The virtual transaction is gone now, wait for the next one */ waitlist++; - } + } while (VirtualTransactionIdIsValid(*waitlist)); /* Reset ps display if we changed it */ if (new_status)