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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy