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