From 811ce92df6765ceb3241a9b67033185437a8362d Mon Sep 17 00:00:00 2001
From: Roman Tsisyk <roman@tsisyk.com>
Date: Mon, 18 Apr 2016 18:16:52 +0300
Subject: [PATCH] Remove struct recovery from memtx_engine.cc

---
 src/box/box.cc          |  7 ++++++-
 src/box/memtx_engine.cc | 16 +++++-----------
 src/box/memtx_engine.h  |  4 +++-
 src/box/recovery.h      |  8 ++++----
 4 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/src/box/box.cc b/src/box/box.cc
index 8befbe5fd2..c09569adac 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -1200,7 +1200,8 @@ engine_init()
 	 * so it must be registered first.
 	 */
 	MemtxEngine *memtx = new MemtxEngine(cfg_gets("snap_dir"),
-					     cfg_geti("panic_on_snap_error"));
+					     cfg_geti("panic_on_snap_error"),
+					     cfg_geti("panic_on_wal_error"));
 	engine_register(memtx);
 
 	SysviewEngine *sysview = new SysviewEngine();
@@ -1344,8 +1345,12 @@ box_init(void)
 		recovery = recovery_new(cfg_gets("wal_dir"),
 					cfg_geti("panic_on_wal_error"),
 					&checkpoint_vclock);
+		/* Add a surrogate server id for snapshot rows */
+		vclock_add_server(&recovery->vclock, 0);
 		/* Tell Sophia engine LSN it must recover to. */
 		engine_recover_to_checkpoint(lsn);
+		/* Replace server vclock using the data from snapshot */
+		vclock_copy(&recovery->vclock, &checkpoint_vclock);
 		engine_begin_wal_recovery();
 	} else {
 		/* TODO: don't create recovery for this case */
diff --git a/src/box/memtx_engine.cc b/src/box/memtx_engine.cc
index 919adf7299..f53e2ab114 100644
--- a/src/box/memtx_engine.cc
+++ b/src/box/memtx_engine.cc
@@ -44,7 +44,6 @@
 #include "iproto_constants.h"
 #include "xrow.h"
 #include "xstream.h"
-#include "recovery.h"
 #include "cluster.h"
 #include "relay.h"
 #include "schema.h"
@@ -601,11 +600,13 @@ memtx_build_secondary_keys(struct space *space, void *param)
 	handler->replace = memtx_replace_all_keys;
 }
 
-MemtxEngine::MemtxEngine(const char *snap_dirname, bool panic_on_snap_error)
+MemtxEngine::MemtxEngine(const char *snap_dirname, bool panic_on_snap_error,
+			 bool panic_on_wal_error)
 	:Engine("memtx"),
 	m_checkpoint(0),
 	m_state(MEMTX_INITIALIZED),
-	m_snap_io_rate_limit(UINT64_MAX)
+	m_snap_io_rate_limit(UINT64_MAX),
+	m_panic_on_wal_error(panic_on_wal_error)
 {
 	flags = ENGINE_CAN_BE_TEMPORARY;
 	xdir_create(&m_snap_dir, snap_dirname, SNAP, &SERVER_ID);
@@ -662,7 +663,6 @@ MemtxEngine::recoverSnapshotRow(struct xrow_header *row)
 void
 MemtxEngine::recoverToCheckpoint(int64_t lsn)
 {
-	struct recovery *r = ::recovery;
 	assert(m_state == MEMTX_INITIALIZED);
 	/*
 	 * By default, enable fast start: bulk read of tuples
@@ -683,9 +683,6 @@ MemtxEngine::recoverToCheckpoint(int64_t lsn)
 	/* Save server UUID */
 	SERVER_ID = snap->server_uuid;
 
-	/* Add a surrogate server id for snapshot rows */
-	vclock_add_server(&r->vclock, 0);
-
 	say_info("recovering from `%s'", snap->filename);
 	struct xlog_cursor cursor;
 	xlog_cursor_open(&cursor, snap);
@@ -713,14 +710,11 @@ MemtxEngine::recoverToCheckpoint(int64_t lsn)
 	if (!cursor.eof_read)
 		panic("snapshot `%s' has no EOF marker", snap->filename);
 
-	/* Replace server vclock using the data from snapshot */
-	vclock_copy(&r->vclock, &snap->vclock);
-
 	if (m_state == MEMTX_READING_SNAPSHOT) {
 		/* End of the fast path: loaded the primary key. */
 		space_foreach(memtx_end_build_primary_key, this);
 
-		if (r->wal_dir.panic_if_error) {
+		if (m_panic_on_wal_error) {
 			/*
 			 * Fast start path: "play out" WAL
 			 * records using the primary key only,
diff --git a/src/box/memtx_engine.h b/src/box/memtx_engine.h
index 3f32eb2f7a..6ca9201794 100644
--- a/src/box/memtx_engine.h
+++ b/src/box/memtx_engine.h
@@ -44,7 +44,8 @@ enum memtx_recovery_state {
 extern struct mempool memtx_index_extent_pool;
 
 struct MemtxEngine: public Engine {
-	MemtxEngine(const char *snap_dirname, bool panic_on_snap_error);
+	MemtxEngine(const char *snap_dirname, bool panic_on_snap_error,
+					      bool panic_on_wal_error);
 	~MemtxEngine();
 	virtual Handler *open() override;
 	virtual Index *createIndex(struct key_def *key_def) override;
@@ -90,6 +91,7 @@ struct MemtxEngine: public Engine {
 	/** Limit disk usage of checkpointing (bytes per second). */
 	uint64_t m_snap_io_rate_limit;
 	struct vclock m_last_checkpoint;
+	bool m_panic_on_wal_error;
 };
 
 enum {
diff --git a/src/box/recovery.h b/src/box/recovery.h
index fa4fa3f1a9..61a7b3c598 100644
--- a/src/box/recovery.h
+++ b/src/box/recovery.h
@@ -89,6 +89,10 @@ recovery_finalize(struct recovery *r, struct xstream *stream,
 void
 recovery_fill_lsn(struct recovery *r, struct xrow_header *row);
 
+#if defined(__cplusplus)
+} /* extern "C" */
+#endif /* defined(__cplusplus) */
+
 /**
  * The write ahead log doesn't store the last checkpoint:
  * it is represented by the last valid snapshot of memtx engine.
@@ -118,8 +122,4 @@ void
 recover_remaining_wals(struct recovery *r, struct xstream *stream,
 		       struct vclock *stop_vclock);
 
-#if defined(__cplusplus)
-} /* extern "C" */
-#endif /* defined(__cplusplus) */
-
 #endif /* TARANTOOL_RECOVERY_H_INCLUDED */
-- 
GitLab