[PATCH 2/2] Fix tarantoolctl cat/play premature stop with --to

Alexander Turenko alexander.turenko at tarantool.org
Wed Mar 20 21:41:14 MSK 2019


Stop a file processing loop only when it is guaranteed that we will not
find a record that match user-provided filters later in this file. If
--replica R is provided one time and we're meet a record from R with a
LSN equal or above of a --to value, we'll stop the loop. Otherwise (no
--replica, several --replica arguments) a file will be read until an end
even if --to is provided.

Fixes #3827.
---
 extra/dist/tarantoolctl.in         | 14 +++++++-------
 test/app-tap/tarantoolctl.test.lua |  4 ++--
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/extra/dist/tarantoolctl.in b/extra/dist/tarantoolctl.in
index 014acee6c..0796f4605 100755
--- a/extra/dist/tarantoolctl.in
+++ b/extra/dist/tarantoolctl.in
@@ -839,11 +839,11 @@ end
 -- 4. If @a opts.replica is set, record.HEADER.replica_id should
 --    not be nil and should be in @a opts.replica list.
 --
--- Once a record with LSN >= @a opts.to is found the loop stops
--- (even if a file contains next records with smaller LSN from
--- another replicas). Note however that this function is called
--- once for each xlog / snap file, so even when it stops on LSN
--- >= @a opts.to on a current file a next file will be processed.
+-- If @a opts.replica is set and is a singleton list and a record
+-- **from this replica** with LSN >= @a opts.to is found the loop
+-- stops. Note however that this function is called once for each
+-- xlog / snap file, so even when it stops on LSN >= @a opts.to on
+-- a current file a next file will be processed.
 local function filter_xlog(gen, param, state, opts, cb)
     local spaces = opts.spaces
     local from, to, spaces = opts.from, opts.to, opts.space
@@ -852,11 +852,11 @@ local function filter_xlog(gen, param, state, opts, cb)
     for lsn, record in gen, param, state do
         local sid = record.BODY and record.BODY.space_id
         local rid = record.HEADER.replica_id
-        if lsn >= to then
+        if replicas and #replicas == 1 and replicas[1] == rid and lsn >= to then
             -- stop, as we've finished reading tuple with lsn == to
             -- and the next lsn's will be bigger
             break
-        elseif (lsn < from) or
+        elseif (lsn < from) or (lsn >= to) or
            (not spaces and sid and sid < 512 and not show_system) or
            (spaces and (sid == nil or not find_in_list(sid, spaces))) or
            (replicas and not find_in_list(rid, replicas)) then
diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua
index 4910b94f3..a914db5c5 100755
--- a/test/app-tap/tarantoolctl.test.lua
+++ b/test/app-tap/tarantoolctl.test.lua
@@ -590,7 +590,7 @@ test:test('filter_xlog', function(test)
         {
             'to w/o replica id',
             opts = merge(default_opts, {to = 120}),
-            exp_result = {},
+            exp_result = {x[9], x[10]},
         },
         {
             'to and replica id',
@@ -600,7 +600,7 @@ test:test('filter_xlog', function(test)
         {
             'to and replica ids',
             opts = merge(default_opts, {to = 137, replica = {1, 2}}),
-            exp_result = {x[7]},
+            exp_result = {x[7], x[9]},
         },
     }
     test:plan(#cases)
-- 
2.20.1




More information about the Tarantool-patches mailing list