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

Commit 21d2a87

Browse files
committed
Reset relation and catalog cache in ATX only when needed
1 parent 0677128 commit 21d2a87

File tree

4 files changed

+66
-6
lines changed

4 files changed

+66
-6
lines changed

src/backend/access/transam/xact.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,8 @@ typedef struct SubXactCallbackItem
294294

295295
static SubXactCallbackItem *SubXact_callbacks = NULL;
296296

297+
static bool xactHasCatcacheInvalidationMessages;
298+
static bool xactHasRelcacheInvalidationMessages;
297299

298300
/* local function prototypes */
299301
static void AssignTransactionId(TransactionState s);
@@ -1850,7 +1852,9 @@ typedef struct {
18501852
void *TriggerState;
18511853
void *SPIState;
18521854
void *SnapshotState;
1855+
struct TransInvalidationInfo* InvalidationInfo;
18531856
} SuspendedTransactionState;
1857+
18541858
static int suspendedXactNum = 0;
18551859
static SuspendedTransactionState suspendedXacts[MAX_SUSPENDED_XACTS];
18561860

@@ -2168,6 +2172,8 @@ CommitTransaction(void)
21682172
* waiting for lock on a relation we've modified, we want them to know
21692173
* about the catalog change before they start using the relation).
21702174
*/
2175+
xactHasCatcacheInvalidationMessages = HasCatcacheInvalidationMessages();
2176+
xactHasRelcacheInvalidationMessages = HasRelcacheInvalidationMessages();
21712177
AtEOXact_Inval(true);
21722178

21732179
AtEOXact_MultiXact();
@@ -2662,6 +2668,8 @@ AbortTransaction(void)
26622668
AtEOXact_Buffers(false);
26632669
}
26642670
AtEOXact_RelationCache(false);
2671+
xactHasCatcacheInvalidationMessages = HasCatcacheInvalidationMessages();
2672+
xactHasRelcacheInvalidationMessages = HasRelcacheInvalidationMessages();
26652673
AtEOXact_Inval(false);
26662674
AtEOXact_MultiXact();
26672675
ResourceOwnerRelease(TopTransactionResourceOwner,
@@ -3504,7 +3512,20 @@ void SuspendTransaction(void)
35043512
SuspendedTransactionState *sus = suspendedXacts + suspendedXactNum++;
35053513

35063514
sus->TopTransactionStateData = TopTransactionStateData;
3515+
35073516
sus->SnapshotState = SuspendSnapshot(); /* only before the resource-owner stuff */
3517+
3518+
if (HasCatcacheInvalidationMessages())
3519+
{
3520+
ResetCatalogCaches();
3521+
}
3522+
if (HasRelcacheInvalidationMessages())
3523+
{
3524+
RelationCacheInvalidate();
3525+
}
3526+
sus->InvalidationInfo = SuspendInvalidationInfo();
3527+
xactHasCatcacheInvalidationMessages = false;
3528+
xactHasRelcacheInvalidationMessages = false;
35083529

35093530
tts = &TopTransactionStateData;
35103531
tts->state = TRANS_INPROGRESS;
@@ -3610,6 +3631,15 @@ bool ResumeTransaction(void)
36103631
TopTransactionResourceOwner = sus->TopTransactionResourceOwner;
36113632

36123633
ResumeSnapshot(sus->SnapshotState); /* only after the resource-owner stuff */
3634+
ResumeInvalidationInfo(sus->InvalidationInfo);
3635+
if (xactHasCatcacheInvalidationMessages)
3636+
{
3637+
ResetCatalogCaches();
3638+
}
3639+
if (xactHasRelcacheInvalidationMessages)
3640+
{
3641+
RelationCacheInvalidate();
3642+
}
36133643

36143644
MyProc->backendId = sus->vxid.backendId;
36153645
MyProc->lxid = sus->vxid.localTransactionId;

src/backend/utils/cache/inval.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,32 @@ xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs,
841841
return numSharedInvalidMessagesArray;
842842
}
843843

844+
bool HasCatcacheInvalidationMessages(void)
845+
{
846+
return transInvalInfo != NULL
847+
&& (transInvalInfo->CurrentCmdInvalidMsgs.cclist != NULL
848+
|| transInvalInfo->PriorCmdInvalidMsgs.cclist != NULL);
849+
}
850+
851+
bool HasRelcacheInvalidationMessages(void)
852+
{
853+
return transInvalInfo != NULL
854+
&& (transInvalInfo->CurrentCmdInvalidMsgs.rclist != NULL
855+
|| transInvalInfo->PriorCmdInvalidMsgs.rclist != NULL);
856+
}
857+
858+
struct TransInvalidationInfo* SuspendInvalidationInfo()
859+
{
860+
TransInvalidationInfo* state = transInvalInfo;
861+
transInvalInfo = NULL;
862+
return state;
863+
}
864+
865+
void ResumeInvalidationInfo(struct TransInvalidationInfo* inval)
866+
{
867+
transInvalInfo = inval;
868+
}
869+
844870
/*
845871
* ProcessCommittedInvalidationMessages is executed by xact_redo_commit() or
846872
* standby_redo() to process invalidation messages. Currently that happens

src/backend/utils/time/snapmgr.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,9 +2176,6 @@ void *SuspendSnapshot(void)
21762176
MOVELEFT(s->ActiveSnapshot, ActiveSnapshot, NULL);
21772177
MOVELEFT(s->OldestActiveSnapshot, OldestActiveSnapshot, NULL);
21782178

2179-
RelationCacheInvalidate();
2180-
ResetCatalogCaches();
2181-
21822179
return s;
21832180
}
21842181

@@ -2207,8 +2204,5 @@ void ResumeSnapshot(void *data)
22072204
ActiveSnapshot = s->ActiveSnapshot;
22082205
OldestActiveSnapshot = s->OldestActiveSnapshot;
22092206

2210-
RelationCacheInvalidate();
2211-
ResetCatalogCaches();
2212-
22132207
free(s);
22142208
}

src/include/utils/inval.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,14 @@ extern void CacheRegisterRelcacheCallback(RelcacheCallbackFunction func,
6161
extern void CallSyscacheCallbacks(int cacheid, uint32 hashvalue);
6262

6363
extern void InvalidateSystemCaches(void);
64+
65+
/* Funcitons below are needed to support ATX */
66+
67+
struct TransInvalidationInfo;
68+
69+
extern bool HasCatcacheInvalidationMessages(void);
70+
extern bool HasRelcacheInvalidationMessages(void);
71+
extern struct TransInvalidationInfo* SuspendInvalidationInfo(void);
72+
extern void ResumeInvalidationInfo(struct TransInvalidationInfo* inval);
73+
6474
#endif /* INVAL_H */

0 commit comments

Comments
 (0)