diff --git a/src/box/engine.cc b/src/box/engine.cc index c83909f8f1a4d602d9bcb5d48bf3f217cc64b017..64fc0bcee98d11c3fdf6d8af792c68bf77128172 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 ed063f3b53a731c62f3a8617c6bd5b1dd6fd04b7..71340c4f2f38ce00c9a2f164dd1d1a206e766255 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 eb956a725de3bc92141280ab8200dc929735ddec..c2447e0026c0a0f919532e5024a46f38d06c4616 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 c3c6681258d3e59ef66df0536de49aca9c0b8aa3..0d9fb3b5d3863548466e8d9ca050572aede32eb7 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 98fece2ff4ccef0261476165755b5896ad676057..79f8a1cba2d35ccedbe7a7de1b2a522521e06b2b 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 a9c1bc4a74254ca335368218215cae813bd3dcfd..2b3cac646b9f957dcee860b31d68850fb9b0a70a 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;