aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Yanofsky <russ@yanofsky.org>2016-11-11 15:40:48 -0500
committerRussell Yanofsky <russ@yanofsky.org>2016-11-14 12:02:31 -0500
commit05e57ccd746b2e14699d2b1980927f30070cb3ad (patch)
tree1cbafd8a97db85acf13ba2d809fc346569f7690d
parentfd6bb700b77491689f0b5f34bdfb75764138f406 (diff)
[qa] Fix sync_blocks timeout argument
Motivation for this change is mainly to make sync_blocks behavior easier to understand. Behavior is unchanged in the normal case when there are only 2 nodes in the rpc_connections set. When there are more than 2 nodes, the previous "timeout -= wait" statement wouldn't take into account time spent waiting for all nodes and as a result could lead to blocking for longer than the requested timeout.
-rw-r--r--qa/rpc-tests/test_framework/util.py11
1 files changed, 8 insertions, 3 deletions
diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py
index 2de4d5e303..01bde0c84d 100644
--- a/qa/rpc-tests/test_framework/util.py
+++ b/qa/rpc-tests/test_framework/util.py
@@ -123,10 +123,15 @@ def str_to_b64str(string):
def sync_blocks(rpc_connections, *, wait=1, timeout=60):
"""
- Wait until everybody has the same tip
+ Wait until everybody has the same tip.
+
+ sync_blocks needs to be called with an rpc_connections set that has least
+ one node already synced to the latest, stable tip, otherwise there's a
+ chance it might return before all nodes are stably synced.
"""
maxheight = 0
- while timeout > 0:
+ start_time = cur_time = time.time()
+ while cur_time <= start_time + timeout:
tips = [r.waitforblockheight(maxheight, int(wait * 1000)) for r in rpc_connections]
heights = [t["height"] for t in tips]
if tips == [tips[0]] * len(tips):
@@ -134,8 +139,8 @@ def sync_blocks(rpc_connections, *, wait=1, timeout=60):
if heights == [heights[0]] * len(heights):
raise AssertionError("Block sync failed, mismatched block hashes:{}".format(
"".join("\n {!r}".format(tip) for tip in tips)))
- timeout -= wait
maxheight = max(heights)
+ cur_time = time.time()
raise AssertionError("Block sync to height {} timed out:{}".format(
maxheight, "".join("\n {!r}".format(tip) for tip in tips)))