This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-maat/src/maat_rule.c

499 lines
19 KiB
C
Raw Normal View History

2023-02-22 15:22:41 +08:00
/**********************************************************************************************
2023-05-04 17:10:19 +08:00
* File: maat_rule.c
2022-11-17 05:05:35 +08:00
* Description:
* Authors: Liu WenTan <liuwentan@geedgenetworks.com>
* Date: 2022-10-31
2023-05-04 17:10:19 +08:00
* Copyright: (c) Since 2022 Geedge Networks, Ltd. All rights reserved.
2022-11-17 05:05:35 +08:00
***********************************************************************************************
*/
#include <unistd.h>
2022-11-25 16:32:29 +08:00
#include <stdio.h>
2022-11-17 05:05:35 +08:00
#include <pthread.h>
#include <linux/limits.h>
2022-11-25 16:32:29 +08:00
#include <string.h>
#include <sys/prctl.h>
2022-12-03 22:23:41 +08:00
#include <sys/stat.h>
2022-11-25 16:32:29 +08:00
#include <assert.h>
2022-11-17 05:05:35 +08:00
2022-12-03 22:23:41 +08:00
#include "json2iris.h"
2023-01-31 20:39:53 +08:00
#include "log/log.h"
2022-11-17 05:05:35 +08:00
#include "maat_utils.h"
2022-12-03 22:23:41 +08:00
#include "maat_rule.h"
#include "maat_config_monitor.h"
#include "maat_redis_monitor.h"
2023-01-30 21:59:35 +08:00
#include "maat_table.h"
#include "maat_compile.h"
#include "maat_plugin.h"
2023-04-20 15:34:56 +08:00
#include "maat_stat.h"
#include "ip_matcher.h"
#include "alignment.h"
2023-01-31 20:39:53 +08:00
#include "maat_garbage_collection.h"
2022-11-17 05:05:35 +08:00
2022-12-09 17:12:18 +08:00
#define MODULE_MAAT_RULE module_name_str("maat.rule")
#define ITEM_RULE_MAGIC 0x4d3c2b1a
2023-05-07 23:09:33 +08:00
struct maat_item_inner *maat_item_inner_new(long long item_id, long long group_id,
long long district_id)
2023-01-30 21:59:35 +08:00
{
struct maat_item_inner *item = ALLOC(struct maat_item_inner, 1);
item->magic_num = ITEM_RULE_MAGIC;
item->item_id = item_id;
item->group_id = group_id;
item->district_id = district_id;
return item;
}
2023-01-31 20:39:53 +08:00
void maat_item_inner_free(void *item_inner)
2023-01-30 21:59:35 +08:00
{
2023-01-31 20:39:53 +08:00
if (NULL == item_inner) {
return;
}
struct maat_item_inner *item = (struct maat_item_inner *)item_inner;
2023-01-30 21:59:35 +08:00
assert(item->magic_num == ITEM_RULE_MAGIC);
item->magic_num = 0;
FREE(item);
2023-01-30 21:59:35 +08:00
}
2022-11-25 16:32:29 +08:00
struct maat_runtime* maat_runtime_create(long long version, struct maat *maat_instance)
2022-11-17 05:05:35 +08:00
{
struct maat_runtime *maat_rt = ALLOC(struct maat_runtime, 1);
maat_rt->version = version;
2023-05-04 17:10:19 +08:00
int ret = table_manager_runtime_create(maat_instance->tbl_mgr, maat_instance->opts.nr_worker_thread,
2023-01-31 20:39:53 +08:00
maat_instance->garbage_bin);
2023-01-30 21:59:35 +08:00
if (ret < 0) {
FREE(maat_rt);
return NULL;
}
maat_rt->ref_tbl_mgr = maat_instance->tbl_mgr;
2023-04-22 11:30:49 +08:00
maat_rt->max_table_num = table_manager_table_size(maat_instance->tbl_mgr);
maat_rt->sequence_map = maat_kv_store_new();
maat_rt->logger = maat_instance->logger;
maat_rt->ref_garbage_bin = maat_instance->garbage_bin;
2023-05-04 17:10:19 +08:00
maat_rt->ref_cnt = alignment_int64_array_alloc(maat_instance->opts.nr_worker_thread);
2022-11-25 16:32:29 +08:00
return maat_rt;
2022-11-17 05:05:35 +08:00
}
2023-04-12 20:48:19 +08:00
void maat_runtime_commit(struct maat_runtime *maat_rt, int update_type,
long long maat_rt_version, struct log_handle *logger)
2022-11-17 05:05:35 +08:00
{
for (size_t i = 0; i < maat_rt->max_table_num; i++) {
table_manager_commit_runtime(maat_rt->ref_tbl_mgr, i, update_type, maat_rt_version);
2022-11-17 05:05:35 +08:00
}
2022-11-25 16:32:29 +08:00
maat_rt->last_update_time = time(NULL);
2022-11-17 05:05:35 +08:00
}
2022-11-25 16:32:29 +08:00
void maat_start_cb(long long new_version, int update_type, void *u_param)
2022-11-17 05:05:35 +08:00
{
struct maat *maat_instance = (struct maat *)u_param;
maat_instance->new_version = new_version;
2023-04-12 20:48:19 +08:00
size_t i = 0;
2023-04-22 11:30:49 +08:00
size_t max_table_cnt = table_manager_table_size(maat_instance->tbl_mgr);
2023-04-12 20:48:19 +08:00
enum table_type table_type = TABLE_TYPE_INVALID;
2023-02-03 17:28:14 +08:00
if (update_type == MAAT_UPDATE_TYPE_FULL) {
2022-11-25 16:32:29 +08:00
maat_instance->creating_maat_rt = maat_runtime_create(new_version, maat_instance);
2023-04-22 11:30:49 +08:00
for (i = 0; i < max_table_cnt; i++) {
2023-04-12 20:48:19 +08:00
table_type = table_manager_get_table_type(maat_instance->tbl_mgr, i);
if (table_type == TABLE_TYPE_COMPILE) {
// compile runtime need a reference to maat runtime
void *compile_rt = table_manager_get_updating_runtime(maat_instance->tbl_mgr, i);
compile_runtime_init(compile_rt, maat_instance->creating_maat_rt);
}
}
} else {
2022-11-17 05:05:35 +08:00
maat_instance->maat_version = new_version;
}
2022-11-25 16:32:29 +08:00
2023-04-22 11:30:49 +08:00
for (i = 0; i < max_table_cnt; i++) {
2023-04-12 20:48:19 +08:00
table_type = table_manager_get_table_type(maat_instance->tbl_mgr, i);
if (table_type == TABLE_TYPE_PLUGIN) {
void *schema = table_manager_get_schema(maat_instance->tbl_mgr, i);
plugin_table_all_callback_start((struct plugin_schema *)schema, update_type);
}
2023-04-12 20:48:19 +08:00
}
2022-11-17 05:05:35 +08:00
}
2022-11-25 16:32:29 +08:00
int maat_update_cb(const char *table_name, const char *line, void *u_param)
2022-11-17 05:05:35 +08:00
{
2023-01-30 21:59:35 +08:00
if (NULL == table_name || NULL == line || NULL == u_param) {
return 0;
}
2022-11-17 05:05:35 +08:00
struct maat *maat_instance =(struct maat *)u_param;
struct maat_runtime* maat_rt = NULL;
2023-01-30 21:59:35 +08:00
int table_id = table_manager_get_table_id(maat_instance->tbl_mgr, table_name);
2022-12-03 22:23:41 +08:00
if (table_id < 0) {
2023-01-30 21:59:35 +08:00
log_error(maat_instance->logger, MODULE_MAAT_RULE,
2023-03-02 14:52:31 +08:00
"[%s:%d] update warning, unknown table name %s",
__FUNCTION__, __LINE__, table_name);
2022-12-03 22:23:41 +08:00
return -1;
}
2023-01-30 21:59:35 +08:00
void *schema = table_manager_get_schema(maat_instance->tbl_mgr, table_id);
if (NULL == schema) {
2022-12-09 17:12:18 +08:00
log_error(maat_instance->logger, MODULE_MAAT_RULE,
2023-03-02 14:52:31 +08:00
"[%s:%d] update warning, table name %s doesn't have table schema",
__FUNCTION__, __LINE__, table_name);
2022-12-03 22:23:41 +08:00
return -1;
}
2022-12-06 00:35:36 +08:00
2023-04-12 20:48:19 +08:00
int update_type = MAAT_UPDATE_TYPE_INC;
if (maat_instance->creating_maat_rt != NULL) { //Full update
2022-11-25 16:32:29 +08:00
maat_rt = maat_instance->creating_maat_rt;
2023-04-12 20:48:19 +08:00
update_type = MAAT_UPDATE_TYPE_FULL;
2022-11-17 05:05:35 +08:00
} else {
maat_rt = maat_instance->maat_rt;
}
2023-04-12 20:48:19 +08:00
table_manager_update_runtime(maat_rt->ref_tbl_mgr, table_name, table_id, line, update_type);
2023-01-30 21:59:35 +08:00
2022-11-17 05:05:35 +08:00
return 0;
}
2023-04-12 19:20:05 +08:00
long long maat_runtime_rule_num(struct maat_runtime *maat_rt)
2022-11-25 16:32:29 +08:00
{
2023-04-12 19:20:05 +08:00
long long total = 0;
2022-11-25 16:32:29 +08:00
for (size_t i = 0; i < maat_rt->max_table_num; i++) {
2023-04-12 19:20:05 +08:00
long long rule_cnt = table_manager_runtime_rule_count(maat_rt->ref_tbl_mgr, i);
total += rule_cnt;
if (rule_cnt != 0) {
log_info(maat_rt->logger, MODULE_MAAT_RULE, "table:%d rule count:%lld", i, rule_cnt);
}
2022-11-25 16:32:29 +08:00
}
return total;
}
2023-01-31 20:39:53 +08:00
void maat_plugin_table_all_callback_finish(struct table_manager *tbl_mgr)
{
2023-04-22 11:30:49 +08:00
size_t max_table_cnt = table_manager_table_size(tbl_mgr);
enum table_type table_type = TABLE_TYPE_INVALID;
2023-01-31 20:39:53 +08:00
2023-04-22 11:30:49 +08:00
for (size_t i = 0; i < max_table_cnt; i++) {
2023-01-31 20:39:53 +08:00
table_type = table_manager_get_table_type(tbl_mgr, i);
if (table_type != TABLE_TYPE_PLUGIN) {
continue;
}
void *plugin_schema = table_manager_get_schema(tbl_mgr, i);
plugin_table_all_callback_finish((struct plugin_schema *)plugin_schema);
}
}
2022-11-17 05:05:35 +08:00
void maat_finish_cb(void *u_param)
{
struct maat *maat_instance = (struct maat *)u_param;
2023-01-31 20:39:53 +08:00
maat_plugin_table_all_callback_finish(maat_instance->tbl_mgr);
2022-11-25 16:32:29 +08:00
if (maat_instance->creating_maat_rt != NULL) {
maat_runtime_commit(maat_instance->creating_maat_rt, MAAT_UPDATE_TYPE_FULL,
maat_instance->creating_maat_rt->version, maat_instance->logger);
2023-04-12 19:20:05 +08:00
maat_instance->creating_maat_rt->rule_num = maat_runtime_rule_num(maat_instance->creating_maat_rt);
2023-02-03 17:28:14 +08:00
log_info(maat_instance->logger, MODULE_MAAT_RULE,
"Full config version %llu load %d entries complete",
maat_instance->creating_maat_rt->version,
maat_instance->creating_maat_rt->rule_num);
2022-11-25 16:32:29 +08:00
} else if (maat_instance->maat_rt != NULL) {
maat_instance->maat_rt->version = maat_instance->maat_version;
maat_runtime_commit(maat_instance->maat_rt, MAAT_UPDATE_TYPE_INC,
maat_instance->maat_rt->version, maat_instance->logger);
2023-04-12 19:20:05 +08:00
maat_instance->maat_rt->rule_num = maat_runtime_rule_num(maat_instance->maat_rt);
2023-02-03 17:28:14 +08:00
log_info(maat_instance->logger, MODULE_MAAT_RULE,
"Inc config version %llu load %d entries complete",
maat_instance->maat_rt->version,
maat_instance->maat_rt->rule_num);
} else {
log_info(maat_instance->logger, MODULE_MAAT_RULE,
"Version %d has no valid rules, plugin callback complete.",
maat_instance->maat_version);
2022-11-17 05:05:35 +08:00
}
maat_instance->new_version = INVALID_VERSION;
2022-11-17 05:05:35 +08:00
}
void maat_read_full_config(struct maat *maat_instance)
{
int ret = -1;
char err_str[NAME_MAX] = {0};
struct source_redis_ctx *redis_ctx = NULL;
switch (maat_instance->opts.input_mode) {
case DATA_SOURCE_REDIS:
redis_ctx = &(maat_instance->opts.redis_ctx);
log_info(maat_instance->logger, MODULE_MAAT_RULE,
"Maat initiate from Redis %s:%hu db%d",
redis_ctx->redis_ip, redis_ctx->redis_port, redis_ctx->redis_db);
redis_ctx->read_ctx = maat_cmd_connect_redis(redis_ctx->redis_ip,
redis_ctx->redis_port,
redis_ctx->redis_db,
maat_instance->logger);
if (redis_ctx->read_ctx != NULL) {
redis_monitor_traverse(maat_instance->maat_version, redis_ctx,
maat_start_cb, maat_update_cb, maat_finish_cb,
maat_instance);
}
if (NULL == maat_instance->creating_maat_rt) {
log_error(maat_instance->logger, MODULE_MAAT_RULE,
"[%s:%d] At initiation: NO effective rule in redis %s:%hu db%d",
__FUNCTION__, __LINE__, redis_ctx->redis_ip, redis_ctx->redis_port,
redis_ctx->redis_db);
}
break;
case DATA_SOURCE_IRIS_FILE:
config_monitor_traverse(maat_instance->maat_version,
maat_instance->opts.iris_ctx.full_idx_dir,
maat_start_cb, maat_update_cb, maat_finish_cb,
maat_instance, maat_instance->opts.decrypt_key,
maat_instance->logger);
if (NULL == maat_instance->creating_maat_rt) {
log_error(maat_instance->logger, MODULE_MAAT_RULE,
"[%s:%d] At initiation: NO effective rule in %s",
__FUNCTION__, __LINE__, maat_instance->opts.iris_ctx.full_idx_dir);
}
break;
case DATA_SOURCE_JSON_FILE:
ret = load_maat_json_file(maat_instance, maat_instance->opts.json_ctx.json_file,
err_str, sizeof(err_str));
if (ret < 0) {
log_error(maat_instance->logger, MODULE_MAAT_RULE,
"[%s:%d] Maat re-initiate with JSON file %s failed: %s",
__FUNCTION__, __LINE__, maat_instance->opts.json_ctx.json_file, err_str);
}
config_monitor_traverse(maat_instance->maat_version,
maat_instance->opts.json_ctx.iris_file,
maat_start_cb, maat_update_cb, maat_finish_cb,
maat_instance, maat_instance->opts.decrypt_key,
maat_instance->logger);
if (NULL == maat_instance->creating_maat_rt) {
log_error(maat_instance->logger, MODULE_MAAT_RULE,
"[%s:%d] At initiation: NO effective rule in %s",
__FUNCTION__, __LINE__, maat_instance->opts.json_ctx.iris_file);
}
break;
default:
break;
}
maat_instance->maat_rt = maat_instance->creating_maat_rt;
maat_instance->creating_maat_rt = NULL;
maat_instance->is_running = 1;
if (maat_instance->maat_rt != NULL) {
maat_instance->maat_version = maat_instance->maat_rt->version;
maat_instance->last_full_version = maat_instance->maat_rt->version;
}
}
long long maat_runtime_get_sequence(struct maat_runtime *maat_rt, const char *key)
{
if (NULL == maat_rt || NULL == key) {
return -1;
}
long long sequence = 0;
int map_ret = maat_kv_read(maat_rt->sequence_map, key, &sequence);
if (map_ret < 0) {
maat_kv_register(maat_rt->sequence_map, key, sequence);
} else {
sequence++;
int ret = maat_kv_write(maat_rt->sequence_map, key, sequence);
if (ret < 0) {
return -1;
}
}
return sequence;
}
void maat_runtime_destroy(struct maat_runtime *maat_rt)
{
if (NULL == maat_rt) {
return;
}
if (maat_rt->sequence_map != NULL) {
maat_kv_store_free(maat_rt->sequence_map);
maat_rt->sequence_map = NULL;
}
if (maat_rt->ref_cnt != NULL) {
alignment_int64_array_free(maat_rt->ref_cnt);
maat_rt->ref_cnt = NULL;
}
FREE(maat_rt);
}
void garbage_maat_kv_store_free(void *kv_store, void *arg)
{
struct maat_kv_store *store = (struct maat_kv_store *)kv_store;
maat_kv_store_free(store);
}
void garbage_maat_runtime_destroy(void *maat_runtime, void *arg)
{
struct maat_runtime *maat_rt = (struct maat_runtime *)maat_runtime;
maat_runtime_destroy(maat_rt);
}
2022-11-17 05:05:35 +08:00
void *rule_monitor_loop(void *arg)
{
2022-11-25 16:32:29 +08:00
/* Defined by prctl: The name can be up to 16 bytes long, and should
be null terminated if it contains fewer bytes. */
char maat_name[16] = {0};
2022-11-17 05:05:35 +08:00
struct maat *maat_instance = (struct maat *)arg;
2023-05-04 17:10:19 +08:00
if (strlen(maat_instance->opts.instance_name) > 0) {
snprintf(maat_name, sizeof(maat_name), "MAAT_%s", maat_instance->opts.instance_name);
2022-11-25 16:32:29 +08:00
} else {
snprintf(maat_name, sizeof(maat_name), "MAAT");
}
int ret = prctl(PR_SET_NAME, (unsigned long long)maat_name, NULL, NULL, NULL);
assert(ret >= 0);
pthread_mutex_lock(&(maat_instance->background_update_mutex));
/* if deferred load on */
2023-05-04 17:10:19 +08:00
if (maat_instance->opts.deferred_load_on != 0) {
2023-02-03 17:28:14 +08:00
log_info(maat_instance->logger, MODULE_MAAT_RULE,
2023-03-02 14:52:31 +08:00
"Deferred Loading ON, updating in %s:%d", __FUNCTION__, __LINE__);
2023-04-14 11:32:59 +08:00
maat_read_full_config(maat_instance);
2022-11-25 16:32:29 +08:00
}
pthread_mutex_unlock(&(maat_instance->background_update_mutex));
2022-12-03 22:23:41 +08:00
char md5_tmp[MD5_DIGEST_LENGTH * 2 + 1] = {0};
char err_str[NAME_MAX] = {0};
struct stat attrib;
2022-11-17 05:05:35 +08:00
while (maat_instance->is_running) {
2023-03-02 14:52:31 +08:00
log_info(maat_instance->logger, MODULE_MAAT_RULE, "%s:%d.............", __FUNCTION__, __LINE__);
2023-05-04 17:10:19 +08:00
usleep(maat_instance->opts.rule_update_checking_interval_ms * 1000);
2023-02-16 16:45:06 +08:00
if (0 == pthread_mutex_trylock(&(maat_instance->background_update_mutex))) {
2023-05-04 17:10:19 +08:00
switch (maat_instance->opts.input_mode) {
2022-12-03 22:23:41 +08:00
case DATA_SOURCE_REDIS:
redis_monitor_traverse(maat_instance->maat_version,
2023-05-04 17:10:19 +08:00
&(maat_instance->opts.redis_ctx),
2022-12-09 17:12:18 +08:00
maat_start_cb, maat_update_cb, maat_finish_cb,
2022-12-03 22:23:41 +08:00
maat_instance);
break;
2022-11-25 16:32:29 +08:00
case DATA_SOURCE_IRIS_FILE:
2022-11-17 05:05:35 +08:00
config_monitor_traverse(maat_instance->maat_version,
2023-05-04 17:10:19 +08:00
maat_instance->opts.iris_ctx.inc_idx_dir,
2022-12-09 17:12:18 +08:00
maat_start_cb, maat_update_cb, maat_finish_cb,
2023-05-04 17:10:19 +08:00
maat_instance, maat_instance->opts.decrypt_key,
maat_instance->logger);
2022-11-17 05:05:35 +08:00
break;
2022-12-03 22:23:41 +08:00
case DATA_SOURCE_JSON_FILE:
memset(md5_tmp, 0, sizeof(md5_tmp));
2023-05-04 17:10:19 +08:00
stat(maat_instance->opts.json_ctx.json_file, &attrib);
if (memcmp(&attrib.st_ctim, &(maat_instance->opts.json_ctx.last_md5_time), sizeof(attrib.st_ctim))) {
maat_instance->opts.json_ctx.last_md5_time = attrib.st_ctim;
md5_file(maat_instance->opts.json_ctx.json_file, md5_tmp);
if (0 != strcmp(md5_tmp, maat_instance->opts.json_ctx.effective_json_md5)) {
ret = load_maat_json_file(maat_instance, maat_instance->opts.json_ctx.json_file,
2022-12-09 17:12:18 +08:00
err_str, sizeof(err_str));
2022-12-03 22:23:41 +08:00
if (ret < 0) {
2022-12-09 17:12:18 +08:00
log_error(maat_instance->logger, MODULE_MAAT_RULE,
2023-03-02 14:52:31 +08:00
"[%s:%d] Maat re-initiate with JSON file %s (md5=%s)failed: %s\n",
2023-05-04 17:10:19 +08:00
__FUNCTION__, __LINE__, maat_instance->opts.json_ctx.json_file,
2023-03-02 14:52:31 +08:00
md5_tmp, err_str);
2022-12-03 22:23:41 +08:00
} else {
2023-05-04 17:10:19 +08:00
config_monitor_traverse(0, maat_instance->opts.json_ctx.iris_file,
2022-12-09 17:12:18 +08:00
maat_start_cb, maat_update_cb, maat_finish_cb,
2023-05-04 17:10:19 +08:00
maat_instance, maat_instance->opts.decrypt_key,
maat_instance->logger);
2022-12-09 17:12:18 +08:00
log_info(maat_instance->logger, MODULE_MAAT_RULE,
"Maat re-initiate with JSON file %s success, md5: %s\n",
2023-05-04 17:10:19 +08:00
maat_instance->opts.json_ctx.json_file, md5_tmp);
2022-12-03 22:23:41 +08:00
}
}
}
break;
2022-11-17 05:05:35 +08:00
default:
break;
}
2022-11-25 16:32:29 +08:00
if (maat_instance->creating_maat_rt != NULL) {
2022-11-17 05:05:35 +08:00
struct maat_runtime *old_maat_rt = maat_instance->maat_rt;
2022-11-25 16:32:29 +08:00
maat_instance->maat_rt = maat_instance->creating_maat_rt;
2022-11-17 05:05:35 +08:00
if (old_maat_rt != NULL) {
2022-11-29 14:12:40 +08:00
if (maat_instance->maat_rt->version > old_maat_rt->version) {
2023-02-03 17:28:14 +08:00
log_info(maat_instance->logger, MODULE_MAAT_RULE,
"Maat version updated %lld -> %lld\n",
2022-12-09 17:12:18 +08:00
old_maat_rt->version, maat_instance->maat_rt->version);
2022-11-29 14:12:40 +08:00
} else {
2023-02-03 17:28:14 +08:00
log_info(maat_instance->logger, MODULE_MAAT_RULE,
"Maat version roll back %lld -> %lld\n",
2022-12-09 17:12:18 +08:00
old_maat_rt->version, maat_instance->maat_rt->version);
2022-11-29 14:12:40 +08:00
}
maat_garbage_bagging(maat_instance->garbage_bin, old_maat_rt, NULL,
garbage_maat_runtime_destroy);
2022-11-17 05:05:35 +08:00
}
2022-11-25 16:32:29 +08:00
maat_instance->creating_maat_rt = NULL;
2022-11-17 05:05:35 +08:00
maat_instance->maat_version = maat_instance->maat_rt->version;
maat_instance->last_full_version = maat_instance->maat_rt->version;
}
if (maat_instance->maat_rt != NULL) {
2022-11-25 16:32:29 +08:00
time_t time_window = time(NULL) - maat_instance->maat_rt->last_update_time;
2023-05-04 17:10:19 +08:00
if (time_window >= maat_instance->opts.rule_effect_interval_ms / 1000) {
maat_runtime_commit(maat_instance->maat_rt, MAAT_UPDATE_TYPE_INC,
maat_instance->maat_rt->version, maat_instance->logger);
2023-02-03 17:28:14 +08:00
log_info(maat_instance->logger, MODULE_MAAT_RULE,
2023-02-23 14:50:07 +08:00
"Actual update config version %u, %d entries load to maat runtime.",
2022-12-12 00:10:30 +08:00
maat_instance->maat_rt->version, maat_instance->maat_rt->rule_num);
2022-11-25 16:32:29 +08:00
}
2022-11-17 05:05:35 +08:00
}
pthread_mutex_unlock(&(maat_instance->background_update_mutex));
}
2022-11-25 16:32:29 +08:00
maat_garbage_collect_routine(maat_instance->garbage_bin);
2023-05-04 17:10:19 +08:00
if ((1 == maat_instance->opts.stat_on) && (time(NULL) % 2 == 0)) {
maat_stat_output(maat_instance->stat, maat_instance->maat_version, maat_instance->opts.perf_on);
2023-04-20 15:34:56 +08:00
}
2022-11-17 05:05:35 +08:00
}
2022-11-25 16:32:29 +08:00
maat_runtime_destroy(maat_instance->maat_rt);
2023-04-03 19:01:26 +08:00
maat_garbage_bin_free(maat_instance->garbage_bin);
table_manager_destroy(maat_instance->tbl_mgr); //table manager MUST be freed at last.
2022-12-03 22:23:41 +08:00
2023-04-20 15:34:56 +08:00
if (maat_instance->stat != NULL) {
maat_stat_free(maat_instance->stat);
maat_instance->stat = NULL;
}
2023-02-03 17:28:14 +08:00
2023-05-04 17:10:19 +08:00
if (maat_instance->opts.input_mode == DATA_SOURCE_REDIS) {
if (maat_instance->opts.redis_ctx.read_ctx != NULL) {
redisFree(maat_instance->opts.redis_ctx.read_ctx);
maat_instance->opts.redis_ctx.read_ctx = NULL;
2022-12-03 22:23:41 +08:00
}
2023-05-04 17:10:19 +08:00
if (maat_instance->opts.redis_ctx.write_ctx != NULL) {
redisFree(maat_instance->opts.redis_ctx.write_ctx);
maat_instance->opts.redis_ctx.write_ctx = NULL;
2022-12-03 22:23:41 +08:00
}
}
2023-05-04 17:10:19 +08:00
if (maat_instance->opts.accept_tags != NULL) {
FREE(maat_instance->opts.accept_tags);
maat_instance->opts.accept_tags = NULL;
}
log_handle_destroy(maat_instance->logger);
2022-12-03 22:23:41 +08:00
FREE(maat_instance);
2022-11-25 16:32:29 +08:00
return NULL;
}