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

Commit 2083132

Browse files
committed
fixes for major mode
1 parent c787f39 commit 2083132

File tree

4 files changed

+108
-41
lines changed

4 files changed

+108
-41
lines changed

state.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -394,14 +394,14 @@ MtmRefreshClusterStatus()
394394
* Check for referee decision when only half of nodes are visible.
395395
*/
396396
if (MtmRefereeConnStr && *MtmRefereeConnStr && !Mtm->refereeWinnerId &&
397-
countZeroBits(EFFECTIVE_CONNECTIVITY_MASK, Mtm->nAllNodes) == Mtm->nAllNodes/2)
397+
countZeroBits(SELF_CONNECTIVITY_MASK, Mtm->nAllNodes) == Mtm->nAllNodes/2)
398398
{
399399
int winner_node_id = MtmRefereeGetWinner();
400400

401401
if (winner_node_id > 0)
402402
{
403403
Mtm->refereeWinnerId = winner_node_id;
404-
if (!BIT_CHECK(EFFECTIVE_CONNECTIVITY_MASK, winner_node_id - 1))
404+
if (!BIT_CHECK(SELF_CONNECTIVITY_MASK, winner_node_id - 1))
405405
{
406406
MTM_LOG1("[STATE] Referee allowed to proceed with half of the nodes (winner_id = %d)",
407407
winner_node_id);
@@ -418,7 +418,7 @@ MtmRefreshClusterStatus()
418418
* Clear winner if we again have all nodes are online.
419419
*/
420420
if (MtmRefereeConnStr && *MtmRefereeConnStr && Mtm->refereeWinnerId &&
421-
countZeroBits(EFFECTIVE_CONNECTIVITY_MASK, Mtm->nAllNodes) == Mtm->nAllNodes)
421+
countZeroBits(SELF_CONNECTIVITY_MASK, Mtm->nAllNodes) == Mtm->nAllNodes)
422422
{
423423
if (MtmRefereeClearWinner())
424424
{
@@ -429,7 +429,7 @@ MtmRefreshClusterStatus()
429429
}
430430

431431
/* Do not check clique with referee grant */
432-
if (Mtm->refereeGrant)
432+
if (Mtm->refereeWinnerId)
433433
return;
434434

435435
/*
@@ -570,16 +570,16 @@ MtmRefereeClearWinner(void)
570570

571571
response = PQgetvalue(res, 0, 0);
572572

573-
if (false)
573+
if (strncmp(response, "t", 1) != 0)
574574
{
575-
MTM_ELOG(WARNING, "Wrong response from referee");
575+
MTM_ELOG(WARNING, "Wrong response from referee: '%s'", response);
576576
PQclear(res);
577577
PQfinish(conn);
578578
return false;
579579
}
580580

581581
/* Ok, we finally got it! */
582-
MTM_LOG1("Got referee clear response %s", response);
582+
MTM_LOG1("Got referee clear response '%s'", response);
583583
PQclear(res);
584584
PQfinish(conn);
585585
return true;

tests2/docker-entrypoint.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ if [ "$1" = 'postgres' ]; then
6969
multimaster.ignore_tables_without_pk = 1
7070
multimaster.heartbeat_recv_timeout = 1100
7171
multimaster.heartbeat_send_timeout = 250
72+
multimaster.max_recovery_lag = 1000000000
7273
EOF
7374

7475
if [ -n "$NODE_ID" ]; then

tests2/test_major.py

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -83,40 +83,6 @@ def test_partition_major(self):
8383
'select pg_reload_conf()'
8484
])
8585

86-
def test_partition_referee(self):
87-
print('### test_partition_referee ###')
88-
89-
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'))
90-
91-
self.assertCommits(aggs_failure[:1])
92-
self.assertNoCommits(aggs_failure[1:])
93-
self.assertIsolation(aggs_failure)
94-
95-
self.assertCommits(aggs)
96-
self.assertIsolation(aggs)
97-
98-
def test_double_failure_referee(self):
99-
print('### test_double_failure_referee ###')
100-
101-
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'))
102-
103-
self.assertCommits(aggs_failure[:1])
104-
self.assertNoCommits(aggs_failure[1:])
105-
self.assertIsolation(aggs_failure)
106-
107-
self.assertCommits(aggs)
108-
self.assertIsolation(aggs)
109-
110-
aggs_failure, aggs = self.performFailure(SingleNodePartition('node1'))
111-
112-
self.assertNoCommits(aggs_failure[:1])
113-
self.assertCommits(aggs_failure[1:])
114-
self.assertIsolation(aggs_failure)
115-
116-
self.assertCommits(aggs)
117-
self.assertIsolation(aggs)
118-
119-
12086
if __name__ == '__main__':
12187
unittest.main()
12288

tests2/test_referee.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#
2+
# Based on Aphyr's test for CockroachDB.
3+
#
4+
5+
import unittest
6+
import time
7+
import subprocess
8+
import datetime
9+
import docker
10+
import warnings
11+
12+
from lib.bank_client import MtmClient
13+
from lib.failure_injector import *
14+
from lib.test_helper import *
15+
16+
17+
class MajorTest(unittest.TestCase, TestHelper):
18+
19+
@classmethod
20+
def setUpClass(cls):
21+
subprocess.check_call(['docker-compose',
22+
'-f', 'support/two_nodes.yml',
23+
'up',
24+
'--force-recreate',
25+
'--build',
26+
'-d'])
27+
28+
# XXX: add normal wait here
29+
time.sleep(TEST_SETUP_TIME)
30+
31+
cls.client = MtmClient([
32+
"dbname=regression user=postgres host=127.0.0.1 port=15432",
33+
"dbname=regression user=postgres host=127.0.0.1 port=15433"
34+
], n_accounts=1000)
35+
cls.client.bgrun()
36+
37+
# create extension on referee
38+
cls.nodeExecute("dbname=regression user=postgres host=127.0.0.1 port=15435", ['create extension multimaster'])
39+
40+
@classmethod
41+
def tearDownClass(cls):
42+
print('tearDown')
43+
cls.client.stop()
44+
45+
time.sleep(TEST_STOP_DELAY)
46+
47+
if not cls.client.is_data_identic():
48+
raise AssertionError('Different data on nodes')
49+
50+
if cls.client.no_prepared_tx() != 0:
51+
raise AssertionError('There are some uncommitted tx')
52+
53+
# XXX: check nodes data identity here
54+
# subprocess.check_call(['docker-compose','down'])
55+
56+
def setUp(self):
57+
warnings.simplefilter("ignore", ResourceWarning)
58+
time.sleep(20)
59+
print('Start new test at ',datetime.datetime.utcnow())
60+
61+
def tearDown(self):
62+
print('Finish test at ',datetime.datetime.utcnow())
63+
64+
def test_partition_referee(self):
65+
print('### test_partition_referee ###')
66+
67+
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'))
68+
69+
self.assertCommits(aggs_failure[:1])
70+
self.assertNoCommits(aggs_failure[1:])
71+
self.assertIsolation(aggs_failure)
72+
73+
self.assertCommits(aggs)
74+
self.assertIsolation(aggs)
75+
76+
def test_double_failure_referee(self):
77+
print('### test_double_failure_referee ###')
78+
79+
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'))
80+
81+
self.assertCommits(aggs_failure[:1])
82+
self.assertNoCommits(aggs_failure[1:])
83+
self.assertIsolation(aggs_failure)
84+
85+
self.assertCommits(aggs)
86+
self.assertIsolation(aggs)
87+
88+
aggs_failure, aggs = self.performFailure(SingleNodePartition('node1'))
89+
90+
self.assertNoCommits(aggs_failure[:1])
91+
self.assertCommits(aggs_failure[1:])
92+
self.assertIsolation(aggs_failure)
93+
94+
self.assertCommits(aggs)
95+
self.assertIsolation(aggs)
96+
97+
98+
if __name__ == '__main__':
99+
unittest.main()
100+

0 commit comments

Comments
 (0)