summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2023-10-18 17:21:08 +0800
committerchenzizhan <[email protected]>2023-10-18 17:21:08 +0800
commit4cb4ebc098772e4dc9e56b2b12abd660182e7877 (patch)
tree3f415ad04d7c754fa1f4ee89b1e80e3f9df5c84e
parentd45698e32ee38b6bba494bd5b4bacc5733a7ae27 (diff)
fix a bug when tagstring value very long
-rw-r--r--src/exporter/cjson_exporter.c1
-rw-r--r--src/tags/my_ut_hash.c28
-rw-r--r--test/test_register_and_reset.cpp27
3 files changed, 46 insertions, 10 deletions
diff --git a/src/exporter/cjson_exporter.c b/src/exporter/cjson_exporter.c
index bfd2bdc..47709f8 100644
--- a/src/exporter/cjson_exporter.c
+++ b/src/exporter/cjson_exporter.c
@@ -441,6 +441,7 @@ int cell_iter_next_cube(struct cell_iter *iter) {
fieldstat_get_cells_used_by_cube(instance, cube_id_next, &iter->tag_list, &iter->n_cell);
if (iter->n_cell == 0) {
free(iter->metric_ids);
+ iter->metric_ids = NULL;
continue;
}
diff --git a/src/tags/my_ut_hash.c b/src/tags/my_ut_hash.c
index 7b914ea..482fcd4 100644
--- a/src/tags/my_ut_hash.c
+++ b/src/tags/my_ut_hash.c
@@ -24,10 +24,11 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
int used_len = 0;
struct fieldstat_tag *tag = NULL;
- char one_time_key[1024] = {0};
- size_t tmp_key_size = sizeof(one_time_key);
- size_t remain_key_size = tmp_key_size;
- size_t total_key_size = tmp_key_size;
+ const size_t init_key_size = 1024;
+ size_t one_time_key_size = init_key_size;
+ char *one_time_key = (char *)malloc(init_key_size);
+ size_t remain_key_size = init_key_size;
+ size_t total_key_size = init_key_size;
char *dynamic_mem = (char *)malloc(remain_key_size);
size_t key_len;
size_t val_len;
@@ -41,6 +42,10 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
key_len = strlen(tag->key);
val_len = sizeof(long long);
used_len = key_len + val_len;
+ while (used_len >= one_time_key_size) {
+ one_time_key_size += init_key_size;
+ one_time_key = (char *)realloc(one_time_key, one_time_key_size);
+ }
memcpy(one_time_key, tag->key, key_len);
memcpy(one_time_key + key_len, &tag->value_longlong, val_len);
break;
@@ -48,6 +53,10 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
key_len = strlen(tag->key);
val_len = sizeof(double);
used_len = key_len + val_len;
+ while (used_len >= one_time_key_size) {
+ one_time_key_size += init_key_size;
+ one_time_key = (char *)realloc(one_time_key, one_time_key_size);
+ }
memcpy(one_time_key, tag->key, key_len);
memcpy(one_time_key + key_len, &tag->value_double, val_len);
break;
@@ -55,6 +64,10 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
key_len = strlen(tag->key);
val_len = strlen(tag->value_str);
used_len = key_len + val_len;
+ while (used_len >= one_time_key_size) {
+ one_time_key_size += init_key_size;
+ one_time_key = (char *)realloc(one_time_key, one_time_key_size);
+ }
memcpy(one_time_key, tag->key, key_len);
memcpy(one_time_key + key_len, tag->value_str, val_len);
break;
@@ -63,10 +76,10 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
break;
}
- if (used_len >= remain_key_size) {
- total_key_size += tmp_key_size;
+ while (used_len >= remain_key_size) {
+ total_key_size += init_key_size;
dynamic_mem = (char *)realloc(dynamic_mem, total_key_size);
- remain_key_size += tmp_key_size;
+ remain_key_size += init_key_size;
}
memcpy(dynamic_mem + total_key_size - remain_key_size, one_time_key, used_len);
@@ -79,6 +92,7 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
*out_key_size = total_key_size - remain_key_size; // not include '\0'
free(dynamic_mem);
+ free(one_time_key);
}
struct tag_hash_key {
diff --git a/test/test_register_and_reset.cpp b/test/test_register_and_reset.cpp
index bab3d7a..c29eb66 100644
--- a/test/test_register_and_reset.cpp
+++ b/test/test_register_and_reset.cpp
@@ -122,13 +122,13 @@ TEST(test_register, register_many_cubes)
fieldstat_free(instance);
}
-TEST(test_register, add_long_tagged_cells)
+TEST(test_register, add_many_tagged_cells)
{
struct fieldstat *instance = fieldstat_new();
int cube_id = fieldstat_create_cube(instance, &TEST_SHARED_TAG, 1, SAMPLING_MODE_COMPREHENSIVE, 10);
struct fieldstat_tag test_tag_long[100];
for (int i = 0; i < 100; i++) {
- test_tag_long[i] = TEST_TAG_INT;
+ test_tag_long[i] = TEST_TAG_INT; // will trigger realloc
}
int metric_id = fieldstat_register_counter(instance, "counter");
@@ -142,6 +142,28 @@ TEST(test_register, add_long_tagged_cells)
fieldstat_free(instance);
}
+TEST(test_register, add_long_tagged_cells)
+{
+ struct fieldstat *instance = fieldstat_new();
+ int cube_id = fieldstat_create_cube(instance, &TEST_SHARED_TAG, 1, SAMPLING_MODE_COMPREHENSIVE, 10);
+ struct fieldstat_tag test_tag_long = TEST_TAG_STRING;
+ char *long_string = (char *)malloc(5001);
+ memset(long_string, 'a', 5001);
+ long_string[5000] = '\0';
+ test_tag_long.value_str = long_string;
+
+ int metric_id = fieldstat_register_counter(instance, "counter");
+ fieldstat_counter_incrby(instance, cube_id, metric_id, &test_tag_long, 1, 10086);
+
+ long long result;
+ struct fieldstat_tag_list tag_list = {&test_tag_long, 1};
+ fieldstat_counter_get(instance, cube_id, metric_id, &tag_list, &result);
+ EXPECT_EQ(result, 10086);
+
+ fieldstat_free(instance);
+ free(long_string);
+}
+
TEST(test_register, register_too_many_metrics)
{
struct fieldstat *instance = fieldstat_new();
@@ -476,7 +498,6 @@ TEST(calibrate, master_many_cube)
fieldstat_free(target);
}
-
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);