summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/fieldstat/fieldstat.h2
-rw-r--r--src/fieldstat.c110
-rw-r--r--test/CMakeLists.txt20
3 files changed, 66 insertions, 66 deletions
diff --git a/include/fieldstat/fieldstat.h b/include/fieldstat/fieldstat.h
index 0fd42b1..be78ab4 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
* @return FS_OK if success. FS_ERR_NULL_HANDLER, FS_ERR_INVALID_CUBE_ID, FS_ERR_INVALID_METRIC_ID if fail.
* FS_ERR_INVALID_PARAM when value is less than 0, or the cube is topk.
*/
-int fieldstat_hist_record(struct fieldstat *instance, int cube_id, int metric_id, const struct fieldstat_tag *tags, size_t n_tag, long long value); // TODO: 看看能不能改成histogram(重命名)。
+int fieldstat_hist_record(struct fieldstat *instance, int cube_id, int metric_id, const struct fieldstat_tag *tags, size_t n_tag, long long value);
/*
* @brief Delete all the cells, also the content of every metrics. The cube and metrics are not deleted. Increase cell_version by 1.
diff --git a/src/fieldstat.c b/src/fieldstat.c
index b090c5f..e5cf868 100644
--- a/src/fieldstat.c
+++ b/src/fieldstat.c
@@ -14,13 +14,12 @@
#include "tag_map.h"
#include "my_ut_hash.h"
-#define DEFAULT_N_METRIC 64
+#define DEFAULT_N_METRIC 32
#define DEFAULT_N_CUBE 128
struct cell {
struct metric **metrics;
- size_t valid_metric_arr_len; // TODO: 单纯就是每次超过就realloc,使用UTARRAY
size_t max_n_metric;
struct fieldstat_tag_list tags; // cell identifier
};
@@ -69,8 +68,7 @@ struct fieldstat {
size_t max_n_cube;
struct metric **metric_masters;
- size_t n_metric_master;
- size_t max_n_metric_master; // TODO: 学习用ut array
+ size_t max_n_metric_master;
struct metric_name_id_map *metric_name_id_map;
struct cube_manager *shared_tag_cube_manager;
@@ -145,20 +143,17 @@ struct metric_name_id_map *name_id_map_copy(struct metric_name_id_map *map)
void add_metric_to_cell(struct cell *cell, struct metric *metric, int metric_id)
{
if (metric_id >= cell->max_n_metric) {
+ cell->metrics = realloc(cell->metrics, sizeof(struct metric *) * cell->max_n_metric * 2);
+ memset(cell->metrics + cell->max_n_metric, 0, sizeof(struct metric *) * cell->max_n_metric);
cell->max_n_metric *= 2;
- cell->metrics = realloc(cell->metrics, sizeof(struct metric *) * cell->max_n_metric);
- memset(cell->metrics + cell->valid_metric_arr_len, 0, sizeof(struct metric *) * (cell->max_n_metric - cell->valid_metric_arr_len));
}
cell->metrics[metric_id] = metric;
- if (metric_id >= cell->valid_metric_arr_len) {
- cell->valid_metric_arr_len = metric_id + 1;
- }
}
struct metric *find_metric_in_cell(const struct cell *cell, int metric_id)
{
- if (metric_id >= cell->valid_metric_arr_len) {
+ if (metric_id >= cell->max_n_metric) {
return NULL;
}
return cell->metrics[metric_id];
@@ -179,7 +174,6 @@ struct metric *add_or_find_metric_in_cell(struct fieldstat *instance, struct cel
struct cell *cell_new(const struct exdata_new_args *args) {
struct cell *pthis = malloc(sizeof(struct cell));
pthis->metrics = calloc(DEFAULT_N_METRIC, sizeof(struct metric *));
- pthis->valid_metric_arr_len = 0;
pthis->max_n_metric = DEFAULT_N_METRIC;
pthis->tags.n_tag = args->n_tags;
@@ -189,7 +183,7 @@ struct cell *cell_new(const struct exdata_new_args *args) {
}
void cell_free(struct cell *pthis) {
- for (size_t i = 0; i < pthis->valid_metric_arr_len; i++) {
+ for (size_t i = 0; i < pthis->max_n_metric; i++) {
metric_free(pthis->metrics[i]);
}
free(pthis->metrics);
@@ -206,9 +200,8 @@ void cell_free(struct cell *pthis) {
struct cell *cell_copy(const struct cell *src) {
struct cell *pthis = malloc(sizeof(struct cell));
pthis->metrics = calloc(src->max_n_metric, sizeof(struct metric *));
- pthis->valid_metric_arr_len = src->valid_metric_arr_len;
pthis->max_n_metric = src->max_n_metric;
- for (size_t i = 0; i < src->valid_metric_arr_len; i++) {
+ for (size_t i = 0; i < src->max_n_metric; i++) {
if (src->metrics[i] == NULL) {
continue;
}
@@ -224,7 +217,7 @@ struct cell *cell_copy(const struct cell *src) {
}
void cell_reset(struct cell *pthis) {
- for (size_t i = 0; i < pthis->valid_metric_arr_len; i++) {
+ for (size_t i = 0; i < pthis->max_n_metric; i++) {
if (pthis->metrics[i] == NULL) {
continue;
}
@@ -233,7 +226,7 @@ void cell_reset(struct cell *pthis) {
}
void cell_merge(struct cell *dest, const struct cell *src) {
- for (size_t i = 0; i < src->valid_metric_arr_len; i++) {
+ for (size_t i = 0; i < src->max_n_metric; i++) {
const struct metric *metric_src = src->metrics[i];
if (metric_src == NULL) {
continue;
@@ -304,7 +297,7 @@ void fieldstat_free(struct fieldstat *instance)
free(instance->cube_version);
cube_manager_free(instance->shared_tag_cube_manager);
- for (size_t i = 0; i < instance->n_metric_master; i++) {
+ for (size_t i = 0; i < instance->max_n_metric_master; i++) {
metric_free(instance->metric_masters[i]);
}
free(instance->metric_masters);
@@ -559,7 +552,7 @@ int fieldstat_cube_set_primary_metric(struct fieldstat *instance, int cube_id, i
if (cube->sampling_mode != SAMPLING_MODE_TOPK) {
return FS_ERR_INVALID_PARAM;
}
- if (metric_id < 0 || metric_id >= instance->n_metric_master) {
+ if (metric_id < 0 || metric_id >= instance->max_n_metric_master) {
return FS_ERR_INVALID_METRIC_ID;
}
if (instance->metric_masters[metric_id] == NULL) {
@@ -581,21 +574,24 @@ int fieldstat_cube_set_primary_metric(struct fieldstat *instance, int cube_id, i
void add_metric_to_instance(struct fieldstat *instance, const struct metric *metric, int metric_id)
{
if (metric_id >= instance->max_n_metric_master) {
+ instance->metric_masters = realloc(instance->metric_masters, sizeof(struct metric *) * instance->max_n_metric_master * 2);
+ memset(instance->metric_masters + instance->max_n_metric_master, 0, sizeof(struct metric *) * (instance->max_n_metric_master));
instance->max_n_metric_master *= 2;
- instance->metric_masters = realloc(instance->metric_masters, sizeof(struct metric *) * instance->max_n_metric_master);
- memset(instance->metric_masters + instance->n_metric_master, 0, sizeof(struct metric *) * (instance->max_n_metric_master - instance->n_metric_master));
}
instance->metric_masters[metric_id] = (struct metric *)metric;
- if (metric_id >= instance->n_metric_master) {
- instance->n_metric_master = metric_id + 1;
- }
name_id_map_add(instance->metric_name_id_map, metric_get_name(metric), metric_id);
}
static int append_metric_to_instance(struct fieldstat *instance, const struct metric *metric)
{
- int metric_id = instance->n_metric_master;
+ int metric_id = 0;
+ for (;metric_id < instance->max_n_metric_master; metric_id++) {
+ if (instance->metric_masters[metric_id] == NULL) {
+ break;
+ }
+ }
+
add_metric_to_instance(instance, metric, metric_id);
return metric_id;
@@ -680,7 +676,7 @@ int check_before_add(const struct fieldstat *instance, int cube_id, int metric_i
return FS_ERR_INVALID_CUBE_ID;
}
- if (metric_id < 0 || metric_id >= instance->n_metric_master) {
+ if (metric_id < 0 || metric_id >= instance->max_n_metric_master) {
return FS_ERR_INVALID_METRIC_ID;
}
const struct metric *metric = instance->metric_masters[metric_id];
@@ -959,12 +955,14 @@ int fieldstat_merge(struct fieldstat *instance, struct fieldstat *src)
return FS_ERR_NULL_HANDLER;
}
- int metric_len_src = src->n_metric_master;
- int metric_len_dst = instance->n_metric_master;
- int metric_len_common = metric_len_src > metric_len_dst ? metric_len_dst : metric_len_src;
- for (int i = 0; i < metric_len_common; i++) {
+ int metric_len_src = src->max_n_metric_master;
+ int metric_len_dst = instance->max_n_metric_master;
+ for (int i = 0; i < metric_len_src; i++) {
const struct metric *metric_src = src->metric_masters[i];
const struct metric *metric_dst = instance->metric_masters[i];
+ if (metric_src == NULL || metric_dst == NULL) {
+ break;
+ }
if (metric_get_type(metric_src) != metric_get_type(metric_dst) ||
strcmp(metric_get_name(metric_src), metric_get_name(metric_dst)) != 0
) {
@@ -972,7 +970,10 @@ int fieldstat_merge(struct fieldstat *instance, struct fieldstat *src)
return FS_ERR_INVALID_PARAM;
}
}
- for (int i = metric_len_common; i < metric_len_src; i++) {
+ for (int i = 0; i < metric_len_src; i++) {
+ if (instance->metric_masters[i] != NULL || src->metric_masters[i] == NULL) {
+ continue;
+ }
const struct metric *metric_src = src->metric_masters[i];
int id_tmp = append_metric_to_instance(instance, metric_fork(metric_src));
name_id_map_add(instance->metric_name_id_map, metric_get_name(metric_src), id_tmp);
@@ -1041,9 +1042,10 @@ struct fieldstat *fieldstat_fork(const struct fieldstat *instance)
new_instance->metric_masters = calloc(instance->max_n_metric_master, sizeof(struct metric *));
new_instance->max_n_metric_master = instance->max_n_metric_master;
- new_instance->n_metric_master = instance->n_metric_master;
- for (size_t i = 0; i < instance->n_metric_master; i++) {
- new_instance->metric_masters[i] = metric_fork(instance->metric_masters[i]);
+ for (size_t i = 0; i < instance->max_n_metric_master; i++) {
+ if (instance->metric_masters[i] != NULL) {
+ new_instance->metric_masters[i] = metric_fork(instance->metric_masters[i]);
+ }
}
new_instance->metric_name_id_map = name_id_map_copy(instance->metric_name_id_map);
@@ -1058,10 +1060,10 @@ void calibrate_metrics_in_instance(const struct fieldstat *master, struct fields
replica->max_n_metric_master = master->max_n_metric_master;
}
- size_t longer_arr_len = master->n_metric_master > replica->n_metric_master ? master->n_metric_master : replica->n_metric_master;
+ size_t longer_arr_len = master->max_n_metric_master > replica->max_n_metric_master ? master->max_n_metric_master : replica->max_n_metric_master;
for (size_t i = 0; i < longer_arr_len; i++) {
- const struct metric *metric_master = i >= master->n_metric_master ? NULL : master->metric_masters[i];
- struct metric *metric_target = i >= replica->n_metric_master ? NULL : replica->metric_masters[i];
+ const struct metric *metric_master = i >= master->max_n_metric_master ? NULL : master->metric_masters[i];
+ struct metric *metric_target = i >= replica->max_n_metric_master ? NULL : replica->metric_masters[i];
if (metric_master == NULL && metric_target == NULL) {
continue;
}
@@ -1086,8 +1088,6 @@ void calibrate_metrics_in_instance(const struct fieldstat *master, struct fields
// metric same, no need to do anything
}
-
- replica->n_metric_master = master->n_metric_master;
}
int fieldstat_calibrate(const struct fieldstat *master, struct fieldstat *replica)
@@ -1179,20 +1179,20 @@ void fieldstat_get_cubes(const struct fieldstat *instance, int **cube_ids, int *
void fieldstat_get_metrics(const struct fieldstat *instance, int **metric_id_out, size_t *n_metric)
{
- if (instance == NULL || instance->n_metric_master == 0) {
- *metric_id_out = NULL;
- *n_metric = 0;
- return;
- }
-
- int *tmp_ids = (int *)malloc(sizeof(int) * instance->n_metric_master);
+ int *tmp_ids = (int *)malloc(sizeof(int) * instance->max_n_metric_master);
*metric_id_out = tmp_ids;
- *n_metric = instance->n_metric_master;
- for (int i = 0; i < instance->n_metric_master; i++) {
- tmp_ids[i] = i;
+ int cnt = 0;
+ for (int i = 0; i < instance->max_n_metric_master; i++) {
+ if (instance->metric_masters[i] != NULL) {
+ tmp_ids[cnt] = i;
+ cnt ++;
+ }
}
-
- return;
+ if (cnt == 0) {
+ free(tmp_ids);
+ *metric_id_out = NULL;
+ }
+ *n_metric = cnt;
}
struct fieldstat_tag_list *fieldstat_get_shared_tags(const struct fieldstat *instance, int cube_id)
@@ -1263,7 +1263,7 @@ const struct metric *get_metric_by_tag_list(const struct fieldstat *instance, in
return NULL;
}
- if (metric_id < 0 || metric_id >= data->valid_metric_arr_len) {
+ if (metric_id < 0 || metric_id >= data->max_n_metric) {
*ret = FS_ERR_INVALID_METRIC_ID;
return NULL;
}
@@ -1359,7 +1359,7 @@ void fieldstat_tag_list_arr_free(struct fieldstat_tag_list *tag_list, size_t n_c
const char *fieldstat_get_metric_name(const struct fieldstat *instance, int metric_id)
{
- if (metric_id < 0 || metric_id >= instance->n_metric_master) {
+ if (metric_id < 0 || metric_id >= instance->max_n_metric_master) {
return NULL;
}
const struct metric *metric = instance->metric_masters[metric_id];
@@ -1372,7 +1372,7 @@ const char *fieldstat_get_metric_name(const struct fieldstat *instance, int metr
enum metric_type fieldstat_get_metric_type(const struct fieldstat *instance, int metric_id)
{
- if (instance == NULL || metric_id < 0 || metric_id >= instance->n_metric_master) {
+ if (instance == NULL || metric_id < 0 || metric_id >= instance->max_n_metric_master) {
return (enum metric_type)(-1);
}
const struct metric *metric = instance->metric_masters[metric_id];
@@ -1502,9 +1502,9 @@ void fieldstat_get_metric_in_cell(const struct fieldstat *instance, int cube_id,
return;
}
- *metric_id_out = (int *)malloc(sizeof(int) * cell_data->valid_metric_arr_len);
+ *metric_id_out = (int *)malloc(sizeof(int) * cell_data->max_n_metric);
int n_metric = 0;
- for (int i = 0; i < cell_data->valid_metric_arr_len; i++) {
+ for (int i = 0; i < cell_data->max_n_metric; i++) {
if (cell_data->metrics[i] != NULL) {
(*metric_id_out)[n_metric] = i;
n_metric++;
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index b2377fd..ced6420 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -48,13 +48,13 @@ function (add_unit_test file_name)
endfunction()
add_unit_test(test_easy_fs)
-# add_unit_test(test_empty_tags)
-# add_unit_test(test_exporter_json)
-# add_unit_test(test_fuzz_test)
-# add_unit_test(test_merge)
-# add_unit_test(test_metric_counter)
-# add_unit_test(test_metric_histogram)
-# add_unit_test(test_metric_hll)
-# add_unit_test(test_performance)
-# add_unit_test(test_register_and_reset)
-# add_unit_test(test_write_json_file) \ No newline at end of file
+add_unit_test(test_empty_tags)
+add_unit_test(test_exporter_json)
+add_unit_test(test_fuzz_test)
+add_unit_test(test_merge)
+add_unit_test(test_metric_counter)
+add_unit_test(test_metric_histogram)
+add_unit_test(test_metric_hll)
+add_unit_test(test_performance)
+add_unit_test(test_register_and_reset)
+add_unit_test(test_write_json_file) \ No newline at end of file