From 903d659aee1e08c16401222e983d57c9b74bb3f6 Mon Sep 17 00:00:00 2001
From: Dmitry Simonenko <pmwkaa@gmail.com>
Date: Fri, 16 Jan 2015 18:17:26 +0400
Subject: [PATCH] sophia-snapshot: do not poll engines for snapshot completion

---
 src/box/box.cc           | 9 ++++-----
 src/box/engine.h         | 4 ++--
 src/box/engine_memtx.cc  | 3 +--
 src/box/engine_memtx.h   | 2 +-
 src/box/engine_sophia.cc | 9 +++++----
 src/box/engine_sophia.h  | 2 +-
 6 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/src/box/box.cc b/src/box/box.cc
index 5b87acea0c..b4867af3d4 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -562,11 +562,10 @@ box_snapshot_delete_engine(EngineFactory *f, void *udate)
 }
 
 static inline void
-box_snapshot_complete_engine(EngineFactory *f, void *udate)
+box_snapshot_wait_engine(EngineFactory *f, void *udate)
 {
 	uint64_t lsn = *(uint64_t*)udate;
-	while (! f->snapshot(SNAPSHOT_READY, lsn))
-		fiber_yield_timeout(.020);
+	f->snapshot(SNAPSHOT_WAIT, lsn);
 }
 
 static ssize_t
@@ -636,7 +635,7 @@ box_snapshot(void)
 		goto error;
 
 	/* wait for engine snapshot completion */
-	engine_foreach(box_snapshot_complete_engine, &snap_lsn);
+	engine_foreach(box_snapshot_wait_engine, &snap_lsn);
 
 	/* rename snapshot on completion */
 	rc = coeio_custom(box_snapshot_rename_cb,
@@ -671,7 +670,7 @@ box_deploy(struct recovery_state *r)
 	/* create engine snapshot and wait for completion */
 	uint64_t snap_lsn = vclock_signature(&r->vclock);
 	engine_foreach(box_snapshot_engine, &snap_lsn);
-	engine_foreach(box_snapshot_complete_engine, &snap_lsn);
+	engine_foreach(box_snapshot_wait_engine, &snap_lsn);
 }
 
 void
diff --git a/src/box/engine.h b/src/box/engine.h
index 7c576dd869..e141345102 100644
--- a/src/box/engine.h
+++ b/src/box/engine.h
@@ -82,7 +82,7 @@ enum engine_snapshot_event {
 	SNAPSHOT_START,
 	SNAPSHOT_RECOVER,
 	SNAPSHOT_DELETE,
-	SNAPSHOT_READY
+	SNAPSHOT_WAIT
 };
 
 typedef void (*engine_recover_f)(struct space*);
@@ -141,7 +141,7 @@ class EngineFactory: public Object {
 	/**
 	 * Engine snapshotting support.
 	 */
-	virtual int snapshot(enum engine_snapshot_event, uint64_t) = 0;
+	virtual void snapshot(enum engine_snapshot_event, uint64_t) = 0;
 public:
 	/** Name of the engine. */
 	const char *name;
diff --git a/src/box/engine_memtx.cc b/src/box/engine_memtx.cc
index 5785ac290d..9c9134d8c6 100644
--- a/src/box/engine_memtx.cc
+++ b/src/box/engine_memtx.cc
@@ -213,10 +213,9 @@ void MemtxFactory::rollback(struct txn *txn)
 	}
 }
 
-int MemtxFactory::snapshot(enum engine_snapshot_event, uint64_t /* lsn */) {
+void MemtxFactory::snapshot(enum engine_snapshot_event, uint64_t /* lsn */) {
 /*
  * memtx snapshotting supported directly by box.
  * do nothing here.
 */
-	return 1;
 }
diff --git a/src/box/engine_memtx.h b/src/box/engine_memtx.h
index aefa35b921..ad1b60a0c2 100644
--- a/src/box/engine_memtx.h
+++ b/src/box/engine_memtx.h
@@ -37,7 +37,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 int  snapshot(enum engine_snapshot_event, uint64_t);
+	virtual void snapshot(enum engine_snapshot_event, uint64_t);
 };
 
 #endif /* TARANTOOL_BOX_ENGINE_MEMTX_H_INCLUDED */
diff --git a/src/box/engine_sophia.cc b/src/box/engine_sophia.cc
index 4b6d766df5..bc24a30c07 100644
--- a/src/box/engine_sophia.cc
+++ b/src/box/engine_sophia.cc
@@ -391,7 +391,7 @@ sophia_snapshot_delete(void *env, uint64_t lsn)
 		sophia_raise(env);
 }
 
-int SophiaFactory::snapshot(enum engine_snapshot_event e, uint64_t lsn)
+void SophiaFactory::snapshot(enum engine_snapshot_event e, uint64_t lsn)
 {
 	switch (e) {
 	case SNAPSHOT_START:
@@ -403,8 +403,9 @@ int SophiaFactory::snapshot(enum engine_snapshot_event e, uint64_t lsn)
 	case SNAPSHOT_DELETE:
 		sophia_snapshot_delete(env, lsn);
 		break;
-	case SNAPSHOT_READY:
-		return sophia_snapshot_ready(env, lsn);
+	case SNAPSHOT_WAIT:
+		while (! sophia_snapshot_ready(env, lsn))
+			fiber_yield_timeout(.020);
+		break;
 	}
-	return 0;
 }
diff --git a/src/box/engine_sophia.h b/src/box/engine_sophia.h
index 5d45055588..8ce9982b77 100644
--- a/src/box/engine_sophia.h
+++ b/src/box/engine_sophia.h
@@ -40,7 +40,7 @@ struct SophiaFactory: public EngineFactory {
 	virtual void commit(struct txn*);
 	virtual void rollback(struct txn*);
 	virtual void recoveryEvent(enum engine_recovery_event);
-	virtual int  snapshot(enum engine_snapshot_event, uint64_t);
+	virtual void snapshot(enum engine_snapshot_event, uint64_t);
 	void *env;
 	void *tx;
 };
-- 
GitLab