summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2024-10-23 18:13:58 +0800
committerchenzizhan <[email protected]>2024-10-23 18:13:58 +0800
commitb883f51910cf155d99f1aa03847d5dac2e690f1d (patch)
treeca7baf1cb66da5c6c8305699c52f415c2130b8de
parente4f173ace47806a87274a3f7e8cec180ba3ab11c (diff)
fieldstat_histogram_fork->histogram_new
-rw-r--r--include/fieldstat/fieldstat.h5
-rw-r--r--src/cube.c9
-rw-r--r--src/fieldstat.c17
-rw-r--r--test/test_metric_histogram.cpp2
4 files changed, 14 insertions, 19 deletions
diff --git a/include/fieldstat/fieldstat.h b/include/fieldstat/fieldstat.h
index 28eb03c..8bb5c8f 100644
--- a/include/fieldstat/fieldstat.h
+++ b/include/fieldstat/fieldstat.h
@@ -163,7 +163,7 @@ int fieldstat_histogram_record(struct fieldstat *instance, int cube_id, int metr
struct histogram provides a way to update the histogram metric in batch created and updated by user.
Example:
- struct histogram *histogram = fieldstat_histogram_fork(instance, cube_id, metric_id);
+ struct histogram *histogram = histogram_new(1, 1000000, 3);
for (int i = 0; i < many_packet_length; i++) {
histogram_record(histogram, packet_length[i]);
}
@@ -175,7 +175,8 @@ struct histogram provides a way to update the histogram metric in batch created
// after many times of histogram_record
histogram_free(histogram);
*/
-struct histogram *fieldstat_histogram_fork(const struct fieldstat *instance, int cube_id, int metric_id);
+// struct histogram *fieldstat_histogram_fork(const struct fieldstat *instance, int cube_id, int metric_id);
+struct histogram *histogram_new(long long lowest_trackable_value, long long highest_trackable_value, int significant_figures);
void histogram_free(struct histogram *histogram);
void histogram_reset(struct histogram *histogram);
int fieldstat_histogram_merge(struct fieldstat *instance, int cube_id, int metric_id, const struct field *cell_dimensions, size_t n_dimensions, const struct histogram *src);
diff --git a/src/cube.c b/src/cube.c
index bafb170..f8a41d5 100644
--- a/src/cube.c
+++ b/src/cube.c
@@ -802,13 +802,18 @@ int cube_histogram_merge(struct cube *cube, int metric_id, const struct field *d
const struct metric_manifest *manifest = metric_manifest_manager_get_by_id(cube->manifest_manager, metric_id);
if (manifest == NULL || manifest->type != METRIC_TYPE_HISTOGRAM) {
- printf("invalid metric id\n");
return FS_ERR_INVALID_METRIC_ID;
}
+ // check if the parameters matches
+ if (src->lowest_discernible_value != manifest->parameters->hdr.lowest_trackable_value ||
+ src->highest_trackable_value != manifest->parameters->hdr.highest_trackable_value ||
+ src->significant_figures != manifest->parameters->hdr.significant_figures) {
+ return FS_ERR_INVALID_PARAM;
+ }
+
struct cell *cell_data = get_cell_in_cube_generic(cube, dimensions, n_dimensions);
if (cell_data == NULL) {
- printf("too many cells\n");
return FS_ERR_TOO_MANY_CELLS;
}
diff --git a/src/fieldstat.c b/src/fieldstat.c
index d8ecc2f..703861b 100644
--- a/src/fieldstat.c
+++ b/src/fieldstat.c
@@ -240,21 +240,10 @@ void fieldstat_calibrate(const struct fieldstat *master, struct fieldstat *repli
/* -------------------------------------------------------------------------- */
/* histogram fast batch transaction */
/* -------------------------------------------------------------------------- */
-struct histogram *fieldstat_histogram_fork(const struct fieldstat *instance, int cube_id, int metric_id) {
- const struct cube *cube = cube_manager_get_cube_by_id(instance->cube_manager, cube_id);
- if (cube == NULL) {
- return NULL;
- }
-
- const struct metric_manifest *manifest = cube_get_metric_manifest_by_id(cube, metric_id);
- if (manifest == NULL || manifest->type != METRIC_TYPE_HISTOGRAM) {
- return NULL;
- }
- const struct histogram_parameters *parameters = &(manifest->parameters->hdr);
-
+struct histogram *histogram_new(long long lowest_trackable_value, long long highest_trackable_value, int significant_figures) {
struct hdr_histogram* inner = NULL;
- int ret = hdr_init(parameters->lowest_trackable_value, parameters->highest_trackable_value, parameters->significant_figures, &inner);
- if (ret != 0) {
+ int ret = hdr_init(lowest_trackable_value, highest_trackable_value, significant_figures, &inner);
+ if (ret != 0) {
return NULL;
}
diff --git a/test/test_metric_histogram.cpp b/test/test_metric_histogram.cpp
index e82000e..66fb6b4 100644
--- a/test/test_metric_histogram.cpp
+++ b/test/test_metric_histogram.cpp
@@ -196,7 +196,7 @@ TEST(metric_test_histogram, histogram_batch_transaction) {
int cube_id = test_fieldstat_cube_create(instance, &TEST_SHARED_TAG, 1, SAMPLING_MODE_COMPREHENSIVE, 10);
int metric_id = fieldstat_register_histogram(instance, cube_id, "test_histogram_metric", 1, 10000, 5);
- struct histogram *histogram = fieldstat_histogram_fork(instance, cube_id, metric_id);
+ struct histogram *histogram = histogram_new(1, 10000, 5);
ASSERT_NE(histogram, nullptr);
long long packet_lengths[] = {1234, 1234, 123, 567, 890, 1234, 1500};