diff options
author | Costa Tsaousis <costa@netdata.cloud> | 2024-01-14 13:31:37 +0200 |
---|---|---|
committer | Tasos Katsoulas <12612986+tkatsoulas@users.noreply.github.com> | 2024-02-06 16:33:22 +0200 |
commit | 8df707138822f4635810ffd0045c082474c2d4eb (patch) | |
tree | 999e45ac01343db6381cc7af1d29c847f5a854d3 | |
parent | 4209f0af4103daa9b1cf71471cbcaf23659862a9 (diff) |
Cherry pick from 989c856c5bd11c5c1c42b587541858ee992a1a5b
Fix labels corruption on duplicate key/values
Fix issue when logging during fatal exit of the agent
-rw-r--r-- | database/rrdlabels.c | 9 | ||||
-rw-r--r-- | libnetdata/log/log.c | 13 |
2 files changed, 18 insertions, 4 deletions
diff --git a/database/rrdlabels.c b/database/rrdlabels.c index 27f2878cdc..9187f63bca 100644 --- a/database/rrdlabels.c +++ b/database/rrdlabels.c @@ -710,10 +710,13 @@ static void labels_add_already_sanitized(RRDLABELS *labels, const char *key, con if(*PValue) { new_ls |= RRDLABEL_FLAG_OLD; + *((RRDLABEL_SRC *)PValue) = new_ls; + delete_label(new_label); } else { new_ls |= RRDLABEL_FLAG_NEW; + *((RRDLABEL_SRC *)PValue) = new_ls; RRDLABEL *old_label_with_same_key = rrdlabels_find_label_with_key_unsafe(labels, new_label); if (old_label_with_same_key) { @@ -723,7 +726,6 @@ static void labels_add_already_sanitized(RRDLABELS *labels, const char *key, con } labels->version++; - *((RRDLABEL_SRC *)PValue) = new_ls; size_t mem_after_judyl = JudyLMemUsed(labels->JudyL); STATS_PLUS_MEMORY(&dictionary_stats_category_rrdlabels, 0, mem_after_judyl - mem_before_judyl, 0); @@ -1465,9 +1467,12 @@ static int rrdlabels_unittest_double_check() rrdlabels_add(labels, "key1", "value1", RRDLABEL_SRC_CONFIG); ret += rrdlabels_unittest_expect_value(labels, "key1", "value1", RRDLABEL_FLAG_NEW); - rrdlabels_add(labels, "key1", "value2", RRDLABEL_SRC_CONFIG); + rrdlabels_add(labels, "key1", "value2", RRDLABEL_SRC_K8S); ret += !rrdlabels_unittest_expect_value(labels, "key1", "value2", RRDLABEL_FLAG_OLD); + rrdlabels_add(labels, "key1", "value3", RRDLABEL_SRC_ACLK); + ret += !rrdlabels_unittest_expect_value(labels, "key1", "value3", RRDLABEL_FLAG_OLD); + ret += (rrdlabels_entries(labels) != 1); rrdlabels_destroy(labels); diff --git a/libnetdata/log/log.c b/libnetdata/log/log.c index 4d46557b97..a7300cf36c 100644 --- a/libnetdata/log/log.c +++ b/libnetdata/log/log.c @@ -2132,8 +2132,8 @@ static void nd_logger(const char *file, const char *function, const unsigned lon if(likely(!thread_log_fields[NDF_TID].entry.set)) thread_log_fields[NDF_TID].entry = ND_LOG_FIELD_U64(NDF_TID, gettid()); + char os_threadname[NETDATA_THREAD_NAME_MAX + 1]; if(likely(!thread_log_fields[NDF_THREAD_TAG].entry.set)) { - char os_threadname[NETDATA_THREAD_NAME_MAX + 1]; const char *thread_tag = netdata_thread_tag(); if(!netdata_thread_tag_exists()) { if (!netdata_thread_tag_exists()) { @@ -2282,7 +2282,16 @@ void netdata_logger_fatal( const char *file, const char *function, const unsigne snprintfz(action_data, 70, "%04lu@%-10.10s:%-15.15s/%d", line, file, function, saved_errno); char action_result[60+1]; - const char *thread_tag = thread_log_fields[NDF_THREAD_TAG].entry.txt; + char os_threadname[NETDATA_THREAD_NAME_MAX + 1]; + const char *thread_tag = netdata_thread_tag(); + if(!netdata_thread_tag_exists()) { + if (!netdata_thread_tag_exists()) { + os_thread_get_current_name_np(os_threadname); + if ('\0' != os_threadname[0]) + /* If it is not an empty string replace "MAIN" thread_tag */ + thread_tag = os_threadname; + } + } if(!thread_tag) thread_tag = "UNKNOWN"; |