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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy