[Tarantool-patches] [PATCH V6 09/10] iproto: rename IPROTO_ERROR and IPROTO_ERROR_STACK

Leonid Vasiliev lvasiliev at tarantool.org
Mon Apr 20 01:25:11 MSK 2020


From: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>

IPROTO_ERROR in fact is not an error. It is an error message.
Secondly, this key is deprecated in favor of IPROTO_ERROR_STACK,
which contains all attributes of the whole error stack. It uses
MP_ERROR MessagePack extenstion for that.

So IPROTO_ERROR is renamed to IPROTO_ERROR_24 (similar to how old
call was renamed to IPROTO_CALL_16). IPROTO_ERROR_STACK becomes
new IPROTO_ERROR.

Follow up #4398
---
 src/box/iproto_constants.h |  4 ++--
 src/box/lua/net_box.lua    | 25 +++++++++++++------------
 src/box/xrow.c             | 10 +++++-----
 test/box/iproto.result     |  8 ++++----
 test/box/iproto.test.lua   |  6 +++---
 5 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/src/box/iproto_constants.h b/src/box/iproto_constants.h
index b57d565..f8eee0f 100644
--- a/src/box/iproto_constants.h
+++ b/src/box/iproto_constants.h
@@ -101,7 +101,7 @@ enum iproto_key {
 
 	/* Leave a gap between request keys and response keys */
 	IPROTO_DATA = 0x30,
-	IPROTO_ERROR = 0x31,
+	IPROTO_ERROR_24 = 0x31,
 	/**
 	 * IPROTO_METADATA: [
 	 *      { IPROTO_FIELD_NAME: name },
@@ -126,7 +126,7 @@ enum iproto_key {
 	/* Leave a gap between SQL keys and additional request keys */
 	IPROTO_REPLICA_ANON = 0x50,
 	IPROTO_ID_FILTER = 0x51,
-	IPROTO_ERROR_STACK = 0x52,
+	IPROTO_ERROR = 0x52,
 	IPROTO_KEY_MAX
 };
 
diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua
index 1e55eaa..1b2b6ac 100644
--- a/src/box/lua/net_box.lua
+++ b/src/box/lua/net_box.lua
@@ -44,8 +44,8 @@ local IPROTO_SQL_INFO_KEY = 0x42
 local SQL_INFO_ROW_COUNT_KEY = 0
 local IPROTO_FIELD_NAME_KEY = 0
 local IPROTO_DATA_KEY      = 0x30
-local IPROTO_ERROR_KEY     = 0x31
-local IPROTO_ERROR_STACK   = 0x52
+local IPROTO_ERROR_24      = 0x31
+local IPROTO_ERROR         = 0x52
 local IPROTO_GREETING_SIZE = 128
 local IPROTO_CHUNK_KEY     = 128
 local IPROTO_OK_KEY        = 0
@@ -150,7 +150,7 @@ local method_decoder = {
     push    = decode_push,
 }
 
-local function decode_error_stack(raw_data)
+local function decode_error(raw_data)
     local ptr = buffer_reg.acucp
     ptr[0] = raw_data
     local err = ffi.C.error_unpack_unsafe(ptr)
@@ -170,8 +170,8 @@ local function decode_error_stack(raw_data)
 end
 
 local response_decoder = {
-    [IPROTO_ERROR_KEY] = decode,
-    [IPROTO_ERROR_STACK] = decode_error_stack,
+    [IPROTO_ERROR_24] = decode,
+    [IPROTO_ERROR] = decode_error,
 }
 
 local function next_id(id) return band(id + 1, 0x7FFFFFFF) end
@@ -614,15 +614,16 @@ local function create_transport(host, port, user, password, callback,
             end
             assert(body_end == body_rpos, "invalid xrow length")
             request.errno = band(status, IPROTO_ERRNO_MASK)
-            -- IPROTO_ERROR_STACK comprises error encoded with
-            -- IPROTO_ERROR_KEY, so we may ignore content of that key.
-            if body[IPROTO_ERROR_STACK] ~= nil then
-                request.response = body[IPROTO_ERROR_STACK]
+            -- IPROTO_ERROR comprises error encoded with
+            -- IPROTO_ERROR_24, so we may ignore content of that
+            -- key.
+            if body[IPROTO_ERROR] ~= nil then
+                request.response = body[IPROTO_ERROR]
                 assert(type(request.response) == 'cdata')
             else
                 request.response = box.error.new({
                     code = request.errno,
-                    reason = body[IPROTO_ERROR_KEY]
+                    reason = body[IPROTO_ERROR_24]
                 })
             end
             request.cond:broadcast()
@@ -800,7 +801,7 @@ local function create_transport(host, port, user, password, callback,
         if hdr[IPROTO_STATUS_KEY] ~= 0 then
             local body
             body, body_end = decode(body_rpos)
-            return error_sm(E_NO_CONNECTION, body[IPROTO_ERROR_KEY])
+            return error_sm(E_NO_CONNECTION, body[IPROTO_ERROR_24])
         end
         set_state('fetch_schema')
         return iproto_schema_sm(hdr[IPROTO_SCHEMA_VERSION_KEY])
@@ -845,7 +846,7 @@ local function create_transport(host, port, user, password, callback,
                 if status ~= 0 then
                     local body
                     body, body_end = decode(body_rpos)
-                    return error_sm(E_NO_CONNECTION, body[IPROTO_ERROR_KEY])
+                    return error_sm(E_NO_CONNECTION, body[IPROTO_ERROR_24])
                 end
                 if schema_version == nil then
                     schema_version = response_schema_version
diff --git a/src/box/xrow.c b/src/box/xrow.c
index 06c6afb..1b3f3f9 100644
--- a/src/box/xrow.c
+++ b/src/box/xrow.c
@@ -379,7 +379,7 @@ iproto_header_encode(char *out, uint32_t type, uint64_t sync,
 
 struct PACKED iproto_body_bin {
 	uint8_t m_body;                    /* MP_MAP */
-	uint8_t k_data;                    /* IPROTO_DATA or IPROTO_ERROR */
+	uint8_t k_data;                    /* IPROTO_DATA or errors */
 	uint8_t m_data;                    /* MP_STR or MP_ARRAY */
 	uint32_t v_data_len;               /* string length of array size */
 };
@@ -496,9 +496,9 @@ static void
 mpstream_iproto_encode_error(struct mpstream *stream, const struct error *error)
 {
 	mpstream_encode_map(stream, 2);
-	mpstream_encode_uint(stream, IPROTO_ERROR);
+	mpstream_encode_uint(stream, IPROTO_ERROR_24);
 	mpstream_encode_str(stream, error->errmsg);
-	mpstream_encode_uint(stream, IPROTO_ERROR_STACK);
+	mpstream_encode_uint(stream, IPROTO_ERROR);
 	error_to_mpstream_noext(error, stream);
 }
 
@@ -1109,7 +1109,7 @@ xrow_decode_error(struct xrow_header *row)
 			continue;
 		}
 		uint8_t key = mp_decode_uint(&pos);
-		if (key == IPROTO_ERROR && mp_typeof(*pos) == MP_STR) {
+		if (key == IPROTO_ERROR_24 && mp_typeof(*pos) == MP_STR) {
 			/*
 			 * Obsolete way of sending error responses.
 			 * To be deprecated but still should be supported
@@ -1119,7 +1119,7 @@ xrow_decode_error(struct xrow_header *row)
 			const char *str = mp_decode_str(&pos, &len);
 			snprintf(error, sizeof(error), "%.*s", len, str);
 			box_error_set(__FILE__, __LINE__, code, error);
-		} else if (key == IPROTO_ERROR_STACK) {
+		} else if (key == IPROTO_ERROR) {
 			struct error *e = error_unpack_unsafe(&pos);
 			if (e == NULL)
 				goto error;
diff --git a/test/box/iproto.result b/test/box/iproto.result
index e4fe684..4b648d3 100644
--- a/test/box/iproto.result
+++ b/test/box/iproto.result
@@ -25,10 +25,10 @@ IPROTO_FUNCTION_NAME  = 0x22
 IPROTO_TUPLE          = 0x21
 ---
 ...
-IPROTO_ERROR          = 0x31
+IPROTO_ERROR_24       = 0x31
 ---
 ...
-IPROTO_ERROR_STACK    = 0x52
+IPROTO_ERROR          = 0x52
 ---
 ...
 IPROTO_ERROR_CODE     = 0x01
@@ -92,11 +92,11 @@ sock:close()
 ...
 -- Both keys (obsolete and stack ones) are present in response.
 --
-assert(response.body[IPROTO_ERROR_STACK] ~= nil)
+assert(response.body[IPROTO_ERROR] ~= nil)
 ---
 - true
 ...
-assert(response.body[IPROTO_ERROR] ~= nil)
+assert(response.body[IPROTO_ERROR_24] ~= nil)
 ---
 - true
 ...
diff --git a/test/box/iproto.test.lua b/test/box/iproto.test.lua
index ec715e9..4af39cc 100644
--- a/test/box/iproto.test.lua
+++ b/test/box/iproto.test.lua
@@ -9,8 +9,8 @@ IPROTO_SYNC           = 0x01
 IPROTO_CALL           = 0x0A
 IPROTO_FUNCTION_NAME  = 0x22
 IPROTO_TUPLE          = 0x21
-IPROTO_ERROR          = 0x31
-IPROTO_ERROR_STACK    = 0x52
+IPROTO_ERROR_24       = 0x31
+IPROTO_ERROR          = 0x52
 IPROTO_ERROR_CODE     = 0x01
 IPROTO_ERROR_MESSAGE  = 0x02
 
@@ -49,7 +49,7 @@ sock:close()
 
 -- Both keys (obsolete and stack ones) are present in response.
 --
-assert(response.body[IPROTO_ERROR_STACK] ~= nil)
 assert(response.body[IPROTO_ERROR] ~= nil)
+assert(response.body[IPROTO_ERROR_24] ~= nil)
 
 box.schema.user.revoke('guest', 'read,write,execute', 'universe')
-- 
2.7.4



More information about the Tarantool-patches mailing list