Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite6d6f56

Browse files
committed
take major node config into account
1 parent0146bca commite6d6f56

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+
boolisEnabledState;
8182
intnEnabled=countZeroBits(Mtm->disabledNodeMask,Mtm->nAllNodes);
8283
intnConnected=countZeroBits(SELF_CONNECTIVITY_MASK,Mtm->nAllNodes);
8384
intnReceivers=Mtm->nAllNodes-countZeroBits(Mtm->pglogicalReceiverMask,Mtm->nAllNodes);
8485
intnSenders=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
caseMTM_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+
defexecute(self,node_id,statements):
118+
con=psycopg2.connect(self.dsns[node_id])
119+
con.autocommit=True
120+
cur=con.cursor()
121+
forstatementinstatements:
122+
cur.execute(statement)
123+
cur.close()
124+
con.close()
125+
117126
defis_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
deftearDown(self):
5959
print('Finish test at ',datetime.datetime.utcnow())
6060

61-
deftest_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+
deftest_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)

[8]ページ先頭

©2009-2025 Movatter.jp