@@ -326,13 +326,41 @@ static char const* MtmGetName(void)
326
326
* -------------------------------------------
327
327
*/
328
328
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
+
329
357
csn_t MtmTransactionSnapshot (TransactionId xid )
330
358
{
331
359
MtmTransState * ts ;
332
360
csn_t snapshot = INVALID_CSN ;
333
361
334
362
MtmLock (LW_SHARED );
335
- ts = hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
363
+ ts = MtmXidMapLookup ( xid );
336
364
if (ts != NULL && !ts -> isLocal ) {
337
365
snapshot = ts -> snapshot ;
338
366
}
@@ -384,7 +412,7 @@ bool MtmXidInMVCCSnapshot(TransactionId xid, Snapshot snapshot)
384
412
#endif
385
413
while (true)
386
414
{
387
- MtmTransState * ts = ( MtmTransState * ) hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
415
+ MtmTransState * ts = MtmXidMapLookup ( xid );
388
416
if (ts != NULL && ts -> status != TRANSACTION_STATUS_IN_PROGRESS )
389
417
{
390
418
if (ts -> csn > MtmTx .snapshot ) {
@@ -455,7 +483,7 @@ MtmAdjustOldestXid(TransactionId xid)
455
483
int i ;
456
484
csn_t oldestSnapshot = INVALID_CSN ;
457
485
MtmTransState * prev = NULL ;
458
- MtmTransState * ts = ( MtmTransState * ) hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
486
+ MtmTransState * ts = MtmXidMapLookup ( xid );
459
487
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 );
460
488
Mtm -> gcCount = 0 ;
461
489
if (ts != NULL ) {
@@ -480,7 +508,7 @@ MtmAdjustOldestXid(TransactionId xid)
480
508
{
481
509
if (prev != NULL ) {
482
510
/* Remove information about too old transactions */
483
- hash_search ( MtmXid2State , & prev -> xid , HASH_REMOVE , NULL );
511
+ MtmXidMapRemove ( prev -> xid );
484
512
}
485
513
}
486
514
}
@@ -657,6 +685,7 @@ MtmCreateTransState(MtmCurrentTrans* x)
657
685
bool found ;
658
686
MtmTransState * ts = hash_search (MtmXid2State , & x -> xid , HASH_ENTER , & found );
659
687
if (!found ) {
688
+ Mtm -> xidCache [x -> xid % MULTIMASTER_XID_MAP_SIZE ] = ts ;
660
689
ts -> status = TRANSACTION_STATUS_IN_PROGRESS ;
661
690
ts -> snapshot = x -> snapshot ;
662
691
ts -> isLocal = true;
@@ -743,7 +772,7 @@ MtmPostPrepareTransaction(MtmCurrentTrans* x)
743
772
MtmTransState * ts ;
744
773
745
774
MtmLock (LW_EXCLUSIVE );
746
- ts = hash_search ( MtmXid2State , & x -> xid , HASH_FIND , NULL );
775
+ ts = MtmXidMapLookup ( x -> xid );
747
776
Assert (ts != NULL );
748
777
749
778
if (!MtmIsCoordinator (ts ) || Mtm -> status == MTM_RECOVERY ) {
@@ -810,7 +839,7 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
810
839
MtmTransState * ts = NULL ;
811
840
MtmLock (LW_EXCLUSIVE );
812
841
if (x -> isPrepared ) {
813
- ts = hash_search ( MtmXid2State , & x -> xid , HASH_FIND , NULL );
842
+ ts = MtmXidMapLookup ( x -> xid );
814
843
Assert (ts != NULL );
815
844
} else if (x -> gid [0 ]) {
816
845
MtmTransMap * tm = (MtmTransMap * )hash_search (MtmGid2State , x -> gid , HASH_REMOVE , NULL );
@@ -858,7 +887,7 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
858
887
}
859
888
MtmSendNotificationMessage (ts , MSG_ABORTED ); /* send notification to coordinator */
860
889
} else if (x -> status == TRANSACTION_STATUS_ABORTED && x -> isReplicated && !x -> isPrepared ) {
861
- hash_search ( MtmXid2State , & x -> xid , HASH_REMOVE , NULL );
890
+ MtmXidMapRemove ( x -> xid );
862
891
}
863
892
MtmUnlock ();
864
893
}
@@ -960,7 +989,7 @@ csn_t MtmGetTransactionCSN(TransactionId xid)
960
989
MtmTransState * ts ;
961
990
csn_t csn ;
962
991
MtmLock (LW_SHARED );
963
- ts = ( MtmTransState * ) hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
992
+ ts = MtmXidMapLookup ( xid );
964
993
Assert (ts != NULL );
965
994
csn = ts -> csn ;
966
995
MtmUnlock ();
@@ -1207,6 +1236,9 @@ MtmBuildConnectivityMatrix(nodemask_t* matrix, bool nowait)
1207
1236
if (i + 1 != MtmNodeId ) {
1208
1237
void * data = RaftableGet (psprintf ("node-mask-%d" , i + 1 ), NULL , NULL , nowait );
1209
1238
if (data == NULL ) {
1239
+ if (MtmUseRaftable ) {
1240
+ elog (WARNING , "Failed to get connectivity matrix from Raftable" );
1241
+ }
1210
1242
return false;
1211
1243
}
1212
1244
matrix [i ] = * (nodemask_t * )data ;
@@ -1491,6 +1523,8 @@ static void MtmInitialize()
1491
1523
Mtm -> nodes [i ].con = MtmConnections [i ];
1492
1524
Mtm -> nodes [i ].flushPos = 0 ;
1493
1525
}
1526
+ Mtm -> xidCache = (MtmTransState * * )ShmemAlloc (MULTIMASTER_XID_MAP_SIZE * sizeof (MtmTransState * ));
1527
+ memset (Mtm -> xidCache , 0 , MULTIMASTER_XID_MAP_SIZE * sizeof (MtmTransState * ));
1494
1528
PGSemaphoreCreate (& Mtm -> votingSemaphore );
1495
1529
PGSemaphoreReset (& Mtm -> votingSemaphore );
1496
1530
SpinLockInit (& Mtm -> spinlock );
@@ -2311,7 +2345,7 @@ mtm_get_csn(PG_FUNCTION_ARGS)
2311
2345
csn_t csn = INVALID_CSN ;
2312
2346
2313
2347
MtmLock (LW_SHARED );
2314
- ts = hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
2348
+ ts = MtmXidMapLookup ( xid );
2315
2349
if (ts != NULL ) {
2316
2350
csn = ts -> csn ;
2317
2351
}
@@ -3036,7 +3070,7 @@ MtmGetGtid(TransactionId xid, GlobalTransactionId* gtid)
3036
3070
MtmTransState * ts ;
3037
3071
3038
3072
MtmLock (LW_SHARED );
3039
- ts = ( MtmTransState * ) hash_search ( MtmXid2State , & xid , HASH_FIND , NULL );
3073
+ ts = MtmXidMapLookup ( xid );
3040
3074
if (ts != NULL ) {
3041
3075
* gtid = ts -> gtid ;
3042
3076
} else {
@@ -3121,6 +3155,9 @@ MtmDetectGlobalDeadLock(PGPROC* proc)
3121
3155
size_t size ;
3122
3156
void * data = RaftableGet (psprintf ("lock-graph-%d" , i + 1 ), & size , NULL , true);
3123
3157
if (data == NULL ) {
3158
+ if (MtmUseRaftable ) {
3159
+ elog (WARNING , "Failed to get deadlock graph from Raftable" );
3160
+ }
3124
3161
return true; /* If using Raftable is disabled */
3125
3162
} else {
3126
3163
MtmGraphAdd (& graph , (GlobalTransactionId * )data , size /sizeof (GlobalTransactionId ));
0 commit comments