From a184be53deca03f18ea9c91bd227a1d1a9b42b04 Mon Sep 17 00:00:00 2001 From: zhengchao Date: Thu, 3 Mar 2022 15:39:39 +0500 Subject: [PATCH] =?UTF-8?q?ex=20data=E6=9B=B4=E6=96=B0=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E8=80=97=E6=97=B610=E7=A7=92=E4=BB=A5=E4=B8=8A=EF=BC=8C?= =?UTF-8?q?=E8=B6=85=E8=BF=87=E5=85=A8=E5=B1=80=E5=9E=83=E5=9C=BE=E5=9B=9E?= =?UTF-8?q?=E6=94=B6=E6=97=B6=E9=97=B4=EF=BC=8C=E5=AF=BC=E8=87=B4=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E5=86=85=E5=AD=98=E8=AE=BF=E9=97=AE=E3=80=82=E5=9B=A0?= =?UTF-8?q?=E6=AD=A4=EF=BC=8C=20=E6=AF=8F=E4=B8=AA=E8=A1=A8=E7=9A=84ex=20d?= =?UTF-8?q?ata=E4=BD=BF=E7=94=A8=E7=8B=AC=E7=AB=8B=E7=9A=84=E5=9E=83?= =?UTF-8?q?=E5=9C=BE=E5=9B=9E=E6=94=B6=E9=98=9F=E5=88=97=EF=BC=8C=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E6=9B=B4=E6=96=B0=E5=AE=8C=E6=AF=95=E6=97=B6=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E5=9B=9E=E6=94=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entry/Maat_ex_data.cpp | 19 ++++++++----------- src/entry/Maat_garbage_collection.cpp | 12 ++++++++++++ src/entry/Maat_rule.cpp | 2 +- src/entry/Maat_table_runtime.cpp | 9 +++------ src/inc_internal/Maat_ex_data.h | 2 +- src/inc_internal/Maat_garbage_collection.h | 1 + 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/entry/Maat_ex_data.cpp b/src/entry/Maat_ex_data.cpp index dd6504f..aefc346 100644 --- a/src/entry/Maat_ex_data.cpp +++ b/src/entry/Maat_ex_data.cpp @@ -30,14 +30,13 @@ struct EX_data_rt pthread_mutex_t mutex_update_commit; int is_updating; - time_t update_start_time; char effective_hash;//value 'a' or 'b', indicates which hash is effective struct EX_data_container* hash_key2ex_a, *hash_key2ex_b; //two hash for read-copy-update (RCU) const struct EX_data_schema* ex_schema; int table_id; void (* user_data_free)(void *user_data); - struct Maat_garbage_bin* ref_bin; + struct Maat_garbage_bin* garbage_bin; }; @@ -63,7 +62,7 @@ void cache_row_free(void*p) } UT_icd ut_cache_row_icd = {sizeof(char*), NULL, NULL, cache_row_free}; -struct EX_data_rt* EX_data_rt_new(int table_id, Maat_plugin_EX_key2index_func_t * key2index, void (* user_data_free)(void *user_data), struct Maat_garbage_bin* bin) +struct EX_data_rt* EX_data_rt_new(int table_id, Maat_plugin_EX_key2index_func_t * key2index, void (* user_data_free)(void *user_data)) { struct EX_data_rt* p=ALLOC(struct EX_data_rt, 1); p->hash_key2ex_a=NULL; @@ -72,7 +71,7 @@ struct EX_data_rt* EX_data_rt_new(int table_id, Maat_plugin_EX_key2index_func_t utarray_new(p->cache_rows, &ut_cache_row_icd); p->table_id=table_id; p->user_data_free=user_data_free; - p->ref_bin=bin; + p->garbage_bin=Maat_garbage_bin_new(60); pthread_mutex_init(&p->mutex_update_commit, NULL); return p; }; @@ -114,7 +113,8 @@ void EX_data_rt_free(struct EX_data_rt* ex_rt) ex_rt->cache_rows=NULL; ex_rt->cache_row_num=0; } - ex_rt->ref_bin=NULL; + Maat_garbage_bin_free(ex_rt->garbage_bin); + ex_rt->garbage_bin=NULL; free(ex_rt); return; } @@ -160,7 +160,7 @@ void EX_data_rt_update_prepare(struct EX_data_rt* ex_rt) HASH_ADD_KEYPTR(hh_a, ex_rt->hash_key2ex_a, ex_container->key, ex_container->key_len, ex_container); } } - ex_rt->update_start_time=time(NULL); + assert(0==Maat_garbage_bin_get_size(ex_rt->garbage_bin)); ex_rt->is_updating=1; return; } @@ -195,10 +195,7 @@ void EX_data_rt_update_commit(struct EX_data_rt* ex_rt) } } ex_rt->is_updating=0; - if(time(NULL)-ex_rt->update_start_time>10) - { - printf("Danger: %s cost more time than EXC garbage collection timeout.\n", __func__); - } + Maat_garbage_collect_by_force(ex_rt->garbage_bin); pthread_mutex_unlock(&ex_rt->mutex_update_commit); return; } @@ -310,7 +307,7 @@ int EX_data_rt_delete_by_row(struct EX_data_rt* ex_rt, const char* row, const ch if(exc) { EX_data_rt_updating_hash_del(ex_rt, exc); - Maat_garbage_bagging(ex_rt->ref_bin, exc, (void (*)(void*))EX_data_container_free); + Maat_garbage_bagging(ex_rt->garbage_bin, exc, (void (*)(void*))EX_data_container_free); ret=0; } else diff --git a/src/entry/Maat_garbage_collection.cpp b/src/entry/Maat_garbage_collection.cpp index 1c7b4f3..ff981bf 100644 --- a/src/entry/Maat_garbage_collection.cpp +++ b/src/entry/Maat_garbage_collection.cpp @@ -81,4 +81,16 @@ void Maat_garbage_collect_routine(struct Maat_garbage_bin* bin) bin->bag_cnt-=n_clollected; return; } +void Maat_garbage_collect_by_force(struct Maat_garbage_bin* bin) +{ + struct Maat_garbage_bag* p=NULL; + while (p=TAILQ_FIRST(&bin->garbage_q)) + { + p->garbage_free(p->garbage); + TAILQ_REMOVE(&bin->garbage_q, p, entries); + free(p); + bin->bag_cnt--; + } + return; +} diff --git a/src/entry/Maat_rule.cpp b/src/entry/Maat_rule.cpp index 3df5c38..dd1d9ab 100644 --- a/src/entry/Maat_rule.cpp +++ b/src/entry/Maat_rule.cpp @@ -57,7 +57,7 @@ extern "C" } #endif -int MAAT_FRAME_VERSION_3_5_0_20220121=1; +int MAAT_FRAME_VERSION_3_6_1_20220303=1; int is_valid_table_name(const char* str) { diff --git a/src/entry/Maat_table_runtime.cpp b/src/entry/Maat_table_runtime.cpp index 512beb7..a87148b 100644 --- a/src/entry/Maat_table_runtime.cpp +++ b/src/entry/Maat_table_runtime.cpp @@ -141,8 +141,7 @@ static struct Maat_table_runtime* table_runtime_new(const struct Maat_table_sche case TABLE_TYPE_PLUGIN: table_rt->plugin.ex_data_rt=EX_data_rt_new(table_schema->table_id, table_schema->plugin.ex_schema.key2index_func, - NULL, - bin); + NULL); if(table_schema->plugin.have_exdata) { EX_data_rt_set_schema(table_rt->plugin.ex_data_rt, &table_schema->plugin.ex_schema); @@ -151,8 +150,7 @@ static struct Maat_table_runtime* table_runtime_new(const struct Maat_table_sche case TABLE_TYPE_IP_PLUGIN: table_rt->ip_plugin.ex_data_rt=EX_data_rt_new(table_schema->table_id, table_schema->ip_plugin.ex_schema.key2index_func, - free, - bin); + free); if(table_schema->ip_plugin.have_exdata) { EX_data_rt_set_schema(table_rt->ip_plugin.ex_data_rt, &table_schema->ip_plugin.ex_schema); @@ -161,8 +159,7 @@ static struct Maat_table_runtime* table_runtime_new(const struct Maat_table_sche case TABLE_TYPE_FQDN_PLUGIN: table_rt->fqdn_plugin.ex_data_rt=EX_data_rt_new(table_schema->table_id, table_schema->fqdn_plugin.ex_schema.key2index_func, - _notype_fqdn_rule_free, - bin); + _notype_fqdn_rule_free); if(table_schema->fqdn_plugin.have_exdata) { EX_data_rt_set_schema(table_rt->fqdn_plugin.ex_data_rt, &table_schema->fqdn_plugin.ex_schema); diff --git a/src/inc_internal/Maat_ex_data.h b/src/inc_internal/Maat_ex_data.h index 92412e0..b06d848 100644 --- a/src/inc_internal/Maat_ex_data.h +++ b/src/inc_internal/Maat_ex_data.h @@ -3,7 +3,7 @@ #include "Maat_garbage_collection.h" struct EX_data_rt; -struct EX_data_rt* EX_data_rt_new(int table_id, Maat_plugin_EX_key2index_func_t * key2index, void (* user_data_free)(void *user_data), struct Maat_garbage_bin* bin); +struct EX_data_rt* EX_data_rt_new(int table_id, Maat_plugin_EX_key2index_func_t * key2index, void (* user_data_free)(void *user_data)); void EX_data_rt_free(struct EX_data_rt* p); void EX_data_rt_update_commit(struct EX_data_rt* ex_rt); diff --git a/src/inc_internal/Maat_garbage_collection.h b/src/inc_internal/Maat_garbage_collection.h index 8a2293d..2c2e1da 100644 --- a/src/inc_internal/Maat_garbage_collection.h +++ b/src/inc_internal/Maat_garbage_collection.h @@ -6,4 +6,5 @@ void Maat_garbage_bin_free(struct Maat_garbage_bin* bin); void Maat_garbage_bagging(struct Maat_garbage_bin* bin, void* garbage, void (* func)(void *)); void Maat_garbage_collect_routine(struct Maat_garbage_bin* bin); size_t Maat_garbage_bin_get_size(struct Maat_garbage_bin* bin); +void Maat_garbage_collect_by_force(struct Maat_garbage_bin* bin);