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

Commita0f28cd

Browse files
knizhnikkelvich
authored andcommitted
Revive vacuum delay
1 parent6fd8584 commita0f28cd

File tree

1 file changed

+54
-26
lines changed

1 file changed

+54
-26
lines changed

‎multimaster.c

Lines changed: 54 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ MtmConnectionInfo* MtmConnections;
171171
staticchar*MtmConnStrs;
172172
staticintMtmQueueSize;
173173
staticintMtmWorkers;
174+
staticintMtmVacuumDelay;
174175
staticintMtmMinRecoveryLag;
175176
staticintMtmMaxRecoveryLag;
176177

@@ -408,36 +409,48 @@ MtmAdjustOldestXid(TransactionId xid)
408409
{
409410
if (TransactionIdIsValid(xid)) {
410411
MtmTransState*ts,*prev=NULL;
411-
412+
csn_toldestSnapshot=0;
413+
inti;
414+
412415
MtmLock(LW_EXCLUSIVE);
413-
ts= (MtmTransState*)hash_search(MtmXid2State,&xid,HASH_FIND,NULL);
414-
if (ts!=NULL&&ts->status==TRANSACTION_STATUS_COMMITTED) {/* committed transactions have same CSNs at all nodes */
415-
csn_toldestSnapshot;
416-
inti;
417-
418-
Mtm->nodes[MtmNodeId-1].oldestSnapshot=oldestSnapshot=ts->csn;
419-
for (i=0;i<MtmNodes;i++) {
420-
if (Mtm->nodes[i].oldestSnapshot<oldestSnapshot) {
421-
oldestSnapshot=Mtm->nodes[i].oldestSnapshot;
422-
}
416+
for (ts=Mtm->transListHead;ts!=NULL;ts=ts->next) {
417+
if (TransactionIdPrecedes(ts->xid,xid)
418+
&&ts->status==TRANSACTION_STATUS_COMMITTED
419+
&&ts->csn>oldestSnapshot)
420+
{
421+
oldestSnapshot=ts->csn;
423422
}
424-
for (ts=Mtm->transListHead;
425-
ts!=NULL
426-
&&ts->csn<oldestSnapshot
427-
&& (ts->status==TRANSACTION_STATUS_COMMITTED||ts->status==TRANSACTION_STATUS_ABORTED)
428-
&&TransactionIdPrecedes(ts->xid,xid);
429-
prev=ts,ts=ts->next)
423+
}
424+
Mtm->nodes[MtmNodeId-1].oldestSnapshot=oldestSnapshot;
425+
for (i=0;i<MtmNodes;i++) {
426+
if (!BIT_CHECK(Mtm->disabledNodeMask,i)
427+
&&Mtm->nodes[i].oldestSnapshot<oldestSnapshot)
430428
{
431-
if (prev!=NULL) {
432-
/* Remove information about too old transactions */
433-
hash_search(MtmXid2State,&prev->xid,HASH_REMOVE,NULL);
434-
}
429+
oldestSnapshot=Mtm->nodes[i].oldestSnapshot;
435430
}
436-
}
437-
if (prev!=NULL) {
438-
Mtm->transListHead=prev;
439-
Mtm->oldestXid=xid=prev->xid;
440-
}else {
431+
}
432+
oldestSnapshot-=MtmVacuumDelay*USEC;
433+
for (ts=Mtm->transListHead;
434+
ts!=NULL
435+
&&ts->csn<oldestSnapshot
436+
&&TransactionIdPrecedes(ts->xid,xid)
437+
&& (ts->status==TRANSACTION_STATUS_COMMITTED||
438+
ts->status==TRANSACTION_STATUS_ABORTED);
439+
ts=ts->next)
440+
{
441+
if (ts->status==TRANSACTION_STATUS_COMMITTED) {
442+
prev=ts;
443+
}
444+
}
445+
if (prev!=NULL) {
446+
for (ts=Mtm->transListHead;ts!=prev;ts=ts->next) {
447+
/* Remove information about too old transactions */
448+
Assert(ts->status!=TRANSACTION_STATUS_UNKNOWN);
449+
hash_search(MtmXid2State,&ts->xid,HASH_REMOVE,NULL);
450+
}
451+
Mtm->transListHead=prev;
452+
Mtm->oldestXid=xid=prev->xid;
453+
}elseif (TransactionIdPrecedes(Mtm->oldestXid,xid)) {
441454
xid=Mtm->oldestXid;
442455
}
443456
MtmUnlock();
@@ -1325,6 +1338,21 @@ _PG_init(void)
13251338
NULL
13261339
);
13271340

1341+
DefineCustomIntVariable(
1342+
"multimaster.vacuum_delay",
1343+
"Minimal age of records which can be vacuumed (seconds)",
1344+
NULL,
1345+
&MtmVacuumDelay,
1346+
1,
1347+
1,
1348+
INT_MAX,
1349+
PGC_BACKEND,
1350+
0,
1351+
NULL,
1352+
NULL,
1353+
NULL
1354+
);
1355+
13281356
DefineCustomIntVariable(
13291357
"multimaster.queue_size",
13301358
"Multimaster queue size",

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp