Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e6d6f56

Browse files
committed
take major node config into account
1 parent 0146bca commit e6d6f56

File tree

6 files changed

+45
-11
lines changed

6 files changed

+45
-11
lines changed

multimaster.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2916,7 +2916,7 @@ _PG_init(void)
29162916
NULL,
29172917
&MtmMajorNode,
29182918
false,
2919-
PGC_BACKEND,
2919+
PGC_SUSET,
29202920
0,
29212921
NULL,
29222922
NULL,

state.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,22 +78,28 @@ static void
7878
MtmCheckState(void)
7979
{
8080
// int nVotingNodes = MtmGetNumberOfVotingNodes();
81+
bool isEnabledState;
8182
int nEnabled = countZeroBits(Mtm->disabledNodeMask, Mtm->nAllNodes);
8283
int nConnected = countZeroBits(SELF_CONNECTIVITY_MASK, Mtm->nAllNodes);
8384
int nReceivers = Mtm->nAllNodes - countZeroBits(Mtm->pglogicalReceiverMask, Mtm->nAllNodes);
8485
int nSenders = Mtm->nAllNodes - countZeroBits(Mtm->pglogicalSenderMask, Mtm->nAllNodes);
8586

86-
MTM_LOG1("[STATE] Status = (disabled=%s, unaccessible=%s, clique=%s, receivers=%s, senders=%s, total=%i)",
87+
MTM_LOG1("[STATE] Status = (disabled=%s, unaccessible=%s, clique=%s, receivers=%s, senders=%s, total=%i, major=%d)",
8788
maskToString(Mtm->disabledNodeMask, Mtm->nAllNodes),
8889
maskToString(SELF_CONNECTIVITY_MASK, Mtm->nAllNodes),
8990
maskToString(Mtm->clique, Mtm->nAllNodes),
9091
maskToString(Mtm->pglogicalReceiverMask, Mtm->nAllNodes),
9192
maskToString(Mtm->pglogicalSenderMask, Mtm->nAllNodes),
92-
Mtm->nAllNodes);
93+
Mtm->nAllNodes,
94+
MtmMajorNode);
95+
96+
isEnabledState =
97+
( (nConnected >= Mtm->nAllNodes/2+1) /* majority */
98+
|| (nConnected == Mtm->nAllNodes/2 && MtmMajorNode) ) /* or half + major node */
99+
&& BIT_CHECK(Mtm->clique, MtmNodeId-1); /* in clique */
93100

94101
/* ANY -> MTM_DISABLED */
95-
if ( nConnected < Mtm->nAllNodes/2+1 ||
96-
!BIT_CHECK(Mtm->clique, MtmNodeId-1) )
102+
if (!isEnabledState)
97103
{
98104
BIT_SET(Mtm->disabledNodeMask, MtmNodeId-1);
99105
MtmSetClusterStatus(MTM_DISABLED);
@@ -103,8 +109,7 @@ MtmCheckState(void)
103109
switch (Mtm->status)
104110
{
105111
case MTM_DISABLED:
106-
if ( (nConnected >= Mtm->nAllNodes/2+1) && /* majority */
107-
BIT_CHECK(Mtm->clique, MtmNodeId-1) ) /* in clique */
112+
if (isEnabledState)
108113
{
109114
MtmSetClusterStatus(MTM_RECOVERY);
110115
return;
@@ -298,6 +303,7 @@ void MtmOnNodeDisconnect(int nodeId)
298303
MtmLock(LW_EXCLUSIVE);
299304
BIT_SET(SELF_CONNECTIVITY_MASK, nodeId-1);
300305
BIT_SET(Mtm->reconnectMask, nodeId-1);
306+
Mtm->nConfigChanges += 1;
301307
MtmCheckState();
302308
MtmUnlock();
303309

tests2/docker-entrypoint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ if [ "$1" = 'postgres' ]; then
6868
multimaster.ignore_tables_without_pk = 1
6969
multimaster.node_id = $NODE_ID
7070
multimaster.conn_strings = '$CONNSTRS'
71+
multimaster.major_node = $MAJOR
7172
multimaster.heartbeat_recv_timeout = 1100
7273
multimaster.heartbeat_send_timeout = 250
73-
multimaster.min_2pc_timeout = 100000000
7474
EOF
7575

7676
cat $PGDATA/postgresql.conf

tests2/lib/bank_client.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@ def initdb(self):
114114
cur.close()
115115
conn.close()
116116

117+
def execute(self, node_id, statements):
118+
con = psycopg2.connect(self.dsns[node_id])
119+
con.autocommit = True
120+
cur = con.cursor()
121+
for statement in statements:
122+
cur.execute(statement)
123+
cur.close()
124+
con.close()
125+
117126
def is_data_identic(self):
118127
hashes = set()
119128

tests2/support/two_nodes.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ services:
1212
POSTGRES_USER: 'pg'
1313
POSTGRES_DB: 'regression'
1414
NODE_ID: 1
15+
MAJOR: 'on'
1516
CONNSTRS: >-
1617
dbname=regression user=pg host=node1,
1718
dbname=regression user=pg host=node2
@@ -28,6 +29,7 @@ services:
2829
POSTGRES_USER: 'pg'
2930
POSTGRES_DB: 'regression'
3031
NODE_ID: 2
32+
MAJOR: 'off'
3133
CONNSTRS: >-
3234
dbname=regression user=pg host=node1,
3335
dbname=regression user=pg host=node2

tests2/test_major.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,29 @@ def setUp(self):
5858
def tearDown(self):
5959
print('Finish test at ',datetime.datetime.utcnow())
6060

61-
def test_node_partition(self):
62-
print('### test_node_partition ###')
61+
# def test_partition(self):
62+
# print('### test_node_partition ###')
63+
64+
# aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'))
65+
66+
# self.assertNoCommits(aggs_failure)
67+
# self.assertIsolation(aggs_failure)
68+
69+
# self.assertCommits(aggs)
70+
# self.assertIsolation(aggs)
71+
72+
def test_partition_major(self):
73+
print('### test_partition_major ###')
74+
75+
# MajorTest.client.execute(0, [
76+
# 'alter system set multimaster.major_node to true',
77+
# 'select pg_reload_conf();'
78+
# ])
6379

6480
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'))
6581

66-
self.assertNoCommits(aggs_failure)
82+
self.assertCommits(aggs_failure[:1])
83+
self.assertNoCommits(aggs_failure[1:])
6784
self.assertIsolation(aggs_failure)
6885

6986
self.assertCommits(aggs)

0 commit comments

Comments
 (0)