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

Commit5a1dfde

Browse files
committed
Make use FullTransactionId in 2PC filenames
Switch from using TransactionId to FullTransactionId in naming of 2PC files.Transaction state file in the pg_twophase directory now have extra 8 bytes inthe name to address an epoch of a given xid.Author: Maxim Orlov, Aleksander Alekseev, Alexander Korotkov, Teodor SigaevAuthor: Nikita Glukhov, Pavel Borisov, Yura SokolovReviewed-by: Jacob Champion, Heikki Linnakangas, Alexander KorotkovReviewed-by: Japin Li, Pavel Borisov, Tom Lane, Peter Eisentraut, Andres FreundReviewed-by: Andrey Borodin, Dilip Kumar, Aleksander AlekseevDiscussion:https://postgr.es/m/CACG%3DezZe1NQSCnfHOr78AtAZxJZeCvxrts0ygrxYwe%3DpyyjVWA%40mail.gmail.comDiscussion:https://postgr.es/m/CAJ7c6TPDOYBYrnCAeyndkBktO0WG2xSdYduTF0nxq%2BvfkmTF5Q%40mail.gmail.com
1 parent2cdf131 commit5a1dfde

File tree

1 file changed

+45
-5
lines changed

1 file changed

+45
-5
lines changed

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

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -942,8 +942,46 @@ TwoPhaseGetDummyProc(TransactionId xid, bool lock_held)
942942
/* State file support*/
943943
/************************************************************************/
944944

945-
#defineTwoPhaseFilePath(path,xid) \
946-
snprintf(path, MAXPGPATH, TWOPHASE_DIR "/%08X", xid)
945+
/*
946+
* Compute the FullTransactionId for the given TransactionId.
947+
*
948+
* The wrap logic is safe here because the span of active xids cannot exceed one
949+
* epoch at any given time.
950+
*/
951+
staticinlineFullTransactionId
952+
AdjustToFullTransactionId(TransactionIdxid)
953+
{
954+
FullTransactionIdnextFullXid;
955+
TransactionIdnextXid;
956+
uint32epoch;
957+
958+
Assert(TransactionIdIsValid(xid));
959+
960+
LWLockAcquire(XidGenLock,LW_SHARED);
961+
nextFullXid=ShmemVariableCache->nextXid;
962+
LWLockRelease(XidGenLock);
963+
964+
nextXid=XidFromFullTransactionId(nextFullXid);
965+
epoch=EpochFromFullTransactionId(nextFullXid);
966+
if (unlikely(xid>nextXid))
967+
{
968+
/* Wraparound occured, must be from a prev epoch. */
969+
Assert(epoch>0);
970+
epoch--;
971+
}
972+
973+
returnFullTransactionIdFromEpochAndXid(epoch,xid);
974+
}
975+
976+
staticinlineint
977+
TwoPhaseFilePath(char*path,TransactionIdxid)
978+
{
979+
FullTransactionIdfxid=AdjustToFullTransactionId(xid);
980+
981+
returnsnprintf(path,MAXPGPATH,TWOPHASE_DIR"/%08X%08X",
982+
EpochFromFullTransactionId(fxid),
983+
XidFromFullTransactionId(fxid));
984+
}
947985

948986
/*
949987
* 2PC state file format:
@@ -1882,13 +1920,15 @@ restoreTwoPhaseData(void)
18821920
cldir=AllocateDir(TWOPHASE_DIR);
18831921
while ((clde=ReadDir(cldir,TWOPHASE_DIR))!=NULL)
18841922
{
1885-
if (strlen(clde->d_name)==8&&
1886-
strspn(clde->d_name,"0123456789ABCDEF")==8)
1923+
if (strlen(clde->d_name)==16&&
1924+
strspn(clde->d_name,"0123456789ABCDEF")==16)
18871925
{
18881926
TransactionIdxid;
1927+
FullTransactionIdfxid;
18891928
char*buf;
18901929

1891-
xid= (TransactionId)strtoul(clde->d_name,NULL,16);
1930+
fxid=FullTransactionIdFromU64(strtou64(clde->d_name,NULL,16));
1931+
xid=XidFromFullTransactionId(fxid);
18921932

18931933
buf=ProcessTwoPhaseBuffer(xid,InvalidXLogRecPtr,
18941934
true, false, false);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp