diff options
| author | chenzizhan <[email protected]> | 2024-08-12 14:03:02 +0800 |
|---|---|---|
| committer | chenzizhan <[email protected]> | 2024-08-12 14:03:02 +0800 |
| commit | 7ccaafd2c6b2527ac9b98c4c376ce29a8c5e5cb9 (patch) | |
| tree | 84f6da24d6df7a876f1d32a799973440cd348ac8 | |
| parent | f58e284c904982364caad7fced8dcc0b6fa71737 (diff) | |
TSG-22150v4.6.3
| -rw-r--r-- | src/cells/spread_sketch.c | 5 | ||||
| -rw-r--r-- | src/cube.c | 20 | ||||
| -rw-r--r-- | test/test_register_and_reset.cpp | 102 |
3 files changed, 100 insertions, 27 deletions
diff --git a/src/cells/spread_sketch.c b/src/cells/spread_sketch.c index f95b0f1..9618771 100644 --- a/src/cells/spread_sketch.c +++ b/src/cells/spread_sketch.c @@ -248,7 +248,6 @@ int spread_sketch_add_hash(struct spread_sketch *ss, const char *entry, size_t e if (ss->level0_cnt == 0) { return 0; } - assert(ss->level0_cnt>0); } // https://www.eecs.harvard.edu/~michaelm/postscripts/tr-02-05.pdf @@ -298,7 +297,9 @@ int spread_sketch_add_hash(struct spread_sketch *ss, const char *entry, size_t e in_sketch = true; } } - hll_add_hash(bucket->sthll_register, ss->precision, item_hash); + if (item_hash != DUMMY_ITEM_HASH) { + hll_add_hash(bucket->sthll_register, ss->precision, item_hash); + } } return in_sketch ? 1 : 0; @@ -1202,9 +1202,15 @@ int cube_counter_get(const struct cube *cube, int metric_id, const struct field_ void *exdata_dummy = NULL; heavy_keeper_one_point_query(cube->heavykeeper, dimension_in_string, dimension_string_len, &count, &exdata_dummy); *value = count; - free(dimension_in_string); - return count == 0 ? FS_ERR_INVALID_DIMENSION : FS_OK; + + if (exdata_dummy == NULL) { + return FS_ERR_INVALID_DIMENSION; + } + if (count == 0) { + return FS_ERR_INVALID_METRIC_ID; + } + return FS_OK; } int ret; @@ -1231,6 +1237,8 @@ int cube_hll_get(const struct cube *cube, int metric_id, const struct field_list free(dimension_in_string); if (hll_value < 0) { return FS_ERR_INVALID_DIMENSION; + } else if (hll_value == 0.0) { + return FS_ERR_INVALID_METRIC_ID; } *value = hll_value; @@ -1280,11 +1288,19 @@ int cube_histogram_count_le_value(const struct cube *cube, int metric_id, const } int cube_get_serialization_as_base64(const struct cube *cube, int metric_id, const struct field_list *fields, char **blob, size_t *blob_size) { + *blob = NULL; + *blob_size = 0; if (cube->sampling_mode == SAMPLING_MODE_TOP_CARDINALITY && cube->primary_metric_id == metric_id) { char *dimension_in_string; size_t dimension_string_len; field_array_to_key(fields->field, fields->n_field, &dimension_in_string, &dimension_string_len); + double hll_value = spread_sketch_get_cardinality(cube->spread_sketch, dimension_in_string, dimension_string_len); + if (hll_value <= 0) { + free(dimension_in_string); + return hll_value == 0 ? FS_ERR_INVALID_METRIC_ID : FS_ERR_INVALID_DIMENSION; + } + *blob = spread_sketch_get_hll_base64_serialization(cube->spread_sketch, dimension_in_string, dimension_string_len); *blob_size = strlen(*blob); free(dimension_in_string); diff --git a/test/test_register_and_reset.cpp b/test/test_register_and_reset.cpp index f3afcc7..7f2772c 100644 --- a/test/test_register_and_reset.cpp +++ b/test/test_register_and_reset.cpp @@ -95,7 +95,48 @@ TEST(test_register, reset_and_try_to_query_cell_comprehensive) fieldstat_free(instance); } -TEST(test_register, reset_and_try_to_query_metric) +TEST(test_register, reset_and_try_to_query_cell_topk) +{ + struct fieldstat *instance = fieldstat_new(); + int cube_id = fieldstat_cube_create(instance, &TEST_SHARED_TAG, 1); + int metric_id = fieldstat_register_counter(instance, cube_id, "counter"); + fieldstat_cube_set_sampling(instance, cube_id, SAMPLING_MODE_TOPK, 10, metric_id); + + fieldstat_counter_incrby(instance, cube_id, metric_id, &TEST_FIELD_INT, 1, 1); + + fieldstat_reset(instance); + long long value; + EXPECT_EQ(fieldstat_counter_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_id, &value), FS_ERR_INVALID_DIMENSION); + + size_t n_cell; + struct field_list *tag_list; + fieldstat_cube_get_cells(instance, cube_id, &tag_list, &n_cell); + EXPECT_EQ(n_cell, 0); + + fieldstat_free(instance); +} + +TEST(test_register, reset_and_try_to_query_cell_spreadsketch) +{ + struct fieldstat *instance = fieldstat_new(); + int cube_id = fieldstat_cube_create(instance, &TEST_SHARED_TAG, 1); + int metric_id = fieldstat_register_hll(instance, cube_id, "hll", 5); + fieldstat_cube_set_sampling(instance, cube_id, SAMPLING_MODE_TOP_CARDINALITY, 10, metric_id); + fieldstat_hll_add(instance, cube_id, metric_id, &TEST_FIELD_INT, 1, "12abc", 5); + + fieldstat_reset(instance); + double value; + EXPECT_EQ(fieldstat_hll_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_id, &value), FS_ERR_INVALID_DIMENSION); + + size_t n_cell; + struct field_list *tag_list; + fieldstat_cube_get_cells(instance, cube_id, &tag_list, &n_cell); + EXPECT_EQ(n_cell, 0); + + fieldstat_free(instance); +} + +TEST(test_register, reset_and_try_to_query_metric_comprehensive) { struct fieldstat *instance = fieldstat_new(); int cube_id = test_fieldstat_cube_create(instance, &TEST_SHARED_TAG, 1, SAMPLING_MODE_COMPREHENSIVE, 10); @@ -105,7 +146,7 @@ TEST(test_register, reset_and_try_to_query_metric) int metric_operated_after_reset = fieldstat_register_counter(instance, cube_id, "counter_after_reset"); fieldstat_counter_incrby(instance, cube_id, metric_counter, &TEST_FIELD_INT, 1, 1); - fieldstat_hll_add(instance, cube_id, metric_counter, &TEST_FIELD_INT, 1, "1", 1); + fieldstat_hll_add(instance, cube_id, metric_hll, &TEST_FIELD_INT, 1, "1", 1); fieldstat_histogram_record(instance, cube_id, metric_hist, &TEST_FIELD_INT, 1, 1000); fieldstat_reset(instance); @@ -121,43 +162,58 @@ TEST(test_register, reset_and_try_to_query_metric) fieldstat_free(instance); } -TEST(test_register, reset_and_try_to_query_cell_topk) +TEST(test_register, reset_and_try_to_query_primary_metric_topk) { struct fieldstat *instance = fieldstat_new(); int cube_id = fieldstat_cube_create(instance, &TEST_SHARED_TAG, 1); - int metric_id = fieldstat_register_counter(instance, cube_id, "counter"); - fieldstat_cube_set_sampling(instance, cube_id, SAMPLING_MODE_TOPK, 10, metric_id); + int metric_counter_primary = fieldstat_register_counter(instance, cube_id, "counter"); + int metric_hll = fieldstat_register_hll(instance, cube_id, "hll", 5); + int metric_operated_after_reset = fieldstat_register_counter(instance, cube_id, "counter_after_reset"); + fieldstat_cube_set_sampling(instance, cube_id, SAMPLING_MODE_TOPK, 1, metric_counter_primary); - fieldstat_counter_incrby(instance, cube_id, metric_id, &TEST_FIELD_INT, 1, 1); + fieldstat_counter_incrby(instance, cube_id, metric_counter_primary, &TEST_FIELD_INT, 1, 1); + fieldstat_hll_add(instance, cube_id, metric_hll, &TEST_FIELD_INT, 1, "1", 1); fieldstat_reset(instance); - long long value; - EXPECT_EQ(fieldstat_counter_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_id, &value), FS_ERR_INVALID_DIMENSION); + fieldstat_counter_incrby(instance, cube_id, metric_operated_after_reset, &TEST_FIELD_INT, 1, 1); - size_t n_cell; - struct field_list *tag_list; - fieldstat_cube_get_cells(instance, cube_id, &tag_list, &n_cell); - EXPECT_EQ(n_cell, 0); + long long value; + double value_hll; + char *value_hll_base64; + size_t value_hll_base64_len; + EXPECT_EQ(fieldstat_counter_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_counter_primary, &value), FS_ERR_INVALID_METRIC_ID); + EXPECT_EQ(fieldstat_hll_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_hll, &value_hll), FS_ERR_INVALID_METRIC_ID); + fieldstat_metric_get_serialization_as_base64(instance, cube_id,metric_hll, &TEST_FIELD_LIST_INT,&value_hll_base64, &value_hll_base64_len); + EXPECT_EQ(value_hll_base64, nullptr); + EXPECT_EQ(fieldstat_counter_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_operated_after_reset, &value), FS_OK); fieldstat_free(instance); } -TEST(test_register, reset_and_try_to_query_cell_spreadsketch) +TEST(test_register, reset_and_try_to_query_primary_metric_spreadsketch) { struct fieldstat *instance = fieldstat_new(); int cube_id = fieldstat_cube_create(instance, &TEST_SHARED_TAG, 1); - int metric_id = fieldstat_register_hll(instance, cube_id, "hll", 5); - fieldstat_cube_set_sampling(instance, cube_id, SAMPLING_MODE_TOP_CARDINALITY, 10, metric_id); - fieldstat_hll_add(instance, cube_id, metric_id, &TEST_FIELD_INT, 1, "12abc", 5); + int metric_counter = fieldstat_register_counter(instance, cube_id, "counter"); + int metric_hll_primary = fieldstat_register_hll(instance, cube_id, "hll", 5); + int metric_operated_after_reset = fieldstat_register_counter(instance, cube_id, "counter_after_reset"); + fieldstat_cube_set_sampling(instance, cube_id, SAMPLING_MODE_TOP_CARDINALITY, 1, metric_hll_primary); + + fieldstat_counter_incrby(instance, cube_id, metric_counter, &TEST_FIELD_INT, 1, 1); + fieldstat_hll_add(instance, cube_id, metric_hll_primary, &TEST_FIELD_INT, 1, "1", 1); fieldstat_reset(instance); - double value; - EXPECT_EQ(fieldstat_hll_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_id, &value), FS_ERR_INVALID_DIMENSION); + fieldstat_counter_incrby(instance, cube_id, metric_operated_after_reset, &TEST_FIELD_INT, 1, 1); - size_t n_cell; - struct field_list *tag_list; - fieldstat_cube_get_cells(instance, cube_id, &tag_list, &n_cell); - EXPECT_EQ(n_cell, 0); + long long value; + double value_hll; + char *value_hll_base64; + size_t value_hll_base64_len; + EXPECT_EQ(fieldstat_counter_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_counter, &value), FS_ERR_INVALID_METRIC_ID); + EXPECT_EQ(fieldstat_hll_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_hll_primary, &value_hll), FS_ERR_INVALID_METRIC_ID); + EXPECT_EQ(fieldstat_counter_get(instance, cube_id, &TEST_FIELD_LIST_INT, metric_operated_after_reset, &value), FS_OK); + fieldstat_metric_get_serialization_as_base64(instance, cube_id,metric_hll_primary, &TEST_FIELD_LIST_INT,&value_hll_base64, &value_hll_base64_len); + EXPECT_EQ(value_hll_base64, nullptr); fieldstat_free(instance); } @@ -830,6 +886,6 @@ TEST(calibrate, delete_first_cube) int main(int argc, char *argv[]) { testing::InitGoogleTest(&argc, argv); - // testing::GTEST_FLAG(filter) = "test_register.reset_and_new_cell_spreadsketch"; + testing::GTEST_FLAG(filter) = "test_register.reset_and_try_to_query_primary*"; return RUN_ALL_TESTS(); }
\ No newline at end of file |
