From 3d80f399b38059dbb69d7863493b5e1ba2fbd2fd Mon Sep 17 00:00:00 2001 From: chenzizhan Date: Wed, 16 Oct 2024 16:01:04 +0800 Subject: fieldstat_hll_add_fields with fields ** --- include/fieldstat/fieldstat.h | 2 +- src/cube.c | 12 ++++++------ src/cube.h | 2 +- src/fieldstat.c | 2 +- test/test_exporter_json.cpp | 4 ++-- test/test_fuzz_test.cpp | 4 ++-- test/test_merge.cpp | 8 ++++---- test/test_metric_hll.cpp | 11 +++++++---- test/test_register_and_reset.cpp | 4 +++- test/utils.cpp | 7 +++++++ test/utils.hpp | 1 + 11 files changed, 35 insertions(+), 22 deletions(-) diff --git a/include/fieldstat/fieldstat.h b/include/fieldstat/fieldstat.h index b539ab8..f177ffb 100644 --- a/include/fieldstat/fieldstat.h +++ b/include/fieldstat/fieldstat.h @@ -151,7 +151,7 @@ int fieldstat_hll_add(struct fieldstat *instance, int cube_id, int metric_id, co * @param item_len: the length of the field. * @return Error codes. */ -int fieldstat_hll_add_fields(struct fieldstat *instance, int cube_id, int metric_id, const struct field *cell_dimensions, size_t n_dimensions, const struct field *items, size_t n_items); +int fieldstat_hll_add_fields(struct fieldstat *instance, int cube_id, int metric_id, const struct field *cell_dimensions, size_t n_dimensions, const struct field **items, size_t n_items); /* diff --git a/src/cube.c b/src/cube.c index ab68dfe..601d063 100644 --- a/src/cube.c +++ b/src/cube.c @@ -865,23 +865,23 @@ int cube_hll_add(struct cube *cube, int metric_id, const struct field *dimension return FS_OK; } -uint64_t field_array_to_hash(const struct field *field, size_t n_dimensions) { +uint64_t field_array_to_hash(const struct field **field, size_t n_dimensions) { XXH3_state_t state = {0}; XXH3_64bits_reset(&state); for (int i = 0; i < n_dimensions; i++) { - XXH3_64bits_update(&state, field[i].key, strlen(field[i].key)); - if (field[i].type != FIELD_VALUE_CSTRING) { - XXH3_64bits_update(&state, &field[i].value_longlong, sizeof(long long)); + XXH3_64bits_update(&state, field[i]->key, strlen(field[i]->key)); + if (field[i]->type != FIELD_VALUE_CSTRING) { + XXH3_64bits_update(&state, &field[i]->value_longlong, sizeof(long long)); } else { - XXH3_64bits_update(&state, field[i].value_str, strlen(field[i].value_str)); + XXH3_64bits_update(&state, field[i]->value_str, strlen(field[i]->value_str)); } } return XXH3_64bits_digest(&state); } -int cube_hll_add_field(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, const struct field *item_fields, size_t n_item) +int cube_hll_add_field(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, const struct field **item_fields, size_t n_item) { if (cube->primary_metric_id == -1) { return FS_ERR_CUBE_SAMPLING_NOT_INITIALIZED; diff --git a/src/cube.h b/src/cube.h index 7ced173..13dc25b 100644 --- a/src/cube.h +++ b/src/cube.h @@ -29,7 +29,7 @@ int cube_register_hist(struct cube *cube,const char *metric_name, long long lowe int cube_histogram_record(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, long long value); int cube_histogram_merge(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, const struct hdr_histogram *src); int cube_hll_add(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, const char *key, size_t key_len); -int cube_hll_add_field(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, const struct field *item_fields, size_t n_item); +int cube_hll_add_field(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, const struct field **item_fields, size_t n_item); int cube_counter_incrby(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, long long increment); int cube_counter_set(struct cube *cube, int metric_id, const struct field *dimensions, size_t n_dimensions, long long value); int cube_counter_incrby_batch(struct cube *cube, const int metric_ids[], const struct field *dimensions, size_t n_dimensions, const long long increments[], size_t n_metrics); diff --git a/src/fieldstat.c b/src/fieldstat.c index 76bd478..d8ecc2f 100644 --- a/src/fieldstat.c +++ b/src/fieldstat.c @@ -191,7 +191,7 @@ int fieldstat_hll_add(struct fieldstat *instance, int cube_id, int metric_id, co } // cppcheck-suppress [constParameterPointer, unmatchedSuppression] -int fieldstat_hll_add_fields(struct fieldstat *instance, int cube_id, int metric_id, const struct field *cell_dimensions, size_t n_dimensions, const struct field *items, size_t n_items) +int fieldstat_hll_add_fields(struct fieldstat *instance, int cube_id, int metric_id, const struct field *cell_dimensions, size_t n_dimensions, const struct field **items, size_t n_items) { struct cube *cube = cube_manager_get_cube_by_id(instance->cube_manager, cube_id); if (cube == NULL) { diff --git a/test/test_exporter_json.cpp b/test/test_exporter_json.cpp index b93b974..2f09fb6 100644 --- a/test/test_exporter_json.cpp +++ b/test/test_exporter_json.cpp @@ -303,14 +303,14 @@ TEST(export_test, cjson_export_on_one_cube_of_spreadsketch_sampling) { Flow flow = flow_generator.next(); Fieldstat_tag_list_wrapper dimension = Fieldstat_tag_list_wrapper("bigger fanouts", flow.src_ip.c_str()); Fieldstat_tag_list_wrapper item = Fieldstat_tag_list_wrapper("dummy", flow.dst_ip.c_str()); - fieldstat_hll_add_fields(instance, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_tag(), item.get_tag_count()); + fieldstat_hll_add_fields(instance, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_field_ptr_array(), item.get_tag_count()); fieldstat_counter_incrby(instance, cube_id, metric_count, dimension.get_tag(), dimension.get_tag_count(), 1); } for (int i = 0; i < 100; i++) { Flow flow = flow_generator.next(); Fieldstat_tag_list_wrapper dimension = Fieldstat_tag_list_wrapper("smaller fanouts", flow.src_ip.c_str()); Fieldstat_tag_list_wrapper item = Fieldstat_tag_list_wrapper("dummy", flow.dst_ip.c_str()); - fieldstat_hll_add_fields(instance, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_tag(), item.get_tag_count()); + fieldstat_hll_add_fields(instance, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_field_ptr_array(), item.get_tag_count()); fieldstat_counter_incrby(instance, cube_id, metric_count, dimension.get_tag(), dimension.get_tag_count(), 1); } diff --git a/test/test_fuzz_test.cpp b/test/test_fuzz_test.cpp index 6057e5d..0f5a0ba 100644 --- a/test/test_fuzz_test.cpp +++ b/test/test_fuzz_test.cpp @@ -425,7 +425,7 @@ TEST(Fuzz_test, many_instance_random_flow_unregister_calibrate_reset_fork_merge_ int cube_id = rand() % CUBE_NUM; const Fieldstat_tag_list_wrapper *shared_tag = shared_tags[cube_id]; - int ret_add = fieldstat_hll_add_fields(instance, cube_id, 0, cell_dimension.get_tag(), cell_dimension.get_tag_count(), item.get_tag(), item.get_tag_count()); + int ret_add = fieldstat_hll_add_fields(instance, cube_id, 0, cell_dimension.get_tag(), cell_dimension.get_tag_count(), item.get_field_ptr_array(), item.get_tag_count()); if (ret_add == FS_ERR_TOO_MANY_CELLS) { continue; } @@ -628,7 +628,7 @@ TEST(perf, simple_one_for_perf_spreadsketch) getchar(); for (int i = 0; i < TEST_ROUND; i++) { - fieldstat_hll_add_fields(instance, cube_id, 0, cell_dimension[i]->get_tag(), cell_dimension[i]->get_tag_count(), items[i]->get_tag(), items[i]->get_tag_count()); + fieldstat_hll_add_fields(instance, cube_id, 0, cell_dimension[i]->get_tag(), cell_dimension[i]->get_tag_count(), items[i]->get_field_ptr_array(), items[i]->get_tag_count()); } clock_t end = clock(); diff --git a/test/test_merge.cpp b/test/test_merge.cpp index 0e5f6fc..568bf51 100644 --- a/test/test_merge.cpp +++ b/test/test_merge.cpp @@ -634,7 +634,7 @@ TEST(unit_test_merge, gen_dest_full_all_src_inserted_given_src_flows_larger_spre Flow flow = flow_generator.next(); Fieldstat_tag_list_wrapper dimension = Fieldstat_tag_list_wrapper(src_key, flow.src_ip.c_str()); Fieldstat_tag_list_wrapper item = Fieldstat_tag_list_wrapper("dummy", flow.dst_ip.c_str()); - fieldstat_hll_add_fields(instance_src, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_tag(), item.get_tag_count()); + fieldstat_hll_add_fields(instance_src, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_field_ptr_array(), item.get_tag_count()); flow_cnt[dimension.to_string()].insert(item.to_string()); } @@ -643,7 +643,7 @@ TEST(unit_test_merge, gen_dest_full_all_src_inserted_given_src_flows_larger_spre Flow flow = flow_generator.next(); Fieldstat_tag_list_wrapper dimension = Fieldstat_tag_list_wrapper(dest_key, flow.src_ip.c_str()); Fieldstat_tag_list_wrapper item = Fieldstat_tag_list_wrapper("dummy", flow.dst_ip.c_str()); - fieldstat_hll_add_fields(instance_dest, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_tag(), item.get_tag_count()); + fieldstat_hll_add_fields(instance_dest, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_field_ptr_array(), item.get_tag_count()); flow_cnt[dimension.to_string()].insert(item.to_string()); } @@ -692,7 +692,7 @@ TEST(unit_test_merge, merge_accuracy_test_gen_dest_full_some_inserted_and_some_m const char *use_key = rand()%2? "src":"common"; Fieldstat_tag_list_wrapper dimension = Fieldstat_tag_list_wrapper(use_key, flow.src_ip.c_str()); Fieldstat_tag_list_wrapper item = Fieldstat_tag_list_wrapper("dummy", flow.dst_ip.c_str()); - fieldstat_hll_add_fields(instance_src, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_tag(), item.get_tag_count()); + fieldstat_hll_add_fields(instance_src, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_field_ptr_array(), item.get_tag_count()); flow_cnt[dimension.to_string()].insert(item.to_string()); } @@ -701,7 +701,7 @@ TEST(unit_test_merge, merge_accuracy_test_gen_dest_full_some_inserted_and_some_m const char *use_key = rand()%2? "dest":"common"; Fieldstat_tag_list_wrapper dimension = Fieldstat_tag_list_wrapper(use_key, flow.src_ip.c_str()); Fieldstat_tag_list_wrapper item = Fieldstat_tag_list_wrapper("dummy", flow.dst_ip.c_str()); - fieldstat_hll_add_fields(instance_src, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_tag(), item.get_tag_count()); + fieldstat_hll_add_fields(instance_src, cube_id, metric_id, dimension.get_tag(), dimension.get_tag_count(), item.get_field_ptr_array(), item.get_tag_count()); flow_cnt[dimension.to_string()].insert(item.to_string()); } diff --git a/test/test_metric_hll.cpp b/test/test_metric_hll.cpp index 92211fb..01b76dc 100644 --- a/test/test_metric_hll.cpp +++ b/test/test_metric_hll.cpp @@ -81,9 +81,12 @@ TEST(metric_test_hll, simple_register_and_query) TEST(metric_test_hll, add_with_tags) { struct fieldstat *instance = test_init_standard_instance_one_cube_one_metric_one_cell_hll(); - fieldstat_hll_add_fields(instance, 0, 0, &TEST_FIELD_INT, 1, &TEST_FIELD_INT, 1); - fieldstat_hll_add_fields(instance, 0, 0, &TEST_FIELD_INT, 1, &TEST_FIELD_DOUBLE, 1); - fieldstat_hll_add_fields(instance, 0, 0, &TEST_FIELD_INT, 1, &TEST_FIELD_STRING, 1); + const struct field *f1[] = {&TEST_FIELD_INT}; + const struct field *f2[] = {&TEST_FIELD_INT, &TEST_FIELD_STRING}; + const struct field *f3[] = {&TEST_FIELD_INT, &TEST_FIELD_STRING, &TEST_FIELD_DOUBLE}; + fieldstat_hll_add_fields(instance, 0, 0, &TEST_FIELD_INT, 1, f1, 1); + fieldstat_hll_add_fields(instance, 0, 0, &TEST_FIELD_INT, 1, f2, 2); + fieldstat_hll_add_fields(instance, 0, 0, &TEST_FIELD_INT, 1, f3, 3); test_assert_standard_instance(instance); EXPECT_NEAR(my_fieldstat_hll_get(instance, 0, 0), 3, 0.5); @@ -247,7 +250,7 @@ TEST(metric_test_hll, spread_sketch_add_and_test_accuracy) Fieldstat_tag_list_wrapper dimension("src ip", f.src_ip.c_str()); Fieldstat_tag_list_wrapper counted("dst ip", f.dst_ip.c_str()); - fieldstat_hll_add_fields(instance, 0, 0, dimension.get_tag(), dimension.get_tag_count(), counted.get_tag(), counted.get_tag_count()); + fieldstat_hll_add_fields(instance, 0, 0, dimension.get_tag(), dimension.get_tag_count(), counted.get_field_ptr_array(), counted.get_tag_count()); flow_cnt[dimension.to_string()].insert(counted.to_string()); } diff --git a/test/test_register_and_reset.cpp b/test/test_register_and_reset.cpp index 2cc9db2..798d107 100644 --- a/test/test_register_and_reset.cpp +++ b/test/test_register_and_reset.cpp @@ -65,7 +65,9 @@ TEST(test_register, delete_spreadsketch_cube_with_cells_and_metrics) fieldstat_cube_set_sampling(instance, cube_id, SAMPLING_MODE_TOP_CARDINALITY, 10, metric_primary); fieldstat_counter_incrby(instance, cube_id, metric_id1, &TEST_FIELD_INT, 1, 1); - fieldstat_hll_add_fields(instance, cube_id, metric_primary, &TEST_FIELD_INT, 1, &TEST_FIELD_DOUBLE, 1); + + const struct field *fields[] = {&TEST_FIELD_DOUBLE}; + fieldstat_hll_add_fields(instance, cube_id, metric_primary, &TEST_FIELD_INT, 1, fields, 1); fieldstat_cube_destroy(instance, cube_id); struct field_list *tag_list = fieldstat_cube_get_dimension(instance, cube_id); diff --git a/test/utils.cpp b/test/utils.cpp index 4e41d8f..2ca8ac1 100644 --- a/test/utils.cpp +++ b/test/utils.cpp @@ -152,6 +152,13 @@ const struct field *Fieldstat_tag_list_wrapper::get_tag() const return tag_list_c.field; } +const struct field **Fieldstat_tag_list_wrapper::get_field_ptr_array() const +{ + static const struct field *field_ptr_array[1]; + field_ptr_array[0] = tag_list_c.field; + return field_ptr_array; +} + size_t Fieldstat_tag_list_wrapper::get_tag_count() const { return tag_list_c.n_field; diff --git a/test/utils.hpp b/test/utils.hpp index efac03a..2803bb5 100644 --- a/test/utils.hpp +++ b/test/utils.hpp @@ -30,6 +30,7 @@ public: bool operator==(const Fieldstat_tag_list_wrapper &tag_list_wrapper) const; const struct field *get_tag() const; + const struct field **get_field_ptr_array() const; size_t get_tag_count() const; const struct field_list *get_c_struct() const; void print_tag_list() const; -- cgit v1.2.3