diff --git a/src/box/box.cc b/src/box/box.cc index 8a1a2668402eb542de34c2cfe7704af944facf67..8d6e966e029894bd2eebd32e584d96bf023b9028 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -1513,7 +1513,7 @@ box_process_join(struct ev_io *io, struct xrow_header *header) /* Remember master's vclock after the last request */ struct vclock stop_vclock; - wal_checkpoint(&stop_vclock, false); + vclock_copy(&stop_vclock, &replicaset.vclock); /* * Register the replica as a WAL consumer so that @@ -1540,9 +1540,7 @@ box_process_join(struct ev_io *io, struct xrow_header *header) say_info("final data sent."); /* Send end of WAL stream marker */ - struct vclock current_vclock; - wal_checkpoint(¤t_vclock, false); - xrow_encode_vclock_xc(&row, ¤t_vclock); + xrow_encode_vclock_xc(&row, &replicaset.vclock); row.sync = header->sync; coio_write_xrow(io, &row); } @@ -1608,9 +1606,7 @@ box_process_subscribe(struct ev_io *io, struct xrow_header *header) * and identify ourselves with our own replica id. */ struct xrow_header row; - struct vclock current_vclock; - wal_checkpoint(¤t_vclock, false); - xrow_encode_vclock_xc(&row, ¤t_vclock); + xrow_encode_vclock_xc(&row, &replicaset.vclock); /* * Identify the message with the replica id of this * instance, this is the only way for a replica to find diff --git a/test/replication/sync.result b/test/replication/sync.result index 4c0ad9c35080e55dc8d2807f6fa220d8ba0a9f63..dc3a6f69b64bbadca35e2733d6aefcef6c8efee9 100644 --- a/test/replication/sync.result +++ b/test/replication/sync.result @@ -311,6 +311,43 @@ test_run:cmd("stop server replica") --- - true ... +-- gh-3830: Sync fails if there's a gap at the end of the master's WAL. +box.error.injection.set('ERRINJ_WAL_WRITE_DISK', true) +--- +- ok +... +box.space.test:replace{123456789} +--- +- error: Failed to write to disk +... +box.error.injection.set('ERRINJ_WAL_WRITE_DISK', false) +--- +- ok +... +test_run:cmd("start server replica") +--- +- true +... +test_run:cmd("switch replica") +--- +- true +... +box.info.status -- running +--- +- running +... +box.info.ro -- false +--- +- false +... +test_run:cmd("switch default") +--- +- true +... +test_run:cmd("stop server replica") +--- +- true +... test_run:cmd("cleanup server replica") --- - true diff --git a/test/replication/sync.test.lua b/test/replication/sync.test.lua index ee82fc58188140f6687f7694365bcc161b52cf34..bc7147355a3243538030242a761b6c1ec74c284b 100644 --- a/test/replication/sync.test.lua +++ b/test/replication/sync.test.lua @@ -156,6 +156,18 @@ box.info.ro -- false box.info.replication[1].upstream.status -- follow test_run:grep_log('replica', 'ER_CFG.*') +test_run:cmd("switch default") +test_run:cmd("stop server replica") + +-- gh-3830: Sync fails if there's a gap at the end of the master's WAL. +box.error.injection.set('ERRINJ_WAL_WRITE_DISK', true) +box.space.test:replace{123456789} +box.error.injection.set('ERRINJ_WAL_WRITE_DISK', false) +test_run:cmd("start server replica") +test_run:cmd("switch replica") +box.info.status -- running +box.info.ro -- false + test_run:cmd("switch default") test_run:cmd("stop server replica") test_run:cmd("cleanup server replica")