From 247515e98bf5739d1f4f3b7ace7bc41bc5f191f0 Mon Sep 17 00:00:00 2001 From: Nikita Pettik <korablev@tarantool.org> Date: Wed, 20 Apr 2022 17:59:59 +0300 Subject: [PATCH] box: add OS stubs for flight recorder requests This patch introduces two stubs: one to log incoming requests and another one to log outgoing responses. Log itself takes place in TX thread, in function family `tx_process_*`. At the start of TX processing we are able to use raw msgpack from input buffer to log it as it was received. In the same way we can log raw msgpack for responses (before sending message to IProto thread). NO_DOC=<No user visible changes> NO_TEST=<No functional changes> NO_CHANGELOG=<No functional changes> --- src/box/box.cc | 5 ++++- src/box/flightrec.h | 33 +++++++++++++++++++++++++++++++-- src/box/iproto.cc | 6 +++++- src/box/lua/load_cfg.lua | 6 ++++++ src/main.cc | 5 ++++- test/app-tap/init_script.result | 3 +++ test/box/admin.result | 6 ++++++ test/box/cfg.result | 12 ++++++++++++ 8 files changed, 71 insertions(+), 5 deletions(-) diff --git a/src/box/box.cc b/src/box/box.cc index a3c71885ad..b635f12c58 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -784,7 +784,10 @@ box_check_flightrec(void) cfg_geti64("flightrec_logs_max_msg_size"), cfg_geti("flightrec_logs_log_level"), cfg_getd("flightrec_metrics_interval"), - cfg_geti64("flightrec_metrics_period")) != 0) + cfg_geti64("flightrec_metrics_period"), + cfg_geti64("flightrec_requests_size"), + cfg_geti64("flightrec_requests_max_req_size"), + cfg_geti64("flightrec_requests_max_res_size")) != 0) diag_raise(); } diff --git a/src/box/flightrec.h b/src/box/flightrec.h index 566e7cad7a..0544e071e7 100644 --- a/src/box/flightrec.h +++ b/src/box/flightrec.h @@ -25,7 +25,9 @@ extern "C" { static inline void flightrec_init(const char *fr_dirname, size_t logs_size, size_t logs_max_msg_size, int logs_log_level, - double metrics_interval, size_t metrics_period) + double metrics_interval, size_t metrics_period, + size_t requests_size, size_t requests_max_req_size, + size_t requests_max_res_size) { (void)fr_dirname; (void)logs_size; @@ -33,6 +35,9 @@ flightrec_init(const char *fr_dirname, size_t logs_size, (void)logs_log_level; (void)metrics_interval; (void)metrics_period; + (void)requests_size; + (void)requests_max_req_size; + (void)requests_max_res_size; say_error("Flight recorder is not available in this build"); } @@ -46,16 +51,40 @@ flightrec_free(void) static inline int flightrec_check_cfg(int64_t logs_size, int64_t logs_max_msg_size, int logs_log_level, double metrics_interval, - int64_t metrics_period) + int64_t metrics_period, int64_t requests_size, + int64_t requests_max_req_size, + int64_t requests_max_res_size) { (void)logs_size; (void)logs_max_msg_size; (void)logs_log_level; (void)metrics_interval; (void)metrics_period; + (void)requests_size; + (void)requests_max_req_size; + (void)requests_max_res_size; return 0; } +/** No-op in OS version. */ +static inline void +flightrec_write_request(char *request_mspack, size_t len) +{ + (void)request_mspack; + (void)len; +} + +struct obuf; +struct obuf_svp; + +/** No-op in OS version. */ +static inline void +flightrec_write_response(struct obuf *buf, struct obuf_svp *svp) +{ + (void)buf; + (void)svp; +} + #if defined(__cplusplus) } /* extern "C" */ #endif /* defined(__cplusplus) */ diff --git a/src/box/iproto.cc b/src/box/iproto.cc index 78815938d2..8a457239ad 100644 --- a/src/box/iproto.cc +++ b/src/box/iproto.cc @@ -70,6 +70,7 @@ #include "assoc.h" #include "txn.h" #include "on_shutdown.h" +#include "flightrec.h" enum { IPROTO_SALT_SIZE = 32, @@ -1883,6 +1884,7 @@ tx_accept_msg(struct cmsg *m) msg->connection->iproto_thread->tx.requests_in_progress++; rmean_collect(msg->connection->iproto_thread->tx.rmean, REQUESTS_IN_PROGRESS, 1); + flightrec_write_request(msg->p_ibuf->rpos, msg->len); return msg; } @@ -1894,7 +1896,9 @@ tx_end_msg(struct iproto_msg *msg, struct obuf_svp *svp) msg->stream->txn = txn_detach(); } msg->connection->iproto_thread->tx.requests_in_progress--; - (void)svp; + /* Log response to the flight recorder. */ + struct obuf *out = msg->connection->tx.p_obuf; + flightrec_write_response(out, svp); } /** diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua index 50d0b4f9f1..11cc52aff5 100644 --- a/src/box/lua/load_cfg.lua +++ b/src/box/lua/load_cfg.lua @@ -79,6 +79,9 @@ local default_cfg = { flightrec_logs_log_level = 6, flightrec_metrics_interval = 1.0, flightrec_metrics_period = 60 * 3, + flightrec_requests_size = 10485760, + flightrec_requests_max_req_size = 16384, + flightrec_requests_max_res_size = 16384, io_collect_interval = nil, readahead = 16320, @@ -202,6 +205,9 @@ local template_cfg = { flightrec_logs_log_level = 'number', flightrec_metrics_interval = 'number', flightrec_metrics_period = 'number', + flightrec_requests_size = 'number', + flightrec_requests_max_req_size = 'number', + flightrec_requests_max_res_size = 'number', io_collect_interval = 'number', readahead = 'number', diff --git a/src/main.cc b/src/main.cc index ffef0eb51f..a424073ed9 100644 --- a/src/main.cc +++ b/src/main.cc @@ -473,7 +473,10 @@ load_cfg(void) cfg_geti64("flightrec_logs_max_msg_size"), cfg_geti("flightrec_logs_log_level"), cfg_getd("flightrec_metrics_interval"), - cfg_geti("flightrec_metrics_period")); + cfg_geti("flightrec_metrics_period"), + cfg_geti("flightrec_requests_size"), + cfg_geti("flightrec_requests_max_req_size"), + cfg_geti("flightrec_requests_max_res_size")); } memtx_tx_manager_use_mvcc_engine = cfg_getb("memtx_use_mvcc_engine"); diff --git a/test/app-tap/init_script.result b/test/app-tap/init_script.result index ad79f6598a..d987b253d7 100644 --- a/test/app-tap/init_script.result +++ b/test/app-tap/init_script.result @@ -24,6 +24,9 @@ flightrec_logs_max_msg_size:4096 flightrec_logs_size:10485760 flightrec_metrics_interval:1 flightrec_metrics_period:180 +flightrec_requests_max_req_size:16384 +flightrec_requests_max_res_size:16384 +flightrec_requests_size:10485760 force_recovery:false hot_standby:false iproto_threads:1 diff --git a/test/box/admin.result b/test/box/admin.result index e5fabc4753..e77289e948 100644 --- a/test/box/admin.result +++ b/test/box/admin.result @@ -69,6 +69,12 @@ cfg_filter(box.cfg) - 1 - - flightrec_metrics_period - 180 + - - flightrec_requests_max_req_size + - 16384 + - - flightrec_requests_max_res_size + - 16384 + - - flightrec_requests_size + - 10485760 - - force_recovery - false - - hot_standby diff --git a/test/box/cfg.result b/test/box/cfg.result index 8112032ce2..c4e30fcece 100644 --- a/test/box/cfg.result +++ b/test/box/cfg.result @@ -57,6 +57,12 @@ cfg_filter(box.cfg) | - 1 | - - flightrec_metrics_period | - 180 + | - - flightrec_requests_max_req_size + | - 16384 + | - - flightrec_requests_max_res_size + | - 16384 + | - - flightrec_requests_size + | - 10485760 | - - force_recovery | - false | - - hot_standby @@ -210,6 +216,12 @@ cfg_filter(box.cfg) | - 1 | - - flightrec_metrics_period | - 180 + | - - flightrec_requests_max_req_size + | - 16384 + | - - flightrec_requests_max_res_size + | - 16384 + | - - flightrec_requests_size + | - 10485760 | - - force_recovery | - false | - - hot_standby -- GitLab