summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2024-10-16 16:01:04 +0800
committerchenzizhan <[email protected]>2024-10-16 16:01:04 +0800
commit3d80f399b38059dbb69d7863493b5e1ba2fbd2fd (patch)
tree363e5d090307e9ea8f9c61db90f86cc7311c45e4
parent7a81c67ec9534772fc3041a8ba9212f11038627d (diff)
fieldstat_hll_add_fields with fields **
-rw-r--r--include/fieldstat/fieldstat.h2
-rw-r--r--src/cube.c12
-rw-r--r--src/cube.h2
-rw-r--r--src/fieldstat.c2
-rw-r--r--test/test_exporter_json.cpp4
-rw-r--r--test/test_fuzz_test.cpp4
-rw-r--r--test/test_merge.cpp8
-rw-r--r--test/test_metric_hll.cpp11
-rw-r--r--test/test_register_and_reset.cpp4
-rw-r--r--test/utils.cpp7
-rw-r--r--test/utils.hpp1
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;