From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: tarantool-patches@freelists.org Cc: vdavydov.dev@gmail.com Subject: [PATCH 7/8] netbox: remove schema_version from requests Date: Mon, 16 Apr 2018 21:39:17 +0300 [thread overview] Message-ID: <c4c2fcabbeeac2d0ce6dbbafa7f4169953218bae.1523903144.git.v.shpilevoy@tarantool.org> (raw) In-Reply-To: <cover.1523903144.git.v.shpilevoy@tarantool.org> In-Reply-To: <cover.1523903144.git.v.shpilevoy@tarantool.org> 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)
next prev parent reply other threads:[~2018-04-16 18:39 UTC|newest] Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-04-16 18:39 [PATCH 0/8] netbox: introduce fiber-async API Vladislav Shpilevoy 2018-04-16 18:39 ` [PATCH 1/8] lua: fix box.error.raise Vladislav Shpilevoy 2018-04-23 16:19 ` Vladimir Davydov 2018-05-08 15:36 ` [tarantool-patches] " Konstantin Osipov 2018-05-08 17:24 ` [tarantool-patches] " Vladislav Shpilevoy 2018-04-16 18:39 ` [PATCH 2/8] lua: allow to create and error object with no throw Vladislav Shpilevoy 2018-04-23 16:20 ` Vladimir Davydov 2018-05-08 15:37 ` [tarantool-patches] " Konstantin Osipov 2018-04-16 18:39 ` [PATCH 3/8] console: fix a bug in interactive readline usage Vladislav Shpilevoy 2018-04-23 16:20 ` Vladimir Davydov 2018-05-08 15:37 ` [tarantool-patches] " Konstantin Osipov 2018-04-16 18:39 ` [PATCH 4/8] netbox: extend codec with 'decode' methods Vladislav Shpilevoy 2018-04-23 16:42 ` Vladimir Davydov 2018-04-23 18:59 ` [tarantool-patches] " Vladislav Shpilevoy 2018-04-24 13:16 ` Vladimir Davydov 2018-05-08 15:49 ` [tarantool-patches] " Konstantin Osipov 2018-05-08 17:24 ` [tarantool-patches] " Vladislav Shpilevoy 2018-04-16 18:39 ` [PATCH 5/8] test: fix unstable test Vladislav Shpilevoy 2018-04-22 5:32 ` [tarantool-patches] " Kirill Yukhin 2018-05-08 15:50 ` Konstantin Osipov 2018-04-16 18:39 ` [PATCH 6/8] netbox: introduce fiber-async API Vladislav Shpilevoy 2018-04-23 12:31 ` [tarantool-patches] " Alexander Turenko 2018-04-23 18:59 ` Vladislav Shpilevoy 2018-04-23 16:44 ` Vladimir Davydov 2018-04-23 18:59 ` [tarantool-patches] " Vladislav Shpilevoy 2018-04-24 13:05 ` Vladimir Davydov 2018-04-16 18:39 ` Vladislav Shpilevoy [this message] 2018-05-08 16:06 ` [tarantool-patches] [PATCH 7/8] netbox: remove schema_version from requests Konstantin Osipov 2018-05-08 17:24 ` [tarantool-patches] " Vladislav Shpilevoy 2018-04-16 18:39 ` [PATCH 8/8] netbox: implement perform_request via async version Vladislav Shpilevoy 2018-04-23 16:47 ` Vladimir Davydov 2018-04-23 19:00 ` [tarantool-patches] " Vladislav Shpilevoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=c4c2fcabbeeac2d0ce6dbbafa7f4169953218bae.1523903144.git.v.shpilevoy@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=tarantool-patches@freelists.org \ --cc=vdavydov.dev@gmail.com \ --subject='Re: [PATCH 7/8] netbox: remove schema_version from requests' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox