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

Commitc3fba52

Browse files
committed
Move DtmMinXid in shared memory
1 parent16cb19c commitc3fba52

File tree

6 files changed

+62
-16
lines changed

6 files changed

+62
-16
lines changed

‎contrib/pg_xtm/dtmd/src/main.c‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,14 +233,14 @@ static char *onreserve(void *stream, void *clientdata, cmd_t *cmd) {
233233

234234
staticxid_tget_global_xmin() {
235235
inti,j;
236-
xid_txmin=INVALID_XID;
236+
xid_txmin=next_gxid;
237237
Transaction*t;
238238
for (i=0;i<transactions_count;i++) {
239239
t=transactions+i;
240240
j=t->snapshots_count>MAX_SNAPSHOTS_PER_TRANS ?MAX_SNAPSHOTS_PER_TRANS :t->snapshots_count;
241241
while (--j >=0) {
242242
Snapshot*s=transaction_snapshot(t,j);
243-
if ((xmin==INVALID_XID)|| (s->xmin<xmin)) {
243+
if (s->xmin<xmin) {
244244
xmin=s->xmin;
245245
}
246246
// minor TODO: Use 'times_sent' to generate a bit greater xmin?

‎contrib/pg_xtm/pg_dtm.c‎

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ typedef struct
4646
{
4747
LWLockIdhashLock;
4848
LWLockIdxidLock;
49+
TransactionIdminXid;
4950
TransactionIdnextXid;
5051
size_tnReservedXids;
5152
SnapshotDataactiveSnapshot;
@@ -69,6 +70,7 @@ static void DtmSetTransactionStatus(TransactionId xid, int nsubxids, Transaction
6970
staticvoidDtmUpdateRecentXmin(Snapshotsnapshot);
7071
staticvoidDtmInitialize(void);
7172
staticvoidDtmXactCallback(XactEventevent,void*arg);
73+
staticboolDtmTransactionIdIsInProgress(TransactionIdxid);
7274
staticTransactionIdDtmGetNextXid(void);
7375
staticTransactionIdDtmGetNewTransactionId(boolisSubXact);
7476
staticTransactionIdDtmGetOldestXmin(Relationrel,boolignoreVacuum);
@@ -85,13 +87,12 @@ static Snapshot CurrentTransactionSnapshot;
8587

8688
staticTransactionIdDtmNextXid;
8789
staticSnapshotDataDtmSnapshot= {HeapTupleSatisfiesMVCC };
88-
staticTransactionIdDtmMinXid;
8990
staticboolDtmHasGlobalSnapshot;
9091
staticboolDtmIsGlobalTransaction;
9192
staticintDtmLocalXidReserve;
9293
staticintDtmCurcid;
9394
staticSnapshotDtmLastSnapshot;
94-
staticTransactionManagerDtmTM= {DtmGetTransactionStatus,DtmSetTransactionStatus,DtmGetSnapshot,DtmGetNewTransactionId,DtmGetOldestXmin };
95+
staticTransactionManagerDtmTM= {DtmGetTransactionStatus,DtmSetTransactionStatus,DtmGetSnapshot,DtmGetNewTransactionId,DtmGetOldestXmin,DtmTransactionIdIsInProgress };
9596

9697

9798
#defineXTM_TRACE(fmt, ...)
@@ -182,7 +183,7 @@ static void DtmMergeWithActiveSnapshot(Snapshot dst)
182183
LWLockAcquire(dtm->xidLock,LW_EXCLUSIVE);
183184
for (i=0,j=0;i<src->xcnt;i++) {
184185
if (!TransactionIdIsInSnapshot(src->xip[i],dst)
185-
&&DtmGetTransactionStatus(src->xip[i],&lsn)==TRANSACTION_STATUS_IN_PROGRESS)
186+
&&DtmGetTransactionStatus(src->xip[i],&lsn)==TRANSACTION_STATUS_IN_PROGRESS)
186187
{
187188
src->xip[j++]=src->xip[i];
188189
}
@@ -228,7 +229,9 @@ static void DtmMergeWithGlobalSnapshot(Snapshot dst)
228229
staticTransactionIdDtmGetOldestXmin(Relationrel,boolignoreVacuum)
229230
{
230231
TransactionIdlocalXmin=GetOldestLocalXmin(rel,ignoreVacuum);
231-
TransactionIdglobalXmin=DtmMinXid;
232+
TransactionIdglobalXmin=dtm->minXid;
233+
XTM_INFO("XTM: DtmGetOldestXmin localXmin=%d, globalXmin=%d\n",localXmin,globalXmin);
234+
232235
if (TransactionIdIsValid(globalXmin)) {
233236
globalXmin-=vacuum_defer_cleanup_age;
234237
if (!TransactionIdIsNormal(globalXmin)) {
@@ -237,14 +240,15 @@ static TransactionId DtmGetOldestXmin(Relation rel, bool ignoreVacuum)
237240
if (TransactionIdPrecedes(globalXmin,localXmin)) {
238241
localXmin=globalXmin;
239242
}
243+
XTM_INFO("XTM: DtmGetOldestXmin adjusted localXmin=%d, globalXmin=%d\n",localXmin,globalXmin);
240244
}
241245
returnlocalXmin;
242246
}
243247

244248
staticvoidDtmUpdateRecentXmin(Snapshotsnapshot)
245249
{
246-
TransactionIdxmin=DtmMinXid;//DtmSnapshot.xmin;
247-
XTM_INFO("XTM: DtmUpdateRecentXmin global xmin=%d, snapshot xmin %d\n",DtmMinXid,DtmSnapshot.xmin);
250+
TransactionIdxmin=dtm->minXid;//DtmSnapshot.xmin;
251+
XTM_INFO("XTM: DtmUpdateRecentXmin global xmin=%d, snapshot xmin %d\n",dtm->minXid,DtmSnapshot.xmin);
248252

249253
if (TransactionIdIsValid(xmin)) {
250254
xmin-=vacuum_defer_cleanup_age;
@@ -272,6 +276,18 @@ static TransactionId DtmGetNextXid()
272276
if (TransactionIdIsValid(DtmNextXid)) {
273277
XTM_INFO("Use global XID %d\n",DtmNextXid);
274278
xid=DtmNextXid;
279+
280+
#ifdefSUPPORT_LOCAL_TRANSACTIONS
281+
{
282+
TransactionId*p;
283+
p=bsearch(&DtmNextXid,dtm->activeSnapshot.xip,dtm->activeSnapshot.xcnt,sizeof(TransactionId),xidComparator);
284+
if (p!=NULL) {
285+
dtm->activeSnapshot.xcnt-=1;
286+
memcpy(p,p+1, (dtm->activeSnapshot.xcnt- (p-dtm->activeSnapshot.xip))*sizeof(TransactionId));
287+
}
288+
}
289+
#endif
290+
275291
if (TransactionIdPrecedesOrEquals(ShmemVariableCache->nextXid,xid)) {
276292
while (TransactionIdPrecedes(ShmemVariableCache->nextXid,xid)) {
277293
XTM_INFO("Extend CLOG for global transaction to %d\n",ShmemVariableCache->nextXid);
@@ -307,7 +323,7 @@ static TransactionId DtmGetNextXid()
307323
returnxid;
308324
}
309325

310-
TransactionId
326+
TransactionId
311327
DtmGetNewTransactionId(boolisSubXact)
312328
{
313329
TransactionIdxid;
@@ -511,11 +527,30 @@ DtmGetNewTransactionId(bool isSubXact)
511527
}
512528

513529

530+
staticboolDtmTransactionIdIsInProgress(TransactionIdxid)
531+
{
532+
XLogRecPtrlsn;
533+
if (TransactionIdIsRunning(xid)) {
534+
return true;
535+
}
536+
#ifdefSUPPORT_LOCAL_TRANSACTIONS
537+
elseif (DtmGetTransactionStatus(xid,&lsn)==TRANSACTION_STATUS_IN_PROGRESS) {
538+
boolgloballyStarted;
539+
LWLockAcquire(dtm->xidLock,LW_SHARED);
540+
globallyStarted=bsearch(&xid,dtm->activeSnapshot.xip,dtm->activeSnapshot.xcnt,sizeof(TransactionId),xidComparator)!=NULL;
541+
LWLockRelease(dtm->xidLock);
542+
returngloballyStarted;
543+
}
544+
#endif
545+
return false;
546+
}
547+
548+
514549
staticSnapshotDtmGetSnapshot(Snapshotsnapshot)
515550
{
516551
if (TransactionIdIsValid(DtmNextXid)/*&& IsMVCCSnapshot(snapshot)*/&&snapshot!=&CatalogSnapshotData) {
517552
if (!DtmHasGlobalSnapshot&& (snapshot!=DtmLastSnapshot||DtmCurcid!=snapshot->curcid)) {
518-
DtmGlobalGetSnapshot(DtmNextXid,&DtmSnapshot,&DtmMinXid);
553+
DtmGlobalGetSnapshot(DtmNextXid,&DtmSnapshot,&dtm->minXid);
519554
}
520555
DtmCurcid=snapshot->curcid;
521556
DtmLastSnapshot=snapshot;
@@ -526,7 +561,9 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot)
526561
}else {
527562
snapshot=GetLocalSnapshotData(snapshot);
528563
}
564+
#ifdefSUPPORT_LOCAL_TRANSACTIONS
529565
DtmMergeWithActiveSnapshot(snapshot);
566+
#endif
530567
DtmUpdateRecentXmin(snapshot);
531568
CurrentTransactionSnapshot=snapshot;
532569
returnsnapshot;
@@ -598,6 +635,7 @@ static void DtmInitialize()
598635
dtm->hashLock=LWLockAssign();
599636
dtm->xidLock=LWLockAssign();
600637
dtm->nReservedXids=0;
638+
dtm->minXid=InvalidTransactionId;
601639
dtm->activeSnapshot.xip= (TransactionId*)ShmemAlloc(GetMaxSnapshotXidCount()*sizeof(TransactionId));
602640
dtm->activeSnapshot.subxip= (TransactionId*)ShmemAlloc(GetMaxSnapshotSubxidCount()*sizeof(TransactionId));
603641
}
@@ -734,9 +772,9 @@ dtm_begin_transaction(PG_FUNCTION_ARGS)
734772
intnParticipants=PG_GETARG_INT32(0);
735773
Assert(!TransactionIdIsValid(DtmNextXid));
736774

737-
DtmNextXid=DtmGlobalStartTransaction(nParticipants,&DtmSnapshot,&DtmMinXid);
775+
DtmNextXid=DtmGlobalStartTransaction(nParticipants,&DtmSnapshot,&dtm->minXid);
738776
Assert(TransactionIdIsValid(DtmNextXid));
739-
XTM_INFO("%d: Start global transaction %d\n",getpid(),DtmNextXid);
777+
XTM_INFO("%d: Start global transaction %d, dtm->minXid=%d\n",getpid(),DtmNextXid,dtm->minXid);
740778

741779
DtmHasGlobalSnapshot= true;
742780
DtmIsGlobalTransaction= true;
@@ -750,9 +788,9 @@ Datum dtm_join_transaction(PG_FUNCTION_ARGS)
750788
Assert(!TransactionIdIsValid(DtmNextXid));
751789
DtmNextXid=PG_GETARG_INT32(0);
752790
Assert(TransactionIdIsValid(DtmNextXid));
753-
XTM_INFO("%d: Join global transaction %d\n",getpid(),DtmNextXid);
754791

755-
DtmGlobalGetSnapshot(DtmNextXid,&DtmSnapshot,&DtmMinXid);
792+
DtmGlobalGetSnapshot(DtmNextXid,&DtmSnapshot,&dtm->minXid);
793+
XTM_INFO("%d: Join global transaction %d, dtm->minXid=%d\n",getpid(),DtmNextXid,dtm->minXid);
756794

757795
DtmHasGlobalSnapshot= true;
758796
DtmIsGlobalTransaction= true;

‎src/backend/access/transam/clog.c‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
#include"miscadmin.h"
4545
#include"pg_trace.h"
4646

47-
TransactionManagerDefaultTM= {CLOGTransactionIdGetStatus,CLOGTransactionIdSetTreeStatus,GetLocalSnapshotData,GetNewLocalTransactionId,GetOldestLocalXmin };
47+
TransactionManagerDefaultTM= {CLOGTransactionIdGetStatus,CLOGTransactionIdSetTreeStatus,GetLocalSnapshotData,GetNewLocalTransactionId,GetOldestLocalXmin,TransactionIdIsRunning };
4848
TransactionManager*TM=&DefaultTM;
4949

5050
/*

‎src/backend/storage/ipc/procarray.c‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,12 @@ ProcArrayApplyXidAssignment(TransactionId topxid,
962962
LWLockRelease(ProcArrayLock);
963963
}
964964

965+
bool
966+
TransactionIdIsInProgress(TransactionIdxid)
967+
{
968+
returnTM->IsInProgress(xid);
969+
}
970+
965971
/*
966972
* TransactionIdIsInProgress -- is given transaction running in some backend
967973
*
@@ -989,7 +995,7 @@ ProcArrayApplyXidAssignment(TransactionId topxid,
989995
* PGXACT again anyway; see GetNewTransactionId).
990996
*/
991997
bool
992-
TransactionIdIsInProgress(TransactionIdxid)
998+
TransactionIdIsRunning(TransactionIdxid)
993999
{
9941000
staticTransactionId*xids=NULL;
9951001
intnxids=0;

‎src/include/access/xtm.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ typedef struct
2222
Snapshot (*GetSnapshot)(Snapshotsnapshot);
2323
TransactionId (*GetNewTransactionId)(boolisSubXact);
2424
TransactionId (*GetOldestXmin)(Relationrel,boolignoreVacuum);
25+
bool (*IsInProgress)(TransactionIdxid);
2526
}TransactionManager;
2627

2728
externTransactionManager*TM;

‎src/include/storage/procarray.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ extern RunningTransactions GetRunningTransactionData(void);
5454

5555
externboolTransactionIdIsRunning(TransactionIdxid);
5656
externboolTransactionIdIsInProgress(TransactionIdxid);
57+
externboolTransactionIdIsRunning(TransactionIdxid);
5758
externboolTransactionIdIsActive(TransactionIdxid);
5859
externTransactionIdGetOldestXmin(Relationrel,boolignoreVacuum);
5960
externTransactionIdGetOldestLocalXmin(Relationrel,boolignoreVacuum);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp