[tarantool-patches] [PATCH v2 2/6] refactoring: remove exceptions from used in alter.cc outer functions

Ilya Kosarev i.kosarev at tarantool.org
Fri Aug 16 21:37:48 MSK 2019


Outer functions, used in alter.cc, are cleared from triggers.
Their usage in alter.cc is updated.
---
 src/box/alter.cc       | 169 +++++++++++++++++++++++++++--------------
 src/box/identifier.h   |  10 ---
 src/box/replication.cc | 115 +++++++++++++++-------------
 src/box/replication.h  |   2 +-
 src/box/schema.cc      |  28 +++++--
 src/box/schema.h       |  13 +---
 src/box/sequence.h     |   9 ---
 src/box/user.cc        |   9 ++-
 src/box/user.h         |  14 +---
 9 files changed, 208 insertions(+), 161 deletions(-)

diff --git a/src/box/alter.cc b/src/box/alter.cc
index 81edd62b5..6b51fdc16 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -100,7 +100,9 @@ access_check_ddl(const char *name, uint32_t object_id, uint32_t owner_uid,
 			return; /* Access granted. */
 	}
 	/* Create a meaningful error message. */
-	struct user *user = user_find_xc(cr->uid);
+	struct user *user = user_find(cr->uid);
+	if (user == NULL)
+		diag_raise();
 	const char *object_name;
 	const char *pname;
 	if (access & PRIV_U) {
@@ -285,7 +287,8 @@ index_def_new_from_tuple(struct tuple *tuple, struct space *space)
 			  tt_cstr(name, BOX_INVALID_NAME_MAX),
 			  space_name(space), "index name is too long");
 	}
-	identifier_check_xc(name, name_len);
+	if (identifier_check(name, name_len) != 0)
+		diag_raise();
 	struct key_def *key_def = NULL;
 	struct key_part_def *part_def = (struct key_part_def *)
 			malloc(sizeof(*part_def) * part_count);
@@ -430,7 +433,8 @@ field_def_decode(struct field_def *field, const char **data,
 			  tt_sprintf("field %d name is too long",
 				     fieldno + TUPLE_INDEX_BASE));
 	}
-	identifier_check_xc(field->name, field_name_len);
+	if (identifier_check(field->name, field_name_len) != 0)
+		diag_raise();
 	if (field->type == field_type_MAX) {
 		tnt_raise(ClientError, errcode, tt_cstr(space_name, name_len),
 			  tt_sprintf("field %d has unknown field type",
@@ -524,7 +528,8 @@ space_def_new_from_tuple(struct tuple *tuple, uint32_t errcode,
 		tnt_raise(ClientError, errcode,
 			  tt_cstr(name, BOX_INVALID_NAME_MAX),
 			  "space name is too long");
-	identifier_check_xc(name, name_len);
+	if (identifier_check(name, name_len) != 0)
+		diag_raise();
 	uint32_t id = tuple_field_u32_xc(tuple, BOX_SPACE_FIELD_ID);
 	if (id > BOX_SPACE_MAX) {
 		tnt_raise(ClientError, errcode, tt_cstr(name, name_len),
@@ -549,7 +554,8 @@ space_def_new_from_tuple(struct tuple *tuple, uint32_t errcode,
 		tnt_raise(ClientError, errcode, tt_cstr(name, name_len),
 			  "space engine name is too long");
 	}
-	identifier_check_xc(engine_name, engine_name_len);
+	if (identifier_check(engine_name, engine_name_len) != 0)
+		diag_raise();
 	struct field_def *fields;
 	uint32_t field_count;
 	/* Check space opts. */
@@ -1986,10 +1992,15 @@ on_replace_dd_space(struct trigger * /* trigger */, void *event)
 				  space_name(old_space),
 				  "the space has indexes");
 		}
-		if (schema_find_grants("space", old_space->def->id)) {
-			tnt_raise(ClientError, ER_DROP_SPACE,
-				  space_name(old_space),
-				  "the space has grants");
+		bool out;
+		if (schema_find_grants("space", old_space->def->id, &out) != 0) {
+			return -1;
+		}
+		if (out) {
+			diag_set(ClientError, ER_DROP_SPACE,
+				 space_name(old_space),
+				 "the space has grants");
+			return -1;
 		}
 		if (space_has_data(BOX_TRUNCATE_ID, 0, old_space->def->id))
 			tnt_raise(ClientError, ER_DROP_SPACE,
@@ -2553,7 +2564,8 @@ user_def_new_from_tuple(struct tuple *tuple)
 		tnt_raise(ClientError, ER_CREATE_USER,
 			  user->name, "unknown user type");
 	}
-	identifier_check_xc(user->name, name_len);
+	if (identifier_check(user->name, name_len) != 0)
+		diag_raise();
 	/*
 	 * AUTH_DATA field in _user space should contain
 	 * chap-sha1 -> base64_encode(sha1(sha1(password), 0).
@@ -2698,7 +2710,8 @@ func_def_new_from_tuple(struct tuple *tuple)
 			  tt_cstr(name, BOX_INVALID_NAME_MAX),
 			  "function name is too long");
 	}
-	identifier_check_xc(name, name_len);
+	if (identifier_check(name, name_len) != 0)
+		diag_raise();
 	if (field_count > BOX_FUNC_FIELD_BODY) {
 		body = tuple_field_str_xc(tuple, BOX_FUNC_FIELD_BODY,
 					  &body_len);
@@ -2933,10 +2946,15 @@ on_replace_dd_func(struct trigger * /* trigger */, void *event)
 		access_check_ddl(old_func->def->name, fid, uid, SC_FUNCTION,
 				 PRIV_D);
 		/* Can only delete func if it has no grants. */
-		if (schema_find_grants("function", old_func->def->fid)) {
-			tnt_raise(ClientError, ER_DROP_FUNCTION,
-				  (unsigned) old_func->def->uid,
-				  "function has grants");
+		bool out;
+		if (schema_find_grants("function", old_func->def->fid, &out) != 0) {
+			return -1;
+		}
+		if (out) {
+			diag_set(ClientError, ER_DROP_FUNCTION,
+				 (unsigned) old_func->def->uid,
+				 "function has grants");
+			return -1;
 		}
 		if (old_func != NULL &&
 		    space_has_data(BOX_FUNC_INDEX_ID, 1, old_func->def->fid)) {
@@ -2985,7 +3003,8 @@ coll_id_def_new_from_tuple(struct tuple *tuple, struct coll_id_def *def)
 	if (name_len > BOX_NAME_MAX)
 		tnt_raise(ClientError, ER_CANT_CREATE_COLLATION,
 			  "collation name is too long");
-	identifier_check_xc(def->name, name_len);
+	if (identifier_check(def->name, name_len) != 0)
+		diag_raise();
 
 	def->owner_id = tuple_field_u32_xc(tuple, BOX_COLLATION_FIELD_UID);
 	struct coll_def *base = &def->base;
@@ -3002,7 +3021,8 @@ coll_id_def_new_from_tuple(struct tuple *tuple, struct coll_id_def *def)
 		tnt_raise(ClientError, ER_CANT_CREATE_COLLATION,
 			  "collation locale is too long");
 	if (locale_len > 0)
-		identifier_check_xc(locale, locale_len);
+		if (identifier_check(locale, locale_len) != 0)
+			diag_raise();
 	snprintf(base->locale, sizeof(base->locale), "%.*s", locale_len,
 		 locale);
 	const char *options =
@@ -3171,20 +3191,25 @@ on_replace_dd_collation(struct trigger * /* trigger */, void *event)
 /**
  * Create a privilege definition from tuple.
  */
-void
+int
 priv_def_create_from_tuple(struct priv_def *priv, struct tuple *tuple)
 {
-	priv->grantor_id = tuple_field_u32_xc(tuple, BOX_PRIV_FIELD_ID);
-	priv->grantee_id = tuple_field_u32_xc(tuple, BOX_PRIV_FIELD_UID);
+	if (tuple_field_u32(tuple, BOX_PRIV_FIELD_ID, &(priv->grantor_id)) != 0)
+		return -1;
+	if (tuple_field_u32(tuple, BOX_PRIV_FIELD_UID, &(priv->grantee_id)) != 0)
+		return -1;
 
 	const char *object_type =
-		tuple_field_cstr_xc(tuple, BOX_PRIV_FIELD_OBJECT_TYPE);
+		tuple_field_cstr(tuple, BOX_PRIV_FIELD_OBJECT_TYPE);
+	if (object_type == NULL)
+		return -1;
 	priv->object_type = schema_object_type(object_type);
 
 	const char *data = tuple_field(tuple, BOX_PRIV_FIELD_OBJECT_ID);
 	if (data == NULL) {
-		tnt_raise(ClientError, ER_NO_SUCH_FIELD_NO,
-			  BOX_PRIV_FIELD_OBJECT_ID + TUPLE_INDEX_BASE);
+		diag_set(ClientError, ER_NO_SUCH_FIELD_NO,
+			 BOX_PRIV_FIELD_OBJECT_ID + TUPLE_INDEX_BASE);
+		return -1;
 	}
 	/*
 	 * When granting or revoking privileges on a whole entity
@@ -3193,23 +3218,28 @@ priv_def_create_from_tuple(struct priv_def *priv, struct tuple *tuple)
 	 * So check for that first.
 	 */
 	switch (mp_typeof(*data)) {
-	case MP_STR:
-		if (mp_decode_strl(&data) == 0) {
-			/* Entity-wide privilege. */
-			priv->object_id = 0;
-			priv->object_type = schema_entity_type(priv->object_type);
-			break;
-		}
-		FALLTHROUGH;
-	default:
-		priv->object_id = tuple_field_u32_xc(tuple,
-						     BOX_PRIV_FIELD_OBJECT_ID);
+		case MP_STR:
+			if (mp_decode_strl(&data) == 0) {
+				/* Entity-wide privilege. */
+				priv->object_id = 0;
+				priv->object_type = schema_entity_type(priv->object_type);
+				break;
+			}
+				FALLTHROUGH;
+		default:
+			if (tuple_field_u32(tuple,BOX_PRIV_FIELD_OBJECT_ID, &(priv->object_id)) != 0)
+				return -1;
 	}
 	if (priv->object_type == SC_UNKNOWN) {
-		tnt_raise(ClientError, ER_UNKNOWN_SCHEMA_OBJECT,
-			  object_type);
+		diag_set(ClientError, ER_UNKNOWN_SCHEMA_OBJECT,
+			 object_type);
+		return -1;
 	}
-	priv->access = tuple_field_u32_xc(tuple, BOX_PRIV_FIELD_ACCESS);
+	uint32_t out;
+	if (tuple_field_u32(tuple, BOX_PRIV_FIELD_ACCESS, &out) != 0)
+		return -1;
+	priv->access = out;
+	return 0;
 }
 
 /*
@@ -3225,7 +3255,9 @@ priv_def_create_from_tuple(struct priv_def *priv, struct tuple *tuple)
 static void
 priv_def_check(struct priv_def *priv, enum priv_type priv_type)
 {
-	struct user *grantor = user_find_xc(priv->grantor_id);
+	struct user *grantor = user_find(priv->grantor_id);
+	if (grantor == NULL)
+		diag_raise();
 	/* May be a role */
 	struct user *grantee = user_by_id(priv->grantee_id);
 	if (grantee == NULL) {
@@ -3259,7 +3291,11 @@ priv_def_check(struct priv_def *priv, enum priv_type priv_type)
 	}
 	case SC_FUNCTION:
 	{
-		struct func *func = func_cache_find(priv->object_id);
+		struct func *func = func_by_id(priv->object_id);
+		if (func == NULL) {
+			diag_set(ClientError, ER_NO_SUCH_FUNCTION, int2str(priv->object_id));
+			diag_raise();
+		}
 		if (func->def->uid != grantor->def->uid &&
 		    grantor->def->uid != ADMIN) {
 			tnt_raise(AccessDeniedError,
@@ -3302,7 +3338,8 @@ priv_def_check(struct priv_def *priv, enum priv_type priv_type)
 				  grantor->def->name);
 		}
 		/* Not necessary to do during revoke, but who cares. */
-		role_check(grantee, role);
+		if (role_check(grantee, role) != 0)
+			diag_raise();
 		break;
 	}
 	case SC_USER:
@@ -3378,7 +3415,8 @@ revoke_priv(struct trigger *trigger, void *event)
 	(void) event;
 	struct tuple *tuple = (struct tuple *)trigger->data;
 	struct priv_def priv;
-	priv_def_create_from_tuple(&priv, tuple);
+	if (priv_def_create_from_tuple(&priv, tuple) != 0)
+		return -1;
 	priv.access = 0;
 	grant_or_revoke(&priv);
 	return 0;
@@ -3391,7 +3429,8 @@ modify_priv(struct trigger *trigger, void *event)
 	(void) event;
 	struct tuple *tuple = (struct tuple *)trigger->data;
 	struct priv_def priv;
-	priv_def_create_from_tuple(&priv, tuple);
+	if (priv_def_create_from_tuple(&priv, tuple) != 0)
+		return -1;
 	grant_or_revoke(&priv);
 	return 0;
 }
@@ -3410,7 +3449,8 @@ on_replace_dd_priv(struct trigger * /* trigger */, void *event)
 	struct priv_def priv;
 
 	if (new_tuple != NULL && old_tuple == NULL) {	/* grant */
-		priv_def_create_from_tuple(&priv, new_tuple);
+		if (priv_def_create_from_tuple(&priv, new_tuple) != 0)
+			return -1;
 		priv_def_check(&priv, PRIV_GRANT);
 		grant_or_revoke(&priv);
 		struct trigger *on_rollback =
@@ -3418,7 +3458,8 @@ on_replace_dd_priv(struct trigger * /* trigger */, void *event)
 		txn_stmt_on_rollback(stmt, on_rollback);
 	} else if (new_tuple == NULL) {                /* revoke */
 		assert(old_tuple);
-		priv_def_create_from_tuple(&priv, old_tuple);
+		if (priv_def_create_from_tuple(&priv, old_tuple) != 0)
+			return -1;
 		priv_def_check(&priv, PRIV_REVOKE);
 		priv.access = 0;
 		grant_or_revoke(&priv);
@@ -3426,7 +3467,8 @@ on_replace_dd_priv(struct trigger * /* trigger */, void *event)
 			txn_alter_trigger_new(modify_priv, old_tuple);
 		txn_stmt_on_rollback(stmt, on_rollback);
 	} else {                                       /* modify */
-		priv_def_create_from_tuple(&priv, new_tuple);
+		if (priv_def_create_from_tuple(&priv, new_tuple) != 0)
+			return -1;
 		priv_def_check(&priv, PRIV_GRANT);
 		grant_or_revoke(&priv);
 		struct trigger *on_rollback =
@@ -3540,7 +3582,8 @@ on_replace_dd_cluster(struct trigger *trigger, void *event)
 		/* Check fields */
 		uint32_t replica_id =
 			tuple_field_u32_xc(new_tuple, BOX_CLUSTER_FIELD_ID);
-		replica_check_id(replica_id);
+		if (replica_check_id(replica_id) != 0)
+			return -1;
 		tt_uuid replica_uuid;
 		tuple_field_uuid_xc(new_tuple, BOX_CLUSTER_FIELD_UUID,
 				    &replica_uuid);
@@ -3575,7 +3618,8 @@ on_replace_dd_cluster(struct trigger *trigger, void *event)
 		assert(old_tuple != NULL);
 		uint32_t replica_id =
 			tuple_field_u32_xc(old_tuple, BOX_CLUSTER_FIELD_ID);
-		replica_check_id(replica_id);
+		if (replica_check_id(replica_id) != 0)
+			return -1;
 
 		struct trigger *on_commit;
 		on_commit = txn_alter_trigger_new(unregister_replica,
@@ -3601,7 +3645,8 @@ sequence_def_new_from_tuple(struct tuple *tuple, uint32_t errcode)
 			  tt_cstr(name, BOX_INVALID_NAME_MAX),
 			  "sequence name is too long");
 	}
-	identifier_check_xc(name, name_len);
+	if (identifier_check(name, name_len) != 0)
+		diag_raise();
 	size_t sz = sequence_def_sizeof(name_len);
 	struct sequence_def *def = (struct sequence_def *) malloc(sz);
 	if (def == NULL)
@@ -3706,7 +3751,9 @@ on_replace_dd_sequence(struct trigger * /* trigger */, void *event)
 				 SC_SEQUENCE, PRIV_C);
 		struct trigger *on_rollback =
 			txn_alter_trigger_new(on_create_sequence_rollback, NULL);
-		seq = sequence_new_xc(new_def);
+		seq = sequence_new(new_def);
+		if (seq == NULL)
+			return -1;
 		sequence_cache_insert(seq);
 		on_rollback->data = seq;
 		txn_stmt_on_rollback(stmt, on_rollback);
@@ -3717,15 +3764,21 @@ on_replace_dd_sequence(struct trigger * /* trigger */, void *event)
 		assert(seq != NULL);
 		access_check_ddl(seq->def->name, seq->def->id, seq->def->uid,
 				 SC_SEQUENCE, PRIV_D);
+		bool out;
 		if (space_has_data(BOX_SEQUENCE_DATA_ID, 0, id))
 			tnt_raise(ClientError, ER_DROP_SEQUENCE,
 				  seq->def->name, "the sequence has data");
 		if (space_has_data(BOX_SPACE_SEQUENCE_ID, 1, id))
 			tnt_raise(ClientError, ER_DROP_SEQUENCE,
 				  seq->def->name, "the sequence is in use");
-		if (schema_find_grants("sequence", seq->def->id))
-			tnt_raise(ClientError, ER_DROP_SEQUENCE,
-				  seq->def->name, "the sequence has grants");
+		if (schema_find_grants("sequence", seq->def->id, &out) != 0) {
+			return -1;
+		}
+		if (out) {
+			diag_set(ClientError, ER_DROP_SEQUENCE,
+				 seq->def->name, "the sequence has grants");
+			return -1;
+		}
 		struct trigger *on_commit =
 			txn_alter_trigger_new(on_drop_sequence_commit, seq);
 		struct trigger *on_rollback =
@@ -4210,7 +4263,8 @@ fk_constraint_def_new_from_tuple(struct tuple *tuple, uint32_t errcode)
 			  tt_cstr(name, BOX_INVALID_NAME_MAX),
 			  "constraint name is too long");
 	}
-	identifier_check_xc(name, name_len);
+	if (identifier_check(name, name_len) != 0)
+		diag_raise();
 	uint32_t link_count;
 	struct field_link *links = decode_fk_links(tuple, &link_count, name,
 						   name_len, errcode);
@@ -4614,7 +4668,8 @@ ck_constraint_def_new_from_tuple(struct tuple *tuple)
 			  tt_cstr(name, BOX_INVALID_NAME_MAX),
 				  "check constraint name is too long");
 	}
-	identifier_check_xc(name, name_len);
+	if (identifier_check(name, name_len) != 0)
+		diag_raise();
 	uint32_t space_id =
 		tuple_field_u32_xc(tuple, BOX_CK_CONSTRAINT_FIELD_SPACE_ID);
 	const char *language_str =
@@ -4819,7 +4874,11 @@ on_replace_dd_func_index(struct trigger *trigger, void *event)
 					BOX_FUNC_INDEX_FUNCTION_ID);
 		space = space_cache_find_xc(space_id);
 		index = index_find_xc(space, index_id);
-		func = func_cache_find(fid);
+		func = func_by_id(fid);
+		if (func == NULL) {
+			diag_set(ClientError, ER_NO_SUCH_FUNCTION, int2str(fid));
+			return -1;
+		}
 		func_index_check_func(func);
 		if (index->def->opts.func_id != func->def->fid) {
 			tnt_raise(ClientError, ER_WRONG_INDEX_OPTIONS, 0,
diff --git a/src/box/identifier.h b/src/box/identifier.h
index a0ed6c10e..0d39793ba 100644
--- a/src/box/identifier.h
+++ b/src/box/identifier.h
@@ -51,16 +51,6 @@ identifier_check(const char *str, int str_len);
 #if defined(__cplusplus)
 } /* extern "C" */
 
-/**
- * Throw an error if identifier is not valid.
- */
-static inline void
-identifier_check_xc(const char *str, int str_len)
-{
-	if (identifier_check(str, str_len))
-		diag_raise();
-}
-
 #endif /* defined(__cplusplus) */
 
 #endif /* TARANTOOL_BOX_IDENTIFIER_H_INCLUDED */
diff --git a/src/box/replication.cc b/src/box/replication.cc
index 41b83a3ad..e8a1890e7 100644
--- a/src/box/replication.cc
+++ b/src/box/replication.cc
@@ -114,15 +114,19 @@ replication_free(void)
 	free(replicaset.replica_by_id);
 }
 
-void
+int
 replica_check_id(uint32_t replica_id)
 {
-        if (replica_id == REPLICA_ID_NIL)
-		tnt_raise(ClientError, ER_REPLICA_ID_IS_RESERVED,
-			  (unsigned) replica_id);
-	if (replica_id >= VCLOCK_MAX)
-		tnt_raise(LoggedError, ER_REPLICA_MAX,
-			  (unsigned) replica_id);
+	if (replica_id == REPLICA_ID_NIL) {
+		diag_set(ClientError, ER_REPLICA_ID_IS_RESERVED,
+			 (unsigned) replica_id);
+		return -1;
+	}
+	if (replica_id >= VCLOCK_MAX) {
+		diag_set(ClientError, ER_REPLICA_MAX,
+			 (unsigned) replica_id);
+		return -1;
+	}
 	/*
 	 * It's okay to update the instance id while it is joining to
 	 * a cluster as long as the id is set by the time bootstrap is
@@ -133,9 +137,12 @@ replica_check_id(uint32_t replica_id)
 	 * case it will replay this operation during the final join
 	 * stage.
 	 */
-        if (!replicaset.is_joining && replica_id == instance_id)
-		tnt_raise(ClientError, ER_LOCAL_INSTANCE_ID_IS_READ_ONLY,
-			  (unsigned) replica_id);
+	if (!replicaset.is_joining && replica_id == instance_id) {
+		diag_set(ClientError, ER_LOCAL_INSTANCE_ID_IS_READ_ONLY,
+			 (unsigned) replica_id);
+		return -1;
+	}
+	return 0;
 }
 
 /* Return true if replica doesn't have id, relay and applier */
@@ -154,7 +161,7 @@ static struct replica *
 replica_new(void)
 {
 	struct replica *replica = (struct replica *)
-			malloc(sizeof(struct replica));
+		malloc(sizeof(struct replica));
 	if (replica == NULL) {
 		tnt_raise(OutOfMemory, sizeof(*replica), "malloc",
 			  "struct replica");
@@ -379,22 +386,22 @@ static void
 replica_on_applier_disconnect(struct replica *replica)
 {
 	switch (replica->applier_sync_state) {
-	case APPLIER_SYNC:
-		assert(replicaset.applier.synced > 0);
-		replicaset.applier.synced--;
-		FALLTHROUGH;
-	case APPLIER_CONNECTED:
-		assert(replicaset.applier.connected > 0);
-		replicaset.applier.connected--;
-		break;
-	case APPLIER_LOADING:
-		assert(replicaset.applier.loading > 0);
-		replicaset.applier.loading--;
-		break;
-	case APPLIER_DISCONNECTED:
-		break;
-	default:
-		unreachable();
+		case APPLIER_SYNC:
+			assert(replicaset.applier.synced > 0);
+			replicaset.applier.synced--;
+				FALLTHROUGH;
+		case APPLIER_CONNECTED:
+			assert(replicaset.applier.connected > 0);
+			replicaset.applier.connected--;
+			break;
+		case APPLIER_LOADING:
+			assert(replicaset.applier.loading > 0);
+			replicaset.applier.loading--;
+			break;
+		case APPLIER_DISCONNECTED:
+			break;
+		default:
+			unreachable();
 	}
 	replica->applier_sync_state = replica->applier->state;
 	if (replica->applier_sync_state == APPLIER_LOADING)
@@ -406,7 +413,7 @@ replica_on_applier_state_f(struct trigger *trigger, void *event)
 {
 	(void)event;
 	struct replica *replica = container_of(trigger,
-			struct replica, on_applier_state);
+					       struct replica, on_applier_state);
 	switch (replica->applier->state) {
 		case APPLIER_INITIAL_JOIN:
 			replicaset.is_joining = true;
@@ -465,11 +472,11 @@ replicaset_update(struct applier **appliers, int count)
 	struct applier *applier;
 
 	auto uniq_guard = make_scoped_guard([&]{
-		replica_hash_foreach_safe(&uniq, replica, next) {
-			replica_hash_remove(&uniq, replica);
-			replica_clear_applier(replica);
-			replica_delete(replica);
-		}
+	    replica_hash_foreach_safe(&uniq, replica, next) {
+		    replica_hash_remove(&uniq, replica);
+		    replica_clear_applier(replica);
+		    replica_delete(replica);
+	    }
 	});
 
 	/* Check for duplicate UUID */
@@ -567,37 +574,37 @@ replicaset_update(struct applier **appliers, int count)
  * Replica set configuration state, shared among appliers.
  */
 struct replicaset_connect_state {
-	/** Number of successfully connected appliers. */
-	int connected;
-	/** Number of appliers that failed to connect. */
-	int failed;
-	/** Signaled when an applier connects or stops. */
-	struct fiber_cond wakeup;
+    /** Number of successfully connected appliers. */
+    int connected;
+    /** Number of appliers that failed to connect. */
+    int failed;
+    /** Signaled when an applier connects or stops. */
+    struct fiber_cond wakeup;
 };
 
 struct applier_on_connect {
-	struct trigger base;
-	struct replicaset_connect_state *state;
+    struct trigger base;
+    struct replicaset_connect_state *state;
 };
 
 static int
 applier_on_connect_f(struct trigger *trigger, void *event)
 {
 	struct applier_on_connect *on_connect = container_of(trigger,
-					struct applier_on_connect, base);
+							     struct applier_on_connect, base);
 	struct replicaset_connect_state *state = on_connect->state;
 	struct applier *applier = (struct applier *)event;
 
 	switch (applier->state) {
-	case APPLIER_OFF:
-	case APPLIER_STOPPED:
-		state->failed++;
-		break;
-	case APPLIER_CONNECTED:
-		state->connected++;
-		break;
-	default:
-		return 0;
+		case APPLIER_OFF:
+		case APPLIER_STOPPED:
+			state->failed++;
+			break;
+		case APPLIER_CONNECTED:
+			state->connected++;
+			break;
+		default:
+			return 0;
 	}
 	fiber_cond_signal(&state->wakeup);
 	applier_pause(applier);
@@ -694,7 +701,7 @@ replicaset_connect(struct applier **appliers, int count,
 		goto error;
 	}
 	return;
-error:
+	error:
 	/* Destroy appliers */
 	for (int i = 0; i < count; i++) {
 		trigger_clear(&triggers[i].base);
@@ -725,7 +732,7 @@ replicaset_needs_rejoin(struct replica **master)
 
 		const char *uuid_str = tt_uuid_str(&replica->uuid);
 		const char *addr_str = sio_strfaddr(&applier->addr,
-						applier->addr_len);
+						    applier->addr_len);
 		const char *local_vclock_str = vclock_to_string(&replicaset.vclock);
 		const char *remote_vclock_str = vclock_to_string(&ballot->vclock);
 		const char *gc_vclock_str = vclock_to_string(&ballot->gc_vclock);
@@ -894,7 +901,7 @@ replicaset_round(bool skip_ro)
 		 * the lowest uuid.
 		 */
 		int cmp = vclock_compare(&applier->ballot.vclock,
-				&leader->applier->ballot.vclock);
+					 &leader->applier->ballot.vclock);
 		if (cmp < 0)
 			continue;
 		if (cmp == 0 && tt_uuid_compare(&replica->uuid,
diff --git a/src/box/replication.h b/src/box/replication.h
index 19f283c7d..470420592 100644
--- a/src/box/replication.h
+++ b/src/box/replication.h
@@ -352,7 +352,7 @@ replica_on_relay_stop(struct replica *replica);
 #if defined(__cplusplus)
 } /* extern "C" */
 
-void
+int
 replica_check_id(uint32_t replica_id);
 
 /**
diff --git a/src/box/schema.cc b/src/box/schema.cc
index 8d8aae448..9767207e0 100644
--- a/src/box/schema.cc
+++ b/src/box/schema.cc
@@ -599,12 +599,22 @@ func_by_name(const char *name, uint32_t name_len)
 	return (struct func *) mh_strnptr_node(funcs_by_name, func)->val;
 }
 
-bool
-schema_find_grants(const char *type, uint32_t id)
+int
+schema_find_grants(const char *type, uint32_t id, bool *out)
 {
-	struct space *priv = space_cache_find_xc(BOX_PRIV_ID);
+	struct space *priv = space_cache_find(BOX_PRIV_ID);
+	if (priv == NULL)
+		return -1;
+
 	/** "object" index */
-	struct index *index = index_find_system_xc(priv, 2);
+	if (!space_is_memtx(priv)) {
+		diag_set(ClientError, ER_UNSUPPORTED,
+			 priv->engine->name, "system data");
+		return -1;
+	}
+	struct index *index = index_find(priv, 2);
+	if (index == NULL)
+		return -1;
 	/*
 	 * +10 = max(mp_sizeof_uint32) +
 	 *       max(mp_sizeof_strl(uint32)).
@@ -612,9 +622,15 @@ schema_find_grants(const char *type, uint32_t id)
 	char key[GRANT_NAME_MAX + 10];
 	assert(strlen(type) <= GRANT_NAME_MAX);
 	mp_encode_uint(mp_encode_str(key, type, strlen(type)), id);
-	struct iterator *it = index_create_iterator_xc(index, ITER_EQ, key, 2);
+	struct iterator *it = index_create_iterator(index, ITER_EQ, key, 2);
+	if (it == NULL)
+		return -1;
 	IteratorGuard iter_guard(it);
-	return iterator_next_xc(it);
+	struct tuple *tuple;
+	if (iterator_next(it, &tuple) != 0)
+		return -1;
+	*out = (tuple != NULL);
+	return 0;
 }
 
 struct sequence *
diff --git a/src/box/schema.h b/src/box/schema.h
index f9d15b38d..88bfd74ad 100644
--- a/src/box/schema.h
+++ b/src/box/schema.h
@@ -171,15 +171,6 @@ schema_free();
 
 struct space *schema_space(uint32_t id);
 
-static inline struct func *
-func_cache_find(uint32_t fid)
-{
-	struct func *func = func_by_id(fid);
-	if (func == NULL)
-		tnt_raise(ClientError, ER_NO_SUCH_FUNCTION, int2str(fid));
-	return func;
-}
-
 
 /**
  * Check whether or not an object has grants on it (restrict
@@ -188,8 +179,8 @@ func_cache_find(uint32_t fid)
  * @retval true object has grants
  * @retval false object has no grants
  */
-bool
-schema_find_grants(const char *type, uint32_t id);
+int
+schema_find_grants(const char *type, uint32_t id, bool *out);
 
 /**
  * A wrapper around sequence_by_id() that raises an exception
diff --git a/src/box/sequence.h b/src/box/sequence.h
index 976020a25..a164da9af 100644
--- a/src/box/sequence.h
+++ b/src/box/sequence.h
@@ -179,15 +179,6 @@ sequence_get_value(struct sequence *seq);
 #if defined(__cplusplus)
 } /* extern "C" */
 
-static inline struct sequence *
-sequence_new_xc(struct sequence_def *def)
-{
-	struct sequence *seq = sequence_new(def);
-	if (seq == NULL)
-		diag_raise();
-	return seq;
-}
-
 #endif /* defined(__cplusplus) */
 
 #endif /* INCLUDES_TARANTOOL_BOX_SEQUENCE_H */
diff --git a/src/box/user.cc b/src/box/user.cc
index c46ff67d1..50614c6f2 100644
--- a/src/box/user.cc
+++ b/src/box/user.cc
@@ -339,7 +339,8 @@ user_reload_privs(struct user *user)
 		struct tuple *tuple;
 		while ((tuple = iterator_next_xc(it)) != NULL) {
 			struct priv_def priv;
-			priv_def_create_from_tuple(&priv, tuple);
+			if (priv_def_create_from_tuple(&priv, tuple) != 0)
+				diag_raise();
 			/**
 			 * Skip role grants, we're only
 			 * interested in real objects.
@@ -559,7 +560,7 @@ user_cache_free()
 
 /** {{{ roles */
 
-void
+int
 role_check(struct user *grantee, struct user *role)
 {
 	/*
@@ -592,9 +593,11 @@ role_check(struct user *grantee, struct user *role)
 	 */
 	if (user_map_is_set(&transitive_closure,
 			    role->auth_token)) {
-		tnt_raise(ClientError, ER_ROLE_LOOP,
+		diag_set(ClientError, ER_ROLE_LOOP,
 			  role->def->name, grantee->def->name);
+		return -1;
 	}
+	return 0;
 }
 
 /**
diff --git a/src/box/user.h b/src/box/user.h
index 527fb2e7c..526cd39ca 100644
--- a/src/box/user.h
+++ b/src/box/user.h
@@ -144,16 +144,6 @@ user_cache_replace(struct user_def *user);
 void
 user_cache_delete(uint32_t uid);
 
-/* Find a user by name. Used by authentication. */
-static inline struct user *
-user_find_xc(uint32_t uid)
-{
-	struct user *user = user_find(uid);
-	if (user == NULL)
-		diag_raise();
-	return user;
-}
-
 static inline struct user *
 user_find_by_name_xc(const char *name, uint32_t len)
 {
@@ -178,7 +168,7 @@ user_cache_free();
  * and no loop in the graph will occur when grantee gets
  * a given role.
  */
-void
+int
 role_check(struct user *grantee, struct user *role);
 
 /**
@@ -201,7 +191,7 @@ role_revoke(struct user *grantee, struct user *role);
 void
 priv_grant(struct user *grantee, struct priv_def *priv);
 
-void
+int
 priv_def_create_from_tuple(struct priv_def *priv, struct tuple *tuple);
 
 /* }}} */
-- 
2.17.1





More information about the Tarantool-patches mailing list