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

Commit03ce7eb

Browse files
committed
Make it possible to abort transaction from XTM TransactionIdSetStatus call
1 parent27bba25 commit03ce7eb

File tree

8 files changed

+38
-27
lines changed

8 files changed

+38
-27
lines changed

‎contrib/pg_dtm/pg_dtm.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,5 +1031,6 @@ bool DtmDetectGlobalDeadLock(PGPROC* proc)
10311031
EnumerateLocks(DtmSerializeLock,&buf);
10321032
hasDeadlock=DtmGlobalDetectDeadLock(PostPortNumber,proc->lxid,buf.data,buf.used);
10331033
ByteBufferFree(&buf);
1034+
elog(NOTICE,"Deadlock detected for transaction %u",proc->lxid);
10341035
returnhasDeadlock;
10351036
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,11 @@ static void TransactionIdSetStatusBit(TransactionId xid, XidStatus status,
9393
staticvoidset_status_by_pages(intnsubxids,TransactionId*subxids,
9494
XidStatusstatus,XLogRecPtrlsn);
9595

96-
void
96+
bool
9797
TransactionIdSetTreeStatus(TransactionIdxid,intnsubxids,
98-
TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn)
98+
TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn)
9999
{
100-
TM->SetTransactionStatus(xid,nsubxids,subxids,status,lsn);
100+
returnTM->SetTransactionStatus(xid,nsubxids,subxids,status,lsn);
101101
}
102102

103103
/*
@@ -151,7 +151,7 @@ TransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
151151
* but aren't yet in cache, as well as hinting pages not to fall out of
152152
* cache yet.
153153
*/
154-
void
154+
bool
155155
PgTransactionIdSetTreeStatus(TransactionIdxid,intnsubxids,
156156
TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn)
157157
{
@@ -217,6 +217,7 @@ PgTransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
217217
subxids+nsubxids_on_first_page,
218218
status,lsn);
219219
}
220+
return true;
220221
}
221222

222223
/*

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -256,24 +256,24 @@ TransactionIdIsKnownCompleted(TransactionId transactionId)
256256
* This commit operation is not guaranteed to be atomic, but if not, subxids
257257
* are correctly marked subcommit first.
258258
*/
259-
void
259+
bool
260260
TransactionIdCommitTree(TransactionIdxid,intnxids,TransactionId*xids)
261261
{
262-
TransactionIdSetTreeStatus(xid,nxids,xids,
263-
TRANSACTION_STATUS_COMMITTED,
264-
InvalidXLogRecPtr);
262+
returnTransactionIdSetTreeStatus(xid,nxids,xids,
263+
TRANSACTION_STATUS_COMMITTED,
264+
InvalidXLogRecPtr);
265265
}
266266

267267
/*
268268
* TransactionIdAsyncCommitTree
269269
*Same as above, but for async commits. The commit record LSN is needed.
270270
*/
271-
void
271+
bool
272272
TransactionIdAsyncCommitTree(TransactionIdxid,intnxids,TransactionId*xids,
273273
XLogRecPtrlsn)
274274
{
275-
TransactionIdSetTreeStatus(xid,nxids,xids,
276-
TRANSACTION_STATUS_COMMITTED,lsn);
275+
returnTransactionIdSetTreeStatus(xid,nxids,xids,
276+
TRANSACTION_STATUS_COMMITTED,lsn);
277277
}
278278

279279
/*

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,7 @@ RecordTransactionCommit(void)
11351135
SharedInvalidationMessage*invalMessages=NULL;
11361136
boolRelcacheInitFileInval= false;
11371137
boolwrote_xlog;
1138+
boolcommitted= false;
11381139

11391140
/* Get data needed for commit record */
11401141
nrels=smgrGetPendingDeletes(true,&rels);
@@ -1273,8 +1274,9 @@ RecordTransactionCommit(void)
12731274
/*
12741275
* Now we may update the CLOG, if we wrote a COMMIT record above
12751276
*/
1276-
if (markXidCommitted)
1277-
TransactionIdCommitTree(xid,nchildren,children);
1277+
if (markXidCommitted) {
1278+
committed=TransactionIdCommitTree(xid,nchildren,children);
1279+
}
12781280
}
12791281
else
12801282
{
@@ -1296,8 +1298,9 @@ RecordTransactionCommit(void)
12961298
* XLOG. Instead, we store the LSN up to which the XLOG must be
12971299
* flushed before the CLOG may be updated.
12981300
*/
1299-
if (markXidCommitted)
1300-
TransactionIdAsyncCommitTree(xid,nchildren,children,XactLastRecEnd);
1301+
if (markXidCommitted) {
1302+
committed=TransactionIdAsyncCommitTree(xid,nchildren,children,XactLastRecEnd);
1303+
}
13011304
}
13021305

13031306
/*
@@ -1308,6 +1311,9 @@ RecordTransactionCommit(void)
13081311
{
13091312
MyPgXact->delayChkpt= false;
13101313
END_CRIT_SECTION();
1314+
if (!committed) {
1315+
elog(ERROR,"Transaction commit rejected by XTM");
1316+
}
13111317
}
13121318

13131319
/* Compute latestXid while we have the child XIDs handy */
@@ -5310,6 +5316,7 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
53105316
TransactionIdmax_xid;
53115317
inti;
53125318
TimestampTzcommit_time;
5319+
boolcommitted;
53135320

53145321
max_xid=TransactionIdLatest(xid,parsed->nsubxacts,parsed->subxacts);
53155322

@@ -5345,7 +5352,7 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
53455352
/*
53465353
* Mark the transaction committed in pg_clog.
53475354
*/
5348-
TransactionIdCommitTree(xid,parsed->nsubxacts,parsed->subxacts);
5355+
committed=TransactionIdCommitTree(xid,parsed->nsubxacts,parsed->subxacts);
53495356
}
53505357
else
53515358
{
@@ -5369,8 +5376,8 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
53695376
* bits set on changes made by transactions that haven't yet
53705377
* recovered. It's unlikely but it's good to be safe.
53715378
*/
5372-
TransactionIdAsyncCommitTree(
5373-
xid,parsed->nsubxacts,parsed->subxacts,lsn);
5379+
committed=TransactionIdAsyncCommitTree(
5380+
xid,parsed->nsubxacts,parsed->subxacts,lsn);
53745381

53755382
/*
53765383
* We must mark clog before we update the ProcArray.
@@ -5397,7 +5404,9 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
53975404
*/
53985405
StandbyReleaseLockTree(xid,0,NULL);
53995406
}
5400-
5407+
if (!committed) {
5408+
elog(NOTICE,"XTM rejected recovert of tran saction %u",xid);
5409+
}
54015410
if (parsed->xinfo&XACT_XINFO_HAS_ORIGIN)
54025411
{
54035412
/* recover apply progress */

‎src/backend/storage/lmgr/deadlock.c‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ DeadLockCheck(PGPROC *proc)
269269
elseif (blocking_autovacuum_proc!=NULL)
270270
returnDS_BLOCKED_BY_AUTOVACUUM;
271271
else
272-
returnTM->DetectGlobalDeadLock() ?DS_DISTRIBUTED_DEADLOCK :DS_NO_DEADLOCK;
272+
returnTM->DetectGlobalDeadLock(proc) ?DS_DISTRIBUTED_DEADLOCK :DS_NO_DEADLOCK;
273273
}
274274

275275
/*

‎src/include/access/clog.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ typedef int XidStatus;
3030
#defineTRANSACTION_STATUS_UNKNOWN 0x03
3131

3232

33-
externvoidTransactionIdSetTreeStatus(TransactionIdxid,intnsubxids,
34-
TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn);
33+
externboolTransactionIdSetTreeStatus(TransactionIdxid,intnsubxids,
34+
TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn);
3535
externXidStatusTransactionIdGetStatus(TransactionIdxid,XLogRecPtr*lsn);
3636

3737
externSizeCLOGShmemBuffers(void);

‎src/include/access/transam.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ extern bool TransactionIdDidCommit(TransactionId transactionId);
157157
externboolTransactionIdDidAbort(TransactionIdtransactionId);
158158
externboolTransactionIdIsKnownCompleted(TransactionIdtransactionId);
159159
externvoidTransactionIdAbort(TransactionIdtransactionId);
160-
externvoidTransactionIdCommitTree(TransactionIdxid,intnxids,TransactionId*xids);
161-
externvoidTransactionIdAsyncCommitTree(TransactionIdxid,intnxids,TransactionId*xids,XLogRecPtrlsn);
160+
externboolTransactionIdCommitTree(TransactionIdxid,intnxids,TransactionId*xids);
161+
externboolTransactionIdAsyncCommitTree(TransactionIdxid,intnxids,TransactionId*xids,XLogRecPtrlsn);
162162
externvoidTransactionIdAbortTree(TransactionIdxid,intnxids,TransactionId*xids);
163163
externboolTransactionIdPrecedes(TransactionIdid1,TransactionIdid2);
164164
externboolTransactionIdPrecedesOrEquals(TransactionIdid1,TransactionIdid2);

‎src/include/access/xtm.h‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ typedef struct
2222
XidStatus (*GetTransactionStatus)(TransactionIdxid,XLogRecPtr*lsn);
2323

2424
/* Set current transaction status (encapsulation of TransactionIdGetStatus in clog.c) */
25-
void (*SetTransactionStatus)(TransactionIdxid,intnsubxids,TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn);
25+
bool (*SetTransactionStatus)(TransactionIdxid,intnsubxids,TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn);
2626

2727
/* Get current transaction snaphot (encapsulation of GetSnapshotData in procarray.c) */
2828
Snapshot (*GetSnapshot)(Snapshotsnapshot);
@@ -55,8 +55,8 @@ extern TransactionManager PgTM; /* Standard PostgreSQL transaction manager */
5555
/* Standard PostgreSQL function implementing TM interface */
5656
externboolPgXidInMVCCSnapshot(TransactionIdxid,Snapshotsnapshot);
5757

58-
externvoidPgTransactionIdSetTreeStatus(TransactionIdxid,intnsubxids,
59-
TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn);
58+
externboolPgTransactionIdSetTreeStatus(TransactionIdxid,intnsubxids,
59+
TransactionId*subxids,XidStatusstatus,XLogRecPtrlsn);
6060
externXidStatusPgTransactionIdGetStatus(TransactionIdxid,XLogRecPtr*lsn);
6161

6262
externSnapshotPgGetSnapshotData(Snapshotsnapshot);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp