Skip to content

Commit 7bea7be

Browse files
committed
test_referee test version without hardcoded sleep times and fsync=on
1 parent 976250e commit 7bea7be

File tree

4 files changed

+42
-23
lines changed

4 files changed

+42
-23
lines changed

tests2/docker-entrypoint.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ if [ "$1" = 'postgres' ]; then
5151
listen_addresses='*'
5252
max_prepared_transactions = 100
5353
synchronous_commit = on
54-
fsync = off
54+
fsync = on
5555
wal_level = logical
5656
max_worker_processes = 30
5757
max_replication_slots = 10
@@ -62,11 +62,11 @@ if [ "$1" = 'postgres' ]; then
6262
# log_statement = all
6363
6464
multimaster.max_nodes = 3
65-
# multimaster.volkswagen_mode = 1
66-
# multimaster.ignore_tables_without_pk = 1
6765
multimaster.heartbeat_recv_timeout = 1100
6866
multimaster.heartbeat_send_timeout = 250
69-
multimaster.max_recovery_lag = 1000000000
67+
multimaster.max_recovery_lag = 1GB
68+
multimaster.min_recovery_lag = 10kB
69+
multimaster.preserve_commit_order = off
7070
EOF
7171

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

tests2/lib/bank_client.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,15 @@ def no_prepared_tx(self):
159159
def status(self):
160160
while self.running:
161161
msg = yield from self.child_pipe.coro_recv()
162-
if msg == 'status':
162+
if msg == 'status' or msg == 'status_noclean':
163163
serialized_aggs = []
164164

165165
for conn_id, conn_aggs in self.aggregates.items():
166166
serialized_aggs.append({})
167167
for aggname, agg in conn_aggs.items():
168168
serialized_aggs[conn_id][aggname] = agg.as_dict()
169-
agg.clear_values()
169+
if msg == 'status':
170+
agg.clear_values()
170171

171172
yield from self.child_pipe.coro_send(serialized_aggs)
172173
else:
@@ -284,9 +285,14 @@ def bgrun(self):
284285
self.evloop_process = multiprocessing.Process(target=self.run, args=())
285286
self.evloop_process.start()
286287

287-
def get_aggregates(self, _print=True):
288-
self.parent_pipe.send('status')
288+
def get_aggregates(self, _print=True, clean=True):
289+
if clean:
290+
self.parent_pipe.send('status')
291+
else:
292+
self.parent_pipe.send('status_noclean')
293+
289294
resp = self.parent_pipe.recv()
295+
290296
if _print:
291297
MtmClient.print_aggregates(resp)
292298
return resp

tests2/lib/test_helper.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
TEST_WARMING_TIME = 5
77
TEST_DURATION = 10
8+
TEST_MAX_RECOVERY_TIME = 300
89
TEST_RECOVERY_TIME = 30
910
TEST_SETUP_TIME = 20
1011
TEST_STOP_DELAY = 5
@@ -34,7 +35,20 @@ def assertNoCommits(self, aggs):
3435
if commits:
3536
raise AssertionError('There are commits during aggregation interval')
3637

37-
def performFailure(self, failure, wait=0):
38+
def awaitCommit(self, node_id):
39+
total_sleep = 0
40+
41+
while total_sleep <= TEST_MAX_RECOVERY_TIME:
42+
aggs = self.client.get_aggregates(clean=False, _print=False)
43+
# print('=== ',aggs[node_id]['transfer']['finish'])
44+
if ('commit' in aggs[node_id]['transfer']['finish'] and
45+
aggs[node_id]['transfer']['finish']['commit'] > 10):
46+
break
47+
time.sleep(5)
48+
total_sleep += 5
49+
50+
51+
def performFailure(self, failure, wait=0, node_wait_for_commit=-1):
3852

3953
time.sleep(TEST_WARMING_TIME)
4054

@@ -57,9 +71,13 @@ def performFailure(self, failure, wait=0):
5771
print('Eliminate failure at ',datetime.datetime.utcnow())
5872

5973
self.client.clean_aggregates()
60-
time.sleep(TEST_RECOVERY_TIME)
61-
aggs = self.client.get_aggregates()
6274

75+
if node_wait_for_commit >= 0:
76+
self.awaitCommit(node_wait_for_commit)
77+
else:
78+
time.sleep(TEST_RECOVERY_TIME)
79+
80+
aggs = self.client.get_aggregates()
6381
return (aggs_failure, aggs)
6482

6583
def nodeExecute(dsn, statements):

tests2/test_referee.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ def setUpClass(cls):
2525
'--build',
2626
'-d'])
2727

28-
# XXX: add normal wait here
29-
time.sleep(TEST_SETUP_TIME)
30-
3128
cls.client = MtmClient([
3229
"dbname=regression user=postgres host=127.0.0.1 port=15432",
3330
"dbname=regression user=postgres host=127.0.0.1 port=15433"
@@ -42,8 +39,6 @@ def tearDownClass(cls):
4239
print('tearDown')
4340
cls.client.stop()
4441

45-
time.sleep(TEST_STOP_DELAY)
46-
4742
if not cls.client.is_data_identic():
4843
raise AssertionError('Different data on nodes')
4944

@@ -55,7 +50,7 @@ def tearDownClass(cls):
5550

5651
def setUp(self):
5752
warnings.simplefilter("ignore", ResourceWarning)
58-
time.sleep(20)
53+
5954
print('Start new test at ',datetime.datetime.utcnow())
6055

6156
def tearDown(self):
@@ -64,7 +59,7 @@ def tearDown(self):
6459
def test_node_crash(self):
6560
print('### test_node_crash ###')
6661

67-
aggs_failure, aggs = self.performFailure(CrashRecoverNode('node2'))
62+
aggs_failure, aggs = self.performFailure(CrashRecoverNode('node2'), node_wait_for_commit=1)
6863

6964
self.assertCommits(aggs_failure[:1])
7065
self.assertNoCommits(aggs_failure[1:])
@@ -77,7 +72,7 @@ def test_node_crash(self):
7772
def test_partition_referee(self):
7873
print('### test_partition_referee ###')
7974

80-
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'))
75+
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'), node_wait_for_commit=1)
8176

8277
self.assertCommits(aggs_failure[:1])
8378
self.assertNoCommits(aggs_failure[1:])
@@ -89,7 +84,7 @@ def test_partition_referee(self):
8984
def test_double_failure_referee(self):
9085
print('### test_double_failure_referee ###')
9186

92-
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'))
87+
aggs_failure, aggs = self.performFailure(SingleNodePartition('node2'), node_wait_for_commit=1)
9388

9489
self.assertCommits(aggs_failure[:1])
9590
self.assertNoCommits(aggs_failure[1:])
@@ -98,7 +93,7 @@ def test_double_failure_referee(self):
9893
self.assertCommits(aggs)
9994
self.assertIsolation(aggs)
10095

101-
aggs_failure, aggs = self.performFailure(SingleNodePartition('node1'))
96+
aggs_failure, aggs = self.performFailure(SingleNodePartition('node1'), node_wait_for_commit=0)
10297

10398
self.assertNoCommits(aggs_failure[:1])
10499
self.assertCommits(aggs_failure[1:])
@@ -121,7 +116,7 @@ def test_winner_restart(self):
121116
self.assertCommits(aggs[1:])
122117
self.assertIsolation(aggs)
123118

124-
aggs_failure, aggs = self.performFailure(RestartNode('node2'))
119+
aggs_failure, aggs = self.performFailure(RestartNode('node2'), node_wait_for_commit=1)
125120

126121
self.assertNoCommits(aggs_failure)
127122
self.assertIsolation(aggs_failure)
@@ -133,7 +128,7 @@ def test_winner_restart(self):
133128
# need to start node1 to perform consequent tests
134129
docker_api = docker.from_env()
135130
docker_api.containers.get('node1').start()
136-
time.sleep(35)
131+
self.awaitCommit(0)
137132

138133

139134
if __name__ == '__main__':

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