summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCosta Tsaousis <costa@netdata.cloud>2024-01-14 13:31:37 +0200
committerTasos Katsoulas <12612986+tkatsoulas@users.noreply.github.com>2024-02-06 16:33:22 +0200
commit8df707138822f4635810ffd0045c082474c2d4eb (patch)
tree999e45ac01343db6381cc7af1d29c847f5a854d3
parent4209f0af4103daa9b1cf71471cbcaf23659862a9 (diff)
Fix labels corruption on duplicate key/values Fix issue when logging during fatal exit of the agent
-rw-r--r--database/rrdlabels.c9
-rw-r--r--libnetdata/log/log.c13
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";