From 4f115b93750a3837f9135930246d8a9fed535939 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Wed, 29 Mar 2023 16:36:58 +0800 Subject: [PATCH 1/2] fix(restful): check static value type matched when adding tags --- src/base/tag.c | 14 +++++++++++-- src/parser/neu_json_tag.c | 41 +++++++++++++++++++++++++++++++++++---- src/parser/neu_json_tag.h | 1 + 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/base/tag.c b/src/base/tag.c index 393234bf..6d7cce91 100644 --- a/src/base/tag.c +++ b/src/base/tag.c @@ -579,6 +579,12 @@ int neu_tag_set_static_value_json(neu_datatag_t *tag, neu_json_type_e t, case NEU_TYPE_UINT64: value.u64 = v->val_int; break; + case NEU_TYPE_FLOAT: + value.f32 = v->val_int; + break; + case NEU_TYPE_DOUBLE: + value.d64 = v->val_int; + break; default: rv = -1; break; @@ -588,14 +594,18 @@ int neu_tag_set_static_value_json(neu_datatag_t *tag, neu_json_type_e t, case NEU_JSON_FLOAT: { if (NEU_TYPE_FLOAT == tag->type) { value.f32 = v->val_float; + } else if (NEU_TYPE_DOUBLE == tag->type) { + value.d64 = v->val_float; } else { rv = -1; } break; } case NEU_JSON_DOUBLE: { - if (NEU_TYPE_DOUBLE == tag->type) { - value.d64 = v->val_float; + if (NEU_TYPE_FLOAT == tag->type) { + value.f32 = v->val_double; + } else if (NEU_TYPE_DOUBLE == tag->type) { + value.d64 = v->val_double; } else { rv = -1; } diff --git a/src/parser/neu_json_tag.c b/src/parser/neu_json_tag.c index d3b98a2c..93db2abe 100644 --- a/src/parser/neu_json_tag.c +++ b/src/parser/neu_json_tag.c @@ -31,6 +31,7 @@ #include "neu_json_tag.h" #include "tag.h" +#include "type.h" int neu_json_encode_tag(void *json_obj, void *param) { @@ -151,10 +152,7 @@ int neu_json_decode_tag_json(void *json_obj, neu_json_tag_t *tag_p) goto decode_fail; } - if (((NEU_ATTRIBUTE_STATIC & tag.attribute) && - NEU_JSON_UNDEFINE == tag.t) || - (!(NEU_ATTRIBUTE_STATIC & tag.attribute) && - NEU_JSON_UNDEFINE != tag.t)) { + if (!neu_json_tag_check_type(&tag)) { goto decode_fail; } @@ -176,6 +174,41 @@ void neu_json_decode_tag_fini(neu_json_tag_t *tag) } } +int neu_json_tag_check_type(neu_json_tag_t *tag) +{ + if (NEU_ATTRIBUTE_STATIC & tag->attribute) { + switch (tag->type) { + case NEU_TYPE_BIT: + case NEU_TYPE_INT8: + case NEU_TYPE_UINT8: + case NEU_TYPE_INT16: + case NEU_TYPE_UINT16: + case NEU_TYPE_INT32: + case NEU_TYPE_UINT32: + case NEU_TYPE_INT64: + case NEU_TYPE_UINT64: + case NEU_TYPE_WORD: + case NEU_TYPE_DWORD: + case NEU_TYPE_LWORD: + return NEU_JSON_INT == tag->t; + case NEU_TYPE_FLOAT: + case NEU_TYPE_DOUBLE: + return NEU_JSON_INT == tag->t || NEU_JSON_FLOAT == tag->t || + NEU_JSON_DOUBLE == tag->t; + case NEU_TYPE_BOOL: + return NEU_JSON_BOOL == tag->t; + case NEU_TYPE_BYTES: + case NEU_TYPE_STRING: + return NEU_JSON_STR == tag->t; + } + } else { + // non-static tag should have no initial value + return NEU_JSON_UNDEFINE == tag->t; + } + + return true; +} + int neu_json_encode_tag_array(void *json_obj, void *param) { neu_json_tag_array_t *array = param; diff --git a/src/parser/neu_json_tag.h b/src/parser/neu_json_tag.h index b6da5665..58a9ce0f 100644 --- a/src/parser/neu_json_tag.h +++ b/src/parser/neu_json_tag.h @@ -46,6 +46,7 @@ typedef struct { int neu_json_encode_tag(void *json_obj, void *param); int neu_json_decode_tag_json(void *json_obj, neu_json_tag_t *tag_p); void neu_json_decode_tag_fini(neu_json_tag_t *tag); +int neu_json_tag_check_type(neu_json_tag_t *tag); typedef struct { int len; From 11c4462c7a7cab01a079adafe9ecf8ecaced79de Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:03:59 +0800 Subject: [PATCH 2/2] fix: driver update only non-static tag value --- src/adapter/driver/driver.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/adapter/driver/driver.c b/src/adapter/driver/driver.c index ad4c6fde..069a2390 100644 --- a/src/adapter/driver/driver.c +++ b/src/adapter/driver/driver.c @@ -94,19 +94,23 @@ static void update(neu_adapter_t *adapter, const char *group, const char *tag, if (value.type == NEU_TYPE_ERROR && tag == NULL) { group_t *g = find_group(driver, group); if (g != NULL) { - UT_array *tags = neu_group_get_read_tag(g->group); + UT_array *tags = neu_group_get_read_tag(g->group); + uint64_t err_count = 0; utarray_foreach(tags, neu_datatag_t *, t) { + if (neu_tag_attribute_test(t, NEU_ATTRIBUTE_STATIC)) { + continue; + } neu_driver_cache_update(driver->cache, group, t->name, global_timestamp, value); + ++err_count; } - driver->adapter.cb_funs.update_metric(&driver->adapter, - NEU_METRIC_TAG_READS_TOTAL, - utarray_len(tags), NULL); driver->adapter.cb_funs.update_metric( - &driver->adapter, NEU_METRIC_TAG_READ_ERRORS_TOTAL, - utarray_len(tags), NULL); + &driver->adapter, NEU_METRIC_TAG_READS_TOTAL, err_count, NULL); + driver->adapter.cb_funs.update_metric( + &driver->adapter, NEU_METRIC_TAG_READ_ERRORS_TOTAL, err_count, + NULL); utarray_free(tags); } } else {