[Tarantool-patches] [PATCH v2 7/7] replication: do not ignore replica vclock on register
Serge Petrenko
sergepetrenko at tarantool.org
Wed Mar 24 15:24:17 MSK 2021
There was a bug in box_process_register. It decoded replica's vclock but
never used it when sending the registration stream. So the replica might
lose the data in range (replica_vclock, start_vclock).
Follow-up #5566
---
src/box/box.cc | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/src/box/box.cc b/src/box/box.cc
index 292a54213..0bcb505a8 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -2127,8 +2127,8 @@ box_process_register(struct ev_io *io, struct xrow_header *header)
assert(header->type == IPROTO_REGISTER);
struct tt_uuid instance_uuid = uuid_nil;
- struct vclock vclock;
- xrow_decode_register_xc(header, &instance_uuid, &vclock);
+ struct vclock replica_vclock;
+ xrow_decode_register_xc(header, &instance_uuid, &replica_vclock);
if (!is_box_configured)
tnt_raise(ClientError, ER_LOADING);
@@ -2154,7 +2154,8 @@ box_process_register(struct ev_io *io, struct xrow_header *header)
"wal_mode = 'none'");
}
- struct gc_consumer *gc = gc_consumer_register(&replicaset.vclock,
+ vclock_reset(&replica_vclock, 0, vclock_get(&replicaset.vclock, 0));
+ struct gc_consumer *gc = gc_consumer_register(&replica_vclock,
"replica %s", tt_uuid_str(&instance_uuid));
if (gc == NULL)
diag_raise();
@@ -2163,9 +2164,6 @@ box_process_register(struct ev_io *io, struct xrow_header *header)
say_info("registering replica %s at %s",
tt_uuid_str(&instance_uuid), sio_socketname(io->fd));
- struct vclock start_vclock;
- vclock_copy(&start_vclock, &replicaset.vclock);
-
/**
* Call the server-side hook which stores the replica uuid
* in _cluster space.
@@ -2180,10 +2178,10 @@ box_process_register(struct ev_io *io, struct xrow_header *header)
/*
* Feed replica with WALs in range
- * (start_vclock, stop_vclock) so that it gets its
+ * (replica_vclock, stop_vclock) so that it gets its
* registration.
*/
- relay_final_join(io->fd, header->sync, &start_vclock, &stop_vclock);
+ relay_final_join(io->fd, header->sync, &replica_vclock, &stop_vclock);
say_info("final data sent.");
struct xrow_header row;
--
2.24.3 (Apple Git-128)
More information about the Tarantool-patches
mailing list