@@ -131,7 +131,7 @@ static TransactionManager MtmTM = {
131
131
MtmGetName
132
132
};
133
133
134
- static char const * const MtmNodeStatusMnem [] =
134
+ char const * const MtmNodeStatusMnem [] =
135
135
{
136
136
"Intialization" ,
137
137
"Offline" ,
@@ -602,7 +602,7 @@ static void MtmPrecommitTransaction(MtmCurrentTrans* x)
602
602
x -> xid = GetCurrentTransactionId ();
603
603
604
604
if (dtm -> disabledNodeMask != 0 ) {
605
- MtmUpdateClusterStatus ( );
605
+ MtmRefreshClusterStatus (true );
606
606
if (dtm -> status != MTM_ONLINE ) {
607
607
elog (ERROR , "Abort current transaction because this cluster node is not online" );
608
608
}
@@ -1096,7 +1096,7 @@ _PG_fini(void)
1096
1096
*/
1097
1097
1098
1098
1099
- void MtmClusterSwitchMode (MtmNodeStatus mode )
1099
+ void MtmSwitchClusterMode (MtmNodeStatus mode )
1100
1100
{
1101
1101
dtm -> status = mode ;
1102
1102
elog (WARNING , "Switch to %s mode" , MtmNodeStatusMnem [mode ]);
@@ -1121,7 +1121,8 @@ void MtmJoinTransaction(GlobalTransactionId* gtid, csn_t globalSnapshot)
1121
1121
Assert (dtm -> status == MTM_RECOVERY );
1122
1122
} else if (dtm -> status == MTM_RECOVERY ) {
1123
1123
/* When recovery is completed we get normal transaction ID and switch to normal mode */
1124
- MtmClusterSwitchMode (MTM_ONLINE );
1124
+ dtm -> recoverySlot = 0 ;
1125
+ MtmSwitchClusterMode (MTM_ONLINE );
1125
1126
}
1126
1127
dtmTx .gtid = * gtid ;
1127
1128
dtmTx .xid = GetCurrentTransactionId ();
@@ -1137,9 +1138,8 @@ void MtmReceiverStarted(int nodeId)
1137
1138
if (!BIT_CHECK (dtm -> pglogicalNodeMask , nodeId - 1 )) {
1138
1139
BIT_SET (dtm -> pglogicalNodeMask , nodeId - 1 );
1139
1140
if (++ dtm -> nReceivers == dtm -> nNodes - 1 ) {
1140
- elog (WARNING , "All receivers are started, switch to normal mode" );
1141
1141
Assert (dtm -> status == MTM_CONNECTED );
1142
- dtm -> status = MTM_ONLINE ;
1142
+ MtmSwitchClusterMode ( MTM_OFFLINE ) ;
1143
1143
}
1144
1144
}
1145
1145
SpinLockRelease (& dtm -> spinlock );
@@ -1632,14 +1632,14 @@ MtmDetectGlobalDeadLock(PGPROC* proc)
1632
1632
1633
1633
ByteBufferAlloc (& buf );
1634
1634
EnumerateLocks (MtmSerializeLock , & buf );
1635
- PaxosSet (psprintf ("lock-graph-%d" , MtmNodeId ), buf .data , buf .used );
1635
+ PaxosSet (psprintf ("lock-graph-%d" , MtmNodeId ), buf .data , buf .used , true );
1636
1636
MtmGraphInit (& graph );
1637
1637
MtmGraphAdd (& graph , (GlobalTransactionId * )buf .data , buf .used /sizeof (GlobalTransactionId ));
1638
1638
ByteBufferFree (& buf );
1639
1639
for (i = 0 ; i < MtmNodes ; i ++ ) {
1640
1640
if (i + 1 != MtmNodeId && !BIT_CHECK (dtm -> disabledNodeMask , i )) {
1641
1641
int size ;
1642
- void * data = PaxosGet (psprintf ("lock-graph-%d" , i + 1 ), & size , NULL );
1642
+ void * data = PaxosGet (psprintf ("lock-graph-%d" , i + 1 ), & size , NULL , true );
1643
1643
if (data == NULL ) {
1644
1644
hasDeadlock = true; /* Just temporary hack until no Paxos */
1645
1645
} else {
@@ -1655,12 +1655,12 @@ MtmDetectGlobalDeadLock(PGPROC* proc)
1655
1655
}
1656
1656
1657
1657
static void
1658
- MtmBuildConnectivityMatrix (nodemask_t * matrix )
1658
+ MtmBuildConnectivityMatrix (nodemask_t * matrix , bool nowait )
1659
1659
{
1660
1660
int i , j , n = MtmNodes ;
1661
1661
for (i = 0 ; i < n ; i ++ ) {
1662
1662
if (i + 1 != MtmNodeId ) {
1663
- void * data = PaxosGet (psprintf ("node-mask-%d" , i + 1 ), NULL , NULL );
1663
+ void * data = PaxosGet (psprintf ("node-mask-%d" , i + 1 ), NULL , NULL , nowait );
1664
1664
matrix [i ] = * (nodemask_t * )data ;
1665
1665
} else {
1666
1666
matrix [i ] = dtm -> connectivityMask ;
@@ -1678,14 +1678,14 @@ MtmBuildConnectivityMatrix(nodemask_t* matrix)
1678
1678
* Build connectivity graph, find clique in it and extend disabledNodeMask by nodes not included in clique.
1679
1679
* This function returns false if current node is excluded from cluster, true otherwise
1680
1680
*/
1681
- void MtmUpdateClusterStatus ( void )
1681
+ void MtmRefreshClusterStatus ( bool nowait )
1682
1682
{
1683
1683
nodemask_t mask , clique ;
1684
1684
nodemask_t matrix [MAX_NODES ];
1685
1685
int clique_size ;
1686
1686
int i ;
1687
1687
1688
- MtmBuildConnectivityMatrix (matrix );
1688
+ MtmBuildConnectivityMatrix (matrix , nowait );
1689
1689
1690
1690
clique = MtmFindMaxClique (matrix , MtmNodes , & clique_size );
1691
1691
if (clique_size >= MtmNodes /2 + 1 ) { /* have quorum */
@@ -1708,11 +1708,11 @@ void MtmUpdateClusterStatus(void)
1708
1708
if (BIT_CHECK (dtm -> disabledNodeMask , MtmNodeId - 1 )) {
1709
1709
if (dtm -> status == MTM_ONLINE ) {
1710
1710
/* I was excluded from cluster:( */
1711
- MtmClusterSwitchMode (MTM_OFFLINE );
1711
+ MtmSwitchClusterMode (MTM_OFFLINE );
1712
1712
}
1713
1713
} else if (dtm -> status == MTM_OFFLINE ) {
1714
1714
/* Should we somehow restart logical receivers? */
1715
- MtmClusterSwitchMode (MTM_RECOVERY );
1715
+ MtmSwitchClusterMode (MTM_RECOVERY );
1716
1716
}
1717
1717
} else {
1718
1718
elog (WARNING , "Clique %lx has no quorum" , clique );
@@ -1722,30 +1722,30 @@ void MtmUpdateClusterStatus(void)
1722
1722
void MtmOnNodeDisconnect (int nodeId )
1723
1723
{
1724
1724
BIT_SET (dtm -> connectivityMask , nodeId - 1 );
1725
- PaxosSet (psprintf ("node-mask-%d" , MtmNodeId ), & dtm -> connectivityMask , sizeof dtm -> connectivityMask );
1725
+ PaxosSet (psprintf ("node-mask-%d" , MtmNodeId ), & dtm -> connectivityMask , sizeof dtm -> connectivityMask , false );
1726
1726
1727
1727
/* Wait more than socket KEEPALIVE timeout to let other nodes update their statuses */
1728
1728
MtmSleep (MtmKeepaliveTimeout );
1729
1729
1730
- MtmUpdateClusterStatus ( );
1730
+ MtmRefreshClusterStatus (false );
1731
1731
}
1732
1732
1733
1733
void MtmOnNodeConnect (int nodeId )
1734
1734
{
1735
1735
BIT_CLEAR (dtm -> connectivityMask , nodeId - 1 );
1736
- PaxosSet (psprintf ("node-mask-%d" , MtmNodeId ), & dtm -> connectivityMask , sizeof dtm -> connectivityMask );
1736
+ PaxosSet (psprintf ("node-mask-%d" , MtmNodeId ), & dtm -> connectivityMask , sizeof dtm -> connectivityMask , false );
1737
1737
}
1738
1738
1739
1739
/*
1740
1740
* Paxos function stubs (until them are miplemented)
1741
1741
*/
1742
- void * PaxosGet (char const * key , int * size , PaxosTimestamp * ts )
1742
+ void * PaxosGet (char const * key , int * size , PaxosTimestamp * ts , bool nowait )
1743
1743
{
1744
1744
if (size != NULL ) {
1745
1745
* size = 0 ;
1746
1746
}
1747
1747
return NULL ;
1748
1748
}
1749
1749
1750
- void PaxosSet (char const * key , void const * value , int size )
1750
+ void PaxosSet (char const * key , void const * value , int size , bool nowait )
1751
1751
{}
0 commit comments