<HTML><BODY><div class="js-helper js-readmsg-msg"><div><style type="text/css"></style>> Please send smth like 'hotfix' for the last commit, I guess it is too late to force push to master.</div><div><div id="style_15832530591922653635_BODY"><div class="class_1583256174"><div> </div><div>If I understood you correctly:</div><hr><div><div>Calling prepare and execute did not update corresponding request statistics<br>in the box.stat table. This happened because methods that collect stats were<br>never called where they should have been.</div><div><br>There was a bug in previous commit resulting in collecting statistics on<br>box.execute twice in some cases.</div><div> </div><div>Closes #4756<br>---</div><div>Issue:</div><div><a href="https://github.com/tarantool/tarantool/issues/4756" rel="noopener noreferrer" target="_blank">https://github.com/tarantool/tarantool/issues/4756</a></div><div>Branch:</div><div><a href="https://github.com/tarantool/tarantool/tree/eljashm/gh-4756-hotfix-box-stat-execute-prepare">https://github.com/tarantool/tarantool/tree/eljashm/gh-4756-hotfix-box-stat-execute-prepare</a> </div><div><br> src/box/execute.c        |  1 -<br> test/sql/iproto.result   | 16 ++++++++--------<br> test/sql/iproto.test.lua |  5 +++--<br> 3 files changed, 11 insertions(+), 11 deletions(-)</div><div>diff --git a/src/box/execute.c b/src/box/execute.c<br>index 3daa09205..24f8529ec 100644<br>--- a/src/box/execute.c<br>+++ b/src/box/execute.c<br>@@ -735,7 +735,6 @@ sql_prepare_and_execute(const char *sql, int len, const struct sql_bind *bind,<br>     if (sql_stmt_compile(sql, len, NULL, &stmt, NULL) != 0)<br>         return -1;<br>     assert(stmt != NULL);<br>-    rmean_collect(rmean_box, IPROTO_EXECUTE, 1);<br>     enum sql_serialization_format format = sql_column_count(stmt) > 0 ?<br>                        DQL_EXECUTE : DML_EXECUTE;<br>     port_sql_create(port, stmt, format, true);<br>diff --git a/test/sql/iproto.result b/test/sql/iproto.result<br>index a391307d1..0e046577d 100644<br>--- a/test/sql/iproto.result<br>+++ b/test/sql/iproto.result<br>@@ -800,22 +800,22 @@ e = box.stat().EXECUTE.total<br> s = box.prepare([[ SELECT ?; ]])<br> ---<br> ...<br>-s:execute({42})<br>+res, err = box.unprepare(s)<br> ---<br>-- metadata:<br>-  - name: '?'<br>-    type: integer<br>-  rows:<br>-  - [42]<br> ...<br>-res, err = box.unprepare(s)<br>+box.execute('create table test (id integer primary key, a integer)')<br> ---<br>+- row_count: 1<br>+...<br>+box.execute('DROP TABLE test')<br>+---<br>+- row_count: 1<br> ...<br> assert(box.stat().PREPARE.total == p + 1)<br> ---<br> - true<br> ...<br>-assert(box.stat().EXECUTE.total == e + 1)<br>+assert(box.stat().EXECUTE.total == e + 2)<br> ---<br> - true<br> ...<br>diff --git a/test/sql/iproto.test.lua b/test/sql/iproto.test.lua<br>index 9eac91d2c..ec1f37035 100644<br>--- a/test/sql/iproto.test.lua<br>+++ b/test/sql/iproto.test.lua<br>@@ -249,11 +249,12 @@ p = box.stat().PREPARE.total<br> e = box.stat().EXECUTE.total<br> <br> s = box.prepare([[ SELECT ?; ]])<br>-s:execute({42})<br> res, err = box.unprepare(s)<br>+box.execute('create table test (id integer primary key, a integer)')<br>+box.execute('DROP TABLE test')<br> <br> assert(box.stat().PREPARE.total == p + 1)<br>-assert(box.stat().EXECUTE.total == e + 1)<br>+assert(box.stat().EXECUTE.total == e + 2)<br> <br> -- Cleanup xlog<br> box.snapshot()<br>-- <br>2.24.0</div></div><div> </div><hr><div>Also that was delegated.</div><div>> <span style="color: rgb(51, 51, 51); font-family: Helvetica, Arial, Tahoma, Verdana, sans-serif; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">Kirill, it also should be backported to 2.2 skipping part related to </span><span style="color: rgb(51, 51, 51); font-family: Helvetica, Arial, Tahoma, Verdana, sans-serif; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">'prepare' feature.</span></div><div> </div><div><div>Calling prepare and execute did not update corresponding request statistics<br>in the box.stat table. This happened because methods that collect stats were<br>never called where they should have been.</div><div> </div><div>Version for 2.2 only includes box.execute.</div><div> </div><div>Closes #4756<br>---<br>Branch:</div><div><a href="https://github.com/tarantool/tarantool/tree/eljashm/gh-4756-box-stat-execute-prepare-2.2-version">https://github.com/tarantool/tarantool/tree/eljashm/gh-4756-box-stat-execute-prepare-2.2-version</a> </div><div> </div><div> src/box/execute.c        |  2 ++<br> test/sql/iproto.result   | 18 ++++++++++++++++++<br> test/sql/iproto.test.lua |  9 +++++++++<br> 3 files changed, 29 insertions(+)</div><div>diff --git a/src/box/execute.c b/src/box/execute.c<br>index 68e94e442..cf4d8afe6 100644<br>--- a/src/box/execute.c<br>+++ b/src/box/execute.c<br>@@ -45,6 +45,7 @@<br> #include "tuple.h"<br> #include "sql/vdbe.h"<br> #include "box/lua/execute.h"<br>+#include "rmean.h"<br> <br> const char *sql_info_key_strs[] = {<br>     "row_count",<br>@@ -417,6 +418,7 @@ static inline int<br> sql_execute(struct sql_stmt *stmt, struct port *port, struct region *region)<br> {<br>     int rc, column_count = sql_column_count(stmt);<br>+    rmean_collect(rmean_box, IPROTO_EXECUTE, 1);<br>     if (column_count > 0) {<br>         /* Either ROW or DONE or ERROR. */<br>         while ((rc = sql_step(stmt)) == SQL_ROW) {<br>diff --git a/test/sql/iproto.result b/test/sql/iproto.result<br>index f43e87117..8a9bfa405 100644<br>--- a/test/sql/iproto.result<br>+++ b/test/sql/iproto.result<br>@@ -820,6 +820,24 @@ box.schema.user.revoke('guest', 'create', 'space')<br> space = nil<br> ---<br> ...<br>+--<br>+-- gh-4756: EXECUTE statistics should be present in box.stat()<br>+--<br>+e = box.stat().EXECUTE.total<br>+---<br>+...<br>+box.execute('create table test3 (id int primary key, a NUMBER, b text)')<br>+---<br>+- row_count: 1<br>+...<br>+box.execute('drop table test3')<br>+---<br>+- row_count: 1<br>+...<br>+assert(box.stat().EXECUTE.total == e + 2)<br>+---<br>+- true<br>+...<br> -- Cleanup xlog<br> box.snapshot()<br> ---<br>diff --git a/test/sql/iproto.test.lua b/test/sql/iproto.test.lua<br>index dd60afe79..d0e979133 100644<br>--- a/test/sql/iproto.test.lua<br>+++ b/test/sql/iproto.test.lua<br>@@ -250,5 +250,14 @@ box.schema.user.revoke('guest', 'read,write,execute', 'universe')<br> box.schema.user.revoke('guest', 'create', 'space')<br> space = nil<br> <br>+--<br>+-- gh-4756: PREPARE and EXECUTE statistics should be present in box.stat()<br>+--<br>+e = box.stat().EXECUTE.total<br>+box.execute('create table test3 (id int primary key, a NUMBER, b text)')<br>+box.execute('drop table test3')<br>+<br>+assert(box.stat().EXECUTE.total == e + 2)<br>+<br> -- Cleanup xlog<br> box.snapshot()<br>-- <br>2.24.0</div></div><div><div> </div><div data-signature-widget="container"><div data-signature-widget="content"><div>--<br>Maria Khaydich</div></div></div><div> </div></div><style type="text/css"></style></div></div></div></div><div> </div></BODY></HTML>