From: Cyrill Gorcunov <gorcunov@gmail.com> To: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Cc: TML <tarantool-patches@dev.tarantool.org> Subject: Re: [Tarantool-patches] [PATCH v4 4/4] crash: report crash data to the feedback server Date: Wed, 16 Dec 2020 23:31:06 +0300 [thread overview] Message-ID: <20201216203106.GC14556@grain> (raw) In-Reply-To: <20201216111606.GA14556@grain> Vlad, take a look please once time permit. I put the whole patch here because changes are significant. - more strict checks for buffer overrides whe filling report - shrink bactrace buffer down to 1K, should be enough - use lbox_ interface for crashinfo configuration - setup env variable to address recursive crashes I desided to not switch to pipes because this requires more changes in the script but I think we could swicth to pipes at any moment if we choose. --- Subject: [PATCH] crash: report crash data to the feedback server We have a feedback server which gathers information about a running instance. While general info is enough for now we may loose a precious information about crashes (such as call backtrace which caused the issue, type of build and etc). In the commit we add support of sending this kind of information to the feedback server. Internally we gather the reason of failure, pack it into base64 form and then run another Tarantool instance which sends it out. A typical report might look like | { | "crashdump": { | "version": "1", | "data": "eyJ1bmFtZSI6eyJzeXNuYW1lIjoiTGludXgiLCJyZWxlYXNlIjoiNS" | "45LjExLTEwMC5mYzMyLng4Nl82NCIsInZlcnNpb24iOiIjMSBTTVAg" | "VHVlIE5vdiAyNCAxOToxNjo1MyBVVEMgMjAyMCIsIm1hY2hpbmUiOi" | "J4ODZfNjQifSwiYnVpbGQiOnsidmVyc2lvbiI6IjIuNy4wLTgzLWc5" | "ZTg1MDM4ZmIiLCJjbWFrZV90eXBlIjoiTGludXgteDg2XzY0LURlYn" | "VnIn0sInNpZ25hbCI6eyJzaWdubyI6MTEsInNpX2NvZGUiOjAsInNp" | "X2FkZHIiOiIweDNlODAwMDVjOGE5IiwiYmFja3RyYWNlIjoiSXpBZ0" | "lEQjROak14WkRBeklHbHVJR055WVhOb1gyTnZiR3hsWTNRclltWUtJ" | "ekVnSURCNE5qTXlaV1JoSUdsdUlHTnlZWE5vWDNOcFoyNWhiRjlqWW" | "lzMU1Rb2pNaUFnTUhnM1pqRmtORGt5TXpsaE9UQWdhVzRnWm5WdWJH" | "OWphMlpwYkdVck5qQUtJek1nSURCNE4yWXhaRFE0WkdReFl6VmxJR2" | "x1SUdWd2IyeHNYM2RoYVhRck5XVUtJelFnSURCNE9ETTNOekV6SUds" | "dUlHVndiMnhzWDNCdmJHd3JPVGtLSXpVZ0lEQjRPRE5oWkRRNElHbH" | "VJR1YyWDNKMWJpczBPRGNLSXpZZ0lEQjROakJtTUdGbElHbHVJSFJo" | "Y21GdWRHOXZiRjlzZFdGZmNuVnVYM05qY21sd2RDc3hNemdLSXpjZ0" | "lEQjRORFEyTldZMUlHbHVJRzFoYVc0ck5XRmpDaU00SUNBd2VEZG1N" | "V1EwT0dObU56QTBNaUJwYmlCZlgyeHBZbU5mYzNSaGNuUmZiV0ZwYm" | "l0bU1nb2pPU0FnTUhnME5EUmhNR1VnYVc0Z1gzTjBZWEowS3pKbENn" | "PT0iLCJ0aW1lc3RhbXAiOiIyMDIwLTEyLTEwIDE3OjA4OjQyIE1TSyJ9fQ==" | } | } The `data` value is a single string I wrapped it for commit message only. When `data` is decoded it consists of | { | "uname": { | "sysname": "Linux", | "release": "5.9.11-100.fc32.x86_64", | "version": "#1 SMP Tue Nov 24 19:16:53 UTC 2020", | "machine": "x86_64" | }, | "build": { | "version": "2.7.0-83-g9e85038fb", | "cmake_type": "Linux-x86_64-Debug" | }, | "signal": { | "signo": 11, | "si_code": 0, | "si_addr": "0x3e80005c8a9", | "backtrace": "IzAgIDB4NjMxZDAzIGluIGNyYXNoX2NvbGxlY3QrYmYKIzEgID" | "B4NjMyZWRhIGluIGNyYXNoX3NpZ25hbF9jYis1MQojMiAgMHg3ZjFkNDkyMzlhO" | "TAgaW4gZnVubG9ja2ZpbGUrNjAKIzMgIDB4N2YxZDQ4ZGQxYzVlIGluIGVwb2xs" | "X3dhaXQrNWUKIzQgIDB4ODM3NzEzIGluIGVwb2xsX3BvbGwrOTkKIzUgIDB4ODN" | "hZDQ4IGluIGV2X3J1bis0ODcKIzYgIDB4NjBmMGFlIGluIHRhcmFudG9vbF9sdW" | "FfcnVuX3NjcmlwdCsxMzgKIzcgIDB4NDQ2NWY1IGluIG1haW4rNWFjCiM4ICAwe" | "DdmMWQ0OGNmNzA0MiBpbiBfX2xpYmNfc3RhcnRfbWFpbitmMgojOSAgMHg0NDRh" | "MGUgaW4gX3N0YXJ0KzJlCg==", | "timestamp": "2020-12-10 17:08:42 MSK" | } | } The `backtrace` itself is encoded as base64 because of newline symbols (and may comprise some nonascii symbols as well). There is no simple way to test this so I did it manually: 1) Run instance with box.cfg{log_level = 8, feedback_host="127.0.0.1:1500"} 2) Run listener shell as while true ; do nc -l -p 1500 -c 'echo -e "HTTP/1.1 200 OK\n\n $(date)"'; done 3) Send SIGSEGV kill -11 `pidof tarantool` Once SIGSEGV is delivered the crashinfo data is generated and sent out. For debug purpose this data is also printed to the terminal on debug log level. Closes #5261 Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> @TarantoolBot document Title: Configuration update, allow to disable sending crash information For better analysis of program crashes the information associated with the crash such as - utsname (similar to `uname -a` output except the network name) - build information - reason for a crash - call backtrace is sent to the feedback server. To disable it set `feedback_crashinfo` to `false`. --- src/box/box.cc | 16 ++ src/box/box.h | 1 + src/box/lua/cfg.cc | 12 ++ src/box/lua/load_cfg.lua | 6 +- src/lib/core/CMakeLists.txt | 2 +- src/lib/core/crash.c | 279 +++++++++++++++++++++++++++++++- src/lib/core/crash.h | 18 +++ src/main.cc | 1 + test/app-tap/init_script.result | 1 + test/box/admin.result | 2 + test/box/cfg.result | 4 + 11 files changed, 338 insertions(+), 4 deletions(-) diff --git a/src/box/box.cc b/src/box/box.cc index a8bc3471d..27079fd46 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -74,6 +74,7 @@ #include "sql.h" #include "systemd.h" #include "call.h" +#include "crash.h" #include "func.h" #include "sequence.h" #include "sql_stmt_cache.h" @@ -1213,6 +1214,21 @@ box_set_prepared_stmt_cache_size(void) return 0; } +void +box_set_crash_params(void) +{ + const char *host = cfg_gets("feedback_host"); + bool is_enabled_1 = cfg_getb("feedback_enabled"); + bool is_enabled_2 = cfg_getb("feedback_crashinfo"); + + if (host != NULL && strlen(host) >= CRASH_FEEDBACK_HOST_MAX) { + tnt_raise(ClientError, ER_CFG, "feedback_host", + "the address is too long"); + } + + crash_cfg_set_params(host, is_enabled_1 && is_enabled_2); +} + /* }}} configuration bindings */ /** diff --git a/src/box/box.h b/src/box/box.h index b47a220b7..6792ade95 100644 --- a/src/box/box.h +++ b/src/box/box.h @@ -257,6 +257,7 @@ void box_set_replication_sync_timeout(void); void box_set_replication_skip_conflict(void); void box_set_replication_anon(void); void box_set_net_msg_max(void); +void box_set_crash_params(void); int box_set_prepared_stmt_cache_size(void); diff --git a/src/box/lua/cfg.cc b/src/box/lua/cfg.cc index 42805e602..089c770e8 100644 --- a/src/box/lua/cfg.cc +++ b/src/box/lua/cfg.cc @@ -375,6 +375,17 @@ lbox_cfg_set_replication_skip_conflict(struct lua_State *L) return 0; } +static int +lbox_cfg_set_crash_params(struct lua_State *L) +{ + try { + box_set_crash_params(); + } catch (Exception *) { + luaT_error(L); + } + return 0; +} + void box_lua_cfg_init(struct lua_State *L) { @@ -411,6 +422,7 @@ box_lua_cfg_init(struct lua_State *L) {"cfg_set_replication_anon", lbox_cfg_set_replication_anon}, {"cfg_set_net_msg_max", lbox_cfg_set_net_msg_max}, {"cfg_set_sql_cache_size", lbox_set_prepared_stmt_cache_size}, + {"cfg_set_crash_params", lbox_cfg_set_crash_params}, {NULL, NULL} }; diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua index 770442052..80009c7af 100644 --- a/src/box/lua/load_cfg.lua +++ b/src/box/lua/load_cfg.lua @@ -33,7 +33,8 @@ end local ifdef_feedback_set_params = private.feedback_daemon ~= nil and - private.feedback_daemon.set_feedback_params or nil + private.feedback_daemon.set_feedback_params and + private.cfg_set_crash_params or nil -- all available options local default_cfg = { @@ -99,6 +100,7 @@ local default_cfg = { replication_skip_conflict = false, replication_anon = false, feedback_enabled = true, + feedback_crashinfo = true, feedback_host = "https://feedback.tarantool.io", feedback_interval = 3600, net_msg_max = 768, @@ -179,6 +181,7 @@ local template_cfg = { replication_skip_conflict = 'boolean', replication_anon = 'boolean', feedback_enabled = ifdef_feedback('boolean'), + feedback_crashinfo = ifdef_feedback('boolean'), feedback_host = ifdef_feedback('string'), feedback_interval = ifdef_feedback('number'), net_msg_max = 'number', @@ -277,6 +280,7 @@ local dynamic_cfg = { checkpoint_wal_threshold = private.cfg_set_checkpoint_wal_threshold, worker_pool_threads = private.cfg_set_worker_pool_threads, feedback_enabled = ifdef_feedback_set_params, + feedback_crashinfo = ifdef_feedback_set_params, feedback_host = ifdef_feedback_set_params, feedback_interval = ifdef_feedback_set_params, -- do nothing, affects new replicas, which query this value on start diff --git a/src/lib/core/CMakeLists.txt b/src/lib/core/CMakeLists.txt index 30cf0dd15..358e98ea7 100644 --- a/src/lib/core/CMakeLists.txt +++ b/src/lib/core/CMakeLists.txt @@ -40,7 +40,7 @@ endif() add_library(core STATIC ${core_sources}) -target_link_libraries(core salad small uri decNumber bit ${LIBEV_LIBRARIES} +target_link_libraries(core salad small uri decNumber bit misc ${LIBEV_LIBRARIES} ${LIBEIO_LIBRARIES} ${LIBCORO_LIBRARIES} ${MSGPUCK_LIBRARIES} ${ICU_LIBRARIES}) diff --git a/src/lib/core/crash.c b/src/lib/core/crash.c index a15a13e8e..f6dd91987 100644 --- a/src/lib/core/crash.c +++ b/src/lib/core/crash.c @@ -7,16 +7,27 @@ #include <string.h> #include <unistd.h> #include <time.h> +#include <sys/types.h> +#include <sys/utsname.h> +#include "third_party/base64.h" +#include "small/static.h" #include "trivia/util.h" #include "backtrace.h" #include "crash.h" #include "say.h" #define pr_fmt(fmt) "crash: " fmt +#define pr_debug(fmt, ...) say_debug(pr_fmt(fmt), ##__VA_ARGS__) +#define pr_info(fmt, ...) say_info(pr_fmt(fmt), ##__VA_ARGS__) +#define pr_err(fmt, ...) say_error(pr_fmt(fmt), ##__VA_ARGS__) #define pr_syserr(fmt, ...) say_syserror(pr_fmt(fmt), ##__VA_ARGS__) +#define pr_crit(fmt, ...) fprintf(stderr, pr_fmt(fmt) "\n", ##__VA_ARGS__) #define pr_panic(fmt, ...) panic(pr_fmt(fmt), ##__VA_ARGS__) +/* Use strlcpy with destination as an array */ +#define strlcpy_a(dst, src) strlcpy(dst, src, sizeof(dst)) + #ifdef TARGET_OS_LINUX #ifndef __x86_64__ # error "Non x86-64 architectures are not supported" @@ -67,6 +78,10 @@ static struct crash_info { */ struct crash_greg greg; #endif + /** + * Timestamp in nanoseconds (realtime). + */ + uint64_t timestamp_rt; /** * Faulting address. */ @@ -81,13 +96,75 @@ static struct crash_info { int sicode; #ifdef ENABLE_BACKTRACE /* - * 4K of memory should be enough to keep the backtrace. + * 1K of memory should be enough to keep the backtrace. * In worst case it gonna be simply trimmed. */ - char backtrace_buf[4096]; + char backtrace_buf[1024]; #endif } crash_info; +static char tarantool_path[PATH_MAX]; +static char feedback_host[CRASH_FEEDBACK_HOST_MAX]; +static bool send_crashinfo = false; + +static inline uint64_t +timespec_to_ns(struct timespec *ts) +{ + return (uint64_t)ts->tv_sec * 1000000000 + (uint64_t)ts->tv_nsec; +} + +static char * +ns_to_localtime(uint64_t timestamp, char *buf, ssize_t len) +{ + time_t sec = timestamp / 1000000000; + char *start = buf; + struct tm tm; + + /* + * Use similar format as say_x logger. Except plain + * seconds should be enough. + */ + localtime_r(&sec, &tm); + ssize_t total = strftime(start, len, "%F %T %Z", &tm); + start += total; + if (total < len) + return buf; + buf[len - 1] = '\0'; + return buf; +} + +void +crash_init(const char *tarantool_bin) +{ + strlcpy_a(tarantool_path, tarantool_bin); + if (strlen(tarantool_path) < strlen(tarantool_bin)) + pr_panic("executable path is trimmed"); +} + +void +crash_cfg_set_params(const char *host, bool is_enabled) +{ + if (host == NULL || !is_enabled) { + if (send_crashinfo) { + pr_debug("disable sending crashinfo feedback"); + send_crashinfo = false; + feedback_host[0] = '\0'; + } + return; + } + + if (strcmp(feedback_host, host) != 0) { + strlcpy_a(feedback_host, host); + if (strlen(feedback_host) < strlen(host)) + pr_panic("feedback_host is too long"); + } + + if (!send_crashinfo) { + pr_debug("enable sending crashinfo feedback"); + send_crashinfo = true; + } +} + /** * The routine is called inside crash signal handler so * be careful to not cause additional signals inside. @@ -96,6 +173,12 @@ static struct crash_info * crash_collect(int signo, siginfo_t *siginfo, void *ucontext) { struct crash_info *cinfo = &crash_info; + struct timespec ts; + + if (clock_gettime(CLOCK_REALTIME, &ts) == 0) + cinfo->timestamp_rt = timespec_to_ns(&ts); + else + cinfo->timestamp_rt = 0; cinfo->signo = signo; cinfo->sicode = siginfo->si_code; @@ -126,6 +209,196 @@ crash_collect(int signo, siginfo_t *siginfo, void *ucontext) return cinfo; } +/** + * Mark an environment that we're in crashinfo handling, this + * allows us to escape recursive attempts to send report, + * if the action of sending report is failing itself. + */ +static int +crash_mark_env_mode(void) +{ + const char *env_name = "TT_CRASHINFO_MODE"; + if (getenv(env_name) != NULL) { + pr_crit("recursive failure detected"); + return -1; + } + + if (setenv(env_name, "y", 0) != 0) { + pr_crit("unable to setup %s", env_name); + return -1; + } + + return 0; +} + +/** + * Report crash information to the feedback daemon + * (ie send it to feedback daemon). + */ +static void +crash_report_feedback_daemon(struct crash_info *cinfo) +{ + if (crash_mark_env_mode() != 0) + return; + + /* + * Update to a new number if format get changed. + */ + const int crashinfo_version = 1; + + char *p = static_alloc(SMALL_STATIC_SIZE); + char *e = &p[SMALL_STATIC_SIZE - 1]; + char *head = p; + char *tail = &p[SMALL_STATIC_SIZE - 8]; + + /* + * Note that while we encode the report we + * intensively use a tail of the allocated + * buffer as a temporary store. + */ + +#define snprintf_safe(__end, __fmt, ...) \ + do { \ + size_t size = (char *)(void *)__end - p; \ + p += snprintf(p, size, __fmt, ##__VA_ARGS__); \ + if (p >= (char *)(void *)__end) \ + goto out; \ + } while (0) + + /* + * Lets reuse tail of the buffer as a temp space. + */ + struct utsname *uname_ptr = (void *)&tail[-sizeof(struct utsname)]; + if (p >= (char *)(void *)uname_ptr) + goto out; + + if (uname(uname_ptr) != 0) { + pr_syserr("uname call failed, ignore"); + memset(uname_ptr, 0, sizeof(struct utsname)); + } + + snprintf_safe(uname_ptr, "{"); + snprintf_safe(uname_ptr, "\"uname\":{"); + snprintf_safe(uname_ptr, "\"sysname\":\"%s\",", uname_ptr->sysname); + /* + * nodename might a sensitive information, skip. + */ + snprintf_safe(uname_ptr, "\"release\":\"%s\",", uname_ptr->release); + snprintf_safe(uname_ptr, "\"version\":\"%s\",", uname_ptr->version); + snprintf_safe(uname_ptr, "\"machine\":\"%s\"", uname_ptr->machine); + snprintf_safe(uname_ptr, "},"); + + snprintf_safe(e, "\"build\":{"); + snprintf_safe(e, "\"version\":\"%s\",", PACKAGE_VERSION); + snprintf_safe(e, "\"cmake_type\":\"%s\"", BUILD_INFO); + snprintf_safe(e, "},"); + + snprintf_safe(e, "\"signal\":{"); + snprintf_safe(e, "\"signo\":%d,", cinfo->signo); + snprintf_safe(e, "\"si_code\":%d,", cinfo->sicode); + if (cinfo->signo == SIGSEGV) { + if (cinfo->sicode == SEGV_MAPERR) { + snprintf_safe(e, "\"si_code_str\":\"%s\",", + "SEGV_MAPERR"); + } else if (cinfo->sicode == SEGV_ACCERR) { + snprintf_safe(e, "\"si_code_str\":\"%s\",", + "SEGV_ACCERR"); + } + snprintf_safe(e, "\"si_addr\":\"0x%llx\",", + (long long)cinfo->siaddr); + } + +#ifdef ENABLE_BACKTRACE + /* + * The backtrace itself is encoded into base64 form + * since it might have arbitrary symbols not suitable + * for json encoding (newlines and etc). + */ + size_t bt_len = strlen(cinfo->backtrace_buf); + size_t bt_elen = base64_bufsize(bt_len, BASE64_NOWRAP); + char *bt_base64 = &tail[-bt_elen]; + if (p >= bt_base64) + goto out; + base64_encode(cinfo->backtrace_buf, bt_len, + bt_base64, bt_elen, BASE64_NOWRAP); + bt_base64[bt_elen] = '\0'; + snprintf_safe(bt_base64, "\"backtrace\":\"%s\",", bt_base64); +#endif + + /* 64 bytes should be enough for longest localtime */ + char *timestamp_rt_str = &tail[-64]; + if (p >= timestamp_rt_str) + goto out; + ns_to_localtime(cinfo->timestamp_rt, timestamp_rt_str, 64); + snprintf_safe(timestamp_rt_str, "\"timestamp\":\"%s\"", timestamp_rt_str); + snprintf_safe(timestamp_rt_str, "}"); + snprintf_safe(timestamp_rt_str, "}"); + + size_t report_len = p - head; + size_t report_elen = base64_bufsize(report_len, BASE64_NOWRAP); + + char *report_base64 = &tail[-report_elen]; + if (p >= report_base64) + goto out; + base64_encode(head, report_len, report_base64, + report_elen, BASE64_NOWRAP); + report_base64[report_elen] = '\0'; + + /* + * Encoded report now sits at report_base64 position, + * at the tail of 'small' static buffer. Lets prepare + * the script to run. + */ + p = head; + snprintf_safe(report_base64, + "require(\'http.client\').post(\'%s\'," + "'{\"crashdump\":{\"version\":\"%d\"," + "\"data\": \"%s\"}}',{timeout=1});" + "os.exit(1);", feedback_host, + crashinfo_version, report_base64); + + pr_debug("crashinfo script: %s", head); + + char *exec_argv[4] = { + [0] = tarantool_path, + [1] = "-e", + [2] = head, + [3] = NULL, + }; + + /* + * Can't use fork here because libev has own + * at_fork helpers with mutex where we might + * stuck (see popen code). + */ + pid_t pid = vfork(); + if (pid == 0) { + /* + * Environment is needed for recursive + * crash protection. See crash_mark_env_mode + * above. + */ + extern char **environ; + /* + * The script must exit at the end but there + * is no simple way to make sure from inside + * of a signal crash handler. So just hope it + * is running fine. + */ + execve(exec_argv[0], exec_argv, environ); + pr_crit("exec(%s,[%s,%s,%s]) failed", + exec_argv[0], exec_argv[0], + exec_argv[1], exec_argv[2]); + _exit(1); + } else if (pid < 0) { + pr_crit("unable to vfork (errno %d)", errno); + } + + return; +out: + pr_crit("unable to prepare a crash report"); +} + /** * Report crash information to the stderr * (usually a current console). @@ -232,6 +505,8 @@ crash_signal_cb(int signo, siginfo_t *siginfo, void *context) in_cb = 1; cinfo = crash_collect(signo, siginfo, context); crash_report_stderr(cinfo); + if (send_crashinfo) + crash_report_feedback_daemon(cinfo); } else { /* Got a signal while running the handler. */ fprintf(stderr, "Fatal %d while backtracing", signo); diff --git a/src/lib/core/crash.h b/src/lib/core/crash.h index d107cd953..800d525e5 100644 --- a/src/lib/core/crash.h +++ b/src/lib/core/crash.h @@ -15,6 +15,24 @@ extern "C" { #endif /* defined(__cplusplus) */ +/** + * PATH_MAX is too big and 2K is recommended + * limit for web address. + */ +#define CRASH_FEEDBACK_HOST_MAX 2048 + +/** + * Initialize crash subsystem. + */ +void +crash_init(const char *tarantool_bin); + +/** + * Configure crash parameters. + */ +void +crash_cfg_set_params(const char *host, bool is_enabled); + /** * Initialize crash signal handlers. */ diff --git a/src/main.cc b/src/main.cc index 391e0f878..2fce81bb3 100644 --- a/src/main.cc +++ b/src/main.cc @@ -687,6 +687,7 @@ main(int argc, char **argv) title_set_script_name(argv[0]); } + crash_init(tarantool_bin); export_syms(); random_init(); diff --git a/test/app-tap/init_script.result b/test/app-tap/init_script.result index 72aa67db2..16c5b01d2 100644 --- a/test/app-tap/init_script.result +++ b/test/app-tap/init_script.result @@ -10,6 +10,7 @@ checkpoint_wal_threshold:1e+18 coredump:false election_mode:off election_timeout:5 +feedback_crashinfo:true feedback_enabled:true feedback_host:https://feedback.tarantool.io feedback_interval:3600 diff --git a/test/box/admin.result b/test/box/admin.result index e05440f66..05debe673 100644 --- a/test/box/admin.result +++ b/test/box/admin.result @@ -41,6 +41,8 @@ cfg_filter(box.cfg) - off - - election_timeout - 5 + - - feedback_crashinfo + - true - - feedback_enabled - true - - feedback_host diff --git a/test/box/cfg.result b/test/box/cfg.result index 10fef006c..22a720c2c 100644 --- a/test/box/cfg.result +++ b/test/box/cfg.result @@ -29,6 +29,8 @@ cfg_filter(box.cfg) | - off | - - election_timeout | - 5 + | - - feedback_crashinfo + | - true | - - feedback_enabled | - true | - - feedback_host @@ -142,6 +144,8 @@ cfg_filter(box.cfg) | - off | - - election_timeout | - 5 + | - - feedback_crashinfo + | - true | - - feedback_enabled | - true | - - feedback_host -- 2.26.2
next prev parent reply other threads:[~2020-12-16 20:31 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-12-10 16:18 [Tarantool-patches] [PATCH v4 0/4] crash: implement sending feedback Cyrill Gorcunov 2020-12-10 16:18 ` [Tarantool-patches] [PATCH v4 1/4] util: introduce strlcpy helper Cyrill Gorcunov 2020-12-11 7:34 ` Serge Petrenko 2020-12-11 7:58 ` Serge Petrenko 2020-12-11 10:04 ` Cyrill Gorcunov 2020-12-11 11:07 ` Serge Petrenko 2020-12-11 11:38 ` Cyrill Gorcunov 2020-12-14 22:54 ` Vladislav Shpilevoy 2020-12-14 22:54 ` Vladislav Shpilevoy 2020-12-15 8:47 ` Cyrill Gorcunov 2020-12-10 16:18 ` [Tarantool-patches] [PATCH v4 2/4] backtrace: allow to specify destination buffer Cyrill Gorcunov 2020-12-11 7:50 ` Serge Petrenko 2020-12-10 16:18 ` [Tarantool-patches] [PATCH v4 3/4] crash: move fatal signal handling in Cyrill Gorcunov 2020-12-11 9:31 ` Serge Petrenko 2020-12-11 10:38 ` Cyrill Gorcunov 2020-12-11 11:12 ` Serge Petrenko 2020-12-14 22:54 ` Vladislav Shpilevoy 2020-12-15 8:16 ` Cyrill Gorcunov 2020-12-20 14:48 ` Vladislav Shpilevoy 2020-12-20 15:49 ` Cyrill Gorcunov 2020-12-20 16:07 ` Vladislav Shpilevoy 2020-12-20 16:58 ` Cyrill Gorcunov 2020-12-20 15:45 ` Vladislav Shpilevoy 2020-12-10 16:18 ` [Tarantool-patches] [PATCH v4 4/4] crash: report crash data to the feedback server Cyrill Gorcunov 2020-12-11 12:57 ` Serge Petrenko 2020-12-12 16:19 ` Cyrill Gorcunov 2020-12-12 17:07 ` Cyrill Gorcunov 2020-12-14 9:41 ` Serge Petrenko 2020-12-14 22:54 ` Vladislav Shpilevoy 2020-12-16 11:16 ` Cyrill Gorcunov 2020-12-16 20:31 ` Cyrill Gorcunov [this message] 2020-12-20 15:16 ` Vladislav Shpilevoy 2020-12-20 18:26 ` Cyrill Gorcunov 2020-12-20 14:48 ` Vladislav Shpilevoy 2020-12-20 18:21 ` Cyrill Gorcunov 2020-12-20 18:41 ` Vladislav Shpilevoy 2020-12-20 19:16 ` Cyrill Gorcunov 2020-12-21 17:01 ` Vladislav Shpilevoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20201216203106.GC14556@grain \ --to=gorcunov@gmail.com \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v4 4/4] crash: report crash data to the feedback server' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox