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