[PATCH 7/8] netbox: remove schema_version from requests
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Mon Apr 16 21:39:17 MSK 2018
Schema_version was used in netbox to update local box-like
schema. The box-like schema makes able to access spaces and
indexes via connection object.
It was updated each time, when a response from a server is
received with a schema version non-equal to the local value.
But there was no reason why a schema version is needed in a
request. It leads to ER_WRONG_SCHEMA_VERSION error sometimes,
but netbox on this error just resends the same request again. The
same behaviour can be reached with just no sending any schema
version to a server.
Remove schema_version from request, and just track schema version
changes in responses.
Part of #3351
Part of #3333
Follow up #3107
---
src/box/lua/net_box.c | 105 +++++++++++++++++++++++-----------------------
src/box/lua/net_box.lua | 90 ++++++++++++++++-----------------------
test/box/net.box.result | 6 +--
test/box/net.box.test.lua | 6 +--
4 files changed, 95 insertions(+), 112 deletions(-)
diff --git a/src/box/lua/net_box.c b/src/box/lua/net_box.c
index db2d2dbb4..04fe70b03 100644
--- a/src/box/lua/net_box.c
+++ b/src/box/lua/net_box.c
@@ -53,7 +53,6 @@ netbox_prepare_request(lua_State *L, struct mpstream *stream, uint32_t r_type)
{
struct ibuf *ibuf = (struct ibuf *) lua_topointer(L, 1);
uint64_t sync = luaL_touint64(L, 2);
- uint64_t schema_version = luaL_touint64(L, 3);
mpstream_init(stream, ibuf, ibuf_reserve_cb, ibuf_alloc_cb,
luamp_error, L);
@@ -67,14 +66,11 @@ netbox_prepare_request(lua_State *L, struct mpstream *stream, uint32_t r_type)
mpstream_advance(stream, fixheader_size);
/* encode header */
- luamp_encode_map(cfg, stream, 3);
+ luamp_encode_map(cfg, stream, 2);
luamp_encode_uint(cfg, stream, IPROTO_SYNC);
luamp_encode_uint(cfg, stream, sync);
- luamp_encode_uint(cfg, stream, IPROTO_SCHEMA_VERSION);
- luamp_encode_uint(cfg, stream, schema_version);
-
luamp_encode_uint(cfg, stream, IPROTO_REQUEST_TYPE);
luamp_encode_uint(cfg, stream, r_type);
@@ -111,9 +107,8 @@ netbox_encode_request(struct mpstream *stream, size_t initial_size)
static int
netbox_encode_ping(lua_State *L)
{
- if (lua_gettop(L) < 3)
- return luaL_error(L, "Usage: netbox.encode_ping(ibuf, sync, "
- "schema_version)");
+ if (lua_gettop(L) < 2)
+ return luaL_error(L, "Usage: netbox.encode_ping(ibuf, sync)");
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, IPROTO_PING);
@@ -124,19 +119,20 @@ netbox_encode_ping(lua_State *L)
static int
netbox_encode_auth(lua_State *L)
{
- if (lua_gettop(L) < 6)
+ if (lua_gettop(L) < 5) {
return luaL_error(L, "Usage: netbox.encode_update(ibuf, sync, "
- "schema_version, user, password, greeting)");
+ "user, password, greeting)");
+ }
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, IPROTO_AUTH);
size_t user_len;
- const char *user = lua_tolstring(L, 4, &user_len);
+ const char *user = lua_tolstring(L, 3, &user_len);
size_t password_len;
- const char *password = lua_tolstring(L, 5, &password_len);
+ const char *password = lua_tolstring(L, 4, &password_len);
size_t salt_len;
- const char *salt = lua_tolstring(L, 6, &salt_len);
+ const char *salt = lua_tolstring(L, 5, &salt_len);
if (salt_len < SCRAMBLE_SIZE)
return luaL_error(L, "Invalid salt");
@@ -160,9 +156,10 @@ netbox_encode_auth(lua_State *L)
static int
netbox_encode_call_impl(lua_State *L, enum iproto_type type)
{
- if (lua_gettop(L) < 5)
+ if (lua_gettop(L) < 4) {
return luaL_error(L, "Usage: netbox.encode_call(ibuf, sync, "
- "schema_version, function_name, args)");
+ "function_name, args)");
+ }
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, type);
@@ -171,13 +168,13 @@ netbox_encode_call_impl(lua_State *L, enum iproto_type type)
/* encode proc name */
size_t name_len;
- const char *name = lua_tolstring(L, 4, &name_len);
+ const char *name = lua_tolstring(L, 3, &name_len);
luamp_encode_uint(cfg, &stream, IPROTO_FUNCTION_NAME);
luamp_encode_str(cfg, &stream, name, name_len);
/* encode args */
luamp_encode_uint(cfg, &stream, IPROTO_TUPLE);
- luamp_encode_tuple(L, cfg, &stream, 5);
+ luamp_encode_tuple(L, cfg, &stream, 4);
netbox_encode_request(&stream, svp);
return 0;
@@ -198,9 +195,10 @@ netbox_encode_call(lua_State *L)
static int
netbox_encode_eval(lua_State *L)
{
- if (lua_gettop(L) < 5)
+ if (lua_gettop(L) < 4) {
return luaL_error(L, "Usage: netbox.encode_eval(ibuf, sync, "
- "schema_version, expr, args)");
+ "expr, args)");
+ }
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, IPROTO_EVAL);
@@ -209,13 +207,13 @@ netbox_encode_eval(lua_State *L)
/* encode expr */
size_t expr_len;
- const char *expr = lua_tolstring(L, 4, &expr_len);
+ const char *expr = lua_tolstring(L, 3, &expr_len);
luamp_encode_uint(cfg, &stream, IPROTO_EXPR);
luamp_encode_str(cfg, &stream, expr, expr_len);
/* encode args */
luamp_encode_uint(cfg, &stream, IPROTO_TUPLE);
- luamp_encode_tuple(L, cfg, &stream, 5);
+ luamp_encode_tuple(L, cfg, &stream, 4);
netbox_encode_request(&stream, svp);
return 0;
@@ -224,21 +222,22 @@ netbox_encode_eval(lua_State *L)
static int
netbox_encode_select(lua_State *L)
{
- if (lua_gettop(L) < 9)
+ if (lua_gettop(L) < 8) {
return luaL_error(L, "Usage netbox.encode_select(ibuf, sync, "
- "schema_version, space_id, index_id, iterator, "
- "offset, limit, key)");
+ "space_id, index_id, iterator, offset, "
+ "limit, key)");
+ }
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, IPROTO_SELECT);
luamp_encode_map(cfg, &stream, 6);
- uint32_t space_id = lua_tonumber(L, 4);
- uint32_t index_id = lua_tonumber(L, 5);
- int iterator = lua_tointeger(L, 6);
- uint32_t offset = lua_tonumber(L, 7);
- uint32_t limit = lua_tonumber(L, 8);
+ uint32_t space_id = lua_tonumber(L, 3);
+ uint32_t index_id = lua_tonumber(L, 4);
+ int iterator = lua_tointeger(L, 5);
+ uint32_t offset = lua_tonumber(L, 6);
+ uint32_t limit = lua_tonumber(L, 7);
/* encode space_id */
luamp_encode_uint(cfg, &stream, IPROTO_SPACE_ID);
@@ -262,7 +261,7 @@ netbox_encode_select(lua_State *L)
/* encode key */
luamp_encode_uint(cfg, &stream, IPROTO_KEY);
- luamp_convert_key(L, cfg, &stream, 9);
+ luamp_convert_key(L, cfg, &stream, 8);
netbox_encode_request(&stream, svp);
return 0;
@@ -271,24 +270,23 @@ netbox_encode_select(lua_State *L)
static inline int
netbox_encode_insert_or_replace(lua_State *L, uint32_t reqtype)
{
- if (lua_gettop(L) < 5)
+ if (lua_gettop(L) < 4) {
return luaL_error(L, "Usage: netbox.encode_insert(ibuf, sync, "
- "schema_version, space_id, tuple)");
- lua_settop(L, 5);
-
+ "space_id, tuple)");
+ }
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, reqtype);
luamp_encode_map(cfg, &stream, 2);
/* encode space_id */
- uint32_t space_id = lua_tonumber(L, 4);
+ uint32_t space_id = lua_tonumber(L, 3);
luamp_encode_uint(cfg, &stream, IPROTO_SPACE_ID);
luamp_encode_uint(cfg, &stream, space_id);
/* encode args */
luamp_encode_uint(cfg, &stream, IPROTO_TUPLE);
- luamp_encode_tuple(L, cfg, &stream, 5);
+ luamp_encode_tuple(L, cfg, &stream, 4);
netbox_encode_request(&stream, svp);
return 0;
@@ -309,9 +307,10 @@ netbox_encode_replace(lua_State *L)
static int
netbox_encode_delete(lua_State *L)
{
- if (lua_gettop(L) < 6)
+ if (lua_gettop(L) < 5) {
return luaL_error(L, "Usage: netbox.encode_delete(ibuf, sync, "
- "schema_version, space_id, index_id, key)");
+ "space_id, index_id, key)");
+ }
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, IPROTO_DELETE);
@@ -319,18 +318,18 @@ netbox_encode_delete(lua_State *L)
luamp_encode_map(cfg, &stream, 3);
/* encode space_id */
- uint32_t space_id = lua_tonumber(L, 4);
+ uint32_t space_id = lua_tonumber(L, 3);
luamp_encode_uint(cfg, &stream, IPROTO_SPACE_ID);
luamp_encode_uint(cfg, &stream, space_id);
/* encode space_id */
- uint32_t index_id = lua_tonumber(L, 5);
+ uint32_t index_id = lua_tonumber(L, 4);
luamp_encode_uint(cfg, &stream, IPROTO_INDEX_ID);
luamp_encode_uint(cfg, &stream, index_id);
/* encode key */
luamp_encode_uint(cfg, &stream, IPROTO_KEY);
- luamp_convert_key(L, cfg, &stream, 6);
+ luamp_convert_key(L, cfg, &stream, 5);
netbox_encode_request(&stream, svp);
return 0;
@@ -339,9 +338,10 @@ netbox_encode_delete(lua_State *L)
static int
netbox_encode_update(lua_State *L)
{
- if (lua_gettop(L) < 7)
+ if (lua_gettop(L) < 6) {
return luaL_error(L, "Usage: netbox.encode_update(ibuf, sync, "
- "schema_version, space_id, index_id, key, ops)");
+ "space_id, index_id, key, ops)");
+ }
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, IPROTO_UPDATE);
@@ -349,12 +349,12 @@ netbox_encode_update(lua_State *L)
luamp_encode_map(cfg, &stream, 5);
/* encode space_id */
- uint32_t space_id = lua_tonumber(L, 4);
+ uint32_t space_id = lua_tonumber(L, 3);
luamp_encode_uint(cfg, &stream, IPROTO_SPACE_ID);
luamp_encode_uint(cfg, &stream, space_id);
/* encode index_id */
- uint32_t index_id = lua_tonumber(L, 5);
+ uint32_t index_id = lua_tonumber(L, 4);
luamp_encode_uint(cfg, &stream, IPROTO_INDEX_ID);
luamp_encode_uint(cfg, &stream, index_id);
@@ -365,12 +365,12 @@ netbox_encode_update(lua_State *L)
/* encode in reverse order for speedup - see luamp_encode() code */
/* encode ops */
luamp_encode_uint(cfg, &stream, IPROTO_TUPLE);
- luamp_encode_tuple(L, cfg, &stream, 7);
+ luamp_encode_tuple(L, cfg, &stream, 6);
lua_pop(L, 1); /* ops */
/* encode key */
luamp_encode_uint(cfg, &stream, IPROTO_KEY);
- luamp_convert_key(L, cfg, &stream, 6);
+ luamp_convert_key(L, cfg, &stream, 5);
netbox_encode_request(&stream, svp);
return 0;
@@ -379,9 +379,10 @@ netbox_encode_update(lua_State *L)
static int
netbox_encode_upsert(lua_State *L)
{
- if (lua_gettop(L) != 6)
+ if (lua_gettop(L) != 5) {
return luaL_error(L, "Usage: netbox.encode_upsert(ibuf, sync, "
- "schema_version, space_id, tuple, ops)");
+ "space_id, tuple, ops)");
+ }
struct mpstream stream;
size_t svp = netbox_prepare_request(L, &stream, IPROTO_UPSERT);
@@ -389,7 +390,7 @@ netbox_encode_upsert(lua_State *L)
luamp_encode_map(cfg, &stream, 4);
/* encode space_id */
- uint32_t space_id = lua_tonumber(L, 4);
+ uint32_t space_id = lua_tonumber(L, 3);
luamp_encode_uint(cfg, &stream, IPROTO_SPACE_ID);
luamp_encode_uint(cfg, &stream, space_id);
@@ -400,12 +401,12 @@ netbox_encode_upsert(lua_State *L)
/* encode in reverse order for speedup - see luamp_encode() code */
/* encode ops */
luamp_encode_uint(cfg, &stream, IPROTO_OPS);
- luamp_encode_tuple(L, cfg, &stream, 6);
+ luamp_encode_tuple(L, cfg, &stream, 5);
lua_pop(L, 1); /* ops */
/* encode tuple */
luamp_encode_uint(cfg, &stream, IPROTO_TUPLE);
- luamp_encode_tuple(L, cfg, &stream, 5);
+ luamp_encode_tuple(L, cfg, &stream, 4);
netbox_encode_request(&stream, svp);
return 0;
diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua
index 96f528963..a2b7b39d2 100644
--- a/src/box/lua/net_box.lua
+++ b/src/box/lua/net_box.lua
@@ -45,7 +45,6 @@ local IPROTO_GREETING_SIZE = 128
local E_UNKNOWN = box.error.UNKNOWN
local E_NO_CONNECTION = box.error.NO_CONNECTION
local E_TIMEOUT = box.error.TIMEOUT
-local E_WRONG_SCHEMA_VERSION = box.error.WRONG_SCHEMA_VERSION
local E_PROC_LUA = box.error.PROC_LUA
-- utility tables
@@ -93,7 +92,7 @@ local method_encoder = {
max = internal.encode_select,
count = internal.encode_call,
-- inject raw data into connection, used by console and tests
- inject = function(buf, id, schema_version, bytes)
+ inject = function(buf, id, bytes)
local ptr = buf:reserve(#bytes)
ffi.copy(ptr, bytes, #bytes)
buf.wpos = ptr + #bytes
@@ -158,7 +157,7 @@ end
-- * implements protocols; concurrent perform_request()-s benefit from
-- multiplexing support in the protocol;
-- * schema-aware (optional) - snoops responses and initiates
--- schema reload when a request fails due to schema version mismatch;
+-- schema reload when a response has a new schema version;
-- * delivers transport events via the callback.
--
-- Transport state machine:
@@ -415,7 +414,7 @@ local function create_transport(host, port, user, password, callback,
-- @retval nil, error Error occured.
-- @retval not nil Future object.
--
- local function perform_async_request(buffer, method, schema_version, ...)
+ local function perform_async_request(buffer, method, ...)
if state ~= 'active' then
return nil, box.error.new({code = last_errno or E_NO_CONNECTION,
reason = last_error})
@@ -426,11 +425,10 @@ local function create_transport(host, port, user, password, callback,
worker_fiber:wakeup()
end
local id = next_request_id
- method_encoder[method](send_buf, id, schema_version, ...)
+ method_encoder[method](send_buf, id, ...)
next_request_id = next_id(id)
- local request = setmetatable(table_new(0, 7), request_mt)
+ local request = setmetatable(table_new(0, 6), request_mt)
request.method = method
- request.schema_version = schema_version
request.buffer = buffer
request.id = id
requests[id] = request
@@ -440,9 +438,9 @@ local function create_transport(host, port, user, password, callback,
--
-- Send a request and wait for response.
--
- local function perform_request(timeout, buffer, method, schema_version, ...)
+ local function perform_request(timeout, buffer, method, ...)
local request, err =
- perform_async_request(buffer, method, schema_version, ...)
+ perform_async_request(buffer, method, ...)
if not request then
return last_errno or E_NO_CONNECTION, last_error
end
@@ -578,7 +576,7 @@ local function create_transport(host, port, user, password, callback,
log.warn("Netbox text protocol support is deprecated since 1.10, "..
"please use require('console').connect() instead")
local setup_delimiter = 'require("console").delimiter("$EOF$")\n'
- method_encoder.inject(send_buf, nil, nil, setup_delimiter)
+ method_encoder.inject(send_buf, nil, setup_delimiter)
local err, response = send_and_recv_console()
if err then
return error_sm(err, response)
@@ -619,7 +617,7 @@ local function create_transport(host, port, user, password, callback,
set_state('fetch_schema')
return iproto_schema_sm()
end
- encode_auth(send_buf, new_request_id(), nil, user, password, salt)
+ encode_auth(send_buf, new_request_id(), user, password, salt)
local err, hdr, body_rpos, body_end = send_and_recv_iproto()
if err then
return error_sm(err, hdr)
@@ -642,11 +640,9 @@ local function create_transport(host, port, user, password, callback,
local select2_id = new_request_id()
local response = {}
-- fetch everything from space _vspace, 2 = ITER_ALL
- encode_select(send_buf, select1_id, nil, VSPACE_ID, 0, 2, 0,
- 0xFFFFFFFF, nil)
+ encode_select(send_buf, select1_id, VSPACE_ID, 0, 2, 0, 0xFFFFFFFF, nil)
-- fetch everything from space _vindex, 2 = ITER_ALL
- encode_select(send_buf, select2_id, nil, VINDEX_ID, 0, 2, 0,
- 0xFFFFFFFF, nil)
+ encode_select(send_buf, select2_id, VINDEX_ID, 0, 2, 0, 0xFFFFFFFF, nil)
schema_version = nil -- any schema_version will do provided that
-- it is consistent across responses
repeat
@@ -692,8 +688,7 @@ local function create_transport(host, port, user, password, callback,
-- Sic: self.schema_version will be updated only after reload.
local body
body, body_end = decode(body_rpos)
- set_state('fetch_schema',
- E_WRONG_SCHEMA_VERSION, body[IPROTO_ERROR_KEY])
+ set_state('fetch_schema')
return iproto_schema_sm(schema_version)
end
return iproto_sm(schema_version)
@@ -977,57 +972,44 @@ function remote_methods:_request(method, opts, ...)
local transport = self._transport
local buffer = opts and opts.buffer
if opts and opts.is_async then
- return transport.perform_async_request(buffer, method, 0, ...)
+ return transport.perform_async_request(buffer, method, ...)
end
- local this_fiber = fiber_self()
- local perform_request = transport.perform_request
- local wait_state = transport.wait_state
- local deadline = nil
+ local deadline
if opts and opts.timeout then
-- conn.space:request(, { timeout = timeout })
deadline = fiber_clock() + opts.timeout
else
-- conn:timeout(timeout).space:request()
-- @deprecated since 1.7.4
- deadline = self._deadlines[this_fiber]
+ deadline = self._deadlines[fiber_self()]
end
- local err, res
- repeat
- local timeout = deadline and max(0, deadline - fiber_clock())
- if self.state ~= 'active' then
- wait_state('active', timeout)
- timeout = deadline and max(0, deadline - fiber_clock())
- end
- err, res = perform_request(timeout, buffer, method,
- self.schema_version, ...)
- if not err then
- return res
- elseif err == E_WRONG_SCHEMA_VERSION then
- err = nil
- end
- until err
- box.error({code = err, reason = res})
+ local timeout = deadline and max(0, deadline - fiber_clock())
+ if self.state ~= 'active' then
+ transport.wait_state('active', timeout)
+ timeout = deadline and max(0, deadline - fiber_clock())
+ end
+ local err, res = transport.perform_request(timeout, buffer, method, ...)
+ if err then
+ box.error({code = err, reason = res})
+ end
+ -- Try to wait until a schema is reloaded if needed.
+ -- Regardless of reloading result, the main response is
+ -- returned, since it does not depend on any schema things.
+ if self.state == 'fetch_schema' then
+ timeout = deadline and max(0, deadline - fiber_clock())
+ transport.wait_state('active', timeout)
+ end
+ return res
end
function remote_methods:ping(opts)
check_remote_arg(self, 'ping')
- local timeout = opts and opts.timeout
- if timeout == nil then
- -- conn:timeout(timeout):ping()
- -- @deprecated since 1.7.4
- local deadline = self._deadlines[fiber_self()]
- timeout = deadline and max(0, deadline - fiber_clock())
- or (opts and opts.timeout)
- end
- local err = self._transport.perform_request(timeout, nil, 'ping',
- self.schema_version)
- return not err or err == E_WRONG_SCHEMA_VERSION
+ return (pcall(self._request, self, 'ping', opts))
end
function remote_methods:reload_schema()
check_remote_arg(self, 'reload_schema')
- self:_request('select', nil, VSPACE_ID, 0, box.index.GE, 0, 0xFFFFFFFF,
- nil)
+ self:ping()
end
-- @deprecated since 1.7.4
@@ -1200,10 +1182,10 @@ function console_methods:eval(line, timeout)
end
if self.protocol == 'Binary' then
local loader = 'return require("console").eval(...)'
- err, res = pr(timeout, nil, 'eval', nil, loader, {line})
+ err, res = pr(timeout, nil, 'eval', loader, {line})
else
assert(self.protocol == 'Lua console')
- err, res = pr(timeout, nil, 'inject', nil, line..'$EOF$\n')
+ err, res = pr(timeout, nil, 'inject', line..'$EOF$\n')
end
if err then
box.error({code = err, reason = res})
diff --git a/test/box/net.box.result b/test/box/net.box.result
index aaa421ec6..3c494696b 100644
--- a/test/box/net.box.result
+++ b/test/box/net.box.result
@@ -28,7 +28,7 @@ function x_select(cn, space_id, index_id, iterator, offset, limit, key, opts)
return cn:_request('select', opts, space_id, index_id, iterator,
offset, limit, key)
end
-function x_fatal(cn) cn._transport.perform_request(nil, nil, 'inject', nil, '\x80') end
+function x_fatal(cn) cn._transport.perform_request(nil, nil, 'inject', '\x80') end
test_run:cmd("setopt delimiter ''");
---
...
@@ -2377,7 +2377,7 @@ c.space.test:delete{1}
--
-- Break a connection to test reconnect_after.
--
-_ = c._transport.perform_request(nil, nil, 'inject', nil, '\x80')
+_ = c._transport.perform_request(nil, nil, 'inject', '\x80')
---
...
c.state
@@ -2940,7 +2940,7 @@ c = net:connect(box.cfg.listen, {reconnect_after = 0.01})
future = c:call('long_function', {1, 2, 3}, {is_async = true})
---
...
-_ = c._transport.perform_request(nil, nil, 'inject', nil, '\x80')
+_ = c._transport.perform_request(nil, nil, 'inject', '\x80')
---
...
while not c:is_connected() do fiber.sleep(0.01) end
diff --git a/test/box/net.box.test.lua b/test/box/net.box.test.lua
index 82c538fbe..9a826dc6d 100644
--- a/test/box/net.box.test.lua
+++ b/test/box/net.box.test.lua
@@ -11,7 +11,7 @@ function x_select(cn, space_id, index_id, iterator, offset, limit, key, opts)
return cn:_request('select', opts, space_id, index_id, iterator,
offset, limit, key)
end
-function x_fatal(cn) cn._transport.perform_request(nil, nil, 'inject', nil, '\x80') end
+function x_fatal(cn) cn._transport.perform_request(nil, nil, 'inject', '\x80') end
test_run:cmd("setopt delimiter ''");
LISTEN = require('uri').parse(box.cfg.listen)
@@ -965,7 +965,7 @@ c.space.test:delete{1}
--
-- Break a connection to test reconnect_after.
--
-_ = c._transport.perform_request(nil, nil, 'inject', nil, '\x80')
+_ = c._transport.perform_request(nil, nil, 'inject', '\x80')
c.state
while not c:is_connected() do fiber.sleep(0.01) end
c:ping()
@@ -1169,7 +1169,7 @@ future:is_ready()
--
c = net:connect(box.cfg.listen, {reconnect_after = 0.01})
future = c:call('long_function', {1, 2, 3}, {is_async = true})
-_ = c._transport.perform_request(nil, nil, 'inject', nil, '\x80')
+_ = c._transport.perform_request(nil, nil, 'inject', '\x80')
while not c:is_connected() do fiber.sleep(0.01) end
future:wait_result(100)
future:result()
--
2.15.1 (Apple Git-101)
More information about the Tarantool-patches
mailing list