From 640eb0f124b5a484f962176581eacbe3556ee045 Mon Sep 17 00:00:00 2001
From: Ilya Verbin <iverbin@tarantool.org>
Date: Thu, 3 Aug 2023 13:31:25 +0300
Subject: [PATCH] box: replace malloc with xmalloc in index_def_dup

And remove unused index_def_check_xc().

As index_def_dup() never returns NULL anymore, change index_create() and
index_read_view_create() return type to `void` and update their callers.

NO_DOC=refactoring
NO_TEST=refactoring
NO_CHANGELOG=refactoring

(cherry picked from commit f6d6175460df74ff5c28df84dd7d8dcd010bb8b7)
---
 src/box/alter.cc           |  2 +-
 src/box/index.cc           | 11 ++---------
 src/box/index.h            |  4 ++--
 src/box/index_def.c        | 28 ++++------------------------
 src/box/index_def.h        | 19 +------------------
 src/box/memtx_bitset.cc    | 14 +++-----------
 src/box/memtx_hash.cc      | 19 ++++---------------
 src/box/memtx_rtree.cc     | 14 +++-----------
 src/box/memtx_tree.cc      | 18 +++---------------
 src/box/sequence.c         |  6 +-----
 src/box/session_settings.c | 14 +++-----------
 src/box/sysview.c          | 15 +++------------
 src/box/vinyl.c            |  6 +-----
 13 files changed, 31 insertions(+), 139 deletions(-)

diff --git a/src/box/alter.cc b/src/box/alter.cc
index e703b426b6..d1c365c644 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -1470,7 +1470,7 @@ class RebuildFuncIndex: public RebuildIndex
 	static struct index_def *
 	func_index_def_new(struct index_def *index_def, struct func *func)
 	{
-		struct index_def *new_index_def = index_def_dup_xc(index_def);
+		struct index_def *new_index_def = index_def_dup(index_def);
 		index_def_set_func(new_index_def, func);
 		return new_index_def;
 	}
diff --git a/src/box/index.cc b/src/box/index.cc
index 68effdfb44..d30bb36253 100644
--- a/src/box/index.cc
+++ b/src/box/index.cc
@@ -769,14 +769,11 @@ iterator_delete(struct iterator *it)
 	it->free(it);
 }
 
-int
+void
 index_create(struct index *index, struct engine *engine,
 	     const struct index_vtab *vtab, struct index_def *def)
 {
 	def = index_def_dup(def);
-	if (def == NULL)
-		return -1;
-
 	index->vtab = vtab;
 	index->engine = engine;
 	index->def = def;
@@ -787,7 +784,6 @@ index_create(struct index *index, struct engine *engine,
 	/* Unusable until set to proper value during space creation. */
 	index->dense_id = UINT32_MAX;
 	rlist_create(&index->read_gaps);
-	return 0;
 }
 
 void
@@ -805,17 +801,14 @@ index_delete(struct index *index)
 	index_def_delete(def);
 }
 
-int
+void
 index_read_view_create(struct index_read_view *rv,
 		       const struct index_read_view_vtab *vtab,
 		       struct index_def *def)
 {
 	rv->vtab = vtab;
 	rv->def = index_def_dup(def);
-	if (rv->def == NULL)
-		return -1;
 	rv->space = NULL;
-	return 0;
 }
 
 void
diff --git a/src/box/index.h b/src/box/index.h
index 65f73f507b..ed5b164d54 100644
--- a/src/box/index.h
+++ b/src/box/index.h
@@ -810,7 +810,7 @@ replace_check_dup(struct tuple *old_tuple, struct tuple *dup_tuple,
  * Initialize an index instance.
  * Note, this function copies the given index definition.
  */
-int
+void
 index_create(struct index *index, struct engine *engine,
 	     const struct index_vtab *vtab, struct index_def *def);
 
@@ -1015,7 +1015,7 @@ index_end_build(struct index *index)
  * Initialize an index read view instance.
  * Note, this function copies the given index definition.
  */
-int
+void
 index_read_view_create(struct index_read_view *rv,
 		       const struct index_read_view_vtab *vtab,
 		       struct index_def *def);
diff --git a/src/box/index_def.c b/src/box/index_def.c
index 458ebcaecd..b0d8d86f4d 100644
--- a/src/box/index_def.c
+++ b/src/box/index_def.c
@@ -119,31 +119,15 @@ index_def_new(uint32_t space_id, uint32_t iid, const char *name,
 struct index_def *
 index_def_dup(const struct index_def *def)
 {
-	struct index_def *dup = (struct index_def *) malloc(sizeof(*dup));
-	if (dup == NULL) {
-		diag_set(OutOfMemory, sizeof(*dup), "malloc",
-			 "struct index_def");
-		return NULL;
-	}
+	struct index_def *dup = xmalloc(sizeof(*dup));
 	*dup = *def;
-	dup->name = strdup(def->name);
-	if (dup->name == NULL) {
-		free(dup);
-		diag_set(OutOfMemory, strlen(def->name) + 1, "malloc",
-			 "index_def name");
-		return NULL;
-	}
+	dup->name = xstrdup(def->name);
 	dup->key_def = key_def_dup(def->key_def);
 	dup->cmp_def = key_def_dup(def->cmp_def);
 	rlist_create(&dup->link);
 	dup->opts = def->opts;
-	if (def->opts.stat != NULL) {
+	if (def->opts.stat != NULL)
 		dup->opts.stat = index_stat_dup(def->opts.stat);
-		if (dup->opts.stat == NULL) {
-			index_def_delete(dup);
-			return NULL;
-		}
-	}
 	return dup;
 }
 
@@ -174,11 +158,7 @@ index_stat_dup(const struct index_stat *src)
 {
 	size_t size = index_stat_sizeof(src->samples, src->sample_count,
 					src->sample_field_count);
-	struct index_stat *dup = (struct index_stat *) malloc(size);
-	if (dup == NULL) {
-		diag_set(OutOfMemory, size, "malloc", "index stat");
-		return NULL;
-	}
+	struct index_stat *dup = xmalloc(size);
 	memcpy(dup, src, size);
 	uint32_t array_size = src->sample_field_count * sizeof(uint32_t);
 	uint32_t stat1_offset = sizeof(struct index_stat);
diff --git a/src/box/index_def.h b/src/box/index_def.h
index 0506f94990..2d6916bc44 100644
--- a/src/box/index_def.h
+++ b/src/box/index_def.h
@@ -286,7 +286,7 @@ index_stat_sizeof(const struct index_sample *samples, uint32_t sample_count,
  * To understand memory layout see index_stat_sizeof() function.
  *
  * @param src Stat to duplicate.
- * @retval Copy of the @src or NULL on OOM.
+ * @retval Copy of the @src.
  */
 struct index_stat *
 index_stat_dup(const struct index_stat *src);
@@ -410,23 +410,6 @@ index_def_check(struct index_def *index_def, const char *space_name);
 
 #if defined(__cplusplus)
 } /* extern "C" */
-
-static inline struct index_def *
-index_def_dup_xc(const struct index_def *def)
-{
-	struct index_def *ret = index_def_dup(def);
-	if (ret == NULL)
-		diag_raise();
-	return ret;
-}
-
-static inline void
-index_def_check_xc(struct index_def *index_def, const char *space_name)
-{
-	if (index_def_check(index_def, space_name) != 0)
-		diag_raise();
-}
-
 #endif /* defined(__cplusplus) */
 
 #endif /* TARANTOOL_BOX_INDEX_DEF_H_INCLUDED */
diff --git a/src/box/memtx_bitset.cc b/src/box/memtx_bitset.cc
index c3a9369dd8..3a5cc82bac 100644
--- a/src/box/memtx_bitset.cc
+++ b/src/box/memtx_bitset.cc
@@ -529,17 +529,9 @@ memtx_bitset_index_new(struct memtx_engine *memtx, struct index_def *def)
 	assert(!def->opts.is_unique);
 
 	struct memtx_bitset_index *index =
-		(struct memtx_bitset_index *)calloc(1, sizeof(*index));
-	if (index == NULL) {
-		diag_set(OutOfMemory, sizeof(*index),
-			 "malloc", "struct memtx_bitset_index");
-		return NULL;
-	}
-	if (index_create(&index->base, (struct engine *)memtx,
-			 &memtx_bitset_index_vtab, def) != 0) {
-		free(index);
-		return NULL;
-	}
+		(struct memtx_bitset_index *)xcalloc(1, sizeof(*index));
+	index_create(&index->base, (struct engine *)memtx,
+		     &memtx_bitset_index_vtab, def);
 
 #ifndef OLD_GOOD_BITSET
 	index->spare_id = SPARE_ID_END;
diff --git a/src/box/memtx_hash.cc b/src/box/memtx_hash.cc
index e22a17ec38..db6fb6c1f1 100644
--- a/src/box/memtx_hash.cc
+++ b/src/box/memtx_hash.cc
@@ -641,10 +641,7 @@ memtx_hash_index_create_read_view(struct index *base)
 	struct memtx_hash_index *index = (struct memtx_hash_index *)base;
 	struct hash_read_view *rv =
 		(struct hash_read_view *)xmalloc(sizeof(*rv));
-	if (index_read_view_create(&rv->base, &vtab, base->def) != 0) {
-		free(rv);
-		return NULL;
-	}
+	index_read_view_create(&rv->base, &vtab, base->def);
 	struct space *space = space_by_id(base->def->space_id);
 	assert(space != NULL);
 	memtx_tx_snapshot_cleaner_create(&rv->cleaner, space);
@@ -689,17 +686,9 @@ struct index *
 memtx_hash_index_new(struct memtx_engine *memtx, struct index_def *def)
 {
 	struct memtx_hash_index *index =
-		(struct memtx_hash_index *)calloc(1, sizeof(*index));
-	if (index == NULL) {
-		diag_set(OutOfMemory, sizeof(*index),
-			 "malloc", "struct memtx_hash_index");
-		return NULL;
-	}
-	if (index_create(&index->base, (struct engine *)memtx,
-			 &memtx_hash_index_vtab, def) != 0) {
-		free(index);
-		return NULL;
-	}
+		(struct memtx_hash_index *)xcalloc(1, sizeof(*index));
+	index_create(&index->base, (struct engine *)memtx,
+		     &memtx_hash_index_vtab, def);
 
 	light_index_create(&index->hash_table, MEMTX_EXTENT_SIZE,
 			   memtx_index_extent_alloc, memtx_index_extent_free,
diff --git a/src/box/memtx_rtree.cc b/src/box/memtx_rtree.cc
index 1d9db44b40..989c344fa6 100644
--- a/src/box/memtx_rtree.cc
+++ b/src/box/memtx_rtree.cc
@@ -439,17 +439,9 @@ memtx_rtree_index_new(struct memtx_engine *memtx, struct index_def *def)
 	}
 
 	struct memtx_rtree_index *index =
-		(struct memtx_rtree_index *)calloc(1, sizeof(*index));
-	if (index == NULL) {
-		diag_set(OutOfMemory, sizeof(*index),
-			 "malloc", "struct memtx_rtree_index");
-		return NULL;
-	}
-	if (index_create(&index->base, (struct engine *)memtx,
-			 &memtx_rtree_index_vtab, def) != 0) {
-		free(index);
-		return NULL;
-	}
+		(struct memtx_rtree_index *)xcalloc(1, sizeof(*index));
+	index_create(&index->base, (struct engine *)memtx,
+		     &memtx_rtree_index_vtab, def);
 
 	index->dimension = def->opts.dimension;
 	rtree_init(&index->tree, index->dimension, MEMTX_EXTENT_SIZE,
diff --git a/src/box/memtx_tree.cc b/src/box/memtx_tree.cc
index 24a054aff4..2bcdbc31ad 100644
--- a/src/box/memtx_tree.cc
+++ b/src/box/memtx_tree.cc
@@ -2004,10 +2004,7 @@ memtx_tree_index_create_read_view(struct index *base)
 		(struct memtx_tree_index<USE_HINT> *)base;
 	struct tree_read_view<USE_HINT> *rv =
 		(struct tree_read_view<USE_HINT> *)xmalloc(sizeof(*rv));
-	if (index_read_view_create(&rv->base, &vtab, base->def) != 0) {
-		free(rv);
-		return NULL;
-	}
+	index_read_view_create(&rv->base, &vtab, base->def);
 	struct space *space = space_by_id(base->def->space_id);
 	assert(space != NULL);
 	memtx_tx_snapshot_cleaner_create(&rv->cleaner, space);
@@ -2129,17 +2126,8 @@ memtx_tree_index_new_tpl(struct memtx_engine *memtx, struct index_def *def,
 {
 	struct memtx_tree_index<USE_HINT> *index =
 		(struct memtx_tree_index<USE_HINT> *)
-		calloc(1, sizeof(*index));
-	if (index == NULL) {
-		diag_set(OutOfMemory, sizeof(*index),
-			 "malloc", "struct memtx_tree_index");
-		return NULL;
-	}
-	if (index_create(&index->base, (struct engine *)memtx,
-			 vtab, def) != 0) {
-		free(index);
-		return NULL;
-	}
+		xcalloc(1, sizeof(*index));
+	index_create(&index->base, (struct engine *)memtx, vtab, def);
 
 	/* See comment to memtx_tree_index_update_def(). */
 	struct key_def *cmp_def;
diff --git a/src/box/sequence.c b/src/box/sequence.c
index 692446a7a7..8d96415cc2 100644
--- a/src/box/sequence.c
+++ b/src/box/sequence.c
@@ -404,17 +404,13 @@ sequence_data_read_view_free(struct index_read_view *base)
 struct index_read_view *
 sequence_data_read_view_create(struct index *index)
 {
-	(void)index;
 	static const struct index_read_view_vtab vtab = {
 		.free = sequence_data_read_view_free,
 		.get_raw = sequence_data_read_view_get_raw,
 		.create_iterator = sequence_data_iterator_create,
 	};
 	struct sequence_data_read_view *rv = xmalloc(sizeof(*rv));
-	if (index_read_view_create(&rv->base, &vtab, index->def) != 0) {
-		free(rv);
-		return NULL;
-	}
+	index_read_view_create(&rv->base, &vtab, index->def);
 	light_sequence_view_create(&rv->view, &sequence_data_index);
 	return (struct index_read_view *)rv;
 }
diff --git a/src/box/session_settings.c b/src/box/session_settings.c
index 053628d3de..66fa9fc830 100644
--- a/src/box/session_settings.c
+++ b/src/box/session_settings.c
@@ -409,17 +409,9 @@ session_settings_space_create_index(struct space *space, struct index_def *def)
 		return NULL;
 	}
 
-	struct session_settings_index *index =
-		(struct session_settings_index *)calloc(1, sizeof(*index));
-	if (index == NULL) {
-		diag_set(OutOfMemory, sizeof(*index), "calloc", "index");
-		return NULL;
-	}
-	if (index_create(&index->base, space->engine,
-			 &session_settings_index_vtab, def) != 0) {
-		free(index);
-		return NULL;
-	}
+	struct session_settings_index *index = xcalloc(1, sizeof(*index));
+	index_create(&index->base, space->engine, &session_settings_index_vtab,
+		     def);
 
 	index->format = space->format;
 	return &index->base;
diff --git a/src/box/sysview.c b/src/box/sysview.c
index 9167e37a9c..6b3dfd790d 100644
--- a/src/box/sysview.c
+++ b/src/box/sysview.c
@@ -475,18 +475,9 @@ sysview_space_create_index(struct space *space, struct index_def *def)
 		return NULL;
 	}
 
-	struct sysview_index *index =
-		(struct sysview_index *)calloc(1, sizeof(*index));
-	if (index == NULL) {
-		diag_set(OutOfMemory, sizeof(*index),
-			 "malloc", "struct sysview_index");
-		return NULL;
-	}
-	if (index_create(&index->base, (struct engine *)sysview,
-			 &sysview_index_vtab, def) != 0) {
-		free(index);
-		return NULL;
-	}
+	struct sysview_index *index = xcalloc(1, sizeof(*index));
+	index_create(&index->base, (struct engine *)sysview,
+		     &sysview_index_vtab, def);
 
 	index->source_space_id = source_space_id;
 	index->source_index_id = source_index_id;
diff --git a/src/box/vinyl.c b/src/box/vinyl.c
index d2f1f61d9a..dc2c053be9 100644
--- a/src/box/vinyl.c
+++ b/src/box/vinyl.c
@@ -713,11 +713,7 @@ vinyl_space_create_index(struct space *space, struct index_def *index_def)
 	if (lsm == NULL)
 		return NULL;
 
-	if (index_create(&lsm->base, &env->base,
-			 &vinyl_index_vtab, index_def) != 0) {
-		vy_lsm_delete(lsm);
-		return NULL;
-	}
+	index_create(&lsm->base, &env->base, &vinyl_index_vtab, index_def);
 	return &lsm->base;
 }
 
-- 
GitLab