diff --git a/src/box/box.cc b/src/box/box.cc index e724de3978b0613a08a01563770ba9638e04753a..f055788d904cba44063b45724ee9700228a7ff5e 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -207,7 +207,7 @@ int box_wait_ro(bool ro, double timeout) { double deadline = ev_monotonic_now(loop()) + timeout; - while (is_ro != ro) { + while (box_is_ro() != ro) { if (fiber_cond_wait_deadline(&ro_cond, deadline) != 0) return -1; if (fiber_is_cancelled()) { @@ -225,6 +225,7 @@ box_clear_orphan(void) return; /* nothing to do */ is_orphan = false; + fiber_cond_broadcast(&ro_cond); /* Update the title to reflect the new status. */ title("running"); diff --git a/test/replication/quorum.result b/test/replication/quorum.result index f6e60aee936c2b48b6f78ce5363b276bb2a37336..5a294103031208086111ed3c5c75096c22745879 100644 --- a/test/replication/quorum.result +++ b/test/replication/quorum.result @@ -32,6 +32,14 @@ box.info.status -- orphan --- - orphan ... +box.ctl.wait_rw(0.001) -- timeout +--- +- error: timed out +... +box.info.ro -- true +--- +- true +... box.space.test:replace{100} -- error --- - error: Can't modify data because this instance is in read-only mode. @@ -48,6 +56,14 @@ box.info.status -- orphan --- - orphan ... +box.ctl.wait_rw(0.001) -- timeout +--- +- error: timed out +... +box.info.ro -- true +--- +- true +... box.space.test:replace{100} -- error --- - error: Can't modify data because this instance is in read-only mode. @@ -55,11 +71,12 @@ box.space.test:replace{100} -- error box.cfg{replication_connect_quorum = 2} --- ... -fiber = require('fiber') +box.ctl.wait_rw() --- ... -while box.info.status == 'orphan' do fiber.sleep(0.001) end +box.info.ro -- false --- +- false ... box.info.status -- running --- @@ -70,6 +87,14 @@ box.info.status -- orphan --- - orphan ... +box.ctl.wait_rw(0.001) -- timeout +--- +- error: timed out +... +box.info.ro -- true +--- +- true +... box.space.test:replace{100} -- error --- - error: Can't modify data because this instance is in read-only mode. @@ -78,11 +103,12 @@ test_run:cmd('start server quorum1') --- - true ... -fiber = require('fiber') +box.ctl.wait_rw() --- ... -while box.info.status == 'orphan' do fiber.sleep(0.001) end +box.info.ro -- false --- +- false ... box.info.status -- running --- @@ -126,6 +152,9 @@ test_run:cmd('stop server quorum1') for i = 1, 10 do box.space.test:insert{i} end --- ... +fiber = require('fiber') +--- +... fiber.sleep(0.1) --- ... diff --git a/test/replication/quorum.test.lua b/test/replication/quorum.test.lua index 44c98b7b1c20ab6740c6bce24f0947b58bea02ed..192f13695127c6e957c7bdb82d748c1daa9a8c5a 100644 --- a/test/replication/quorum.test.lua +++ b/test/replication/quorum.test.lua @@ -20,24 +20,30 @@ test_run:cmd('switch quorum2') test_run:cmd('restart server quorum2') box.info.status -- orphan +box.ctl.wait_rw(0.001) -- timeout +box.info.ro -- true box.space.test:replace{100} -- error box.cfg{replication={}} box.info.status -- running test_run:cmd('restart server quorum2') box.info.status -- orphan +box.ctl.wait_rw(0.001) -- timeout +box.info.ro -- true box.space.test:replace{100} -- error box.cfg{replication_connect_quorum = 2} -fiber = require('fiber') -while box.info.status == 'orphan' do fiber.sleep(0.001) end +box.ctl.wait_rw() +box.info.ro -- false box.info.status -- running test_run:cmd('restart server quorum2') box.info.status -- orphan +box.ctl.wait_rw(0.001) -- timeout +box.info.ro -- true box.space.test:replace{100} -- error test_run:cmd('start server quorum1') -fiber = require('fiber') -while box.info.status == 'orphan' do fiber.sleep(0.001) end +box.ctl.wait_rw() +box.info.ro -- false box.info.status -- running -- Check that the replica follows all masters. @@ -54,6 +60,7 @@ box.error.injection.set("ERRINJ_RELAY_TIMEOUT", 0.01) test_run:cmd('stop server quorum1') for i = 1, 10 do box.space.test:insert{i} end +fiber = require('fiber') fiber.sleep(0.1) test_run:cmd('start server quorum1')