From d542e0f92bb837a71c5d9ba82dfb5d4458bd397a Mon Sep 17 00:00:00 2001 From: Vladimir Davydov <vdavydov.dev@gmail.com> Date: Wed, 1 Nov 2017 14:48:13 +0300 Subject: [PATCH] memtx: handle xlog_flush() error when writing snapshot If xlog_flush() fails, box.snapshot() will still succeed, but recovery from such an incomplete snapshot will fail. Fix it and add the corresponding test case. --- src/box/memtx_engine.c | 5 ++++- test/box/errinj.result | 15 +++++++++++++++ test/box/errinj.test.lua | 6 ++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/box/memtx_engine.c b/src/box/memtx_engine.c index 057a35de02..07ebfffffa 100644 --- a/src/box/memtx_engine.c +++ b/src/box/memtx_engine.c @@ -634,7 +634,10 @@ checkpoint_f(va_list ap) } } } - xlog_flush(&snap); + if (xlog_flush(&snap) < 0) { + xlog_close(&snap, false); + return -1; + } xlog_close(&snap, false); say_info("done"); return 0; diff --git a/test/box/errinj.result b/test/box/errinj.result index a83dcf0a40..3551851694 100644 --- a/test/box/errinj.result +++ b/test/box/errinj.result @@ -667,6 +667,21 @@ errinj.set("ERRINJ_WAL_WRITE_DISK", false) --- - ok ... +_ = space:insert{1} +--- +... +errinj.set("ERRINJ_WAL_WRITE", true) +--- +- ok +... +box.snapshot() +--- +- error: Error injection 'xlog write injection' +... +errinj.set("ERRINJ_WAL_WRITE", false) +--- +- ok +... space:drop() --- ... diff --git a/test/box/errinj.test.lua b/test/box/errinj.test.lua index e4dc7a5497..992f6e2a99 100644 --- a/test/box/errinj.test.lua +++ b/test/box/errinj.test.lua @@ -196,6 +196,12 @@ errinj.set("ERRINJ_WAL_WRITE", false) errinj.set("ERRINJ_WAL_WRITE_DISK", true) _ = space:insert{1, require'digest'.urandom(192 * 1024)} errinj.set("ERRINJ_WAL_WRITE_DISK", false) + +_ = space:insert{1} + +errinj.set("ERRINJ_WAL_WRITE", true) +box.snapshot() +errinj.set("ERRINJ_WAL_WRITE", false) space:drop() --test space:bsize() in case of memory error -- GitLab