@@ -326,13 +326,41 @@ static char const* MtmGetName(void)
326326 * -------------------------------------------
327327 */
328328
329+ static MtmTransState * MtmXidMapLookup (TransactionId xid )
330+ {
331+ MtmTransState * ts ;
332+ if (TransactionIdPrecedes (xid , Mtm -> oldestXid )) {
333+ Mtm -> xidCacheSkips += 1 ;
334+ return NULL ;
335+ }
336+ ts = Mtm -> xidCache [xid % MULTIMASTER_XID_MAP_SIZE ];
337+ if (ts != NULL && ts -> xid == xid ) {
338+ Mtm -> xidCacheHits += 1 ;
339+ return ts ;
340+ }
341+ Mtm -> xidCacheMisses += 1 ;
342+ ts = hash_search (MtmXid2State , & xid , HASH_FIND , NULL );
343+ if (ts != NULL ) {
344+ Mtm -> xidCache [xid % MULTIMASTER_XID_MAP_SIZE ] = ts ;
345+ }
346+ return ts ;
347+ }
348+
349+ static void MtmXidMapRemove (TransactionId xid )
350+ {
351+ MtmTransState * ts = hash_search (MtmXid2State , & xid , HASH_REMOVE , NULL );
352+ if (Mtm -> xidCache [xid % MULTIMASTER_XID_MAP_SIZE ] == ts ) {
353+ Mtm -> xidCache [xid % MULTIMASTER_XID_MAP_SIZE ] = NULL ;
354+ }
355+ }
356+
329357csn_t MtmTransactionSnapshot (TransactionId xid )
330358{
331359 MtmTransState * ts ;
332360 csn_t snapshot = INVALID_CSN ;
333361
334362 MtmLock (LW_SHARED );
335- ts = hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
363+ ts = MtmXidMapLookup ( xid );
336364 if (ts != NULL && !ts -> isLocal ) {
337365 snapshot = ts -> snapshot ;
338366 }
@@ -384,7 +412,7 @@ bool MtmXidInMVCCSnapshot(TransactionId xid, Snapshot snapshot)
384412#endif
385413 while (true)
386414 {
387- MtmTransState * ts = ( MtmTransState * ) hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
415+ MtmTransState * ts = MtmXidMapLookup ( xid );
388416 if (ts != NULL && ts -> status != TRANSACTION_STATUS_IN_PROGRESS )
389417 {
390418 if (ts -> csn > MtmTx .snapshot ) {
@@ -455,7 +483,7 @@ MtmAdjustOldestXid(TransactionId xid)
455483 int i ;
456484 csn_t oldestSnapshot = INVALID_CSN ;
457485 MtmTransState * prev = NULL ;
458- MtmTransState * ts = ( MtmTransState * ) hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
486+ MtmTransState * ts = MtmXidMapLookup ( xid );
459487 MTM_LOG2 ("%d: MtmAdjustOldestXid(%d): snapshot=%ld, csn=%ld, status=%d" , MyProcPid , xid , ts != NULL ? ts -> snapshot : 0 , ts != NULL ? ts -> csn : 0 , ts != NULL ? ts -> status : -1 );
460488 Mtm -> gcCount = 0 ;
461489 if (ts != NULL ) {
@@ -480,7 +508,7 @@ MtmAdjustOldestXid(TransactionId xid)
480508 {
481509 if (prev != NULL ) {
482510 /* Remove information about too old transactions */
483- hash_search ( MtmXid2State , & prev -> xid , HASH_REMOVE , NULL );
511+ MtmXidMapRemove ( prev -> xid );
484512 }
485513 }
486514 }
@@ -657,6 +685,7 @@ MtmCreateTransState(MtmCurrentTrans* x)
657685 bool found ;
658686 MtmTransState * ts = hash_search (MtmXid2State , & x -> xid , HASH_ENTER , & found );
659687 if (!found ) {
688+ Mtm -> xidCache [x -> xid % MULTIMASTER_XID_MAP_SIZE ] = ts ;
660689 ts -> status = TRANSACTION_STATUS_IN_PROGRESS ;
661690 ts -> snapshot = x -> snapshot ;
662691 ts -> isLocal = true;
@@ -743,7 +772,7 @@ MtmPostPrepareTransaction(MtmCurrentTrans* x)
743772 MtmTransState * ts ;
744773
745774 MtmLock (LW_EXCLUSIVE );
746- ts = hash_search ( MtmXid2State , & x -> xid , HASH_FIND , NULL );
775+ ts = MtmXidMapLookup ( x -> xid );
747776 Assert (ts != NULL );
748777
749778 if (!MtmIsCoordinator (ts ) || Mtm -> status == MTM_RECOVERY ) {
@@ -810,7 +839,7 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
810839 MtmTransState * ts = NULL ;
811840 MtmLock (LW_EXCLUSIVE );
812841 if (x -> isPrepared ) {
813- ts = hash_search ( MtmXid2State , & x -> xid , HASH_FIND , NULL );
842+ ts = MtmXidMapLookup ( x -> xid );
814843 Assert (ts != NULL );
815844 } else if (x -> gid [0 ]) {
816845 MtmTransMap * tm = (MtmTransMap * )hash_search (MtmGid2State , x -> gid , HASH_REMOVE , NULL );
@@ -858,7 +887,7 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
858887 }
859888 MtmSendNotificationMessage (ts , MSG_ABORTED ); /* send notification to coordinator */
860889 } else if (x -> status == TRANSACTION_STATUS_ABORTED && x -> isReplicated && !x -> isPrepared ) {
861- hash_search ( MtmXid2State , & x -> xid , HASH_REMOVE , NULL );
890+ MtmXidMapRemove ( x -> xid );
862891 }
863892 MtmUnlock ();
864893 }
@@ -960,7 +989,7 @@ csn_t MtmGetTransactionCSN(TransactionId xid)
960989 MtmTransState * ts ;
961990 csn_t csn ;
962991 MtmLock (LW_SHARED );
963- ts = ( MtmTransState * ) hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
992+ ts = MtmXidMapLookup ( xid );
964993 Assert (ts != NULL );
965994 csn = ts -> csn ;
966995 MtmUnlock ();
@@ -1207,6 +1236,9 @@ MtmBuildConnectivityMatrix(nodemask_t* matrix, bool nowait)
12071236 if (i + 1 != MtmNodeId ) {
12081237 void * data = RaftableGet (psprintf ("node-mask-%d" , i + 1 ), NULL , NULL , nowait );
12091238 if (data == NULL ) {
1239+ if (MtmUseRaftable ) {
1240+ elog (WARNING , "Failed to get connectivity matrix from Raftable" );
1241+ }
12101242 return false;
12111243 }
12121244 matrix [i ] = * (nodemask_t * )data ;
@@ -1491,6 +1523,8 @@ static void MtmInitialize()
14911523 Mtm -> nodes [i ].con = MtmConnections [i ];
14921524 Mtm -> nodes [i ].flushPos = 0 ;
14931525 }
1526+ Mtm -> xidCache = (MtmTransState * * )ShmemAlloc (MULTIMASTER_XID_MAP_SIZE * sizeof (MtmTransState * ));
1527+ memset (Mtm -> xidCache , 0 , MULTIMASTER_XID_MAP_SIZE * sizeof (MtmTransState * ));
14941528 PGSemaphoreCreate (& Mtm -> votingSemaphore );
14951529 PGSemaphoreReset (& Mtm -> votingSemaphore );
14961530 SpinLockInit (& Mtm -> spinlock );
@@ -2311,7 +2345,7 @@ mtm_get_csn(PG_FUNCTION_ARGS)
23112345 csn_t csn = INVALID_CSN ;
23122346
23132347 MtmLock (LW_SHARED );
2314- ts = hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
2348+ ts = MtmXidMapLookup ( xid );
23152349 if (ts != NULL ) {
23162350 csn = ts -> csn ;
23172351 }
@@ -3036,7 +3070,7 @@ MtmGetGtid(TransactionId xid, GlobalTransactionId* gtid)
30363070 MtmTransState * ts ;
30373071
30383072 MtmLock (LW_SHARED );
3039- ts = ( MtmTransState * ) hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
3073+ ts = MtmXidMapLookup ( xid );
30403074 if (ts != NULL ) {
30413075 * gtid = ts -> gtid ;
30423076 } else {
@@ -3121,6 +3155,9 @@ MtmDetectGlobalDeadLock(PGPROC* proc)
31213155 size_t size ;
31223156 void * data = RaftableGet (psprintf ("lock-graph-%d" , i + 1 ), & size , NULL , true);
31233157 if (data == NULL ) {
3158+ if (MtmUseRaftable ) {
3159+ elog (WARNING , "Failed to get deadlock graph from Raftable" );
3160+ }
31243161 return true; /* If using Raftable is disabled */
31253162 } else {
31263163 MtmGraphAdd (& graph , (GlobalTransactionId * )data , size /sizeof (GlobalTransactionId ));
0 commit comments