From 04802e4112b679f928a0aa51d78f1f1e5b3ab931 Mon Sep 17 00:00:00 2001 From: Daniil Medvedev <medvdanil@gmail.com> Date: Mon, 31 Aug 2015 18:20:07 +0300 Subject: [PATCH] gh-798 & gh-838: exceptions and space:get() added in box.stat() --- src/box/box.cc | 2 ++ src/box/error.cc | 9 +++++++++ src/box/error.h | 11 +++++++++++ src/box/index.cc | 5 +++++ src/box/iproto.cc | 11 +---------- src/box/lua/stat.cc | 7 ++++++- src/cbus.cc | 14 ++++++++++---- src/cbus.h | 5 +++-- src/rmean.h | 1 + test/box/misc.result | 1 + test/box/stat.result | 17 +++++++++++++++++ test/box/stat.test.lua | 6 ++++++ test/box/stat_net.result | 3 +++ test/box/stat_net.test.lua | 3 +++ test/unit/CMakeLists.txt | 3 ++- 15 files changed, 80 insertions(+), 18 deletions(-) diff --git a/src/box/box.cc b/src/box/box.cc index 3288794d37..56421e2399 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -583,6 +583,7 @@ box_free(void) tuple_free(); port_free(); engine_shutdown(); + rmean_delete(rmean_error); rmean_delete(rmean_box); } } @@ -616,6 +617,7 @@ box_init(void) cfg_getd("slab_alloc_factor")); rmean_box = rmean_new(iproto_type_strs, IPROTO_TYPE_STAT_MAX); + rmean_error = rmean_new(rmean_error_strings, RMEAN_ERROR_LAST); engine_init(); diff --git a/src/box/error.cc b/src/box/error.cc index 789ffc6f62..ce13f90c75 100644 --- a/src/box/error.cc +++ b/src/box/error.cc @@ -32,6 +32,11 @@ #include <stdio.h> #include <fiber.h> +struct rmean *rmean_error = NULL; + +const char *rmean_error_strings[RMEAN_ERROR_LAST] = { + "EXCEPTION" +}; static struct method clienterror_methods[] = { make_method(&type_ClientError, "code", &ClientError::errcode), @@ -49,6 +54,8 @@ ClientError::ClientError(const char *file, unsigned line, va_start(ap, errcode); vsnprintf(m_errmsg, sizeof(m_errmsg), tnt_errcode_desc(m_errcode), ap); + if (rmean_error) + rmean_collect(rmean_error, RMEAN_ERROR_EXCEPTION, 1); va_end(ap); } @@ -59,6 +66,8 @@ ClientError::ClientError(const char *file, unsigned line, const char *msg, m_errcode = errcode; strncpy(m_errmsg, msg, sizeof(m_errmsg) - 1); m_errmsg[sizeof(m_errmsg) - 1] = 0; + if (rmean_error) + rmean_collect(rmean_error, RMEAN_ERROR_EXCEPTION, 1); } void diff --git a/src/box/error.h b/src/box/error.h index 1e3deab61b..21146815ec 100644 --- a/src/box/error.h +++ b/src/box/error.h @@ -32,6 +32,17 @@ */ #include "errcode.h" #include "exception.h" +#include "rmean.h" + +extern struct rmean *rmean_error; + +enum rmean_error_name { + RMEAN_ERROR_EXCEPTION, + + RMEAN_ERROR_LAST +}; +extern const char *rmean_error_strings[RMEAN_ERROR_LAST]; + extern const struct type type_ClientError; class ClientError: public Exception { diff --git a/src/box/index.cc b/src/box/index.cc index 8d52481c73..7b5e31456b 100644 --- a/src/box/index.cc +++ b/src/box/index.cc @@ -34,6 +34,8 @@ #include "schema.h" #include "user_def.h" #include "space.h" +#include "iproto_constants.h" +#include "request.h" const char *iterator_type_strs[] = { /* [ITER_EQ] = */ "EQ", @@ -305,6 +307,9 @@ box_index_get(uint32_t space_id, uint32_t index_id, const char *key, uint32_t part_count = key ? mp_decode_array(&key) : 0; primary_key_validate(index->key_def, key, part_count); struct tuple *tuple = index->findByKey(key, part_count); + /* Count statistics */ + rmean_collect(rmean_box, IPROTO_SELECT, 1); + *result = tuple_bless_null(tuple); return 0; } catch (Exception *) { diff --git a/src/box/iproto.cc b/src/box/iproto.cc index e9612def32..1c422f9a8c 100644 --- a/src/box/iproto.cc +++ b/src/box/iproto.cc @@ -55,13 +55,6 @@ /* {{{ iproto_msg - declaration */ -const char *rmean_net_names[RMEAN_NET_LAST] = { - "EVENTS", - "LOCKS", - "RECEIVED", - "SENT" -}; - /** * A single msg from io thread. All requests @@ -865,8 +858,7 @@ net_cord_f(va_list /* ap */) /* Init statistics counter */ - rmean_net = rmean_new(rmean_net_names, RMEAN_NET_LAST); - rmean_cbus_is_count = true; + rmean_net = rmean_new(rmean_net_strings, RMEAN_NET_LAST); if (rmean_net == NULL) tnt_raise(OutOfMemory, @@ -884,7 +876,6 @@ net_cord_f(va_list /* ap */) */ fiber_yield(); - rmean_cbus_is_count = false; rmean_delete(rmean_net); } diff --git a/src/box/lua/stat.cc b/src/box/lua/stat.cc index add58243f1..efdc1d3121 100644 --- a/src/box/lua/stat.cc +++ b/src/box/lua/stat.cc @@ -35,6 +35,7 @@ #include <rmean.h> #include <box/request.h> #include <cbus.h> +#include <box/error.h> extern "C" { #include <lua.h> @@ -92,7 +93,10 @@ static int lbox_stat_index(struct lua_State *L) { luaL_checkstring(L, -1); - return rmean_foreach(rmean_box, seek_stat_item, L); + int res = rmean_foreach(rmean_box, seek_stat_item, L); + if (res) + return res; + return rmean_foreach(rmean_error, seek_stat_item, L); } static int @@ -100,6 +104,7 @@ lbox_stat_call(struct lua_State *L) { lua_newtable(L); rmean_foreach(rmean_box, set_stat_item, L); + rmean_foreach(rmean_error, set_stat_item, L); return 1; } diff --git a/src/cbus.cc b/src/cbus.cc index b6267905d4..abfb6c2bcc 100644 --- a/src/cbus.cc +++ b/src/cbus.cc @@ -31,9 +31,15 @@ #include "cbus.h" #include "scoped_guard.h" -struct rmean *rmean_net; +struct rmean *rmean_net = NULL; +const char *rmean_net_strings[RMEAN_NET_LAST] = { + "EVENTS", + "LOCKS", + "RECEIVED", + "SENT" +}; + -bool rmean_cbus_is_count = 0; static void cbus_flush_cb(ev_loop * /* loop */, struct ev_async *watcher, @@ -191,7 +197,7 @@ cbus_flush_cb(ev_loop * /* loop */, struct ev_async *watcher, pipe->n_input = 0; if (pipe_was_empty) { /* Count statistics */ - if (rmean_cbus_is_count) + if (rmean_net) rmean_collect(rmean_net, RMEAN_NET_EVENTS, 1); ev_async_send(pipe->consumer, &pipe->fetch_output); @@ -223,7 +229,7 @@ cpipe_peek_impl(struct cpipe *pipe) if (peer_pipe_was_empty) { /* Count statistics */ - if (rmean_cbus_is_count) + if (rmean_net) rmean_collect(rmean_net, RMEAN_NET_EVENTS, 1); ev_async_send(peer->consumer, &peer->fetch_output); diff --git a/src/cbus.h b/src/cbus.h index 650d54dd6d..3b717d3699 100644 --- a/src/cbus.h +++ b/src/cbus.h @@ -42,7 +42,6 @@ typedef void (*cmsg_f)(struct cmsg *); /** rmean_net - network statistics (iproto & cbus) */ extern struct rmean *rmean_net; -extern bool rmean_cbus_is_count; enum rmean_net_name { RMEAN_NET_EVENTS, @@ -53,6 +52,8 @@ enum rmean_net_name { RMEAN_NET_LAST }; +extern const char *rmean_net_strings[RMEAN_NET_LAST]; + /** * One hop in a message travel route. A message may need to be * delivered to many destinations before it can be dispensed with. @@ -379,7 +380,7 @@ static inline void cbus_lock(struct cbus *bus) { /* Count statistics */ - if (rmean_cbus_is_count) + if (rmean_net) rmean_collect(rmean_net, RMEAN_NET_LOCKS, 1); tt_pthread_mutex_lock(&bus->mutex); diff --git a/src/rmean.h b/src/rmean.h index 5b980b620c..b6dd5848a9 100644 --- a/src/rmean.h +++ b/src/rmean.h @@ -39,6 +39,7 @@ #define PERF_SECS 5 + struct stats { const char *name; int64_t value[PERF_SECS + 1]; diff --git a/test/box/misc.result b/test/box/misc.result index 24a3d4705e..900b2c89de 100644 --- a/test/box/misc.result +++ b/test/box/misc.result @@ -142,6 +142,7 @@ t; - SELECT - INSERT - EVAL + - EXCEPTION - CALL - REPLACE - UPSERT diff --git a/test/box/stat.result b/test/box/stat.result index f497bce295..4d706748ea 100644 --- a/test/box/stat.result +++ b/test/box/stat.result @@ -21,6 +21,10 @@ box.stat.SELECT.total --- - 0 ... +box.stat.EXCEPTION.total +--- +- 0 +... space = box.schema.space.create('tweedledum') --- ... @@ -50,6 +54,15 @@ box.stat.REPLACE.total ... box.stat.SELECT.total --- +- 2 +... +-- check exceptions +space:get('Impossible value') +--- +- error: 'Supplied key type of part 0 does not match index part type: expected NUM' +... +box.stat.EXCEPTION.total +--- - 1 ... --# stop server default @@ -75,6 +88,10 @@ box.stat.SELECT.total --- - 0 ... +box.stat.EXCEPTION.total +--- +- 0 +... -- cleanup box.space.tweedledum:drop() --- diff --git a/test/box/stat.test.lua b/test/box/stat.test.lua index 5ff384a4d1..834c06b18c 100644 --- a/test/box/stat.test.lua +++ b/test/box/stat.test.lua @@ -6,6 +6,7 @@ box.stat.DELETE.total box.stat.UPDATE.total box.stat.REPLACE.total box.stat.SELECT.total +box.stat.EXCEPTION.total space = box.schema.space.create('tweedledum') index = space:create_index('primary', { type = 'hash' }) @@ -19,6 +20,10 @@ box.stat.UPDATE.total box.stat.REPLACE.total box.stat.SELECT.total +-- check exceptions +space:get('Impossible value') +box.stat.EXCEPTION.total + --# stop server default --# start server default @@ -28,6 +33,7 @@ box.stat.DELETE.total box.stat.UPDATE.total box.stat.REPLACE.total box.stat.SELECT.total +box.stat.EXCEPTION.total -- cleanup box.space.tweedledum:drop() diff --git a/test/box/stat_net.result b/test/box/stat_net.result index 5b5866c738..fa3ca518dc 100644 --- a/test/box/stat_net.result +++ b/test/box/stat_net.result @@ -1,3 +1,6 @@ +-- clear statistics +--# stop server default +--# start server default box.stat.net.SENT -- zero --- - total: 0 diff --git a/test/box/stat_net.test.lua b/test/box/stat_net.test.lua index 87049db69c..62eaf09ecf 100644 --- a/test/box/stat_net.test.lua +++ b/test/box/stat_net.test.lua @@ -1,3 +1,6 @@ +-- clear statistics +--# stop server default +--# start server default box.stat.net.SENT -- zero box.stat.net.RECEIVED -- zero diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 384fc7674f..c86a062ad7 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -60,7 +60,8 @@ target_link_libraries(light.test small) add_executable(vclock.test vclock.cc unit.c ${CMAKE_SOURCE_DIR}/src/box/vclock.c ${CMAKE_SOURCE_DIR}/src/box/errcode.c - ${CMAKE_SOURCE_DIR}/src/box/error.cc) + ${CMAKE_SOURCE_DIR}/src/box/error.cc + ${CMAKE_SOURCE_DIR}/src/rmean.cc) target_link_libraries(vclock.test core small) add_executable(quota.test quota.cc unit.c) target_link_libraries(quota.test pthread) -- GitLab