summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2024-08-12 14:03:02 +0800
committerchenzizhan <[email protected]>2024-08-12 14:03:02 +0800
commit7ccaafd2c6b2527ac9b98c4c376ce29a8c5e5cb9 (patch)
tree84f6da24d6df7a876f1d32a799973440cd348ac8
parentf58e284c904982364caad7fced8dcc0b6fa71737 (diff)
TSG-22150v4.6.3
-rw-r--r--src/cells/spread_sketch.c5
-rw-r--r--src/cube.c20
-rw-r--r--test/test_register_and_reset.cpp102
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;
diff --git a/src/cube.c b/src/cube.c
index 344e273..0c340f0 100644
--- a/src/cube.c
+++ b/src/cube.c
@@ -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