diff --git a/src/box/alter.cc b/src/box/alter.cc index 854ca6d96086aebfaf0ad2145640af3e2a27fa42..6e5d6e52e0b24be4311a619ef2b0ebc65a43ffde 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -1178,6 +1178,7 @@ class CreateIndex: public AlterSpaceOp virtual void alter_def(struct alter_space *alter); virtual void alter(struct alter_space *alter); virtual void commit(struct alter_space *alter, int64_t lsn); + virtual void rollback(struct alter_space *alter); virtual ~CreateIndex(); }; @@ -1232,6 +1233,14 @@ CreateIndex::commit(struct alter_space *alter, int64_t signature) index_commit_create(new_index, signature); } +void +CreateIndex::rollback(struct alter_space *alter) +{ + struct index *new_index = index_find_xc(alter->new_space, + new_index_def->iid); + index_abort_create(new_index); +} + CreateIndex::~CreateIndex() { if (new_index_def) @@ -1264,6 +1273,7 @@ class RebuildIndex: public AlterSpaceOp virtual void alter_def(struct alter_space *alter); virtual void alter(struct alter_space *alter); virtual void commit(struct alter_space *alter, int64_t signature); + virtual void rollback(struct alter_space *alter); virtual ~RebuildIndex(); }; @@ -1298,6 +1308,14 @@ RebuildIndex::commit(struct alter_space *alter, int64_t signature) index_commit_create(new_index, signature); } +void +RebuildIndex::rollback(struct alter_space *alter) +{ + struct index *new_index = space_index(alter->new_space, + new_index_def->iid); + index_abort_create(new_index); +} + RebuildIndex::~RebuildIndex() { if (new_index_def) diff --git a/src/box/index.cc b/src/box/index.cc index 21c768cef69db5084570a7d8cb89465dad2dbf41..d02cbbc5d7b5cfdabe2ea9ce03d59cb7e3f390e4 100644 --- a/src/box/index.cc +++ b/src/box/index.cc @@ -540,6 +540,11 @@ generic_index_commit_create(struct index *, int64_t) { } +void +generic_index_abort_create(struct index *) +{ +} + void generic_index_commit_drop(struct index *) { diff --git a/src/box/index.h b/src/box/index.h index 81d32a8bc18c5bca3deb1b62b47d027774cc89e0..b8b0feb27a511803d49b164b0aeebde3571c4053 100644 --- a/src/box/index.h +++ b/src/box/index.h @@ -350,6 +350,11 @@ struct index_vtab { * a snapshot row, it is set to the snapshot signature. */ void (*commit_create)(struct index *index, int64_t signature); + /** + * Called if index creation failed, either due to + * WAL write error or build error. + */ + void (*abort_create)(struct index *index); /** * Called after WAL write to commit index drop. * Must not fail. @@ -468,6 +473,12 @@ index_commit_create(struct index *index, int64_t signature) index->vtab->commit_create(index, signature); } +static inline void +index_abort_create(struct index *index) +{ + index->vtab->abort_create(index); +} + static inline void index_commit_drop(struct index *index) { @@ -587,6 +598,7 @@ index_end_build(struct index *index) * Virtual method stubs. */ void generic_index_commit_create(struct index *, int64_t); +void generic_index_abort_create(struct index *); void generic_index_commit_drop(struct index *); void generic_index_update_def(struct index *); ssize_t generic_index_size(struct index *); diff --git a/src/box/memtx_bitset.c b/src/box/memtx_bitset.c index d76ee56d2c06f321b99d30cc7199c235a9d6347a..c2685a657a54c33b69634012b75142fcea64ae77 100644 --- a/src/box/memtx_bitset.c +++ b/src/box/memtx_bitset.c @@ -457,6 +457,7 @@ memtx_bitset_index_count(struct index *base, enum iterator_type type, static const struct index_vtab memtx_bitset_index_vtab = { /* .destroy = */ memtx_bitset_index_destroy, /* .commit_create = */ generic_index_commit_create, + /* .abort_create = */ generic_index_abort_create, /* .commit_drop = */ generic_index_commit_drop, /* .update_def = */ generic_index_update_def, /* .size = */ memtx_bitset_index_size, diff --git a/src/box/memtx_hash.c b/src/box/memtx_hash.c index 3cb6cbcda57c5906f13b89cfff8270c6ad7382e7..4dab23cdaa53e5a043f10ae7154bdd69427a4aa6 100644 --- a/src/box/memtx_hash.c +++ b/src/box/memtx_hash.c @@ -381,6 +381,7 @@ memtx_hash_index_create_snapshot_iterator(struct index *base) static const struct index_vtab memtx_hash_index_vtab = { /* .destroy = */ memtx_hash_index_destroy, /* .commit_create = */ generic_index_commit_create, + /* .abort_create = */ generic_index_abort_create, /* .commit_drop = */ generic_index_commit_drop, /* .update_def = */ memtx_hash_index_update_def, /* .size = */ memtx_hash_index_size, diff --git a/src/box/memtx_rtree.c b/src/box/memtx_rtree.c index 35fcd2d07869a2a413546e8a76089dc80d2329a7..dea68897bdd4d9623212356aeffdd95bbabb2504 100644 --- a/src/box/memtx_rtree.c +++ b/src/box/memtx_rtree.c @@ -295,6 +295,7 @@ memtx_rtree_index_begin_build(struct index *base) static const struct index_vtab memtx_rtree_index_vtab = { /* .destroy = */ memtx_rtree_index_destroy, /* .commit_create = */ generic_index_commit_create, + /* .abort_create = */ generic_index_abort_create, /* .commit_drop = */ generic_index_commit_drop, /* .update_def = */ generic_index_update_def, /* .size = */ memtx_rtree_index_size, diff --git a/src/box/memtx_tree.c b/src/box/memtx_tree.c index c976bd9c0620ecfa35043ce806f25ae71fbb1755..06b74e119bcb7356a37fedc4b9ebc6741d00a918 100644 --- a/src/box/memtx_tree.c +++ b/src/box/memtx_tree.c @@ -582,6 +582,7 @@ memtx_tree_index_create_snapshot_iterator(struct index *base) static const struct index_vtab memtx_tree_index_vtab = { /* .destroy = */ memtx_tree_index_destroy, /* .commit_create = */ generic_index_commit_create, + /* .abort_create = */ generic_index_abort_create, /* .commit_drop = */ generic_index_commit_drop, /* .update_def = */ memtx_tree_index_update_def, /* .size = */ memtx_tree_index_size, diff --git a/src/box/sysview_index.c b/src/box/sysview_index.c index ce2f2cb23e2d3ca76c4ae869930461e5f0537816..be17fd328dd86bf944a995ea514eb50974553394 100644 --- a/src/box/sysview_index.c +++ b/src/box/sysview_index.c @@ -161,6 +161,7 @@ sysview_index_get(struct index *base, const char *key, static const struct index_vtab sysview_index_vtab = { /* .destroy = */ sysview_index_destroy, /* .commit_create = */ generic_index_commit_create, + /* .abort_create = */ generic_index_abort_create, /* .commit_drop = */ generic_index_commit_drop, /* .update_def = */ generic_index_update_def, /* .size = */ generic_index_size, diff --git a/src/box/vinyl.c b/src/box/vinyl.c index ed87aa9c49d07869f5b1cf52ce3bf014961042a7..8abfaac9fca04c2cd11a811356acf72dd6f4b894 100644 --- a/src/box/vinyl.c +++ b/src/box/vinyl.c @@ -3959,6 +3959,7 @@ static const struct space_vtab vinyl_space_vtab = { static const struct index_vtab vinyl_index_vtab = { /* .destroy = */ vinyl_index_destroy, /* .commit_create = */ vinyl_index_commit_create, + /* .abort_create = */ generic_index_abort_create, /* .commit_drop = */ vinyl_index_commit_drop, /* .update_def = */ generic_index_update_def, /* .size = */ vinyl_index_size,