Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit a670826

Browse files
committed
Fix handling of subtransactions working with temporary tables at replica
1 parent 39c2915 commit a670826

File tree

5 files changed

+35
-1
lines changed

5 files changed

+35
-1
lines changed

src/backend/access/heap/heapam_visibility.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,11 @@ HeapTupleSatisfiesUpdate(Relation relation, HeapTuple htup, CommandId curcid,
464464
Assert(htup->t_tableOid != InvalidOid);
465465

466466
if (relation->rd_rel->relpersistence == RELPERSISTENCE_SESSION && RecoveryInProgress())
467+
{
468+
AccessTempRelationAtReplica = true;
467469
return TempTupleSatisfiesVisibility(htup, curcid, buffer) ? TM_Ok : TM_Invisible;
470+
}
471+
AccessTempRelationAtReplica = false;
468472

469473
if (!HeapTupleHeaderXminCommitted(tuple))
470474
{
@@ -1747,7 +1751,11 @@ bool
17471751
HeapTupleSatisfiesVisibility(Relation relation, HeapTuple tup, Snapshot snapshot, Buffer buffer)
17481752
{
17491753
if (relation->rd_rel->relpersistence == RELPERSISTENCE_SESSION && RecoveryInProgress())
1754+
{
1755+
AccessTempRelationAtReplica = true;
17501756
return TempTupleSatisfiesVisibility(tup, snapshot->curcid, buffer);
1757+
}
1758+
AccessTempRelationAtReplica = false;
17511759

17521760
switch (snapshot->snapshot_type)
17531761
{

src/backend/access/transam/transam.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "access/clog.h"
2323
#include "access/subtrans.h"
2424
#include "access/transam.h"
25+
#include "access/xact.h"
2526
#include "utils/snapmgr.h"
2627

2728
/*
@@ -126,6 +127,9 @@ TransactionIdDidCommit(TransactionId transactionId)
126127
{
127128
XidStatus xidstatus;
128129

130+
if (AccessTempRelationAtReplica)
131+
return !IsReplicaCurrentTransactionId(transactionId) && !IsReplicaTransactionAborted(transactionId);
132+
129133
xidstatus = TransactionLogFetch(transactionId);
130134

131135
/*
@@ -182,6 +186,9 @@ TransactionIdDidAbort(TransactionId transactionId)
182186
{
183187
XidStatus xidstatus;
184188

189+
if (AccessTempRelationAtReplica)
190+
return IsReplicaTransactionAborted(transactionId);
191+
185192
xidstatus = TransactionLogFetch(transactionId);
186193

187194
/*

src/backend/access/transam/xact.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,10 +287,12 @@ typedef struct XactCallbackItem
287287

288288
static XactCallbackItem *Xact_callbacks = NULL;
289289

290-
static TransactionId replicaTransIdCount;
290+
static TransactionId replicaTransIdCount = FirstNormalTransactionId;
291291
static TransactionId replicaTopTransId;
292292
static Bitmapset* replicaAbortedXids;
293293

294+
bool AccessTempRelationAtReplica;
295+
294296
/*
295297
* List of add-on start- and end-of-subxact callbacks
296298
*/
@@ -902,6 +904,9 @@ TransactionIdIsCurrentTransactionId(TransactionId xid)
902904
{
903905
TransactionState s;
904906

907+
if (AccessTempRelationAtReplica)
908+
return IsReplicaCurrentTransactionId(xid);
909+
905910
/*
906911
* We always say that BootstrapTransactionId is "not my transaction ID"
907912
* even when it is (ie, during bootstrap). Along with the fact that
@@ -2622,7 +2627,11 @@ AbortTransaction(void)
26222627

26232628
/* Mark transactions involved global temp table at replica as aborted */
26242629
if (TransactionIdIsValid(s->replicaTransactionId))
2630+
{
2631+
MemoryContext ctx = MemoryContextSwitchTo(TopMemoryContext);
26252632
replicaAbortedXids = bms_add_member(replicaAbortedXids, s->replicaTransactionId);
2633+
MemoryContextSwitchTo(ctx);
2634+
}
26262635

26272636
/* Make sure we have a valid memory context and resource owner */
26282637
AtAbort_Memory();
@@ -4915,7 +4924,11 @@ AbortSubTransaction(void)
49154924

49164925
/* Mark transactions involved global temp table at replica as aborted */
49174926
if (TransactionIdIsValid(s->replicaTransactionId))
4927+
{
4928+
MemoryContext ctx = MemoryContextSwitchTo(TopMemoryContext);
49184929
replicaAbortedXids = bms_add_member(replicaAbortedXids, s->replicaTransactionId);
4930+
MemoryContextSwitchTo(ctx);
4931+
}
49194932

49204933
/* Make sure we have a valid memory context and resource owner */
49214934
AtSubAbort_Memory();

src/backend/storage/ipc/procarray.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,9 @@ TransactionIdIsInProgress(TransactionId xid)
994994
int i,
995995
j;
996996

997+
if (AccessTempRelationAtReplica)
998+
return IsReplicaCurrentTransactionId(xid) && !IsReplicaTransactionAborted(xid);
999+
9971000
/*
9981001
* Don't bother checking a transaction older than RecentXmin; it could not
9991002
* possibly still be running. (Note: in particular, this guarantees that

src/include/access/xact.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141
extern int DefaultXactIsoLevel;
4242
extern PGDLLIMPORT int XactIsoLevel;
4343

44+
extern bool AccessTempRelationAtReplica;
45+
46+
4447
/*
4548
* We implement three isolation levels internally.
4649
* The two stronger ones use one snapshot per database transaction;

0 commit comments

Comments
 (0)