summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2024-03-28 18:15:17 +0800
committerchenzizhan <[email protected]>2024-03-28 18:15:17 +0800
commit3269ef27d012b244093fa623697a9db7ff59157d (patch)
tree9131087556578b604cc949669c6794e561e24ae6 /src
parentff8899c6760b1352f00acb6fd7a87f41acd2901c (diff)
fix: when calibrate and destroy are called in a specific order: 1. mem leak, 2. cubeid wrongv4.5.4
Diffstat (limited to 'src')
-rw-r--r--src/fieldstat.c46
-rw-r--r--src/tags/cell_manager.c24
-rw-r--r--src/tags/cell_manager.h1
3 files changed, 55 insertions, 16 deletions
diff --git a/src/fieldstat.c b/src/fieldstat.c
index 5c8235c..376bc43 100644
--- a/src/fieldstat.c
+++ b/src/fieldstat.c
@@ -228,10 +228,9 @@ void add_cube_to_position(struct fieldstat *instance, struct fs_cube *cube, int
free(old_ver_arr);
}
instance->cube[cube_id] = cube;
- instance->cube_version[cube_id] = 0;
- instance->valid_cube_arr_length = cube_id + 1;
-
- cube_manager_add(instance->shared_tag_cube_manager, cube->key_tag, cube_id);
+ if (cube_id >= instance->valid_cube_arr_length) {
+ instance->valid_cube_arr_length = cube_id + 1;
+ }
}
int fieldstat_append_cube_to_instance(struct fieldstat *instance, struct fs_cube *cube)
@@ -245,6 +244,7 @@ int fieldstat_append_cube_to_instance(struct fieldstat *instance, struct fs_cube
}
int cube_id = instance->valid_cube_arr_length;
add_cube_to_position(instance, cube, cube_id);
+ cube_manager_add(instance->shared_tag_cube_manager, cube->key_tag, cube_id);
return cube_id;
}
@@ -361,14 +361,9 @@ int fieldstat_cube_add(struct fieldstat *instance, int cube_id, const struct fie
return ret;
}
-void fieldstat_cube_free(struct fieldstat *instance, int cube_id)
+void fieldstat_cube_free_contents(struct fieldstat *instance, int cube_id)
{
struct fs_cube *cube = instance->cube[cube_id];
- if (cube == NULL) {
- return;
- }
-
- cube_manager_delete(instance->shared_tag_cube_manager, cube->key_tag);
cell_manager_free(cube->cell_manager);
fieldstat_free_tag_array(cube->shared_tags, cube->n_shared_tags);
@@ -383,6 +378,21 @@ void fieldstat_cube_free(struct fieldstat *instance, int cube_id)
free(cube);
instance->cube[cube_id] = NULL;
+
+ if (cube_id == instance->valid_cube_arr_length - 1) {
+ instance->valid_cube_arr_length--;
+ }
+}
+
+void fieldstat_cube_free(struct fieldstat *instance, int cube_id)
+{
+ if (instance->cube[cube_id] == NULL) {
+ return;
+ }
+
+ cube_manager_delete(instance->shared_tag_cube_manager, instance->cube[cube_id]->key_tag);
+
+ fieldstat_cube_free_contents(instance, cube_id);
}
struct fs_cube *fieldstat_cube_fork(const struct fs_cube *cube) {
@@ -989,15 +999,18 @@ int fieldstat_calibrate(const struct fieldstat *master, struct fieldstat *replic
replica->max_n_cube = master->max_n_cube;
}
- size_t longer_arr_len = master->valid_cube_arr_length > replica->valid_cube_arr_length ? master->valid_cube_arr_length : replica->valid_cube_arr_length;
+ size_t len_master = master->valid_cube_arr_length;
+ size_t len_replica = replica->valid_cube_arr_length;
+ size_t longer_arr_len = len_master > len_replica ? len_master : len_replica;
for (size_t i = 0; i < longer_arr_len; i++) {
- const struct fs_cube *cube_master = i >= master->valid_cube_arr_length ? NULL : master->cube[i];
- const struct fs_cube *cube_target = i >= replica->valid_cube_arr_length ? NULL : replica->cube[i];
+ const struct fs_cube *cube_master = i >= len_master ? NULL : master->cube[i];
+ const struct fs_cube *cube_target = i >= len_replica ? NULL : replica->cube[i];
+
if (cube_master == NULL && cube_target == NULL) {
continue;
}
if (cube_master == NULL && cube_target != NULL) {
- fieldstat_cube_free(replica, i);
+ fieldstat_cube_free_contents(replica, i);
continue;
}
if (cube_master != NULL && cube_target == NULL) {
@@ -1009,8 +1022,8 @@ int fieldstat_calibrate(const struct fieldstat *master, struct fieldstat *replic
if (master->cube_version[i] == replica->cube_version[i] && tag_hash_key_cmp(cube_master->key_tag, cube_target->key_tag) == 0) {
continue;
}
-
- fieldstat_cube_free(replica, i);
+
+ fieldstat_cube_free_contents(replica, i);
struct fs_cube *cube_dup = fieldstat_cube_fork(cube_master);
add_cube_to_position(replica, cube_dup, i);
}
@@ -1018,6 +1031,7 @@ int fieldstat_calibrate(const struct fieldstat *master, struct fieldstat *replic
memcpy(replica->cube_version, master->cube_version, sizeof(unsigned long) * master->max_n_cube);
replica->valid_cube_arr_length = master->valid_cube_arr_length;
+ cube_manager_calibrate(replica->shared_tag_cube_manager, master->shared_tag_cube_manager);
calibrate_metrics_in_instance(master, replica);
return FS_OK;
diff --git a/src/tags/cell_manager.c b/src/tags/cell_manager.c
index d3601ac..7c3b61e 100644
--- a/src/tags/cell_manager.c
+++ b/src/tags/cell_manager.c
@@ -372,4 +372,28 @@ int cube_manager_find(const struct cube_manager *pthis, const struct tag_hash_ke
} else {
return node->cell_id;
}
+}
+
+void cube_manager_calibrate(struct cube_manager *pthis, const struct cube_manager *master)
+{
+ struct tag_id_map *node = NULL;
+ struct tag_id_map *tmp = NULL;
+ HASH_ITER(hh, pthis->head, node, tmp) {
+ int cube_id = cube_manager_find(master, node->tag);
+ if (cube_id == -1) {
+ HASH_DEL(pthis->head, node);
+ tag_hash_key_free(node->tag);
+ free(node);
+ } else {
+ node->cell_id = cube_id;
+ }
+ }
+
+ // exist in master but not in self
+ HASH_ITER(hh, master->head, node, tmp) {
+ int cube_id = cube_manager_find(pthis, node->tag);
+ if (cube_id == -1) {
+ cube_manager_add(pthis, node->tag, node->cell_id);
+ }
+ }
} \ No newline at end of file
diff --git a/src/tags/cell_manager.h b/src/tags/cell_manager.h
index dbd6514..eea3bc3 100644
--- a/src/tags/cell_manager.h
+++ b/src/tags/cell_manager.h
@@ -34,6 +34,7 @@ void cube_manager_free(struct cube_manager *pthis);
void cube_manager_add(struct cube_manager *pthis, const struct tag_hash_key *tag, int id);
int cube_manager_find(const struct cube_manager *pthis, const struct tag_hash_key *tag);
void cube_manager_delete(struct cube_manager *pthis, const struct tag_hash_key *tag);
+void cube_manager_calibrate(struct cube_manager *pthis, const struct cube_manager *master);
#ifdef __cplusplus
}