mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Don't force-assign transaction id when exporting a snapshot.
Previously we required every exported transaction to have an xid assigned. That was used to check that the exporting transaction is still running, which in turn is needed to guarantee that that necessary rows haven't been removed in between exporting and importing the snapshot. The exported xid caused unnecessary problems with logical decoding, because slot creation has to wait for all concurrent xid to finish, which in turn serializes concurrent slot creation. It also prohibited snapshots to be exported on hot-standby replicas. Instead export the virtual transactionid, which avoids the unnecessary serialization and the inability to export snapshots on standbys. This changes the file name of the exported snapshot, but since we never documented what that one means, that seems ok. Author: Petr Jelinek, slightly editorialized by me Reviewed-By: Andres Freund Discussion: https://postgr.es/m/f598b4b8-8cd7-0d54-0939-adda763d8c34@2ndquadrant.com
This commit is contained in:
@ -1793,14 +1793,15 @@ GetSnapshotData(Snapshot snapshot)
|
||||
* Returns TRUE if successful, FALSE if source xact is no longer running.
|
||||
*/
|
||||
bool
|
||||
ProcArrayInstallImportedXmin(TransactionId xmin, TransactionId sourcexid)
|
||||
ProcArrayInstallImportedXmin(TransactionId xmin,
|
||||
VirtualTransactionId *sourcevxid)
|
||||
{
|
||||
bool result = false;
|
||||
ProcArrayStruct *arrayP = procArray;
|
||||
int index;
|
||||
|
||||
Assert(TransactionIdIsNormal(xmin));
|
||||
if (!TransactionIdIsNormal(sourcexid))
|
||||
if (!sourcevxid)
|
||||
return false;
|
||||
|
||||
/* Get lock so source xact can't end while we're doing this */
|
||||
@ -1817,8 +1818,10 @@ ProcArrayInstallImportedXmin(TransactionId xmin, TransactionId sourcexid)
|
||||
if (pgxact->vacuumFlags & PROC_IN_VACUUM)
|
||||
continue;
|
||||
|
||||
xid = pgxact->xid; /* fetch just once */
|
||||
if (xid != sourcexid)
|
||||
/* We are only interested in the specific virtual transaction. */
|
||||
if (proc->backendId != sourcevxid->backendId)
|
||||
continue;
|
||||
if (proc->lxid != sourcevxid->localTransactionId)
|
||||
continue;
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user