mirror of https://github.com/mongodb/mongo
54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
"""Test hook to wait for replication to complete on a replica set."""
|
|
|
|
import time
|
|
|
|
from buildscripts.resmokelib import core, errors
|
|
from buildscripts.resmokelib.testing.hooks import interface
|
|
|
|
|
|
class WaitForReplication(interface.Hook):
|
|
"""Wait for replication to complete."""
|
|
|
|
IS_BACKGROUND = False
|
|
|
|
def __init__(self, hook_logger, fixture, shell_options=None):
|
|
"""Initialize WaitForReplication."""
|
|
description = "WaitForReplication waits on a replica set"
|
|
interface.Hook.__init__(self, hook_logger, fixture, description)
|
|
|
|
self.hook_logger = hook_logger
|
|
self.fixture = fixture
|
|
self.shell_options = shell_options
|
|
|
|
def after_test(self, test, test_report):
|
|
"""Run mongo shell to call replSetTest.awaitReplication()."""
|
|
start_time = time.time()
|
|
client_conn = self.fixture.get_driver_connection_url()
|
|
js_cmds = """
|
|
const {{ReplSetTest}} = await import("jstests/libs/replsettest.js");
|
|
const conn = '{}';
|
|
try {{
|
|
const rst = new ReplSetTest(conn);
|
|
rst.awaitReplication();
|
|
}} catch (e) {{
|
|
jsTestLog("WaitForReplication got error: " + tojson(e));
|
|
if (!e.message.includes('The server is in quiesce mode and will shut down')) {{
|
|
throw e;
|
|
}}
|
|
jsTestLog("Ignoring shutdown error in quiesce mode");
|
|
}}"""
|
|
shell_options = {
|
|
**{"nodb": "", "eval": js_cmds.format(client_conn)},
|
|
**(self.shell_options or {}),
|
|
}
|
|
shell_proc = core.programs.mongo_shell_program(
|
|
self.hook_logger,
|
|
test_name="wait_for_replication",
|
|
**shell_options,
|
|
)
|
|
shell_proc.start()
|
|
return_code = shell_proc.wait()
|
|
if return_code:
|
|
raise errors.ServerFailure("Awaiting replication failed for {}".format(client_conn))
|
|
self.hook_logger.info("WaitForReplication took %0.4f seconds", time.time() - start_time)
|