Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladislav Shpilevoy via Tarantool-patches <tarantool-patches@dev.tarantool.org>
To: tarantool-patches@dev.tarantool.org, olegrok@tarantool.org
Subject: [Tarantool-patches] [PATCH vshard 3/4] router: support msgpack object args
Date: Wed,  9 Feb 2022 01:32:33 +0100	[thread overview]
Message-ID: <bdddc93804b432093b9ef732b91c4528551ea0e1.1644366575.git.v.shpilevoy@tarantool.org> (raw)
In-Reply-To: <cover.1644366575.git.v.shpilevoy@tarantool.org>

Msgpack object allows to represent scalar values and tables with
them as a raw MessagePack buffer. It will be introduced after
2.10.0-beta2.

It can be used in most of the places which used to take arguments
for further encoding into MessagePack anyway. Including netbox
API. Usage of msgpack object allows not to decode the buffer if it
was received from a remote instance for further proxying. It is
simply memcpy-ed into a next call.

VShard.router almost supported this feature. Only needed to change
the arguments type check. But even better - simply drop it and
trust netbox to do the type check.

Part of #312
---
 test/instances/router.lua           |  1 +
 test/router-luatest/router_test.lua | 47 +++++++++++++++++++++++++++++
 vshard/replicaset.lua               |  4 ---
 vshard/util.lua                     |  9 ++++++
 4 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/test/instances/router.lua b/test/instances/router.lua
index ccec6c1..921ac73 100755
--- a/test/instances/router.lua
+++ b/test/instances/router.lua
@@ -1,5 +1,6 @@
 #!/usr/bin/env tarantool
 local helpers = require('test.luatest_helpers')
+_G.msgpack = require('msgpack')
 -- Do not load entire vshard into the global namespace to catch errors when code
 -- relies on that.
 _G.vshard = {
diff --git a/test/router-luatest/router_test.lua b/test/router-luatest/router_test.lua
index 621794a..13ab74d 100644
--- a/test/router-luatest/router_test.lua
+++ b/test/router-luatest/router_test.lua
@@ -1,5 +1,6 @@
 local t = require('luatest')
 local vtest = require('test.luatest_helpers.vtest')
+local vutil = require('vshard.util')
 local wait_timeout = 120
 
 local g = t.group('router')
@@ -52,3 +53,49 @@ g.test_basic = function(g)
     t.assert(not err, 'no error')
     t.assert_equals(res, 1, 'good result')
 end
+
+if vutil.feature.msgpack_object then
+
+g.test_msgpack_args = function(g)
+    local router = g.router
+    --
+    -- Normal call ro.
+    --
+    local res, err = router:exec(function(timeout)
+        local args = msgpack.object({100})
+        return vshard.router.callrw(1, 'echo', args, {timeout = timeout})
+    end, {wait_timeout})
+    t.assert(not err, 'no error')
+    t.assert_equals(res, 100, 'good result')
+    --
+    -- Normal call rw.
+    --
+    res, err = router:exec(function(timeout)
+        local args = msgpack.object({100})
+        return vshard.router.callro(1, 'echo', args, {timeout = timeout})
+    end, {wait_timeout})
+    t.assert(not err, 'no error')
+    t.assert_equals(res, 100, 'good result')
+    --
+    -- Direct call ro.
+    --
+    res, err = router:exec(function(timeout)
+        local args = msgpack.object({100})
+        local route = vshard.router.route(1)
+        return route:callro('echo', args, {timeout = timeout})
+    end, {wait_timeout})
+    t.assert(err == nil, 'no error')
+    t.assert_equals(res, 100, 'good result')
+    --
+    -- Direct call rw.
+    --
+    res, err = router:exec(function(timeout)
+        local args = msgpack.object({100})
+        local route = vshard.router.route(1)
+        return route:callrw('echo', args, {timeout = timeout})
+    end, {wait_timeout})
+    t.assert(err == nil, 'no error')
+    t.assert_equals(res, 100, 'good result')
+end
+
+end -- vutil.feature.msgpack_object
diff --git a/vshard/replicaset.lua b/vshard/replicaset.lua
index 8e5526a..16b89aa 100644
--- a/vshard/replicaset.lua
+++ b/vshard/replicaset.lua
@@ -408,8 +408,6 @@ end
 --
 local function replicaset_master_call(replicaset, func, args, opts)
     assert(opts == nil or type(opts) == 'table')
-    assert(type(func) == 'string', 'function name')
-    assert(args == nil or type(args) == 'table', 'function arguments')
     local master = replicaset.master
     if not master then
         opts = opts and table.copy(opts) or {}
@@ -552,8 +550,6 @@ local function replicaset_template_multicallro(prefer_replica, balance)
 
     return function(replicaset, func, args, opts)
         assert(opts == nil or type(opts) == 'table')
-        assert(type(func) == 'string', 'function name')
-        assert(args == nil or type(args) == 'table', 'function arguments')
         opts = opts and table.copy(opts) or {}
         local timeout = opts.timeout or consts.CALL_TIMEOUT_MAX
         local net_status, storage_status, retval, err, replica
diff --git a/vshard/util.lua b/vshard/util.lua
index 9e0212a..72176f7 100644
--- a/vshard/util.lua
+++ b/vshard/util.lua
@@ -230,6 +230,14 @@ local function fiber_is_self_canceled()
     return not pcall(fiber.testcancel)
 end
 
+--
+-- Dictionary of supported core features on the given instance. Try to use it
+-- in all the other code rather than direct version check.
+--
+local feature = {
+    msgpack_object = version_is_at_least(2, 10, 0, 'beta', 2, 86),
+}
+
 return {
     tuple_extract_key = tuple_extract_key,
     reloadable_fiber_create = reloadable_fiber_create,
@@ -241,4 +249,5 @@ return {
     table_minus_yield = table_minus_yield,
     fiber_cond_wait = fiber_cond_wait,
     fiber_is_self_canceled = fiber_is_self_canceled,
+    feature = feature,
 }
-- 
2.24.3 (Apple Git-128)


  parent reply	other threads:[~2022-02-09  0:34 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-09  0:32 [Tarantool-patches] [PATCH vshard 0/4] Router msgpack object and netbox return_raw Vladislav Shpilevoy via Tarantool-patches
2022-02-09  0:32 ` [Tarantool-patches] [PATCH vshard 1/4] test: support luatest Vladislav Shpilevoy via Tarantool-patches
2022-02-09 17:53   ` Oleg Babin via Tarantool-patches
2022-02-10 22:32     ` Vladislav Shpilevoy via Tarantool-patches
2022-02-11 16:38       ` Oleg Babin via Tarantool-patches
2022-02-09  0:32 ` [Tarantool-patches] [PATCH vshard 2/4] util: introduce Tarantool's semver parser Vladislav Shpilevoy via Tarantool-patches
2022-02-09 17:53   ` Oleg Babin via Tarantool-patches
2022-02-10 22:33     ` Vladislav Shpilevoy via Tarantool-patches
2022-02-11 16:38       ` Oleg Babin via Tarantool-patches
2022-02-09  0:32 ` Vladislav Shpilevoy via Tarantool-patches [this message]
2022-02-09 17:53   ` [Tarantool-patches] [PATCH vshard 3/4] router: support msgpack object args Oleg Babin via Tarantool-patches
2022-02-10 22:33     ` Vladislav Shpilevoy via Tarantool-patches
2022-02-11 16:38       ` Oleg Babin via Tarantool-patches
2022-02-09  0:32 ` [Tarantool-patches] [PATCH vshard 4/4] router: support netbox return_raw Vladislav Shpilevoy via Tarantool-patches
2022-02-09 17:53   ` Oleg Babin via Tarantool-patches
2022-02-10 22:34     ` Vladislav Shpilevoy via Tarantool-patches
2022-02-11 16:38       ` Oleg Babin via Tarantool-patches
2022-02-11 23:05 ` [Tarantool-patches] [PATCH vshard 0/4] Router msgpack object and " Vladislav Shpilevoy via Tarantool-patches
2022-02-15 16:55   ` Oleg Babin via Tarantool-patches
2022-02-15 21:16     ` Vladislav Shpilevoy via Tarantool-patches

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=bdddc93804b432093b9ef732b91c4528551ea0e1.1644366575.git.v.shpilevoy@tarantool.org \
    --to=tarantool-patches@dev.tarantool.org \
    --cc=olegrok@tarantool.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH vshard 3/4] router: support msgpack object args' \
    /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