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