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,