[PATCH 2/6] box/console: Add explicit output EOS mapping

Konstantin Osipov kostja.osipov at gmail.com
Tue Oct 1 23:10:45 MSK 2019


* Cyrill Gorcunov <gorcunov at gmail.com> [19/09/20 21:36]:
> This will help us to distinguish end of string/stream
> in text protocols (such as remote console connection).
> 
> Note that we start printing ";" terminator for every
> lua output. Actually current yaml output does the
> same but inside console.c module.
> 
> And since lua output is yet a new feature in stabilization
> phase we're safe to make such changes without breaking api.
> 
> We keep the eos values in table because we will need to
> fetch eos from active format in later patches, thus it
> is easier to use dictionary here. Moreover in future
> we might need to extend this eos table for other
> serializers.
> 
> Part-of #3834
> ---
>  src/box/lua/console.lua | 20 +++++++++++++-------
>  1 file changed, 13 insertions(+), 7 deletions(-)
> 
> diff --git a/src/box/lua/console.lua b/src/box/lua/console.lua
> index 22bafab3a..5430e6787 100644
> --- a/src/box/lua/console.lua
> +++ b/src/box/lua/console.lua
> @@ -11,7 +11,6 @@ local urilib = require('uri')
>  local yaml = require('yaml')
>  local net_box = require('net.box')
>  
> -local YAML_TERM = '\n...\n'
>  local PUSH_TAG_HANDLE = '!push!'
>  
>  --
> @@ -20,6 +19,11 @@ local PUSH_TAG_HANDLE = '!push!'
>  local default_output_format = { ["fmt"] = "yaml", ["opts"] = nil }
>  local output_handlers = { }
>  
> +--
> +-- End of streams/strings. They will allow to recognize blocks
> +-- depending on output format.

Please adjust the comment:

This is an end-of-stream marker for text output of Tarantool
server, for different output formats - yaml and Lua.
While for yaml ... is a standard stream end marker, using ';'
for Lua output we're walking on a thin ice - ';' is legal inside
a valid Lua block as well. But since this marker is used when
reading data created by a Tarantool server, we can rely on it not
being present inside of stream, since Tarantool server never
puts it inside of a stream.

> +local output_eos = { ["yaml"] = '\n...\n', ["lua"] = ';' }
> +
>  output_handlers["yaml"] = function(status, opts, ...)
>      local err
>      if status then
> @@ -42,9 +46,11 @@ end
>  
>  output_handlers["lua"] = function(status, opts, ...)
>      --
> -    -- Don't print nil if there is no data
> +    -- If no data present at least EOS should be put,
> +    -- otherwise wire readers won't be able to find
> +    -- where end of string is.

where *the* end of stream is.

>      if not ... then
> -        return ""
> +        return output_eos["lua"]
>      end
>      -- Map internal symbols in case if they are
>      -- not inside tables and serpent won't handle
> @@ -54,7 +60,7 @@ output_handlers["lua"] = function(status, opts, ...)
>      }
>      for k,v in pairs(map_direct_symbols) do
>          if k == ... then
> -            return v
> +            return v .. output_eos["lua"]
>          end
>      end
>      --
> @@ -75,9 +81,9 @@ output_handlers["lua"] = function(status, opts, ...)
>          nocode = true,
>      }
>      if opts == "block" then
> -        return serpent.block(..., serpent_opts)
> +        return serpent.block(..., serpent_opts) .. output_eos["lua"]
>      end
> -    return serpent.line(..., serpent_opts)
> +    return serpent.line(..., serpent_opts) .. output_eos["lua"]
>  end
>  
>  local function output_verify_opts(fmt, opts)
> @@ -309,7 +315,7 @@ local text_connection_mt = {
>          -- @retval     nil Error.
>          --
>          read = function(self)
> -            local ret = self._socket:read(YAML_TERM)
> +            local ret = self._socket:read(output_eos["yaml"])
>              if ret and ret ~= '' then
>                  return ret
>              end

With these small additions, LGTM.


-- 
Konstantin Osipov, Moscow, Russia




More information about the Tarantool-patches mailing list