From 17b5745a7d8f9946de51a0d30bf01f0e02b5e87c Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko <pmwkaa@gmail.com> Date: Thu, 3 Apr 2014 16:45:36 +0400 Subject: [PATCH] sophia-index: make DropIndex engine specific. --- src/box/alter.cc | 6 +----- src/box/engine.h | 4 ++++ src/box/engine_memtx.cc | 10 ++++++++++ src/box/engine_memtx.h | 1 + src/box/engine_sophia.cc | 6 ++++++ src/box/engine_sophia.h | 1 + test/box/sophia.result | 2 +- test/box/sophia.test.lua | 2 +- 8 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/box/alter.cc b/src/box/alter.cc index f19e311d4c..aec77035a1 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -596,11 +596,7 @@ DropIndex::commit(struct alter_space *alter) Index *pk = index_find(alter->old_space, 0); if (pk == NULL) return; - struct iterator *it = pk->position(); - pk->initIterator(it, ITER_ALL, NULL, 0); - struct tuple *tuple; - while ((tuple = it->next(it))) - tuple_ref(tuple, -1); + alter->old_space->engine->factory->dropIndex(pk); } /** Change non-essential (no data change) properties of an index. */ diff --git a/src/box/engine.h b/src/box/engine.h index e32203de8d..21c586c419 100644 --- a/src/box/engine.h +++ b/src/box/engine.h @@ -101,6 +101,10 @@ class EngineFactory: public Object { * space. */ virtual Index *createIndex(struct key_def*) = 0; + /* + * Delete all tuples in the index on drop. + */ + virtual void dropIndex(Index*) = 0; /** * Check a key definition for violation of * various limits. diff --git a/src/box/engine_memtx.cc b/src/box/engine_memtx.cc index 4fe7c8d628..cb8fab1c7d 100644 --- a/src/box/engine_memtx.cc +++ b/src/box/engine_memtx.cc @@ -111,6 +111,16 @@ MemtxFactory::createIndex(struct key_def *key_def) } } +void +MemtxFactory::dropIndex(Index *index) +{ + struct iterator *it = index->position(); + index->initIterator(it, ITER_ALL, NULL, 0); + struct tuple *tuple; + while ((tuple = it->next(it))) + tuple_ref(tuple, -1); +} + void MemtxFactory::keydefCheck(struct key_def *key_def) { diff --git a/src/box/engine_memtx.h b/src/box/engine_memtx.h index 60f73a0593..e3ea0c0fa4 100644 --- a/src/box/engine_memtx.h +++ b/src/box/engine_memtx.h @@ -33,6 +33,7 @@ struct MemtxFactory: public EngineFactory { MemtxFactory(); virtual Engine *open(); virtual Index *createIndex(struct key_def *key_def); + virtual void dropIndex(Index *index); virtual void keydefCheck(struct key_def *key_def); virtual void recoveryEvent(enum engine_recovery_event event); }; diff --git a/src/box/engine_sophia.cc b/src/box/engine_sophia.cc index 1c28e62cab..3a06c76c05 100644 --- a/src/box/engine_sophia.cc +++ b/src/box/engine_sophia.cc @@ -134,6 +134,12 @@ SophiaFactory::createIndex(struct key_def *key_def) } } +void +SophiaFactory::dropIndex(Index *index) +{ + (void)index; +} + void SophiaFactory::keydefCheck(struct key_def *key_def) { diff --git a/src/box/engine_sophia.h b/src/box/engine_sophia.h index 2432705e13..c4320ada45 100644 --- a/src/box/engine_sophia.h +++ b/src/box/engine_sophia.h @@ -34,6 +34,7 @@ struct SophiaFactory: public EngineFactory { virtual void init(); virtual Engine *open(); virtual Index *createIndex(struct key_def *key_def); + virtual void dropIndex(Index *index); virtual void keydefCheck(struct key_def *key_def); virtual void txnFinish(struct txn *txn); virtual void recoveryEvent(enum engine_recovery_event event); diff --git a/test/box/sophia.result b/test/box/sophia.result index e576f18229..7cae8cef6e 100644 --- a/test/box/sophia.result +++ b/test/box/sophia.result @@ -103,7 +103,7 @@ t space:drop() --- ... -os.execute("rm -rf space0123") +os.execute("rm -rf sophia") --- - 0 ... diff --git a/test/box/sophia.test.lua b/test/box/sophia.test.lua index 7843558b3a..759fe750ab 100644 --- a/test/box/sophia.test.lua +++ b/test/box/sophia.test.lua @@ -24,4 +24,4 @@ for v=1, 10 do table.insert(t, space:get({v})) end t space:drop() -os.execute("rm -rf space0123") +os.execute("rm -rf sophia") -- GitLab