diff options
| author | chenzizhan <[email protected]> | 2023-10-18 17:21:08 +0800 |
|---|---|---|
| committer | chenzizhan <[email protected]> | 2023-10-18 17:21:08 +0800 |
| commit | 4cb4ebc098772e4dc9e56b2b12abd660182e7877 (patch) | |
| tree | 3f415ad04d7c754fa1f4ee89b1e80e3f9df5c84e | |
| parent | d45698e32ee38b6bba494bd5b4bacc5733a7ae27 (diff) | |
fix a bug when tagstring value very long
| -rw-r--r-- | src/exporter/cjson_exporter.c | 1 | ||||
| -rw-r--r-- | src/tags/my_ut_hash.c | 28 | ||||
| -rw-r--r-- | test/test_register_and_reset.cpp | 27 |
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); |
