summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cells/spread_sketch.c5
-rw-r--r--src/cube.c20
2 files changed, 21 insertions, 4 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);