From aa3c011f86ae21d6060ad4a998bfa895bc73d550 Mon Sep 17 00:00:00 2001
From: Dmitriy Koltsov <dkoltsov@picodata.io>
Date: Fri, 26 Jul 2024 18:39:55 +0300
Subject: [PATCH] fix(test): use waiters instead of timeout for
 replication_test.lua and wal_ext_test.lua

Replace fiber.sleep with luatest.helpers.retrying
to make tests less flaky

NO_DOC=internal
NO_CHANGELOG=internal
---
 test/box-luatest/wal_ext_test.lua     | 20 ++++++++-
 test/ssl-luatest/replication_test.lua | 61 ++++++++++++++++-----------
 2 files changed, 55 insertions(+), 26 deletions(-)

diff --git a/test/box-luatest/wal_ext_test.lua b/test/box-luatest/wal_ext_test.lua
index cacf1b3943..b2796ba6d9 100644
--- a/test/box-luatest/wal_ext_test.lua
+++ b/test/box-luatest/wal_ext_test.lua
@@ -134,8 +134,24 @@ g.test_new_old_extension_replicated = function()
         return lsn
     end)
 
-    -- wait until data has been replicated
-    require('fiber').sleep(2)
+        local function check_vclock_synchronized()
+                local function get_vclock(node_name)
+                        return g.rs:get_server(node_name)
+                                :exec(function() return box.info.vclock end)
+                end
+                local master_vclock = get_vclock("master")
+                local replica_vclock = get_vclock("replica")
+
+                t.assert_equals(
+                        master_vclock,
+                        replica_vclock,
+                        'Vclocks are not synchronized'
+                )
+        end
+        t.helpers.retrying(
+                {timeout = 2, delay = 0.1},
+                check_vclock_synchronized
+        )
 
     g.rs:get_server('replica'):exec(function(lsn)
         local fio = require('fio')
diff --git a/test/ssl-luatest/replication_test.lua b/test/ssl-luatest/replication_test.lua
index b32a35ccef..9101cdb780 100644
--- a/test/ssl-luatest/replication_test.lua
+++ b/test/ssl-luatest/replication_test.lua
@@ -75,26 +75,31 @@ g.test_replication = function()
     })
     g.rs:start()
 
-    local master_lsn = g.rs:get_server('master'):exec(function()
+    -- write something on master
+    g.rs:get_server('master'):exec(function()
         box.schema.space.create('test'):create_index('pk')
 
         box.space.test:insert({ 1, "1" })
         box.space.test:insert({ 2, "2" })
         box.space.test:update(2, { { '=', 2, '3' } })
         box.space.test:delete(1)
-
-        return box.info.lsn
     end)
 
-    -- wait until data has been replicated
-    require('fiber').sleep(2)
-
-    local replica_lsn = g.rs:get_server('replica'):exec(function()
-        t.assert_equals(box.space.test:len(), 1)
-        return box.info.replication[1].lsn
-    end)
-
-    t.assert_equals(master_lsn, replica_lsn)
+    local function check_vclock_synchronized()
+        local function get_vclock(node_name)
+                return g.rs:get_server(node_name)
+                    :exec(function() return box.info.vclock end)
+        end
+        local master_vclock = get_vclock("master")
+        local replica_vclock = get_vclock("replica")
+
+        t.assert_equals(
+            master_vclock,
+            replica_vclock,
+            'Vclocks are not synchronized'
+        )
+    end
+    t.helpers.retrying({timeout = 2, delay = 0.1}, check_vclock_synchronized)
 end
 
 g.test_anon_replication = function()
@@ -130,26 +135,34 @@ g.test_anon_replication = function()
     })
     g.rs:start()
 
-    local master_lsn = g.rs:get_server('master'):exec(function()
+    -- write something on master
+    g.rs:get_server('master'):exec(function()
         box.schema.space.create('test'):create_index('pk')
 
         box.space.test:insert({ 1, "1" })
         box.space.test:insert({ 2, "2" })
         box.space.test:update(2, { { '=', 2, '3' } })
         box.space.test:delete(1)
-
-        return box.info.lsn
     end)
 
-    -- wait until data has been replicated
-    require('fiber').sleep(2)
-
-    local replica_lsn = g.rs:get_server('replica'):exec(function()
-        t.assert_equals(box.space.test:len(), 1)
-        return box.info.replication[1].lsn
-    end)
-
-    t.assert_equals(master_lsn, replica_lsn)
+    local function check_vclock_synchronized()
+        local function get_vclock(node_name)
+                return g.rs:get_server(node_name)
+                    :exec(function() return box.info.vclock end)
+        end
+        local master_vclock = get_vclock("master")
+        local replica_vclock = get_vclock("replica")
+
+        t.assert_equals(
+            master_vclock,
+            replica_vclock,
+            'Vclocks are not synchronized'
+        )
+    end
+    t.helpers.retrying(
+        {timeout = 2, delay = 0.1},
+        check_vclock_synchronized
+    )
 end
 
 g.test_plain_replication_to_ssl_master = function()
-- 
GitLab