From ae6244ad5ac0a698e4e53dcfef301c66bbaecbb7 Mon Sep 17 00:00:00 2001
From: Konstantin Osipov <kostja@tarantool.org>
Date: Wed, 21 Jan 2015 16:52:53 +0300
Subject: [PATCH] In engine API, separate checkpoint recovery from
 checkpointing.

set_snapshot_lsn is called at server start,
and snapshot() API is used to save a snapshot.
---
 src/box/engine.cc        |  4 ++--
 src/box/engine.h         | 10 ++++++++--
 src/box/memtx_engine.cc  | 16 ++++++++++++++--
 src/box/memtx_engine.h   |  1 +
 src/box/sophia_engine.cc | 18 +++++++++++-------
 src/box/sophia_engine.h  |  1 +
 6 files changed, 37 insertions(+), 13 deletions(-)

diff --git a/src/box/engine.cc b/src/box/engine.cc
index c83909f8f1..64fc0bcee9 100644
--- a/src/box/engine.cc
+++ b/src/box/engine.cc
@@ -85,7 +85,7 @@ EngineFactory *
 engine_find(const char *name)
 {
 	EngineFactory *e;
-	rlist_foreach_entry(e, &engines, link) {
+	engine_foreach(e) {
 		if (strcmp(e->name, name) == 0)
 			return e;
 	}
@@ -108,7 +108,7 @@ engine_begin_recover_snapshot(int64_t snapshot_lsn)
 	/* recover engine snapshot */
 	EngineFactory *f;
 	engine_foreach(f) {
-		f->snapshot(SNAPSHOT_RECOVER, snapshot_lsn);
+		f->set_snapshot_lsn(snapshot_lsn);
 	}
 }
 
diff --git a/src/box/engine.h b/src/box/engine.h
index ed063f3b53..71340c4f2f 100644
--- a/src/box/engine.h
+++ b/src/box/engine.h
@@ -79,10 +79,15 @@ enum engine_recovery_event {
  * Engine specific snapshot event.
  */
 enum engine_snapshot_event {
+	/** Begin two-face snapshot creation in this engine. */
 	SNAPSHOT_START,
-	SNAPSHOT_RECOVER,
+	/** Wait for completion of the two-phase snapshot creation */
+	SNAPSHOT_WAIT,
+	/**
+	 * On success, delete previous snapshot, on failure,
+	 * delete the last snapshot (passed in as lsn.
+	 */
 	SNAPSHOT_DELETE,
-	SNAPSHOT_WAIT
 };
 
 typedef void (*engine_recover_f)(struct space*);
@@ -138,6 +143,7 @@ class EngineFactory: public Object {
 	virtual void begin(struct txn*, struct space*);
 	virtual void commit(struct txn*);
 	virtual void rollback(struct txn*);
+	virtual void set_snapshot_lsn(int64_t lsn) = 0;
 	/**
 	 * Engine snapshotting support.
 	 */
diff --git a/src/box/memtx_engine.cc b/src/box/memtx_engine.cc
index eb956a725d..c2447e0026 100644
--- a/src/box/memtx_engine.cc
+++ b/src/box/memtx_engine.cc
@@ -200,7 +200,8 @@ MemtxFactory::keydefCheck(struct key_def *key_def)
 	}
 }
 
-void MemtxFactory::rollback(struct txn *txn)
+void
+MemtxFactory::rollback(struct txn *txn)
 {
 	struct txn_stmt *stmt;
 	rlist_foreach_entry_reverse(stmt, &txn->stmts, next) {
@@ -211,7 +212,18 @@ void MemtxFactory::rollback(struct txn *txn)
 	}
 }
 
-void MemtxFactory::snapshot(enum engine_snapshot_event, int64_t /* lsn */)
+/** Called at start to tell memtx to recover to a given LSN. */
+void
+MemtxFactory::set_snapshot_lsn(int64_t /* lsn */)
+{
+	/*
+	 * memtx snapshotting supported directly by box.
+	 * do nothing here.
+	 */
+}
+
+void
+MemtxFactory::snapshot(enum engine_snapshot_event, int64_t /* lsn */)
 {
 	/*
 	 * memtx snapshotting supported directly by box.
diff --git a/src/box/memtx_engine.h b/src/box/memtx_engine.h
index c3c6681258..0d9fb3b5d3 100644
--- a/src/box/memtx_engine.h
+++ b/src/box/memtx_engine.h
@@ -38,6 +38,7 @@ struct MemtxFactory: public EngineFactory {
 	virtual void keydefCheck(struct key_def *key_def);
 	virtual void recoveryEvent(enum engine_recovery_event event);
 	virtual void rollback(struct txn*);
+	virtual void set_snapshot_lsn(int64_t lsn);
 	virtual void snapshot(enum engine_snapshot_event, int64_t);
 };
 
diff --git a/src/box/sophia_engine.cc b/src/box/sophia_engine.cc
index 98fece2ff4..79f8a1cba2 100644
--- a/src/box/sophia_engine.cc
+++ b/src/box/sophia_engine.cc
@@ -391,21 +391,25 @@ sophia_snapshot_delete(void *env, int64_t lsn)
 		sophia_raise(env);
 }
 
-void SophiaFactory::snapshot(enum engine_snapshot_event e, int64_t lsn)
+void
+SophiaFactory::set_snapshot_lsn(int64_t lsn)
+{
+	sophia_snapshot_recover(env, lsn);
+}
+
+void
+SophiaFactory::snapshot(enum engine_snapshot_event e, int64_t lsn)
 {
 	switch (e) {
 	case SNAPSHOT_START:
 		sophia_snapshot(env, lsn);
 		break;
-	case SNAPSHOT_RECOVER:
-		sophia_snapshot_recover(env, lsn);
-		break;
-	case SNAPSHOT_DELETE:
-		sophia_snapshot_delete(env, lsn);
-		break;
 	case SNAPSHOT_WAIT:
 		while (! sophia_snapshot_ready(env, lsn))
 			fiber_yield_timeout(.020);
 		break;
+	case SNAPSHOT_DELETE:
+		sophia_snapshot_delete(env, lsn);
+		break;
 	}
 }
diff --git a/src/box/sophia_engine.h b/src/box/sophia_engine.h
index a9c1bc4a74..2b3cac646b 100644
--- a/src/box/sophia_engine.h
+++ b/src/box/sophia_engine.h
@@ -40,6 +40,7 @@ struct SophiaFactory: public EngineFactory {
 	virtual void commit(struct txn*);
 	virtual void rollback(struct txn*);
 	virtual void recoveryEvent(enum engine_recovery_event);
+	virtual void set_snapshot_lsn(int64_t);
 	virtual void snapshot(enum engine_snapshot_event, int64_t);
 	void *env;
 	void *tx;
-- 
GitLab