<HTML><BODY><div class="js-helper js-readmsg-msg"><style type="text/css"></style><div><div id="style_15813596792030494451_BODY"><div class="class_1581389966"><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>Closes #4756</div><div><br>---<br>Issue:<br><a href="https://github.com/tarantool/tarantool/issues/4756Branch:https://github.com/tarantool/tarantool/compare/eljashm/gh-4756-box-stat-execute-and-prepare-not-updated" rel="noopener noreferrer" target="_blank">https://github.com/tarantool/tarantool/issues/4756<br>Branch:<br>https://github.com/tarantool/tarantool/compare/eljashm/gh-4756-box-stat-execute-and-prepare-not-updated</a></div><div> </div><div> src/box/execute.c         |  4 ++++<br> test/box-tap/cfg.test.lua | 16 +++++++++++++---<br> 2 files changed, 17 insertions(+), 3 deletions(-)</div><div>diff --git a/src/box/execute.c b/src/box/execute.c<br>index dc8dce81c..e775055b4 100644<br>--- a/src/box/execute.c<br>+++ b/src/box/execute.c<br>@@ -48,6 +48,7 @@<br> #include "box/lua/execute.h"<br> #include "box/sql_stmt_cache.h"<br> #include "session.h"<br>+#include "rmean.h"<br> <br> const char *sql_info_key_strs[] = {<br>     "row_count",<br>@@ -608,6 +609,7 @@ sql_prepare(const char *sql, int len, struct port *port)<br> {<br>     uint32_t stmt_id = sql_stmt_calculate_id(sql, len);<br>     struct sql_stmt *stmt = sql_stmt_cache_find(stmt_id);<br>+    rmean_collect(rmean_box, IPROTO_PREPARE, 1);<br>     if (stmt == NULL) {<br>         if (sql_stmt_compile(sql, len, NULL, &stmt, NULL) != 0)<br>             return -1;<br>@@ -669,6 +671,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>@@ -732,6 +735,7 @@ 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_PREPARE, 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/box-tap/cfg.test.lua b/test/box-tap/cfg.test.lua<br>index d529447bb..d367aab07 100755<br>--- a/test/box-tap/cfg.test.lua<br>+++ b/test/box-tap/cfg.test.lua<br>@@ -6,7 +6,7 @@ local socket = require('socket')<br> local fio = require('fio')<br> local uuid = require('uuid')<br> local msgpack = require('msgpack')<br>-test:plan(104)<br>+test:plan(106)<br> <br> --------------------------------------------------------------------------------<br> -- Invalid values<br>@@ -592,6 +592,16 @@ box.cfg{read_only=true}<br> ]]<br> test:is(run_script(code), PANIC, "panic on bootstrapping a read-only instance as master")<br> <br>+--<br>+-- gh-4756: PREPARE and EXECUTE statistics should be present in box.stat()<br>+--<br>+local p = box.stat().PREPARE.total<br>+local e = box.stat().EXECUTE.total<br> <br>-test:check()<br>-os.exit(0)<br>+s = box.prepare([[ SELECT ?; ]])<br>+s:execute({42})<br>+<br>+test:is(box.stat().PREPARE.total, p + 1, "prepare stat is incremented")<br>+test:is(box.stat().EXECUTE.total, e + 1, "execute stat is incremented")<br>+<br>+os.exit(test:check() and 0 or 1)<br>-- <br>2.24.0</div></div><div> </div><div data-signature-widget="container"><div data-signature-widget="content"><div>--<br>Maria Khaydich</div></div></div></div></div></div></div><div> </div></BODY></HTML>