Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit21d2a87

Browse files
committed
Reset relation and catalog cache in ATX only when needed
1 parent0677128 commit21d2a87

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
staticSubXactCallbackItem*SubXact_callbacks=NULL;
296296

297+
staticboolxactHasCatcacheInvalidationMessages;
298+
staticboolxactHasRelcacheInvalidationMessages;
297299

298300
/* local function prototypes */
299301
staticvoidAssignTransactionId(TransactionStates);
@@ -1850,7 +1852,9 @@ typedef struct {
18501852
void*TriggerState;
18511853
void*SPIState;
18521854
void*SnapshotState;
1855+
structTransInvalidationInfo*InvalidationInfo;
18531856
}SuspendedTransactionState;
1857+
18541858
staticintsuspendedXactNum=0;
18551859
staticSuspendedTransactionStatesuspendedXacts[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
returnnumSharedInvalidMessagesArray;
842842
}
843843

844+
boolHasCatcacheInvalidationMessages(void)
845+
{
846+
returntransInvalInfo!=NULL
847+
&& (transInvalInfo->CurrentCmdInvalidMsgs.cclist!=NULL
848+
||transInvalInfo->PriorCmdInvalidMsgs.cclist!=NULL);
849+
}
850+
851+
boolHasRelcacheInvalidationMessages(void)
852+
{
853+
returntransInvalInfo!=NULL
854+
&& (transInvalInfo->CurrentCmdInvalidMsgs.rclist!=NULL
855+
||transInvalInfo->PriorCmdInvalidMsgs.rclist!=NULL);
856+
}
857+
858+
structTransInvalidationInfo*SuspendInvalidationInfo()
859+
{
860+
TransInvalidationInfo*state=transInvalInfo;
861+
transInvalInfo=NULL;
862+
returnstate;
863+
}
864+
865+
voidResumeInvalidationInfo(structTransInvalidationInfo*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
returns;
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
externvoidCallSyscacheCallbacks(intcacheid,uint32hashvalue);
6262

6363
externvoidInvalidateSystemCaches(void);
64+
65+
/* Funcitons below are needed to support ATX */
66+
67+
structTransInvalidationInfo;
68+
69+
externboolHasCatcacheInvalidationMessages(void);
70+
externboolHasRelcacheInvalidationMessages(void);
71+
externstructTransInvalidationInfo*SuspendInvalidationInfo(void);
72+
externvoidResumeInvalidationInfo(structTransInvalidationInfo*inval);
73+
6474
#endif/* INVAL_H */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp