[FEATURE]compile/plugin/xx_plugin table support gc

This commit is contained in:
刘文坛
2023-06-19 09:44:25 +00:00
parent 0b73681bd1
commit df36b8987b
22 changed files with 455 additions and 393 deletions

View File

@@ -15,10 +15,9 @@ struct log_handle *g_logger = NULL;
struct maat *g_maat_inst = NULL;
struct user_info {
char name[256];
char name[16];
char ip_addr[32];
int id;
int ref_cnt;
};
void ex_data_new_cb(const char *table_name, int table_id, const char *key, const char *table_line,
@@ -26,10 +25,10 @@ void ex_data_new_cb(const char *table_name, int table_id, const char *key, const
{
int *counter = (int *)argp;
struct user_info *u = ALLOC(struct user_info, 1);
int valid = 0, tag = 0;
int ret = sscanf(table_line, "%d\t%s\t%s%d\t%d", &(u->id), u->ip_addr, u->name, &valid, &tag);
EXPECT_EQ(ret, 5);
u->ref_cnt = 0;
int ret = sscanf(table_line, "%d\t%s\t%s", &(u->id), u->ip_addr, u->name);
EXPECT_EQ(ret, 3);
*ad = u;
(*counter)++;
}
@@ -37,19 +36,15 @@ void ex_data_new_cb(const char *table_name, int table_id, const char *key, const
void ex_data_free_cb(int table_id, void **ad, long argl, void *argp)
{
struct user_info *u = (struct user_info *)(*ad);
if ((__sync_sub_and_fetch(&u->ref_cnt, 1) == 0)) {
printf("yes, free(u)\n");
free(u);
*ad = NULL;
} else {
printf("u->ref_cnt:%d\n", u->ref_cnt);
}
memset(u, 0, sizeof(struct user_info));
free(u);
*ad = NULL;
}
void ex_data_dup_cb(int table_id, void **to, void **from, long argl, void *argp)
{
struct user_info *u = (struct user_info *)(*from);
__sync_add_and_fetch(&(u->ref_cnt), 1);
*to = u;
}
@@ -59,7 +54,7 @@ TEST(EXDataRuntime, Update) {
ASSERT_GT(table_id, 0);
int ex_data_counter = 0;
struct ex_data_runtime *ex_data_rt = ex_data_runtime_new(table_id, g_logger);
struct ex_data_runtime *ex_data_rt = ex_data_runtime_new(table_id, 3, g_logger);
struct ex_container_schema *container_schema = ALLOC(struct ex_container_schema, 1);
container_schema->custom_data_free = NULL;
container_schema->table_id = table_id;
@@ -72,7 +67,7 @@ TEST(EXDataRuntime, Update) {
ex_data_runtime_set_ex_container_schema(ex_data_rt, container_schema);
const char *row1 = "1\t192.168.0.1\tmahuateng\t1\t0";
const char *row1 = "101\t192.168.0.1\tmahuateng";
const char *key1 = "192.168.0.1";
size_t key1_len = strlen(key1);
void *ex_data = ex_data_runtime_row2ex_data(ex_data_rt, table_name, row1, key1, key1_len);
@@ -82,7 +77,7 @@ TEST(EXDataRuntime, Update) {
int ret = ex_data_runtime_add_ex_container(ex_data_rt, key1, key1_len, ex_container);
EXPECT_EQ(ret, 0);
const char *row2 = "2\t192.168.0.2\tliyanhong\t1\t0";
const char *row2 = "102\t192.168.0.2\tliyanhong";
const char *key2 = "192.168.0.2";
size_t key2_len = strlen(key2);
ex_data = ex_data_runtime_row2ex_data(ex_data_rt, table_name, row2, key2, key2_len);
@@ -92,22 +87,35 @@ TEST(EXDataRuntime, Update) {
ex_data_runtime_commit(ex_data_rt);
void *res_data1 = ex_data_runtime_get_ex_data_by_key(ex_data_rt, "192.168.0.1", 11);
void *res_data1 = ex_data_runtime_get_ex_data_by_key(ex_data_rt, key1, key1_len);
EXPECT_TRUE(res_data1 != NULL);
struct user_info *info = (struct user_info *)res_data1;
EXPECT_EQ(0, strcmp(info->name, "mahuateng"));
EXPECT_EQ(info->id, 1);
ex_data_free_cb(table_id, (void **)&res_data1, 0, NULL);
struct user_info *info1 = (struct user_info *)res_data1;
EXPECT_EQ(0, strcmp(info1->name, "mahuateng"));
EXPECT_EQ(info1->id, 101);
ex_container = NULL;
void *res_data2 = ex_data_runtime_get_ex_data_by_key(ex_data_rt, "192.168.0.2", 11);
void *res_data2 = ex_data_runtime_get_ex_data_by_key(ex_data_rt, key2, key2_len);
EXPECT_TRUE(res_data2 != NULL);
info = (struct user_info *)res_data2;
EXPECT_EQ(0, strcmp(info->name, "liyanhong"));
EXPECT_EQ(info->id, 2);
ex_data_free_cb(table_id, (void **)&res_data2, 0, NULL);
struct user_info *info2 = (struct user_info *)res_data2;
EXPECT_EQ(0, strcmp(info2->name, "liyanhong"));
EXPECT_EQ(info2->id, 102);
ex_data_runtime_del_ex_container(ex_data_rt, key1, key1_len);
ex_data_runtime_commit(ex_data_rt);
EXPECT_EQ(0, strcmp(info1->name, "mahuateng"));
EXPECT_EQ(info1->id, 101);
sleep(5);
ex_data_runtime_garbage_collect_routine(ex_data_rt);
EXPECT_EQ(0, strcmp(info2->name, "liyanhong"));
EXPECT_EQ(info2->id, 102);
EXPECT_NE(0, strcmp(info1->name, "mahuateng"));
EXPECT_NE(info1->id, 101);
ex_data_runtime_free(ex_data_rt);
FREE(container_schema);