[tarantool-patches] Re: [PATCH v3 2/4] collation: split collation into core and box objects

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Wed May 16 20:07:16 MSK 2018


I added CollationError:

diff --git a/src/box/coll.c b/src/box/coll.c
index 3bf3aff3c..a8e54727b 100644
--- a/src/box/coll.c
+++ b/src/box/coll.c
@@ -46,7 +46,6 @@ box_coll_new(const struct box_coll_def *def)
  	}
  	coll->base = coll_new(&def->base);
  	if (coll->base == NULL) {
-		diag_reset(ClientError, ER_CANT_CREATE_COLLATION);
  		free(coll);
  		return NULL;
  	}
diff --git a/src/box/error.cc b/src/box/error.cc
index bbe3b5236..6b14dff05 100644
--- a/src/box/error.cc
+++ b/src/box/error.cc
@@ -108,20 +108,6 @@ ClientError::ClientError(const type_info *type, const char *file, unsigned line,
  		rmean_collect(rmean_error, RMEAN_ERROR, 1);
  }
  
-ClientError::ClientError(struct error *last_e, uint32_t errcode)
-	:Exception(&type_ClientError, last_e->file, last_e->line)
-{
-	m_errcode = errcode;
-	/*
-	 * Do not collect error - it was collected already by the
-	 * original error.
-	 */
-	int len = strlen(last_e->errmsg);
-	assert(len < DIAG_ERRMSG_MAX);
-	memcpy(this->errmsg, last_e->errmsg, len);
-	this->errmsg[len] = 0;
-}
-
  ClientError::ClientError(const char *file, unsigned line,
  			 uint32_t errcode, ...)
  	:Exception(&type_ClientError, file, line)
@@ -151,19 +137,6 @@ BuildClientError(const char *file, unsigned line, uint32_t errcode, ...)
  	}
  }
  
-struct error *
-RebuildClientError(struct error *last_e, uint32_t errcode)
-{
-	/* Can not convert OOM. */
-	if (last_e->type == &type_OutOfMemory)
-		return last_e;
-	try {
-		return new ClientError(last_e, errcode);
-	} catch (OutOfMemory *e) {
-		return e;
-	}
-}
-
  void
  ClientError::log() const
  {
@@ -182,6 +155,8 @@ ClientError::get_errcode(const struct error *e)
  		return ER_MEMORY_ISSUE;
  	if (type_cast(SystemError, e))
  		return ER_SYSTEM;
+	if (type_cast(CollationError, e))
+		return ER_CANT_CREATE_COLLATION;
  	return ER_PROC_LUA;
  }
  
diff --git a/src/box/error.h b/src/box/error.h
index 5bad1cdc3..c791e6c6a 100644
--- a/src/box/error.h
+++ b/src/box/error.h
@@ -44,9 +44,6 @@ BuildAccessDeniedError(const char *file, unsigned int line,
  		       const char *access_type, const char *object_type,
  		       const char *object_name, const char *user_name);
  
-struct error *
-RebuildClientError(struct error *last_e, uint32_t errcode);
-
  
  /** \cond public */
  
@@ -167,8 +164,6 @@ public:
  
  	ClientError(const char *file, unsigned line, uint32_t errcode, ...);
  
-	ClientError(struct error *last_e, uint32_t errcode);
-
  	static uint32_t get_errcode(const struct error *e);
  	/* client errno code */
  	int m_errcode;
diff --git a/src/coll.c b/src/coll.c
index 398bff49e..2794d5f3c 100644
--- a/src/coll.c
+++ b/src/coll.c
@@ -127,7 +127,7 @@ static int
  coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  {
  	if (def->locale_len >= MAX_LOCALE) {
-		diag_set(IllegalParams, "too long locale");
+		diag_set(CollationError, "too long locale");
  		return -1;
  	}
  	char locale[MAX_LOCALE];
@@ -136,7 +136,7 @@ coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  	UErrorCode status = U_ZERO_ERROR;
  	struct UCollator *collator = ucol_open(locale, &status);
  	if (U_FAILURE(status)) {
-		diag_set(IllegalParams, u_errorName(status));
+		diag_set(CollationError, u_errorName(status));
  		return -1;
  	}
  	coll->icu.collator = collator;
@@ -148,7 +148,7 @@ coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  				       UCOL_DEFAULT;
  		ucol_setAttribute(collator, UCOL_FRENCH_COLLATION, v, &status);
  		if (U_FAILURE(status)) {
-			diag_set(IllegalParams, tt_sprintf("failed to set "\
+			diag_set(CollationError, tt_sprintf("failed to set "\
  				 "french_collation: %s", u_errorName(status)));
  			return -1;
  		}
@@ -162,7 +162,7 @@ coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  		ucol_setAttribute(collator, UCOL_ALTERNATE_HANDLING, v,
  				  &status);
  		if (U_FAILURE(status)) {
-			diag_set(IllegalParams, tt_sprintf("failed to set "\
+			diag_set(CollationError, tt_sprintf("failed to set "\
  				 "alternate_handling: %s",
  				 u_errorName(status)));
  			return -1;
@@ -176,7 +176,7 @@ coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  			UCOL_DEFAULT;
  		ucol_setAttribute(collator, UCOL_CASE_FIRST, v, &status);
  		if (U_FAILURE(status)) {
-			diag_set(IllegalParams, tt_sprintf("failed to set "\
+			diag_set(CollationError, tt_sprintf("failed to set "\
  				 "case_first: %s", u_errorName(status)));
  			return -1;
  		}
@@ -187,7 +187,7 @@ coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  			w == COLL_ICU_OFF ? UCOL_OFF : UCOL_DEFAULT;
  		ucol_setAttribute(collator, UCOL_CASE_LEVEL , v, &status);
  		if (U_FAILURE(status)) {
-			diag_set(IllegalParams, tt_sprintf("failed to set "\
+			diag_set(CollationError, tt_sprintf("failed to set "\
  				 "case_level: %s", u_errorName(status)));
  			return -1;
  		}
@@ -199,7 +199,7 @@ coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  		ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, v,
  				  &status);
  		if (U_FAILURE(status)) {
-			diag_set(IllegalParams, tt_sprintf("failed to set "\
+			diag_set(CollationError, tt_sprintf("failed to set "\
  				 "normalization_mode: %s",
  				 u_errorName(status)));
  			return -1;
@@ -216,7 +216,7 @@ coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  			UCOL_DEFAULT;
  		ucol_setAttribute(collator, UCOL_STRENGTH, v, &status);
  		if (U_FAILURE(status)) {
-			diag_set(IllegalParams, tt_sprintf("failed to set "\
+			diag_set(CollationError, tt_sprintf("failed to set "\
  				 "strength: %s", u_errorName(status)));
  			return -1;
  		}
@@ -227,7 +227,7 @@ coll_icu_init_cmp(struct coll *coll, const struct coll_def *def)
  			w == COLL_ICU_OFF ? UCOL_OFF : UCOL_DEFAULT;
  		ucol_setAttribute(collator, UCOL_NUMERIC_COLLATION, v, &status);
  		if (U_FAILURE(status)) {
-			diag_set(IllegalParams, tt_sprintf("failed to set "\
+			diag_set(CollationError, tt_sprintf("failed to set "\
  				 "numeric_collation: %s", u_errorName(status)));
  			return -1;
  		}
diff --git a/src/diag.h b/src/diag.h
index 85fc1ab21..bd5a539b0 100644
--- a/src/diag.h
+++ b/src/diag.h
@@ -249,6 +249,8 @@ struct error *
  BuildSystemError(const char *file, unsigned line, const char *format, ...);
  struct error *
  BuildXlogError(const char *file, unsigned line, const char *format, ...);
+struct error *
+BuildCollationError(const char *file, unsigned line, const char *format, ...);
  
  struct index_def;
  
@@ -263,15 +265,6 @@ BuildUnsupportedIndexFeature(const char *file, unsigned line,
  	diag_add_error(diag_get(), e);					\
  } while (0)
  
-#define diag_reset(new_class, ...) do {                                 \
-	struct diag *d = diag_get();                                    \
-	struct error *last_e = diag_last_error(d);                      \
-	if (last_e->type != &type_##new_class) {                        \
-		last_e = Rebuild##new_class(last_e, ##__VA_ARGS__);     \
-		diag_add_error(d, last_e);                              \
-	}                                                               \
-} while (0)
-
  #if defined(__cplusplus)
  } /* extern "C" */
  #endif /* defined(__cplusplus) */
diff --git a/src/exception.cc b/src/exception.cc
index 56077f76d..1cbf8852f 100644
--- a/src/exception.cc
+++ b/src/exception.cc
@@ -235,6 +235,18 @@ IllegalParams::IllegalParams(const char *file, unsigned line,
  	va_end(ap);
  }
  
+const struct type_info type_CollationError =
+	make_type("CollationError", &type_Exception);
+
+CollationError::CollationError(const char *file, unsigned line,
+			       const char *format, ...)
+	: Exception(&type_CollationError, file, line)
+{
+	va_list ap;
+	va_start(ap, format);
+	error_vformat_msg(this, format, ap);
+	va_end(ap);
+}
  
  #define BuildAlloc(type)				\
  	void *p = malloc(sizeof(type));			\
@@ -303,6 +315,18 @@ BuildSystemError(const char *file, unsigned line, const char *format, ...)
  	return e;
  }
  
+struct error *
+BuildCollationError(const char *file, unsigned line, const char *format, ...)
+{
+	BuildAlloc(CollationError);
+	CollationError *e =  new (p) CollationError(file, line, "");
+	va_list ap;
+	va_start(ap, format);
+	error_vformat_msg(e, format, ap);
+	va_end(ap);
+	return e;
+}
+
  void
  exception_init()
  {
diff --git a/src/exception.h b/src/exception.h
index fe7ab84f0..f56616b68 100644
--- a/src/exception.h
+++ b/src/exception.h
@@ -49,6 +49,7 @@ extern const struct type_info type_ChannelIsClosed;
  extern const struct type_info type_LuajitError;
  extern const struct type_info type_IllegalParams;
  extern const struct type_info type_SystemError;
+extern const struct type_info type_CollationError;
  
  const char *
  exception_get_string(struct error *e, const struct method_info *method);
@@ -139,6 +140,14 @@ public:
  	IllegalParams(const char *file, unsigned line, const char *format, ...);
  	virtual void raise() { throw this; }
  };
+
+class CollationError: public Exception {
+public:
+	CollationError(const char *file, unsigned line, const char *format,
+		       ...);
+	virtual void raise() { throw this; }
+};
+
  /**
   * Initialize the exception subsystem.
   */


On 15/05/2018 22:54, Vladislav Shpilevoy wrote:
> In the issue #3290 the important problem appeared - Tarantool can
> not create completely internal collations with no ID, name,
> owner. Just for internal usage.
> 
> Original struct coll can not be used for this since
> * it has fields that are not needed in internals;
> * collation name is public thing, and the collation cache uses
>    it, so it would be necessary to forbid to a user usage of some
>    system names;
> * when multiple collations has the same comparator and only their
>    names/owners/IDs are different, the separate UCollator objects
>    are created, but it would be good to be able to reference a
>    single one.
> 
> This patch renames coll to box_coll, coll_def to box_call_def and
> introduces coll - pure collation object with no any user defined
> things.
> 
> Needed for #3290.
> ---
>   src/CMakeLists.txt       |   2 +
>   src/box/alter.cc         |  72 +++++++-------
>   src/box/coll.c           | 247 ++++-------------------------------------------
>   src/box/coll.h           |  59 +++--------
>   src/box/coll_cache.c     |  44 +++++----
>   src/box/coll_cache.h     |  17 ++--
>   src/box/coll_def.c       |  32 ------
>   src/box/coll_def.h       |  86 +----------------
>   src/box/key_def.cc       |  22 +++--
>   src/box/key_def.h        |   5 +-
>   src/box/lua/space.cc     |   8 +-
>   src/box/schema.cc        |   8 +-
>   src/box/tuple.c          |   4 +-
>   src/box/tuple_compare.cc |   5 +-
>   src/box/tuple_hash.cc    |   4 +-
>   src/coll.c               | 234 ++++++++++++++++++++++++++++++++++++++++++++
>   src/coll.h               |  98 +++++++++++++++++++
>   src/coll_def.c           |  63 ++++++++++++
>   src/coll_def.h           | 115 ++++++++++++++++++++++
>   test/unit/coll.cpp       |   8 +-
>   20 files changed, 653 insertions(+), 480 deletions(-)
>   create mode 100644 src/coll.c
>   create mode 100644 src/coll.h
>   create mode 100644 src/coll_def.c
>   create mode 100644 src/coll_def.h
> 




More information about the Tarantool-patches mailing list