Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: imeevma@tarantool.org, tarantool-patches@freelists.org
Subject: [tarantool-patches] Re: [PATCH v2 2/7] box: add method dump_lua to port
Date: Fri, 23 Nov 2018 00:49:11 +0300	[thread overview]
Message-ID: <eb9203d5-0ce9-b93c-9d43-f07abf81ea65@tarantool.org> (raw)
In-Reply-To: <15aaf24f520f8a1ad834ec417bcde6f42331a583.1542910674.git.imeevma@gmail.com>

Hi! Thanks for the fixes! See my 5 comments below, fix
at the end of the email and on the branch.

Also, please, do not forget next time to answer to my comments
inlined. Do not just send v2 without any answers.

On 22/11/2018 22:10, imeevma@tarantool.org wrote:
> New method dump_lua dumps saved in port tuples to Lua stack. It
> will allow us to call this method without any other interaction
> with port.
> 
> Needed for #3505
> ---
>   src/box/lua/call.c |  1 +
>   src/box/port.c     | 22 ++++++++++++++++++++++
>   src/box/port.h     | 12 ++++++++++++
>   3 files changed, 35 insertions(+)
> 
> diff --git a/src/box/port.c b/src/box/port.c
> index 266cf3d..a65a32d 100644
> --- a/src/box/port.c
> +++ b/src/box/port.c
> @@ -36,6 +36,8 @@
>   #include <small/mempool.h>
>   #include <fiber.h>
>   #include "errinj.h"
> +#include "lua/utils.h"
> +#include "lua/tuple.h"

1. src/box/ files should not depend in Lua. I moved
implementation to misc.cc and put here extern declaration.

>   
>   static struct mempool port_tuple_entry_pool;
>   
> @@ -121,6 +123,19 @@ port_tuple_dump_msgpack(struct port *base, struct obuf *out)
>   	return 1;
>   }
>   
> +static int

2. Why do you need to return number of dumped tuples? Dump_msgpack
returns number of tuples since in iproto.cc it firstly reserves
msgpack array header, then dumps port and then fills the reserved
header. For Lua we do not need it.

> +port_tuple_dump_lua(struct port *base, struct lua_State *L)
> +{
> +	struct port_tuple *port = port_tuple(base);
> +	struct port_tuple_entry *pe;
> +	int i = 0;

3. Why did not you add here lua_createtable(L, port->size, 0);
as it is done in misc.cc in the original implementation?

4. Why did not you replaced lbox_port_to_table with this new
method?

I did this points and it works.

> +	for (pe = port->first; pe != NULL; pe = pe->next) {
> +		luaT_pushtuple(L, pe->tuple);
> +		lua_rawseti(L, -2, ++i);
> +	}
> +	return port->size;
> +}
> +
>   void
>   port_destroy(struct port *port)
>   {
> diff --git a/src/box/port.h b/src/box/port.h
> index 882bb37..3bd83b0 100644
> --- a/src/box/port.h
> +++ b/src/box/port.h
> @@ -185,6 +190,13 @@ int
>   port_dump_msgpack_16(struct port *port, struct obuf *out);
>   
>   /**
> + * Same as port_dump(), but use the legacy Tarantool 1.6
> + * format.

5. This comment does not make sense to this function.

> + */
> +int
> +port_dump_lua(struct port *port, struct lua_State *L);
> +
> +/**
>    * Dump a port content as a plain text into a buffer,
>    * allocated inside.
>    * @param port Port with data to dump.
> 

===========================================================

diff --git a/src/box/lua/misc.cc b/src/box/lua/misc.cc
index 8bd33aed1..6af811f7d 100644
--- a/src/box/lua/misc.cc
+++ b/src/box/lua/misc.cc
@@ -56,23 +56,26 @@ lbox_encode_tuple_on_gc(lua_State *L, int idx, size_t *p_len)
  	return (char *) region_join_xc(gc, *p_len);
  }
  
-/* }}} */
-
-/** {{{ Lua/C implementation of index:select(): used only by Vinyl **/
-
-static inline void
-lbox_port_to_table(lua_State *L, struct port *port_base)
+/**
+ * Dump port_tuple content to Lua as a table. Used in box/port.c,
+ * but implemented here to eliminate port.c dependency on Lua.
+ */
+extern "C" void
+port_tuple_dump_lua(struct port *base, struct lua_State *L)
  {
-	struct port_tuple *port = port_tuple(port_base);
+	struct port_tuple *port = port_tuple(base);
  	lua_createtable(L, port->size, 0);
-	struct port_tuple_entry *entry = port->first;
-	for (int i = 0 ; i < port->size; i++) {
-		luaT_pushtuple(L, entry->tuple);
-		lua_rawseti(L, -2, i + 1);
-		entry = entry->next;
+	struct port_tuple_entry *pe = port->first;
+	for (int i = 0; pe != NULL; pe = pe->next) {
+		luaT_pushtuple(L, pe->tuple);
+		lua_rawseti(L, -2, ++i);
  	}
  }
  
+/* }}} */
+
+/** {{{ Lua/C implementation of index:select(): used only by Vinyl **/
+
  static int
  lbox_select(lua_State *L)
  {
@@ -106,7 +109,7 @@ lbox_select(lua_State *L)
  	 * table always crashed the first (can't be fixed with pcall).
  	 * https://github.com/tarantool/tarantool/issues/1182
  	 */
-	lbox_port_to_table(L, &port);
+	port_dump_lua(&port, L);
  	port_destroy(&port);
  	return 1; /* lua table with tuples */
  }
diff --git a/src/box/port.c b/src/box/port.c
index a65a32d96..df94eb507 100644
--- a/src/box/port.c
+++ b/src/box/port.c
@@ -123,18 +123,8 @@ port_tuple_dump_msgpack(struct port *base, struct obuf *out)
  	return 1;
  }
  
-static int
-port_tuple_dump_lua(struct port *base, struct lua_State *L)
-{
-	struct port_tuple *port = port_tuple(base);
-	struct port_tuple_entry *pe;
-	int i = 0;
-	for (pe = port->first; pe != NULL; pe = pe->next) {
-		luaT_pushtuple(L, pe->tuple);
-		lua_rawseti(L, -2, ++i);
-	}
-	return port->size;
-}
+extern void
+port_tuple_dump_lua(struct port *base, struct lua_State *L);
  
  void
  port_destroy(struct port *port)
@@ -154,10 +144,10 @@ port_dump_msgpack_16(struct port *port, struct obuf *out)
  	return port->vtab->dump_msgpack_16(port, out);
  }
  
-int
+void
  port_dump_lua(struct port *port, struct lua_State *L)
  {
-	return port->vtab->dump_lua(port, L);
+	port->vtab->dump_lua(port, L);
  }
  
  const char *
diff --git a/src/box/port.h b/src/box/port.h
index 3bd83b092..751e44efe 100644
--- a/src/box/port.h
+++ b/src/box/port.h
@@ -77,11 +77,8 @@ struct port_vtab {
  	 * 1.6 format.
  	 */
  	int (*dump_msgpack_16)(struct port *port, struct obuf *out);
-	/**
-	 * Dump the content of a port to Lua stack.
-	 * On success returns number of entries dumped.
-	 */
-	int (*dump_lua)(struct port *port, struct lua_State *L);
+	/** Dump the content of a port to Lua stack. */
+	void (*dump_lua)(struct port *port, struct lua_State *L);
  	/**
  	 * Dump a port content as a plain text into a buffer,
  	 * allocated inside.
@@ -189,11 +186,8 @@ port_dump_msgpack(struct port *port, struct obuf *out);
  int
  port_dump_msgpack_16(struct port *port, struct obuf *out);
  
-/**
- * Same as port_dump(), but use the legacy Tarantool 1.6
- * format.
- */
-int
+/** Dump port content to Lua stack. */
+void
  port_dump_lua(struct port *port, struct lua_State *L);
  
  /**

  reply	other threads:[~2018-11-22 21:49 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-22 19:10 [tarantool-patches] [PATCH v2 0/7] Remove box.sql.execute imeevma
2018-11-22 19:10 ` [tarantool-patches] [PATCH v2 1/7] box: store sql text and length in sql_request imeevma
2018-11-22 19:10 ` [tarantool-patches] [PATCH v2 2/7] box: add method dump_lua to port imeevma
2018-11-22 21:49   ` Vladislav Shpilevoy [this message]
2018-11-27 19:25     ` [tarantool-patches] " Imeev Mergen
2018-11-22 19:10 ` [tarantool-patches] [PATCH v2 3/7] iproto: remove iproto functions from execute.c imeevma
2018-11-22 19:10 ` [tarantool-patches] [PATCH v2 4/7] iproto: replace obuf by mpstream in execute.c imeevma
2018-11-22 19:11 ` [tarantool-patches] [PATCH v2 5/7] sql: create interface vstream imeevma
2018-11-22 21:49   ` [tarantool-patches] " Vladislav Shpilevoy
2018-11-27 19:25     ` Imeev Mergen
2018-11-22 19:11 ` [tarantool-patches] [PATCH v2 6/7] lua: create vstream implementation for Lua imeevma
2018-11-22 21:49   ` [tarantool-patches] " Vladislav Shpilevoy
2018-11-27 19:25     ` Imeev Mergen
2018-11-22 19:11 ` [tarantool-patches] [PATCH v2 7/7] sql: check new box.sql.execute() imeevma

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=eb9203d5-0ce9-b93c-9d43-f07abf81ea65@tarantool.org \
    --to=v.shpilevoy@tarantool.org \
    --cc=imeevma@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='[tarantool-patches] Re: [PATCH v2 2/7] box: add method dump_lua to port' \
    /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