Tarantool development patches archive
 help / color / mirror / Atom feed
* [tarantool-patches] [PATCH] Set format for spaces with sysview engine
@ 2019-04-15 13:35 Kirill Yukhin
  2019-04-16 15:13 ` [tarantool-patches] " Vladislav Shpilevoy
                   ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-15 13:35 UTC (permalink / raw)
  To: v.shpilevoy; +Cc: tarantool-patches, Kirill Yukhin

The patch sets format for spaces with sysview engine.
This is done due to following reasons:
  1. To allow to create an SQL view, which looks at format of
     space being used.
  2. To unify sysview's engine spaces with SQL views. This
     will allow to use sysview machinery to query SQL views from
     Lua land.

Closes #4111
---
 src/box/index_def.c                         | 20 ++++++
 src/box/index_def.h                         | 11 ++++
 src/box/memtx_space.c                       | 15 ++---
 src/box/sysview.c                           | 25 +++++++-
 src/box/tuple_format.c                      |  5 +-
 test/box/access_sysview.result              | 68 ++++++++++++++++++++-
 test/sql/gh-4111-format-in-sysview.result   | 51 ++++++++++++++++
 test/sql/gh-4111-format-in-sysview.test.lua | 13 ++++
 test/wal_off/alter.result                   |  2 +-
 9 files changed, 195 insertions(+), 15 deletions(-)
 create mode 100644 test/sql/gh-4111-format-in-sysview.result
 create mode 100644 test/sql/gh-4111-format-in-sysview.test.lua

diff --git a/src/box/index_def.c b/src/box/index_def.c
index c743d12..31dac33 100644
--- a/src/box/index_def.c
+++ b/src/box/index_def.c
@@ -33,6 +33,7 @@
 #include "identifier.h"
 #include "tuple_format.h"
 #include "json/json.h"
+#include "fiber.h"
 
 const char *index_type_strs[] = { "HASH", "TREE", "BITSET", "RTREE" };
 
@@ -245,6 +246,25 @@ index_def_cmp(const struct index_def *key1, const struct index_def *key2)
 			    key2->key_def->parts, key2->key_def->part_count);
 }
 
+struct key_def **
+key_def_array(struct rlist *index_defs, int *size)
+{
+	/* Create a format from key and field definitions. */
+	int key_count = 0;
+	struct index_def *index_def;
+	rlist_foreach_entry(index_def, index_defs, link)
+		key_count++;
+	struct key_def **keys = (struct key_def **) region_alloc(&fiber()->gc,
+					     sizeof(*keys) * key_count);
+	if (keys == NULL)
+		return NULL;
+	*size = key_count;
+	key_count = 0;
+	rlist_foreach_entry(index_def, index_defs, link)
+		keys[key_count++] = index_def->key_def;
+	return keys;
+}
+
 bool
 index_def_is_valid(struct index_def *index_def, const char *space_name)
 
diff --git a/src/box/index_def.h b/src/box/index_def.h
index 7717ecd..628342d 100644
--- a/src/box/index_def.h
+++ b/src/box/index_def.h
@@ -336,6 +336,17 @@ index_def_new(uint32_t space_id, uint32_t iid, const char *name,
 	      const struct index_opts *opts,
 	      struct key_def *key_def, struct key_def *pk_def);
 
+/**
+ * Create an array of key_defs from array of index definitions.
+ *
+ * @param index_defs Array pointer.
+ * @param size       Array size.
+ * @retval not NULL  Array of pointers to key_def
+ * @retval NULL      Memory error.
+ */
+struct key_def **
+key_def_array(struct rlist *index_defs, int *size);
+
 /**
  * One key definition is greater than the other if it's id is
  * greater, it's name is greater,  it's index type is greater
diff --git a/src/box/memtx_space.c b/src/box/memtx_space.c
index 7bb46c7..89b04c1 100644
--- a/src/box/memtx_space.c
+++ b/src/box/memtx_space.c
@@ -975,23 +975,16 @@ memtx_space_new(struct memtx_engine *memtx,
 	}
 
 	/* Create a format from key and field definitions. */
+
 	int key_count = 0;
-	struct index_def *index_def;
-	rlist_foreach_entry(index_def, key_list, link)
-		key_count++;
-	struct key_def **keys = region_alloc(&fiber()->gc,
-					     sizeof(*keys) * key_count);
+	struct key_def **keys = key_def_array(key_list, &key_count);
 	if (keys == NULL) {
 		free(memtx_space);
 		return NULL;
 	}
-	key_count = 0;
-	rlist_foreach_entry(index_def, key_list, link)
-		keys[key_count++] = index_def->key_def;
-
 	struct tuple_format *format =
-		tuple_format_new(&memtx_tuple_format_vtab, memtx, keys, key_count,
-				 def->fields, def->field_count,
+		tuple_format_new(&memtx_tuple_format_vtab, memtx, keys,
+				 key_count, def->fields, def->field_count,
 				 def->exact_field_count, def->dict,
 				 def->opts.is_temporary, def->opts.is_ephemeral);
 	if (format == NULL) {
diff --git a/src/box/sysview.c b/src/box/sysview.c
index f9edd2d..768cd02 100644
--- a/src/box/sysview.c
+++ b/src/box/sysview.c
@@ -517,8 +517,31 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def,
 			 "malloc", "struct space");
 		return NULL;
 	}
+	int key_count = 0;
+	/* 
+	 * Despite of the fact that space with sysview engine
+	 * actually doesn't own tuples, setup of format will be
+	 * useful in order to unify it with SQL views and to use
+	 * same machinery to do selects from such views from Lua
+	 * land.
+	 */
+	struct key_def **keys = key_def_array(key_list, &key_count);
+	if (keys == NULL) {
+		free(space);
+		return NULL;
+	}
+	struct tuple_format *format =
+		tuple_format_new(NULL, NULL, keys, key_count, def->fields,
+				 def->field_count, def->exact_field_count,
+				 def->dict, def->opts.is_temporary,
+				 def->opts.is_ephemeral);
+	if (format == NULL) {
+		free(space);
+		return NULL;
+	}
+	tuple_format_ref(format);
 	if (space_create(space, engine, &sysview_space_vtab,
-			 def, key_list, NULL) != 0) {
+			 def, key_list, format) != 0) {
 		free(space);
 		return NULL;
 	}
diff --git a/src/box/tuple_format.c b/src/box/tuple_format.c
index 093046b..804a678 100644
--- a/src/box/tuple_format.c
+++ b/src/box/tuple_format.c
@@ -699,7 +699,10 @@ tuple_format_new(struct tuple_format_vtab *vtab, void *engine,
 		tuple_format_alloc(keys, key_count, space_field_count, dict);
 	if (format == NULL)
 		return NULL;
-	format->vtab = *vtab;
+	if (vtab != NULL)
+		format->vtab = *vtab;
+	else
+		memset(&format->vtab, 0, sizeof(format->vtab));
 	format->engine = engine;
 	format->is_temporary = is_temporary;
 	format->is_ephemeral = is_ephemeral;
diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
index ae04266..6b51566 100644
--- a/test/box/access_sysview.result
+++ b/test/box/access_sysview.result
@@ -635,6 +635,7 @@ seq:drop()
 --
 box.space._vspace.index[1]:alter({parts = { 2, 'string' }})
 ---
+- error: Field 2 has type 'unsigned' in space format, but type 'string' in index definition
 ...
 box.space._vspace.index[1]:select('xxx')
 ---
@@ -642,7 +643,72 @@ box.space._vspace.index[1]:select('xxx')
 ...
 box.space._vspace.index[1]:select(1)
 ---
-- error: 'Supplied key type of part 0 does not match index part type: expected string'
+- - [257, 1, '_vinyl_deferred_delete', 'blackhole', 0, {'group_id': 1}, [{'name': 'space_id',
+        'type': 'unsigned'}, {'name': 'lsn', 'type': 'unsigned'}, {'name': 'tuple',
+        'type': 'array'}]]
+  - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
+        'name': 'value', 'is_nullable': true}]]
+  - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
+        'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
+      {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
+        'name': 'opts', 'type': 'map'}]]
+  - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
+        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
+        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
+  - [281, 1, '_vspace', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
+        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
+        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
+  - [284, 1, '_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'step',
+        'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {'name': 'max', 'type': 'integer'},
+      {'name': 'start', 'type': 'integer'}, {'name': 'cache', 'type': 'integer'},
+      {'name': 'cycle', 'type': 'boolean'}]]
+  - [285, 1, '_sequence_data', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
+      {'name': 'value', 'type': 'integer'}]]
+  - [286, 1, '_vsequence', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'},
+      {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {
+        'name': 'step', 'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {
+        'name': 'max', 'type': 'integer'}, {'name': 'start', 'type': 'integer'}, {
+        'name': 'cache', 'type': 'integer'}, {'name': 'cycle', 'type': 'boolean'}]]
+  - [288, 1, '_index', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
+        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
+  - [289, 1, '_vindex', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
+        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
+  - [296, 1, '_func', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
+        'type': 'unsigned'}]]
+  - [297, 1, '_vfunc', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
+        'type': 'unsigned'}]]
+  - [304, 1, '_user', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
+        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
+  - [305, 1, '_vuser', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
+        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
+        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
+  - [312, 1, '_priv', 'memtx', 0, {}, [{'name': 'grantor', 'type': 'unsigned'}, {
+        'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
+      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
+  - [313, 1, '_vpriv', 'sysview', 0, {}, [{'name': 'grantor', 'type': 'unsigned'},
+      {'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
+      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
+  - [320, 1, '_cluster', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'uuid',
+        'type': 'string'}]]
+  - [328, 1, '_trigger', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'}, {'name': 'space_id',
+        'type': 'unsigned'}, {'name': 'opts', 'type': 'map'}]]
+  - [330, 1, '_truncate', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'count',
+        'type': 'unsigned'}]]
+  - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
+      {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
+  - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'},
+      {'name': 'child_id', 'type': 'unsigned'}, {'name': 'parent_id', 'type': 'unsigned'},
+      {'name': 'is_deferred', 'type': 'boolean'}, {'name': 'match', 'type': 'string'},
+      {'name': 'on_delete', 'type': 'string'}, {'name': 'on_update', 'type': 'string'},
+      {'name': 'child_cols', 'type': 'array'}, {'name': 'parent_cols', 'type': 'array'}]]
 ...
 box.space._vspace.index[1]:alter({parts = { 2, 'unsigned' }})
 ---
diff --git a/test/sql/gh-4111-format-in-sysview.result b/test/sql/gh-4111-format-in-sysview.result
new file mode 100644
index 0000000..1d6c1f0
--- /dev/null
+++ b/test/sql/gh-4111-format-in-sysview.result
@@ -0,0 +1,51 @@
+-- Make sure, that it is possible to create a VIEW which
+-- refers to "_v" space, i.e. to sysview engine.
+-- Boefore gh-4111 was fixed, attempt to create such a view
+-- failed due to lack of format in a space with sysview
+-- engine.
+test_run = require('test_run').new()
+---
+...
+box.space._vspace:format()
+---
+- [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner', 'type': 'unsigned'}, {'name': 'name',
+    'type': 'string'}, {'name': 'engine', 'type': 'string'}, {'name': 'field_count',
+    'type': 'unsigned'}, {'name': 'flags', 'type': 'map'}, {'name': 'format', 'type': 'array'}]
+...
+box.execute([[CREATE VIEW t AS SELECT "name" FROM "_vspace" y]])
+---
+- row_count: 1
+...
+box.execute([[SELECT * from t]])
+---
+- metadata:
+  - name: name
+    type: string
+  rows:
+  - ['_vinyl_deferred_delete']
+  - ['_schema']
+  - ['_collation']
+  - ['_space']
+  - ['_vspace']
+  - ['_sequence']
+  - ['_sequence_data']
+  - ['_vsequence']
+  - ['_index']
+  - ['_vindex']
+  - ['_func']
+  - ['_vfunc']
+  - ['_user']
+  - ['_vuser']
+  - ['_priv']
+  - ['_vpriv']
+  - ['_cluster']
+  - ['_trigger']
+  - ['_truncate']
+  - ['_space_sequence']
+  - ['_fk_constraint']
+  - ['T']
+...
+box.execute([[DROP VIEW t]])
+---
+- row_count: 1
+...
diff --git a/test/sql/gh-4111-format-in-sysview.test.lua b/test/sql/gh-4111-format-in-sysview.test.lua
new file mode 100644
index 0000000..644738b
--- /dev/null
+++ b/test/sql/gh-4111-format-in-sysview.test.lua
@@ -0,0 +1,13 @@
+-- Make sure, that it is possible to create a VIEW which
+-- refers to "_v" space, i.e. to sysview engine.
+-- Boefore gh-4111 was fixed, attempt to create such a view
+-- failed due to lack of format in a space with sysview
+-- engine.
+
+test_run = require('test_run').new()
+
+box.space._vspace:format()
+
+box.execute([[CREATE VIEW t AS SELECT "name" FROM "_vspace" y]])
+box.execute([[SELECT * from t]])
+box.execute([[DROP VIEW t]])
diff --git a/test/wal_off/alter.result b/test/wal_off/alter.result
index becdf13..9257ccf 100644
--- a/test/wal_off/alter.result
+++ b/test/wal_off/alter.result
@@ -28,7 +28,7 @@ end;
 ...
 #spaces;
 ---
-- 65511
+- 65488
 ...
 -- cleanup
 for k, v in pairs(spaces) do
-- 
2.20.1

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-15 13:35 [tarantool-patches] [PATCH] Set format for spaces with sysview engine Kirill Yukhin
@ 2019-04-16 15:13 ` Vladislav Shpilevoy
  2019-04-17  8:13   ` Kirill Yukhin
  2019-04-17 13:38 ` Konstantin Osipov
  2019-04-19 11:38 ` Kirill Yukhin
  2 siblings, 1 reply; 20+ messages in thread
From: Vladislav Shpilevoy @ 2019-04-16 15:13 UTC (permalink / raw)
  To: Kirill Yukhin; +Cc: tarantool-patches

Hi! Thanks for the patch! See 17 comments below.

1. Please, prepend a subsystem name to the commit title.
Here I would use 'sysview' (by analogue with 'memtx', 'vinyl').
Do not forget to omit capital letter in 'Set' when the prefix
is added.

On 15/04/2019 16:35, Kirill Yukhin wrote:
> The patch sets format for spaces with sysview engine.
> This is done due to following reasons:
>   1. To allow to create an SQL view, which looks at format of
>      space being used.

2. But it does exactly this even before your patch. Elaborate
please, that before your patch not all spaces had formats - the
ones of sysview engine. This is because sysview was invented as
a filter-engine for normal engines and nothing more. Therefore it
hasn't its own tuples and didn't need a format.

But SQL may want to work with sysview spaces, and it expects that
every space has struct tuple_format, no exceptions. So as not to
patch SQL with shit like

    if engine == sysview then do not use tuple_format

we've decided to create bogus formats even for sysview spaces.

>   2. To unify sysview's engine spaces with SQL views. This
>      will allow to use sysview machinery to query SQL views from
>      Lua land.

3. This will *completely replace* SQL views. The latter will become
just another interface to sysview.

> 
> Closes #4111
> ---

4. Please, specify branch and issue links here.

>  src/box/index_def.c                         | 20 ++++++
>  src/box/index_def.h                         | 11 ++++
>  src/box/memtx_space.c                       | 15 ++---
>  src/box/sysview.c                           | 25 +++++++-
>  src/box/tuple_format.c                      |  5 +-
>  test/box/access_sysview.result              | 68 ++++++++++++++++++++-
>  test/sql/gh-4111-format-in-sysview.result   | 51 ++++++++++++++++
>  test/sql/gh-4111-format-in-sysview.test.lua | 13 ++++
>  test/wal_off/alter.result                   |  2 +-
>  9 files changed, 195 insertions(+), 15 deletions(-)
>  create mode 100644 test/sql/gh-4111-format-in-sysview.result
>  create mode 100644 test/sql/gh-4111-format-in-sysview.test.lua
> 
> diff --git a/src/box/index_def.c b/src/box/index_def.c
> index c743d12..31dac33 100644
> --- a/src/box/index_def.c
> +++ b/src/box/index_def.c
> @@ -245,6 +246,25 @@ index_def_cmp(const struct index_def *key1, const struct index_def *key2)
>  			    key2->key_def->parts, key2->key_def->part_count);
>  }
>  
> +struct key_def **
> +key_def_array(struct rlist *index_defs, int *size)
> +{
> +	/* Create a format from key and field definitions. */

5. You do not create a format here. Just a key_def array.
The comment can be dropped.

> +	int key_count = 0;
> +	struct index_def *index_def;
> +	rlist_foreach_entry(index_def, index_defs, link)
> +		key_count++;
> +	struct key_def **keys = (struct key_def **) region_alloc(&fiber()->gc,
> +					     sizeof(*keys) * key_count);

6. Please, align the code according to the code style. We violate
the alignment only in rare cases when indentation is huge (usually it
is about internal still raw SQLite functions).

> +	if (keys == NULL)
> +		return NULL;

7. Please, set diag. Region_alloc does not set it itself.

> +	*size = key_count;
> +	key_count = 0;
> +	rlist_foreach_entry(index_def, index_defs, link)
> +		keys[key_count++] = index_def->key_def;
> +	return keys;
> +}
> +
>  bool
>  index_def_is_valid(struct index_def *index_def, const char *space_name)
>  
> diff --git a/src/box/index_def.h b/src/box/index_def.h
> index 7717ecd..628342d 100644
> --- a/src/box/index_def.h
> +++ b/src/box/index_def.h
> @@ -336,6 +336,17 @@ index_def_new(uint32_t space_id, uint32_t iid, const char *name,
>  	      const struct index_opts *opts,
>  	      struct key_def *key_def, struct key_def *pk_def);
>  
> +/**
> + * Create an array of key_defs from array of index definitions.

8. Please, add a comment that the array is created on region.

9. It is not an array of index definitions. It is a list. The
same below about @param index_defs.

> + *
> + * @param index_defs Array pointer.
> + * @param size       Array size.

10. Please, do not write comments just for the sake of them.
Here 'size' is an [out] variable. From your comment it looks
like it is a ready-at-hand size of index_defs list.

A comment could be like:

    @param[out] size A location to store size of the result
           key_defs array.

> + * @retval not NULL  Array of pointers to key_def
> + * @retval NULL      Memory error.
> + */
> +struct key_def **
> +key_def_array(struct rlist *index_defs, int *size);
> +
>  /**
>   * One key definition is greater than the other if it's id is
>   * greater, it's name is greater,  it's index type is greater
> diff --git a/src/box/memtx_space.c b/src/box/memtx_space.c
> index 7bb46c7..89b04c1 100644
> --- a/src/box/memtx_space.c
> +++ b/src/box/memtx_space.c
> @@ -975,23 +975,16 @@ memtx_space_new(struct memtx_engine *memtx,
>  	}
>  
>  	/* Create a format from key and field definitions. */
> +

11. Stray empty line.

>  	struct tuple_format *format =
> -		tuple_format_new(&memtx_tuple_format_vtab, memtx, keys, key_count,
> -				 def->fields, def->field_count,
> +		tuple_format_new(&memtx_tuple_format_vtab, memtx, keys,
> +				 key_count, def->fields, def->field_count,

12. This diff changes nothing, even names are the same. Please, drop.

>  				 def->exact_field_count, def->dict,
>  				 def->opts.is_temporary, def->opts.is_ephemeral);
>  	if (format == NULL) {
> diff --git a/src/box/sysview.c b/src/box/sysview.c
> index f9edd2d..768cd02 100644
> --- a/src/box/sysview.c
> +++ b/src/box/sysview.c
> @@ -517,8 +517,31 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def,
>  			 "malloc", "struct space");
>  		return NULL;
>  	}
> +	int key_count = 0;
> +	/* 
> +	 * Despite of the fact that space with sysview engine

13. In English 'despite' is never followed by 'of'. You either write
'despite', or 'in spite of', no exceptions.

> +	 * actually doesn't own tuples, setup of format will be
> +	 * useful in order to unify it with SQL views and to use
> +	 * same machinery to do selects from such views from Lua
> +	 * land.
> +	 */
> +	struct key_def **keys = key_def_array(key_list, &key_count);
> +	if (keys == NULL) {
> +		free(space);
> +		return NULL;
> +	}
> +	struct tuple_format *format =
> +		tuple_format_new(NULL, NULL, keys, key_count, def->fields,
> +				 def->field_count, def->exact_field_count,
> +				 def->dict, def->opts.is_temporary,
> +				 def->opts.is_ephemeral);
> +	if (format == NULL) {
> +		free(space);
> +		return NULL;
> +	}
> +	tuple_format_ref(format);
>  	if (space_create(space, engine, &sysview_space_vtab,
> -			 def, key_list, NULL) != 0) {
> +			 def, key_list, format) != 0) {
>  		free(space);
>  		return NULL;
>  	}
> diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
> index ae04266..6b51566 100644
> --- a/test/box/access_sysview.result
> +++ b/test/box/access_sysview.result
> @@ -642,7 +643,72 @@ box.space._vspace.index[1]:select('xxx')
>  ...
>  box.space._vspace.index[1]:select(1)
>  ---
> -- error: 'Supplied key type of part 0 does not match index part type: expected string'
> +- - [257, 1, '_vinyl_deferred_delete', 'blackhole', 0, {'group_id': 1}, [{'name': 'space_id',
> +        'type': 'unsigned'}, {'name': 'lsn', 'type': 'unsigned'}, {'name': 'tuple',
> +        'type': 'array'}]]
> +  - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
> +        'name': 'value', 'is_nullable': true}]]
> +  - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
> +        'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
> +      {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
> +        'name': 'opts', 'type': 'map'}]]
> +  - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
> +        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
> +        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
> +  - [281, 1, '_vspace', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
> +        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
> +        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
> +  - [284, 1, '_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'step',
> +        'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {'name': 'max', 'type': 'integer'},
> +      {'name': 'start', 'type': 'integer'}, {'name': 'cache', 'type': 'integer'},
> +      {'name': 'cycle', 'type': 'boolean'}]]
> +  - [285, 1, '_sequence_data', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> +      {'name': 'value', 'type': 'integer'}]]
> +  - [286, 1, '_vsequence', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> +      {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {
> +        'name': 'step', 'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {
> +        'name': 'max', 'type': 'integer'}, {'name': 'start', 'type': 'integer'}, {
> +        'name': 'cache', 'type': 'integer'}, {'name': 'cycle', 'type': 'boolean'}]]
> +  - [288, 1, '_index', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> +        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
> +  - [289, 1, '_vindex', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> +        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
> +  - [296, 1, '_func', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
> +        'type': 'unsigned'}]]
> +  - [297, 1, '_vfunc', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
> +        'type': 'unsigned'}]]
> +  - [304, 1, '_user', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> +        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
> +  - [305, 1, '_vuser', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> +        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
> +  - [312, 1, '_priv', 'memtx', 0, {}, [{'name': 'grantor', 'type': 'unsigned'}, {
> +        'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
> +      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
> +  - [313, 1, '_vpriv', 'sysview', 0, {}, [{'name': 'grantor', 'type': 'unsigned'},
> +      {'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
> +      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
> +  - [320, 1, '_cluster', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'uuid',
> +        'type': 'string'}]]
> +  - [328, 1, '_trigger', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'}, {'name': 'space_id',
> +        'type': 'unsigned'}, {'name': 'opts', 'type': 'map'}]]
> +  - [330, 1, '_truncate', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'count',
> +        'type': 'unsigned'}]]
> +  - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> +      {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
> +  - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'},
> +      {'name': 'child_id', 'type': 'unsigned'}, {'name': 'parent_id', 'type': 'unsigned'},
> +      {'name': 'is_deferred', 'type': 'boolean'}, {'name': 'match', 'type': 'string'},
> +      {'name': 'on_delete', 'type': 'string'}, {'name': 'on_update', 'type': 'string'},
> +      {'name': 'child_cols', 'type': 'array'}, {'name': 'parent_cols', 'type': 'array'}]]

14. Too huge output, which will change on each update in system
spaces set and format. We already have similar tests printing
everything out, and usually it is not a pleasant business to fix
them after each touch of upgrade.lua. I would rather replaced it
like this:

    box.space._vspace.index[1]:count(1) > 0

>  ...
>  box.space._vspace.index[1]:alter({parts = { 2, 'unsigned' }})
>  ---
> diff --git a/test/sql/gh-4111-format-in-sysview.result b/test/sql/gh-4111-format-in-sysview.result
> new file mode 100644
> index 0000000..1d6c1f0
> --- /dev/null
> +++ b/test/sql/gh-4111-format-in-sysview.result

15. Please, move it to 'access_sysview' test. Because
basically it is exactly about this: accessing a sysview
from SQL.

> @@ -0,0 +1,51 @@
> +-- Make sure, that it is possible to create a VIEW which
> +-- refers to "_v" space, i.e. to sysview engine.
> +-- Boefore gh-4111 was fixed, attempt to create such a view

16. Boefore -> before.

> +-- failed due to lack of format in a space with sysview
> +-- engine.
> +test_run = require('test_run').new()
> +---
> +...
> +box.space._vspace:format()
> +---
> +- [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner', 'type': 'unsigned'}, {'name': 'name',
> +    'type': 'string'}, {'name': 'engine', 'type': 'string'}, {'name': 'field_count',
> +    'type': 'unsigned'}, {'name': 'flags', 'type': 'map'}, {'name': 'format', 'type': 'array'}]
> +...
> +box.execute([[CREATE VIEW t AS SELECT "name" FROM "_vspace" y]])
> +---
> +- row_count: 1
> +...
> +box.execute([[SELECT * from t]])
> +---
> +- metadata:
> +  - name: name
> +    type: string
> +  rows:
> +  - ['_vinyl_deferred_delete']
> +  - ['_schema']
> +  - ['_collation']
> +  - ['_space']
> +  - ['_vspace']
> +  - ['_sequence']
> +  - ['_sequence_data']
> +  - ['_vsequence']
> +  - ['_index']
> +  - ['_vindex']
> +  - ['_func']
> +  - ['_vfunc']
> +  - ['_user']
> +  - ['_vuser']
> +  - ['_priv']
> +  - ['_vpriv']
> +  - ['_cluster']
> +  - ['_trigger']
> +  - ['_truncate']
> +  - ['_space_sequence']
> +  - ['_fk_constraint']
> +  - ['T']

17. The same objection as 14. Probably it would be less
flaky to call

    box.execute([[SELECT * from t WHERE "name" = "T"]])

Then it will print one line only and still test the issue
good.

> +...
> +box.execute([[DROP VIEW t]])
> +---
> +- row_count: 1
> +...

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-16 15:13 ` [tarantool-patches] " Vladislav Shpilevoy
@ 2019-04-17  8:13   ` Kirill Yukhin
  2019-04-17 10:11     ` Vladislav Shpilevoy
  0 siblings, 1 reply; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-17  8:13 UTC (permalink / raw)
  To: Vladislav Shpilevoy; +Cc: tarantool-patches

Hello,

Thanks for review! I'll send updated patch as v2.
My answers are inlined.

On 16 апр 18:13, Vladislav Shpilevoy wrote:
> Hi! Thanks for the patch! See 17 comments below.
> 
> 1. Please, prepend a subsystem name to the commit title.
> Here I would use 'sysview' (by analogue with 'memtx', 'vinyl').
> Do not forget to omit capital letter in 'Set' when the prefix
> is added.

Didn't know we have spacial prefix for sysview. Done.

> On 15/04/2019 16:35, Kirill Yukhin wrote:
> > The patch sets format for spaces with sysview engine.
> > This is done due to following reasons:
> >   1. To allow to create an SQL view, which looks at format of
> >      space being used.
> 
> 2. But it does exactly this even before your patch. Elaborate
> please, that before your patch not all spaces had formats - the
> ones of sysview engine. This is because sysview was invented as
> a filter-engine for normal engines and nothing more. Therefore it
> hasn't its own tuples and didn't need a format.
> 
> But SQL may want to work with sysview spaces, and it expects that
> every space has struct tuple_format, no exceptions. So as not to
> patch SQL with shit like
> 
>     if engine == sysview then do not use tuple_format
> 
> we've decided to create bogus formats even for sysview spaces.

I've updated commment.

> >   2. To unify sysview's engine spaces with SQL views. This
> >      will allow to use sysview machinery to query SQL views from
> >      Lua land.
> 
> 3. This will *completely replace* SQL views. The latter will become
> just another interface to sysview.

Updated comment.

> > 
> > Closes #4111
> > ---
> 
> 4. Please, specify branch and issue links here.

Done.

> > diff --git a/src/box/index_def.c b/src/box/index_def.c
> > index c743d12..31dac33 100644
> > --- a/src/box/index_def.c
> > +++ b/src/box/index_def.c
> > @@ -245,6 +246,25 @@ index_def_cmp(const struct index_def *key1, const struct index_def *key2)
> >  			    key2->key_def->parts, key2->key_def->part_count);
> >  }
> >  
> > +struct key_def **
> > +key_def_array(struct rlist *index_defs, int *size)
> > +{
> > +	/* Create a format from key and field definitions. */
> 
> 5. You do not create a format here. Just a key_def array.
> The comment can be dropped.

Done.

> > +	int key_count = 0;
> > +	struct index_def *index_def;
> > +	rlist_foreach_entry(index_def, index_defs, link)
> > +		key_count++;
> > +	struct key_def **keys = (struct key_def **) region_alloc(&fiber()->gc,
> > +					     sizeof(*keys) * key_count);
> 
> 6. Please, align the code according to the code style. We violate
> the alignment only in rare cases when indentation is huge (usually it
> is about internal still raw SQLite functions).

Done.

> > +	if (keys == NULL)
> > +		return NULL;
> 
> 7. Please, set diag. Region_alloc does not set it itself.

Done.
 
> > diff --git a/src/box/index_def.h b/src/box/index_def.h
> > index 7717ecd..628342d 100644
> > --- a/src/box/index_def.h
> > +++ b/src/box/index_def.h
> > @@ -336,6 +336,17 @@ index_def_new(uint32_t space_id, uint32_t iid, const char *name,
> >  	      const struct index_opts *opts,
> >  	      struct key_def *key_def, struct key_def *pk_def);
> >  
> > +/**
> > + * Create an array of key_defs from array of index definitions.
> 
> 8. Please, add a comment that the array is created on region.

Done.
 
> 9. It is not an array of index definitions. It is a list. The
> same below about @param index_defs.

Done.

> 10. Please, do not write comments just for the sake of them.
> Here 'size' is an [out] variable. From your comment it looks
> like it is a ready-at-hand size of index_defs list.

Fixed.

> > diff --git a/src/box/memtx_space.c b/src/box/memtx_space.c
> > index 7bb46c7..89b04c1 100644
> > --- a/src/box/memtx_space.c
> > +++ b/src/box/memtx_space.c
> > @@ -975,23 +975,16 @@ memtx_space_new(struct memtx_engine *memtx,
> >  	}
> >  
> >  	/* Create a format from key and field definitions. */
> > +
> 
> 11. Stray empty line.

Removed.

> >  	struct tuple_format *format =
> > -		tuple_format_new(&memtx_tuple_format_vtab, memtx, keys, key_count,
> > -				 def->fields, def->field_count,
> > +		tuple_format_new(&memtx_tuple_format_vtab, memtx, keys,
> > +				 key_count, def->fields, def->field_count,
> 
> 12. This diff changes nothing, even names are the same. Please, drop.

Reverted.

> > diff --git a/src/box/sysview.c b/src/box/sysview.c
> > index f9edd2d..768cd02 100644
> > --- a/src/box/sysview.c
> > +++ b/src/box/sysview.c
> > @@ -517,8 +517,31 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def,
> >  			 "malloc", "struct space");
> >  		return NULL;
> >  	}
> > +	int key_count = 0;
> > +	/* 
> > +	 * Despite of the fact that space with sysview engine
> 
> 13. In English 'despite' is never followed by 'of'. You either write
> 'despite', or 'in spite of', no exceptions.

Fixed.

> > diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
> > index ae04266..6b51566 100644
> > --- a/test/box/access_sysview.result
> > +++ b/test/box/access_sysview.result
> > @@ -642,7 +643,72 @@ box.space._vspace.index[1]:select('xxx')
> >  ...
> >  box.space._vspace.index[1]:select(1)
> >  ---
> > -- error: 'Supplied key type of part 0 does not match index part type: expected string'
> > +- - [257, 1, '_vinyl_deferred_delete', 'blackhole', 0, {'group_id': 1}, [{'name': 'space_id',
> > +        'type': 'unsigned'}, {'name': 'lsn', 'type': 'unsigned'}, {'name': 'tuple',
> > +        'type': 'array'}]]
> > +  - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
> > +        'name': 'value', 'is_nullable': true}]]
> > +  - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
> > +        'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
> > +      {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
> > +        'name': 'opts', 'type': 'map'}]]
> > +  - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
> > +        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
> > +        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
> > +  - [281, 1, '_vspace', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
> > +        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
> > +        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
> > +  - [284, 1, '_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'step',
> > +        'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {'name': 'max', 'type': 'integer'},
> > +      {'name': 'start', 'type': 'integer'}, {'name': 'cache', 'type': 'integer'},
> > +      {'name': 'cycle', 'type': 'boolean'}]]
> > +  - [285, 1, '_sequence_data', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> > +      {'name': 'value', 'type': 'integer'}]]
> > +  - [286, 1, '_vsequence', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> > +      {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {
> > +        'name': 'step', 'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {
> > +        'name': 'max', 'type': 'integer'}, {'name': 'start', 'type': 'integer'}, {
> > +        'name': 'cache', 'type': 'integer'}, {'name': 'cycle', 'type': 'boolean'}]]
> > +  - [288, 1, '_index', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> > +        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
> > +  - [289, 1, '_vindex', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> > +        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
> > +  - [296, 1, '_func', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
> > +        'type': 'unsigned'}]]
> > +  - [297, 1, '_vfunc', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
> > +        'type': 'unsigned'}]]
> > +  - [304, 1, '_user', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> > +        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
> > +  - [305, 1, '_vuser', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> > +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> > +        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
> > +  - [312, 1, '_priv', 'memtx', 0, {}, [{'name': 'grantor', 'type': 'unsigned'}, {
> > +        'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
> > +      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
> > +  - [313, 1, '_vpriv', 'sysview', 0, {}, [{'name': 'grantor', 'type': 'unsigned'},
> > +      {'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
> > +      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
> > +  - [320, 1, '_cluster', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'uuid',
> > +        'type': 'string'}]]
> > +  - [328, 1, '_trigger', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'}, {'name': 'space_id',
> > +        'type': 'unsigned'}, {'name': 'opts', 'type': 'map'}]]
> > +  - [330, 1, '_truncate', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'count',
> > +        'type': 'unsigned'}]]
> > +  - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> > +      {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
> > +  - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'},
> > +      {'name': 'child_id', 'type': 'unsigned'}, {'name': 'parent_id', 'type': 'unsigned'},
> > +      {'name': 'is_deferred', 'type': 'boolean'}, {'name': 'match', 'type': 'string'},
> > +      {'name': 'on_delete', 'type': 'string'}, {'name': 'on_update', 'type': 'string'},
> > +      {'name': 'child_cols', 'type': 'array'}, {'name': 'parent_cols', 'type': 'array'}]]
> 
> 14. Too huge output, which will change on each update in system
> spaces set and format. We already have similar tests printing
> everything out, and usually it is not a pleasant business to fix
> them after each touch of upgrade.lua. I would rather replaced it
> like this:
> 
>     box.space._vspace.index[1]:count(1) > 0

Done.

> > diff --git a/test/sql/gh-4111-format-in-sysview.result b/test/sql/gh-4111-format-in-sysview.result
> > new file mode 100644
> > index 0000000..1d6c1f0
> > --- /dev/null
> > +++ b/test/sql/gh-4111-format-in-sysview.result
> 
> 15. Please, move it to 'access_sysview' test. Because
> basically it is exactly about this: accessing a sysview
> from SQL.

No, this is a regression test for the bug #4111. I can move it to another suite if you like.

> > @@ -0,0 +1,51 @@
> > +-- Make sure, that it is possible to create a VIEW which
> > +-- refers to "_v" space, i.e. to sysview engine.
> > +-- Boefore gh-4111 was fixed, attempt to create such a view
> 
> 16. Boefore -> before.

Fixed.
 
> > +-- failed due to lack of format in a space with sysview
> > +-- engine.
> > +test_run = require('test_run').new()
> > +---
> > +...
> > +box.space._vspace:format()
> > +---
> > +- [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner', 'type': 'unsigned'}, {'name': 'name',
> > +    'type': 'string'}, {'name': 'engine', 'type': 'string'}, {'name': 'field_count',
> > +    'type': 'unsigned'}, {'name': 'flags', 'type': 'map'}, {'name': 'format', 'type': 'array'}]
> > +...
> > +box.execute([[CREATE VIEW t AS SELECT "name" FROM "_vspace" y]])
> > +---
> > +- row_count: 1
> > +...
> > +box.execute([[SELECT * from t]])
> > +---
> > +- metadata:
> > +  - name: name
> > +    type: string
> > +  rows:
> > +  - ['_vinyl_deferred_delete']
> > +  - ['_schema']
> > +  - ['_collation']
> > +  - ['_space']
> > +  - ['_vspace']
> > +  - ['_sequence']
> > +  - ['_sequence_data']
> > +  - ['_vsequence']
> > +  - ['_index']
> > +  - ['_vindex']
> > +  - ['_func']
> > +  - ['_vfunc']
> > +  - ['_user']
> > +  - ['_vuser']
> > +  - ['_priv']
> > +  - ['_vpriv']
> > +  - ['_cluster']
> > +  - ['_trigger']
> > +  - ['_truncate']
> > +  - ['_space_sequence']
> > +  - ['_fk_constraint']
> > +  - ['T']
> 
> 17. The same objection as 14. Probably it would be less
> flaky to call
> 
>     box.execute([[SELECT * from t WHERE "name" = "T"]])
> 
> Then it will print one line only and still test the issue
> good.

Done.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-17  8:13   ` Kirill Yukhin
@ 2019-04-17 10:11     ` Vladislav Shpilevoy
  2019-04-18  8:16       ` Kirill Yukhin
  0 siblings, 1 reply; 20+ messages in thread
From: Vladislav Shpilevoy @ 2019-04-17 10:11 UTC (permalink / raw)
  To: Kirill Yukhin; +Cc: tarantool-patches

Hi! Thanks for the fixes!

>> 1. Please, prepend a subsystem name to the commit title.
>> Here I would use 'sysview' (by analogue with 'memtx', 'vinyl').
>> Do not forget to omit capital letter in 'Set' when the prefix
>> is added.
> 
> Didn't know we have spacial prefix for sysview. Done.

As I know, we do not have a strict list of subsystems at all.
Or it is hidden somewhere in SOP, which would not make any sense,
because new ones appear too often.

See 3 comments below.

>>> diff --git a/src/box/index_def.h b/src/box/index_def.h
>>> index 7717ecd..628342d 100644
>>> --- a/src/box/index_def.h
>>> +++ b/src/box/index_def.h
>>> @@ -336,6 +336,17 @@ index_def_new(uint32_t space_id, uint32_t iid, const char *name,
>>>  	      const struct index_opts *opts,
>>>  	      struct key_def *key_def, struct key_def *pk_def);
>>>  
>>> +/**
>>> + * Create an array of key_defs from array of index definitions.
>> 9. It is not an array of index definitions. It is a list. The
>> same below about @param index_defs.
> 
> Done.

1. No, it isn't. You still say "from array of index definitions",
but it is not array. Please, fix.

> 
>> 10. Please, do not write comments just for the sake of them.
>> Here 'size' is an [out] variable. From your comment it looks
>> like it is a ready-at-hand size of index_defs list.
> 
> Fixed.

2. [out] should be specified after @param, not after parameter
name (your current version is @param size[out]). Source:
http://www.doxygen.nl/manual/commands.html#cmdparam

>>> diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
>>> index ae04266..6b51566 100644
>>> --- a/test/box/access_sysview.result
>>> +++ b/test/box/access_sysview.result
>>> @@ -642,7 +643,72 @@ box.space._vspace.index[1]:select('xxx')
>>>  ...
>>>  box.space._vspace.index[1]:select(1)
>>>  ---
>>> -- error: 'Supplied key type of part 0 does not match index part type: expected string'
>>> +- - [257, 1, '_vinyl_deferred_delete', 'blackhole', 0, {'group_id': 1}, [{'name': 'space_id',
>>> +        'type': 'unsigned'}, {'name': 'lsn', 'type': 'unsigned'}, {'name': 'tuple',
>>> +        'type': 'array'}]]
>>> +  - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
>>> +        'name': 'value', 'is_nullable': true}]]
>>> +  - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
>>> +        'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
>>> +      {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
>>> +        'name': 'opts', 'type': 'map'}]]
>>> +  - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
>>> +        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
>>> +        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
>>> +  - [281, 1, '_vspace', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
>>> +        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
>>> +        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
>>> +  - [284, 1, '_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'step',
>>> +        'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {'name': 'max', 'type': 'integer'},
>>> +      {'name': 'start', 'type': 'integer'}, {'name': 'cache', 'type': 'integer'},
>>> +      {'name': 'cycle', 'type': 'boolean'}]]
>>> +  - [285, 1, '_sequence_data', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
>>> +      {'name': 'value', 'type': 'integer'}]]
>>> +  - [286, 1, '_vsequence', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'},
>>> +      {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {
>>> +        'name': 'step', 'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {
>>> +        'name': 'max', 'type': 'integer'}, {'name': 'start', 'type': 'integer'}, {
>>> +        'name': 'cache', 'type': 'integer'}, {'name': 'cycle', 'type': 'boolean'}]]
>>> +  - [288, 1, '_index', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
>>> +        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
>>> +  - [289, 1, '_vindex', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
>>> +        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
>>> +  - [296, 1, '_func', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
>>> +        'type': 'unsigned'}]]
>>> +  - [297, 1, '_vfunc', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
>>> +        'type': 'unsigned'}]]
>>> +  - [304, 1, '_user', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
>>> +        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
>>> +  - [305, 1, '_vuser', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
>>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
>>> +        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
>>> +  - [312, 1, '_priv', 'memtx', 0, {}, [{'name': 'grantor', 'type': 'unsigned'}, {
>>> +        'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
>>> +      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
>>> +  - [313, 1, '_vpriv', 'sysview', 0, {}, [{'name': 'grantor', 'type': 'unsigned'},
>>> +      {'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
>>> +      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
>>> +  - [320, 1, '_cluster', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'uuid',
>>> +        'type': 'string'}]]
>>> +  - [328, 1, '_trigger', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'}, {'name': 'space_id',
>>> +        'type': 'unsigned'}, {'name': 'opts', 'type': 'map'}]]
>>> +  - [330, 1, '_truncate', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'count',
>>> +        'type': 'unsigned'}]]
>>> +  - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
>>> +      {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
>>> +  - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'},
>>> +      {'name': 'child_id', 'type': 'unsigned'}, {'name': 'parent_id', 'type': 'unsigned'},
>>> +      {'name': 'is_deferred', 'type': 'boolean'}, {'name': 'match', 'type': 'string'},
>>> +      {'name': 'on_delete', 'type': 'string'}, {'name': 'on_update', 'type': 'string'},
>>> +      {'name': 'child_cols', 'type': 'array'}, {'name': 'parent_cols', 'type': 'array'}]]
>>
>> 14. Too huge output, which will change on each update in system
>> spaces set and format. We already have similar tests printing
>> everything out, and usually it is not a pleasant business to fix
>> them after each touch of upgrade.lua. I would rather replaced it
>> like this:
>>
>>     box.space._vspace.index[1]:count(1) > 0
> 
> Done.

3. No, it is not. This hunk is still literally absolutely the same.
Please, do it.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-15 13:35 [tarantool-patches] [PATCH] Set format for spaces with sysview engine Kirill Yukhin
  2019-04-16 15:13 ` [tarantool-patches] " Vladislav Shpilevoy
@ 2019-04-17 13:38 ` Konstantin Osipov
  2019-04-18  8:23   ` Kirill Yukhin
  2019-04-19 11:38 ` Kirill Yukhin
  2 siblings, 1 reply; 20+ messages in thread
From: Konstantin Osipov @ 2019-04-17 13:38 UTC (permalink / raw)
  To: tarantool-patches; +Cc: v.shpilevoy, Kirill Yukhin

* Kirill Yukhin <kyukhin@tarantool.org> [19/04/15 17:06]:
> +/**
> + * Create an array of key_defs from array of index definitions.

Why allocate on region? We usually allocate key_defs with
malloc().

The function should be called index_def_to_key_def() or similar.


-- 
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-17 10:11     ` Vladislav Shpilevoy
@ 2019-04-18  8:16       ` Kirill Yukhin
  2019-04-18 10:43         ` Vladislav Shpilevoy
  0 siblings, 1 reply; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-18  8:16 UTC (permalink / raw)
  To: tarantool-patches

Hello,

Thanks for review. My answers are inlinded. Iterative patch in the bottom.
Branch force pushed and rebased on recent master. I've also renamed function
as per kostja's request in neighbour mail.

On 17 апр 13:11, Vladislav Shpilevoy wrote:
> Hi! Thanks for the fixes!
> 
> >> 1. Please, prepend a subsystem name to the commit title.
> >> Here I would use 'sysview' (by analogue with 'memtx', 'vinyl').
> >> Do not forget to omit capital letter in 'Set' when the prefix
> >> is added.
> > 
> > Didn't know we have spacial prefix for sysview. Done.
> 
> As I know, we do not have a strict list of subsystems at all.
> Or it is hidden somewhere in SOP, which would not make any sense,
> because new ones appear too often.

I think I saw such a list in web docs...

> See 3 comments below.
> 
> >>> diff --git a/src/box/index_def.h b/src/box/index_def.h
> >>> index 7717ecd..628342d 100644
> >>> --- a/src/box/index_def.h
> >>> +++ b/src/box/index_def.h
> >>> @@ -336,6 +336,17 @@ index_def_new(uint32_t space_id, uint32_t iid, const char *name,
> >>>  	      const struct index_opts *opts,
> >>>  	      struct key_def *key_def, struct key_def *pk_def);
> >>>  
> >>> +/**
> >>> + * Create an array of key_defs from array of index definitions.
> >> 9. It is not an array of index definitions. It is a list. The
> >> same below about @param index_defs.
> > 
> > Done.
> 
> 1. No, it isn't. You still say "from array of index definitions",
> but it is not array. Please, fix.

Done.

> >> 10. Please, do not write comments just for the sake of them.
> >> Here 'size' is an [out] variable. From your comment it looks
> >> like it is a ready-at-hand size of index_defs list.
> > 
> > Fixed.
> 
> 2. [out] should be specified after @param, not after parameter
> name (your current version is @param size[out]). Source:
> http://www.doxygen.nl/manual/commands.html#cmdparam

Moved.

> >>> diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
> >>> index ae04266..6b51566 100644
> >>> --- a/test/box/access_sysview.result
> >>> +++ b/test/box/access_sysview.result
> >>> @@ -642,7 +643,72 @@ box.space._vspace.index[1]:select('xxx')
> >>>  ...
> >>>  box.space._vspace.index[1]:select(1)
> >>>  ---
> >>> -- error: 'Supplied key type of part 0 does not match index part type: expected string'
> >>> +- - [257, 1, '_vinyl_deferred_delete', 'blackhole', 0, {'group_id': 1}, [{'name': 'space_id',
> >>> +        'type': 'unsigned'}, {'name': 'lsn', 'type': 'unsigned'}, {'name': 'tuple',
> >>> +        'type': 'array'}]]
> >>> +  - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
> >>> +        'name': 'value', 'is_nullable': true}]]
> >>> +  - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
> >>> +        'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
> >>> +      {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
> >>> +        'name': 'opts', 'type': 'map'}]]
> >>> +  - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
> >>> +        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
> >>> +        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
> >>> +  - [281, 1, '_vspace', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
> >>> +        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
> >>> +        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
> >>> +  - [284, 1, '_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'step',
> >>> +        'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {'name': 'max', 'type': 'integer'},
> >>> +      {'name': 'start', 'type': 'integer'}, {'name': 'cache', 'type': 'integer'},
> >>> +      {'name': 'cycle', 'type': 'boolean'}]]
> >>> +  - [285, 1, '_sequence_data', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> >>> +      {'name': 'value', 'type': 'integer'}]]
> >>> +  - [286, 1, '_vsequence', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> >>> +      {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {
> >>> +        'name': 'step', 'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {
> >>> +        'name': 'max', 'type': 'integer'}, {'name': 'start', 'type': 'integer'}, {
> >>> +        'name': 'cache', 'type': 'integer'}, {'name': 'cycle', 'type': 'boolean'}]]
> >>> +  - [288, 1, '_index', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> >>> +        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
> >>> +  - [289, 1, '_vindex', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> >>> +        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
> >>> +  - [296, 1, '_func', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
> >>> +        'type': 'unsigned'}]]
> >>> +  - [297, 1, '_vfunc', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
> >>> +        'type': 'unsigned'}]]
> >>> +  - [304, 1, '_user', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> >>> +        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
> >>> +  - [305, 1, '_vuser', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
> >>> +        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
> >>> +        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
> >>> +  - [312, 1, '_priv', 'memtx', 0, {}, [{'name': 'grantor', 'type': 'unsigned'}, {
> >>> +        'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
> >>> +      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
> >>> +  - [313, 1, '_vpriv', 'sysview', 0, {}, [{'name': 'grantor', 'type': 'unsigned'},
> >>> +      {'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
> >>> +      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
> >>> +  - [320, 1, '_cluster', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'uuid',
> >>> +        'type': 'string'}]]
> >>> +  - [328, 1, '_trigger', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'}, {'name': 'space_id',
> >>> +        'type': 'unsigned'}, {'name': 'opts', 'type': 'map'}]]
> >>> +  - [330, 1, '_truncate', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'count',
> >>> +        'type': 'unsigned'}]]
> >>> +  - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
> >>> +      {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
> >>> +  - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'},
> >>> +      {'name': 'child_id', 'type': 'unsigned'}, {'name': 'parent_id', 'type': 'unsigned'},
> >>> +      {'name': 'is_deferred', 'type': 'boolean'}, {'name': 'match', 'type': 'string'},
> >>> +      {'name': 'on_delete', 'type': 'string'}, {'name': 'on_update', 'type': 'string'},
> >>> +      {'name': 'child_cols', 'type': 'array'}, {'name': 'parent_cols', 'type': 'array'}]]
> >>
> >> 14. Too huge output, which will change on each update in system
> >> spaces set and format. We already have similar tests printing
> >> everything out, and usually it is not a pleasant business to fix
> >> them after each touch of upgrade.lua. I would rather replaced it
> >> like this:
> >>
> >>     box.space._vspace.index[1]:count(1) > 0
> > 
> > Done.
> 
> 3. No, it is not. This hunk is still literally absolutely the same.
> Please, do it.

I did it in reg test. Done here as well.

diff --git a/src/box/index_def.c b/src/box/index_def.c
index f509443..476d9f8 100644
--- a/src/box/index_def.c
+++ b/src/box/index_def.c
@@ -247,7 +247,7 @@ index_def_cmp(const struct index_def *key1, const struct index_def *key2)
 }
 
 struct key_def **
-key_def_array(struct rlist *index_defs, int *size)
+index_def_to_key_def(struct rlist *index_defs, int *size)
 {
 	int key_count = 0;
 	struct index_def *index_def;
diff --git a/src/box/index_def.h b/src/box/index_def.h
index 0eb9b45..6dac283 100644
--- a/src/box/index_def.h
+++ b/src/box/index_def.h
@@ -337,16 +337,16 @@ index_def_new(uint32_t space_id, uint32_t iid, const char *name,
 	      struct key_def *key_def, struct key_def *pk_def);
 
 /**
- * Create an array (on a region) of key_defs from array of index
+ * Create an array (on a region) of key_defs from list of index
  * definitions.
  *
  * @param index_defs List head.
- * @param size[out]  Array size.
+ * @param[out] size  Array size.
  * @retval not NULL  Array of pointers to key_def
  * @retval NULL      Memory error.
  */
 struct key_def **
-key_def_array(struct rlist *index_defs, int *size);
+index_def_to_key_def(struct rlist *index_defs, int *size);
 
 /**
  * One key definition is greater than the other if it's id is
diff --git a/src/box/memtx_space.c b/src/box/memtx_space.c
index fa02806..a28204d 100644
--- a/src/box/memtx_space.c
+++ b/src/box/memtx_space.c
@@ -976,7 +976,7 @@ memtx_space_new(struct memtx_engine *memtx,
 
 	/* Create a format from key and field definitions. */
 	int key_count = 0;
-	struct key_def **keys = key_def_array(key_list, &key_count);
+	struct key_def **keys = index_def_to_key_def(key_list, &key_count);
 	if (keys == NULL) {
 		free(memtx_space);
 		return NULL;
diff --git a/src/box/sysview.c b/src/box/sysview.c
index d65137d..0b07c9f 100644
--- a/src/box/sysview.c
+++ b/src/box/sysview.c
@@ -525,7 +525,7 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def,
 	 * same machinery to do selects from such views from Lua
 	 * land.
 	 */
-	struct key_def **keys = key_def_array(key_list, &key_count);
+	struct key_def **keys = index_def_to_key_def(key_list, &key_count);
 	if (keys == NULL) {
 		free(space);
 		return NULL;
diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
index 6b51566..c6a2b22 100644
--- a/test/box/access_sysview.result
+++ b/test/box/access_sysview.result
@@ -641,74 +641,9 @@ box.space._vspace.index[1]:select('xxx')
 ---
 - error: 'Supplied key type of part 0 does not match index part type: expected unsigned'
 ...
-box.space._vspace.index[1]:select(1)
+box.space._vspace.index[1]:count(1) > 0
 ---
-- - [257, 1, '_vinyl_deferred_delete', 'blackhole', 0, {'group_id': 1}, [{'name': 'space_id',
-        'type': 'unsigned'}, {'name': 'lsn', 'type': 'unsigned'}, {'name': 'tuple',
-        'type': 'array'}]]
-  - [272, 1, '_schema', 'memtx', 0, {}, [{'type': 'string', 'name': 'key'}, {'type': 'any',
-        'name': 'value', 'is_nullable': true}]]
-  - [276, 1, '_collation', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {
-        'name': 'name', 'type': 'string'}, {'name': 'owner', 'type': 'unsigned'},
-      {'name': 'type', 'type': 'string'}, {'name': 'locale', 'type': 'string'}, {
-        'name': 'opts', 'type': 'map'}]]
-  - [280, 1, '_space', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
-        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
-        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
-  - [281, 1, '_vspace', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'engine',
-        'type': 'string'}, {'name': 'field_count', 'type': 'unsigned'}, {'name': 'flags',
-        'type': 'map'}, {'name': 'format', 'type': 'array'}]]
-  - [284, 1, '_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'step',
-        'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {'name': 'max', 'type': 'integer'},
-      {'name': 'start', 'type': 'integer'}, {'name': 'cache', 'type': 'integer'},
-      {'name': 'cycle', 'type': 'boolean'}]]
-  - [285, 1, '_sequence_data', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
-      {'name': 'value', 'type': 'integer'}]]
-  - [286, 1, '_vsequence', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'},
-      {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {
-        'name': 'step', 'type': 'integer'}, {'name': 'min', 'type': 'integer'}, {
-        'name': 'max', 'type': 'integer'}, {'name': 'start', 'type': 'integer'}, {
-        'name': 'cache', 'type': 'integer'}, {'name': 'cycle', 'type': 'boolean'}]]
-  - [288, 1, '_index', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
-        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
-  - [289, 1, '_vindex', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'iid',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
-        'type': 'string'}, {'name': 'opts', 'type': 'map'}, {'name': 'parts', 'type': 'array'}]]
-  - [296, 1, '_func', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
-        'type': 'unsigned'}]]
-  - [297, 1, '_vfunc', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid',
-        'type': 'unsigned'}]]
-  - [304, 1, '_user', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
-        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
-  - [305, 1, '_vuser', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner',
-        'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type',
-        'type': 'string'}, {'name': 'auth', 'type': 'map'}]]
-  - [312, 1, '_priv', 'memtx', 0, {}, [{'name': 'grantor', 'type': 'unsigned'}, {
-        'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
-      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
-  - [313, 1, '_vpriv', 'sysview', 0, {}, [{'name': 'grantor', 'type': 'unsigned'},
-      {'name': 'grantee', 'type': 'unsigned'}, {'name': 'object_type', 'type': 'string'},
-      {'name': 'object_id', 'type': 'scalar'}, {'name': 'privilege', 'type': 'unsigned'}]]
-  - [320, 1, '_cluster', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'uuid',
-        'type': 'string'}]]
-  - [328, 1, '_trigger', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'}, {'name': 'space_id',
-        'type': 'unsigned'}, {'name': 'opts', 'type': 'map'}]]
-  - [330, 1, '_truncate', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'count',
-        'type': 'unsigned'}]]
-  - [340, 1, '_space_sequence', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'},
-      {'name': 'sequence_id', 'type': 'unsigned'}, {'name': 'is_generated', 'type': 'boolean'}]]
-  - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'},
-      {'name': 'child_id', 'type': 'unsigned'}, {'name': 'parent_id', 'type': 'unsigned'},
-      {'name': 'is_deferred', 'type': 'boolean'}, {'name': 'match', 'type': 'string'},
-      {'name': 'on_delete', 'type': 'string'}, {'name': 'on_update', 'type': 'string'},
-      {'name': 'child_cols', 'type': 'array'}, {'name': 'parent_cols', 'type': 'array'}]]
+- true
 ...
 box.space._vspace.index[1]:alter({parts = { 2, 'unsigned' }})
 ---
diff --git a/test/box/access_sysview.test.lua b/test/box/access_sysview.test.lua
index 4cc5611..c624584 100644
--- a/test/box/access_sysview.test.lua
+++ b/test/box/access_sysview.test.lua
@@ -270,7 +270,7 @@ seq:drop()
 
 box.space._vspace.index[1]:alter({parts = { 2, 'string' }})
 box.space._vspace.index[1]:select('xxx')
-box.space._vspace.index[1]:select(1)
+box.space._vspace.index[1]:count(1) > 0
 box.space._vspace.index[1]:alter({parts = { 2, 'unsigned' }})
 box.space._space.index[1]:drop()
 box.space._vspace.index[1]:select(1)

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-17 13:38 ` Konstantin Osipov
@ 2019-04-18  8:23   ` Kirill Yukhin
  0 siblings, 0 replies; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-18  8:23 UTC (permalink / raw)
  To: Konstantin Osipov; +Cc: tarantool-patches, v.shpilevoy

Hello,

On 17 апр 16:38, Konstantin Osipov wrote:
> * Kirill Yukhin <kyukhin@tarantool.org> [19/04/15 17:06]:
> > +/**
> > + * Create an array of key_defs from array of index definitions.
> 
> Why allocate on region? We usually allocate key_defs with
> malloc().

I didn't change this peace of code. It was always alloacted on a region.
See [1].

> 
> The function should be called index_def_to_key_def() or similar.

Done (in another mail).

--
Regards, Kirill Yukhin

[1] - https://github.com/tarantool/tarantool/blob/master/src/box/memtx_space.c#L982

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18  8:16       ` Kirill Yukhin
@ 2019-04-18 10:43         ` Vladislav Shpilevoy
  2019-04-18 11:14           ` Kirill Yukhin
  0 siblings, 1 reply; 20+ messages in thread
From: Vladislav Shpilevoy @ 2019-04-18 10:43 UTC (permalink / raw)
  To: tarantool-patches, Kirill Yukhin

Hi! Thanks for the fixes! See 4 comments below.

1. Now I see that sysview tuple format leaks. Please,
apply this diff:

======================================================
diff --git a/src/box/sysview.c b/src/box/sysview.c
index 0b07c9f4a..96c5e78ca 100644
--- a/src/box/sysview.c
+++ b/src/box/sysview.c
@@ -545,6 +545,8 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def,
 		free(space);
 		return NULL;
 	}
+	/* Format is now referenced by the space. */
+	tuple_format_unref(format);
 	return space;
 }
======================================================

On 18/04/2019 11:16, Kirill Yukhin wrote:
> Hello,
> 
> Thanks for review. My answers are inlinded. Iterative patch in the bottom.
> Branch force pushed and rebased on recent master. I've also renamed function
> as per kostja's request in neighbour mail.

2. I do not agree with the new name, because we do not convert one
index_def to one key_def. We just reorganize a list of the formers
into an array of the latters not touching the objects.

But as you wish.

> 
> On 17 апр 13:11, Vladislav Shpilevoy wrote:
>> Hi! Thanks for the fixes!
>>
>>>> 1. Please, prepend a subsystem name to the commit title.
>>>> Here I would use 'sysview' (by analogue with 'memtx', 'vinyl').
>>>> Do not forget to omit capital letter in 'Set' when the prefix
>>>> is added.
>>>
>>> Didn't know we have spacial prefix for sysview. Done.
>>
>> As I know, we do not have a strict list of subsystems at all.
>> Or it is hidden somewhere in SOP, which would not make any sense,
>> because new ones appear too often.
> 
> I think I saw such a list in web docs...

3. If you mean this:
https://www.tarantool.io/ru/doc/2.1/dev_guide/developer_guidelines/#how-to-write-a-commit-message
then obviously it is not full. We also use 'test', 'fiber',
'tarantoolctl', 'box', 'lib', 'space', 'swim' etc. It means,
that the list in the docs is just a few examples, not a strict
list.

>>>>> diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
>>>>> index ae04266..6b51566 100644
>>>>> --- a/test/box/access_sysview.result
>>>>> +++ b/test/box/access_sysview.result
>>>>> @@ -642,7 +643,72 @@ box.space._vspace.index[1]:select('xxx')
>>>>>  ...
>>>>>  box.space._vspace.index[1]:select(1)
>>>>> +  - [356, 1, '_fk_constraint', 'memtx', 0, {}, [{'name': 'name', 'type': 'string'},
>>>>> +      {'name': 'child_id', 'type': 'unsigned'}, {'name': 'parent_id', 'type': 'unsigned'},
>>>>> +      {'name': 'is_deferred', 'type': 'boolean'}, {'name': 'match', 'type': 'string'},
>>>>> +      {'name': 'on_delete', 'type': 'string'}, {'name': 'on_update', 'type': 'string'},
>>>>> +      {'name': 'child_cols', 'type': 'array'}, {'name': 'parent_cols', 'type': 'array'}]]
>>>>
>>>> 14. Too huge output, which will change on each update in system
>>>> spaces set and format. We already have similar tests printing
>>>> everything out, and usually it is not a pleasant business to fix
>>>> them after each touch of upgrade.lua. I would rather replaced it
>>>> like this:
>>>>
>>>>     box.space._vspace.index[1]:count(1) > 0
>>>
>>> Done.
>>
>> 3. No, it is not. This hunk is still literally absolutely the same.
>> Please, do it.
> 
> I did it in reg test.

4. Sorry, but I gave you both comments in the first review
and you said 'Done' not actually having one of them done.

> Done here as well.
Thanks, now it is really fixed.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 10:43         ` Vladislav Shpilevoy
@ 2019-04-18 11:14           ` Kirill Yukhin
  2019-04-18 11:39             ` Vladislav Shpilevoy
  0 siblings, 1 reply; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-18 11:14 UTC (permalink / raw)
  To: Vladislav Shpilevoy; +Cc: tarantool-patches

Hello,

On 18 апр 13:43, Vladislav Shpilevoy wrote:
> Hi! Thanks for the fixes! See 4 comments below.
> 
> 1. Now I see that sysview tuple format leaks. Please,
> apply this diff:
> 
> ======================================================
> diff --git a/src/box/sysview.c b/src/box/sysview.c
> index 0b07c9f4a..96c5e78ca 100644
> --- a/src/box/sysview.c
> +++ b/src/box/sysview.c
> @@ -545,6 +545,8 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def,
>  		free(space);
>  		return NULL;
>  	}
> +	/* Format is now referenced by the space. */
> +	tuple_format_unref(format);
>  	return space;
>  }
> ======================================================

Done.

Branch force-pushed and re-tested.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 11:14           ` Kirill Yukhin
@ 2019-04-18 11:39             ` Vladislav Shpilevoy
  2019-04-18 12:08               ` Kirill Yukhin
  0 siblings, 1 reply; 20+ messages in thread
From: Vladislav Shpilevoy @ 2019-04-18 11:39 UTC (permalink / raw)
  To: Kirill Yukhin; +Cc: tarantool-patches



On 18/04/2019 14:14, Kirill Yukhin wrote:
> Hello,
> 
> On 18 апр 13:43, Vladislav Shpilevoy wrote:
>> Hi! Thanks for the fixes! See 4 comments below.
>>
>> 1. Now I see that sysview tuple format leaks. Please,
>> apply this diff:
>>
>> ======================================================
>> diff --git a/src/box/sysview.c b/src/box/sysview.c
>> index 0b07c9f4a..96c5e78ca 100644
>> --- a/src/box/sysview.c
>> +++ b/src/box/sysview.c
>> @@ -545,6 +545,8 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def,
>>  		free(space);
>>  		return NULL;
>>  	}
>> +	/* Format is now referenced by the space. */
>> +	tuple_format_unref(format);
>>  	return space;
>>  }
>> ======================================================
> 
> Done.
> 
> Branch force-pushed and re-tested.

How was it retested?

[024] Test failed! Result content mismatch:
[024] --- wal_off/alter.result	Thu Apr 18 14:36:14 2019
[024] +++ wal_off/alter.reject	Thu Apr 18 14:37:03 2019
[024] @@ -28,7 +28,7 @@
[024]  ...
[024]  #spaces;
[024]  ---
[024] -- 65488
[024] +- 65505
[024]  ...
[024]  -- cleanup
[024]  for k, v in pairs(spaces) do
[024] 

Looks like some of the previously leaking formats are
back in the pool, good.

> 
> --
> Regards, Kirill Yukhin
> 

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 11:39             ` Vladislav Shpilevoy
@ 2019-04-18 12:08               ` Kirill Yukhin
  2019-04-18 12:43                 ` Vladislav Shpilevoy
  0 siblings, 1 reply; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-18 12:08 UTC (permalink / raw)
  To: Vladislav Shpilevoy; +Cc: tarantool-patches

Hello,

On 18 апр 14:39, Vladislav Shpilevoy wrote:
> 
> 
> On 18/04/2019 14:14, Kirill Yukhin wrote:
> > Hello,
> > 
> > On 18 апр 13:43, Vladislav Shpilevoy wrote:
> >> Hi! Thanks for the fixes! See 4 comments below.
> >>
> >> 1. Now I see that sysview tuple format leaks. Please,
> >> apply this diff:
> >>
> >> ======================================================
> >> diff --git a/src/box/sysview.c b/src/box/sysview.c
> >> index 0b07c9f4a..96c5e78ca 100644
> >> --- a/src/box/sysview.c
> >> +++ b/src/box/sysview.c
> >> @@ -545,6 +545,8 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def,
> >>  		free(space);
> >>  		return NULL;
> >>  	}
> >> +	/* Format is now referenced by the space. */
> >> +	tuple_format_unref(format);
> >>  	return space;
> >>  }
> >> ======================================================
> > 
> > Done.
> > 
> > Branch force-pushed and re-tested.
> 
> How was it retested?

I didn't staged updated result. Done.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 12:08               ` Kirill Yukhin
@ 2019-04-18 12:43                 ` Vladislav Shpilevoy
  2019-04-18 13:25                   ` Kirill Yukhin
  2019-04-18 14:16                   ` Konstantin Osipov
  0 siblings, 2 replies; 20+ messages in thread
From: Vladislav Shpilevoy @ 2019-04-18 12:43 UTC (permalink / raw)
  To: Kirill Yukhin; +Cc: tarantool-patches

Now finally technically is ok except that I will never agree
with the test-file-per-issue policy. It is ridiculous.

Following this logic I should name the whole swim subsystem
test file like gh-3234-swim and rename the binary protocol
test file into gh-3234-swim_proto - two files about the same
issue with an ugly prefix looking like it is a fix of a bug. 

Additionally, creation of a new file on each typo-like issue
will lead us sometime into the test-hell like it was in SQLite:

tkt-02a8e81d44.test	tkt-54844eea3f.test	tkt-9a8b09f8e6.test	tkt-d82e3f3721.test	tkt1514.test		tkt2450.test		tkt3121.test		tkt3541.test		tkt3838.test
tkt-26ff0c2d1e.test	tkt-5d863f876e.test	tkt-9d68c883.test	tkt-f3e5abed55.test	tkt1536.test		tkt2565.test		tkt3201.test		tkt3554.test		tkt3841.test
tkt-2a5629202f.test	tkt-5e10420e8d.test	tkt-9f2eb3abac.test	tkt-f67b41381a.test	tkt1537.test		tkt2640.test		tkt3292.test		tkt3581.test		tkt3871.test
tkt-2d1a5c67d.test	tkt-5ee23731f.test	tkt-a7b7803e.test	tkt-f777251dc7a.test	tkt1567.test		tkt2643.test		tkt3298.test		tkt35xx.test		tkt3879.test
tkt-2ea2425d34.test	tkt-6bfb98dfc0.test	tkt-a8a0d2996a.test	tkt-f7b4edec.test	tkt1644.test		tkt2686.test		tkt3334.test		tkt3630.test		tkt3911.test
tkt-31338dca7e.test	tkt-752e1646fc.test	tkt-b1d3a2e531.test	tkt-f973c7ac31.test	tkt1667.test		tkt2767.test		tkt3346.test		tkt3718.test		tkt3918.test
tkt-313723c356.test	tkt-78e04e52ea.test	tkt-b351d95f9.test	tkt-fa7bf5ec.test	tkt1873.test		tkt2817.test		tkt3357.test		tkt3731.test		tkt3922.test
tkt-385a5b56b9.test	tkt-7a31705a7e6.test	tkt-b72787b1.test	tkt-fc62af4523.test	tkt2141.test		tkt2820.test		tkt3419.test		tkt3757.test		tkt3929.test

Cool, isn't it? Very understandable and
E a S y   T o   R e P r O d U c E.

We will end like this. I've finished, LGTM.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 12:43                 ` Vladislav Shpilevoy
@ 2019-04-18 13:25                   ` Kirill Yukhin
  2019-04-18 14:18                     ` Konstantin Osipov
  2019-04-18 14:16                   ` Konstantin Osipov
  1 sibling, 1 reply; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-18 13:25 UTC (permalink / raw)
  To: Vladislav Shpilevoy; +Cc: tarantool-patches

Hello,

On 18 апр 15:43, Vladislav Shpilevoy wrote:
> Now finally technically is ok except that I will never agree
> with the test-file-per-issue policy. It is ridiculous.
Thanks, I'll check it into master and 2.1 branches.
 
> Following this logic I should name the whole swim subsystem
> test file like gh-3234-swim and rename the binary protocol
> test file into gh-3234-swim_proto - two files about the same
> issue with an ugly prefix looking like it is a fix of a bug.

I hope that will be part of SOP soon.

> Additionally, creation of a new file on each typo-like issue
> will lead us sometime into the test-hell like it was in SQLite:
> 
> tkt-02a8e81d44.test	tkt-54844eea3f.test	tkt-9a8b09f8e6.test	tkt-d82e3f3721.test	tkt1514.test		tkt2450.test		tkt3121.test		tkt3541.test		tkt3838.test
> tkt-26ff0c2d1e.test	tkt-5d863f876e.test	tkt-9d68c883.test	tkt-f3e5abed55.test	tkt1536.test		tkt2565.test		tkt3201.test		tkt3554.test		tkt3841.test
> tkt-2a5629202f.test	tkt-5e10420e8d.test	tkt-9f2eb3abac.test	tkt-f67b41381a.test	tkt1537.test		tkt2640.test		tkt3292.test		tkt3581.test		tkt3871.test
> tkt-2d1a5c67d.test	tkt-5ee23731f.test	tkt-a7b7803e.test	tkt-f777251dc7a.test	tkt1567.test		tkt2643.test		tkt3298.test		tkt35xx.test		tkt3879.test
> tkt-2ea2425d34.test	tkt-6bfb98dfc0.test	tkt-a8a0d2996a.test	tkt-f7b4edec.test	tkt1644.test		tkt2686.test		tkt3334.test		tkt3630.test		tkt3911.test
> tkt-31338dca7e.test	tkt-752e1646fc.test	tkt-b1d3a2e531.test	tkt-f973c7ac31.test	tkt1667.test		tkt2767.test		tkt3346.test		tkt3718.test		tkt3918.test
> tkt-313723c356.test	tkt-78e04e52ea.test	tkt-b351d95f9.test	tkt-fa7bf5ec.test	tkt1873.test		tkt2817.test		tkt3357.test		tkt3731.test		tkt3922.test
> tkt-385a5b56b9.test	tkt-7a31705a7e6.test	tkt-b72787b1.test	tkt-fc62af4523.test	tkt2141.test		tkt2820.test		tkt3419.test		tkt3757.test		tkt3929.test

How ofter do you scan list of regression tests? I bet - never.
But you very often try to extract 2-3 lines of failed case.

In case of aggregated testcases this might take a while.

Also, please keep in mind that number of cores are increasing on
this planet. So, we are trying to get some profit: more files ->
more processes -> more cores utilized.

Finally, filename should be accompanied w/ 2-3 key words, IMHO.
This will significantly increase readability of such strange listings.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 12:43                 ` Vladislav Shpilevoy
  2019-04-18 13:25                   ` Kirill Yukhin
@ 2019-04-18 14:16                   ` Konstantin Osipov
  1 sibling, 0 replies; 20+ messages in thread
From: Konstantin Osipov @ 2019-04-18 14:16 UTC (permalink / raw)
  To: tarantool-patches; +Cc: Kirill Yukhin

* Vladislav Shpilevoy <v.shpilevoy@tarantool.org> [19/04/18 17:12]:
> Now finally technically is ok except that I will never agree
> with the test-file-per-issue policy. It is ridiculous.

We should not use it, Kirill, please don't.
> 
> Following this logic I should name the whole swim subsystem
> test file like gh-3234-swim and rename the binary protocol
> test file into gh-3234-swim_proto - two files about the same
> issue with an ugly prefix looking like it is a fix of a bug. 
> 

-- 
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 13:25                   ` Kirill Yukhin
@ 2019-04-18 14:18                     ` Konstantin Osipov
  2019-04-19 11:46                       ` Kirill Yukhin
  2019-04-20 22:36                       ` Alexander Turenko
  0 siblings, 2 replies; 20+ messages in thread
From: Konstantin Osipov @ 2019-04-18 14:18 UTC (permalink / raw)
  To: tarantool-patches; +Cc: Vladislav Shpilevoy

* Kirill Yukhin <kyukhin@tarantool.org> [19/04/18 17:12]:
> How ofter do you scan list of regression tests? I bet - never.
> But you very often try to extract 2-3 lines of failed case.

If you work with the test suite as an active maintainer you work
with the files all the time. Otherwise your tests just rot.

> In case of aggregated testcases this might take a while.
> 
> Also, please keep in mind that number of cores are increasing on
> this planet. So, we are trying to get some profit: more files ->
> more processes -> more cores utilized.
> 
> Finally, filename should be accompanied w/ 2-3 key words, IMHO.
> This will significantly increase readability of such strange listings.

Kirill, the decision has been made in 2008 and you don't flip it
just like that. Please don't.

-- 
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-15 13:35 [tarantool-patches] [PATCH] Set format for spaces with sysview engine Kirill Yukhin
  2019-04-16 15:13 ` [tarantool-patches] " Vladislav Shpilevoy
  2019-04-17 13:38 ` Konstantin Osipov
@ 2019-04-19 11:38 ` Kirill Yukhin
  2 siblings, 0 replies; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-19 11:38 UTC (permalink / raw)
  To: v.shpilevoy; +Cc: tarantool-patches

Hello,

On 15 Apr 16:35, Kirill Yukhin wrote:
> The patch sets format for spaces with sysview engine.
> This is done due to following reasons:
>   1. To allow to create an SQL view, which looks at format of
>      space being used.
>   2. To unify sysview's engine spaces with SQL views. This
>      will allow to use sysview machinery to query SQL views from
>      Lua land.
> 
> Closes #4111

I've checked the patch into 2.1 and master.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 14:18                     ` Konstantin Osipov
@ 2019-04-19 11:46                       ` Kirill Yukhin
  2019-04-20 22:36                       ` Alexander Turenko
  1 sibling, 0 replies; 20+ messages in thread
From: Kirill Yukhin @ 2019-04-19 11:46 UTC (permalink / raw)
  To: tarantool-patches; +Cc: Vladislav Shpilevoy

On 18 Apr 17:18, Konstantin Osipov wrote:
> * Kirill Yukhin <kyukhin@tarantool.org> [19/04/18 17:12]:
> > How ofter do you scan list of regression tests? I bet - never.
> > But you very often try to extract 2-3 lines of failed case.
> 
> If you work with the test suite as an active maintainer you work
> with the files all the time. Otherwise your tests just rot.

I see no arguments here, sorry. Of course one work with files all the
time, but what's the point? Please, be more specific: which exact
problems you won't be able to solve w/ such an approach?
Or which of your regular actions will become complicated?

After you collected those problems, you might want to compare 
them w/ clear pros:
  1. more testing parallelism
  2. simple case extraction: one file, one issue, no surfing aroung
     thousands of lines.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-18 14:18                     ` Konstantin Osipov
  2019-04-19 11:46                       ` Kirill Yukhin
@ 2019-04-20 22:36                       ` Alexander Turenko
  2019-04-21 17:06                         ` Vladislav Shpilevoy
  2019-04-21 18:19                         ` Konstantin Osipov
  1 sibling, 2 replies; 20+ messages in thread
From: Alexander Turenko @ 2019-04-20 22:36 UTC (permalink / raw)
  To: Konstantin Osipov; +Cc: tarantool-patches, Vladislav Shpilevoy, Kirill Yukhin

On Thu, Apr 18, 2019 at 05:18:04PM +0300, Konstantin Osipov wrote:
> * Kirill Yukhin <kyukhin@tarantool.org> [19/04/18 17:12]:
> > How ofter do you scan list of regression tests? I bet - never.
> > But you very often try to extract 2-3 lines of failed case.
> 
> If you work with the test suite as an active maintainer you work
> with the files all the time. Otherwise your tests just rot.

It does not matter much whether test cases spread around its own files
or grouped into categories within one file. The key point here is to
make cases independent. Even when you have independent test cases you
still can extract common preparation code that will be run before each
test case (or before a group of test cases).

Look how test cases are organized in our projects with pytest or with
failsafe maven plugin. They are grouped into files, but I still able to
do something like `pytest test/test_foo.py -k test_bar` or `mvn verify
-Dit.test=FooIT#testBar` and concentrate on one case.

When test cases depend on each other you need to manually find and
extract all needed parts of a test file to run a case. When you do it
several times per day, hey, it becomes annoying.

Now even if developers highly self-disciplined and write independent
test cases, an extra work is still necessary to run a case if a harness
is unable to run just what you need.

And while we are here there is other problem with console-input-like
tests: often you don't sure which statements results are checked
intentionally and which ones are run only for its side effects.
Sometimes you need to git-blame over several attempts to rewrite a test
to understand what the idea was.

Maybe we are near to the point when such simple approach gives more
problems then solves.

Yep, I stated problems here, but don't propose anything. I don't know
where is a right balance between pushing developers to write structured
tests and the freedom developers have now.

I see that some developers like ability to test something with injecting
just one line for one case into another one. I think that it will make
tests more and more embrassing. So, I don't know.

WBR, Alexander Turenko.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-20 22:36                       ` Alexander Turenko
@ 2019-04-21 17:06                         ` Vladislav Shpilevoy
  2019-04-21 18:19                         ` Konstantin Osipov
  1 sibling, 0 replies; 20+ messages in thread
From: Vladislav Shpilevoy @ 2019-04-21 17:06 UTC (permalink / raw)
  To: tarantool-patches, Alexander Turenko, Konstantin Osipov; +Cc: Kirill Yukhin



On 21/04/2019 01:36, Alexander Turenko wrote:
> On Thu, Apr 18, 2019 at 05:18:04PM +0300, Konstantin Osipov wrote:
>> * Kirill Yukhin <kyukhin@tarantool.org> [19/04/18 17:12]:
>>> How ofter do you scan list of regression tests? I bet - never.
>>> But you very often try to extract 2-3 lines of failed case.
>>
>> If you work with the test suite as an active maintainer you work
>> with the files all the time. Otherwise your tests just rot.
> 
> It does not matter much whether test cases spread around its own files
> or grouped into categories within one file. The key point here is to
> make cases independent. Even when you have independent test cases you
> still can extract common preparation code that will be run before each
> test case (or before a group of test cases).
> 
> Look how test cases are organized in our projects with pytest or with
> failsafe maven plugin. They are grouped into files, but I still able to
> do something like `pytest test/test_foo.py -k test_bar` or `mvn verify
> -Dit.test=FooIT#testBar` and concentrate on one case.
> 
> When test cases depend on each other you need to manually find and
> extract all needed parts of a test file to run a case. When you do it
> several times per day, hey, it becomes annoying.
> 
> Now even if developers highly self-disciplined and write independent
> test cases, an extra work is still necessary to run a case if a harness
> is unable to run just what you need.
> 
> And while we are here there is other problem with console-input-like
> tests: often you don't sure which statements results are checked
> intentionally and which ones are run only for its side effects.
> Sometimes you need to git-blame over several attempts to rewrite a test
> to understand what the idea was.
> 
> Maybe we are near to the point when such simple approach gives more
> problems then solves.
> 
> Yep, I stated problems here, but don't propose anything. I don't know
> where is a right balance between pushing developers to write structured
> tests and the freedom developers have now.
> 
> I see that some developers like ability to test something with injecting
> just one line for one case into another one. I think that it will make
> tests more and more embrassing. So, I don't know.

My point is that many issues are because of typos or another extra simple
mistakes, and what is more - they are linked somehow to a swarm of other
similar issues, already tested somewhere.

For example, the test you've fixed for netbox about 'unique' index
flag. It was just a typo, and we have a place, where other space/index
properties are tested. It is logically to test one another index property
together with others. Just imagine how many tests you would have had if we
had dedicated one test file to each space and index option. In such a
situation parallel test run will not help you, when number of test files
will be thousands. You just do not have so many cores so as to swiftly
start and shutdown new processes and threads.

Even SQLite does not dedicate new test file per each single tiny typo-like
issue. They have dedicated file per issue, but only for really hard ones.

> 
> WBR, Alexander Turenko.
> 

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [tarantool-patches] Re: [PATCH] Set format for spaces with sysview engine
  2019-04-20 22:36                       ` Alexander Turenko
  2019-04-21 17:06                         ` Vladislav Shpilevoy
@ 2019-04-21 18:19                         ` Konstantin Osipov
  1 sibling, 0 replies; 20+ messages in thread
From: Konstantin Osipov @ 2019-04-21 18:19 UTC (permalink / raw)
  To: tarantool-patches; +Cc: Vladislav Shpilevoy, Kirill Yukhin

* Alexander Turenko <alexander.turenko@tarantool.org> [19/04/21 01:38]:

Adding tap-like commands to tell the harness about start/end of an
individual test case to our .test files is a great
idea. In fact, if you look at most of the .test files, they
already contain well-written individual cases. 
I think we should just do it.

> On Thu, Apr 18, 2019 at 05:18:04PM +0300, Konstantin Osipov wrote:
> > * Kirill Yukhin <kyukhin@tarantool.org> [19/04/18 17:12]:
> > > How ofter do you scan list of regression tests? I bet - never.
> > > But you very often try to extract 2-3 lines of failed case.
> > 
> > If you work with the test suite as an active maintainer you work
> > with the files all the time. Otherwise your tests just rot.
> 
> It does not matter much whether test cases spread around its own files
> or grouped into categories within one file. The key point here is to
> make cases independent. Even when you have independent test cases you
> still can extract common preparation code that will be run before each
> test case (or before a group of test cases).
> 
> Look how test cases are organized in our projects with pytest or with
> failsafe maven plugin. They are grouped into files, but I still able to
> do something like `pytest test/test_foo.py -k test_bar` or `mvn verify
> -Dit.test=FooIT#testBar` and concentrate on one case.
> 
> When test cases depend on each other you need to manually find and
> extract all needed parts of a test file to run a case. When you do it
> several times per day, hey, it becomes annoying.
> 
> Now even if developers highly self-disciplined and write independent
> test cases, an extra work is still necessary to run a case if a harness
> is unable to run just what you need.
> 
> And while we are here there is other problem with console-input-like
> tests: often you don't sure which statements results are checked
> intentionally and which ones are run only for its side effects.
> Sometimes you need to git-blame over several attempts to rewrite a test
> to understand what the idea was.
> 
> Maybe we are near to the point when such simple approach gives more
> problems then solves.
> 
> Yep, I stated problems here, but don't propose anything. I don't know
> where is a right balance between pushing developers to write structured
> tests and the freedom developers have now.
> 
> I see that some developers like ability to test something with injecting
> just one line for one case into another one. I think that it will make
> tests more and more embrassing. So, I don't know.
> 
> WBR, Alexander Turenko.

-- 
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2019-04-21 18:19 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-15 13:35 [tarantool-patches] [PATCH] Set format for spaces with sysview engine Kirill Yukhin
2019-04-16 15:13 ` [tarantool-patches] " Vladislav Shpilevoy
2019-04-17  8:13   ` Kirill Yukhin
2019-04-17 10:11     ` Vladislav Shpilevoy
2019-04-18  8:16       ` Kirill Yukhin
2019-04-18 10:43         ` Vladislav Shpilevoy
2019-04-18 11:14           ` Kirill Yukhin
2019-04-18 11:39             ` Vladislav Shpilevoy
2019-04-18 12:08               ` Kirill Yukhin
2019-04-18 12:43                 ` Vladislav Shpilevoy
2019-04-18 13:25                   ` Kirill Yukhin
2019-04-18 14:18                     ` Konstantin Osipov
2019-04-19 11:46                       ` Kirill Yukhin
2019-04-20 22:36                       ` Alexander Turenko
2019-04-21 17:06                         ` Vladislav Shpilevoy
2019-04-21 18:19                         ` Konstantin Osipov
2019-04-18 14:16                   ` Konstantin Osipov
2019-04-17 13:38 ` Konstantin Osipov
2019-04-18  8:23   ` Kirill Yukhin
2019-04-19 11:38 ` Kirill Yukhin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox