在删除配置时,误判事务失败,导致出现错误的告警并多次重试。已修复

This commit is contained in:
zhengchao
2018-04-24 22:32:04 +08:00
parent 8fcdf53694
commit cceaa90e67
3 changed files with 46 additions and 50 deletions

View File

@@ -206,42 +206,6 @@ int invalidate_line(char* line, enum MAAT_TABLE_TYPE type,int valid_column_seq)
line[i]='0'; line[i]='0';
return 0; return 0;
} }
int del_rule_from_redis(redisContext* ctx, struct serial_rule_t* s_rule, long long new_version)
{
int append_cmd_cnt=0;
redisAppendCommand(ctx,"RENAME %s:%s,%d %s:%s,%d"
,rm_key_prefix[MAAT_OP_ADD]
,s_rule->table_name
,s_rule->rule_id
,rm_key_prefix[MAAT_OP_DEL]
,s_rule->table_name
,s_rule->rule_id
);
append_cmd_cnt++;
redisAppendCommand(ctx,"EXPIRE %s:%s,%d %d",rm_key_prefix[MAAT_OP_DEL]
,s_rule->table_name
,s_rule->rule_id
,MAAT_REDIS_SYNC_TIME);
append_cmd_cnt++;
//NX: Don't update already exisiting elements. Always add new elements.
redisAppendCommand(ctx,"ZADD %s NX %d DEL,%s,%d",rm_status_sset
,new_version
,s_rule->table_name
,s_rule->rule_id);
append_cmd_cnt++;
// Try to remove from expiration sorted set, no matter wheather it exists or not.
redisAppendCommand(ctx,"ZREM %s %s,%d",rm_expire_sset
,s_rule->table_name
,s_rule->rule_id);
append_cmd_cnt++;
redisAppendCommand(ctx,"ZREM %s %d",rm_label_sset
,s_rule->rule_id);
append_cmd_cnt++;
return append_cmd_cnt;
}
void serialize_region(const struct Maat_region_t* p,int group_id, char* buff,int size) void serialize_region(const struct Maat_region_t* p,int group_id, char* buff,int size)
{ {
int ret=0; int ret=0;
@@ -854,7 +818,7 @@ redisReply* _exec_serial_rule_end(redisContext* ctx,long long maat_redis_version
} }
void _exec_serial_rule(redisContext* ctx, long long version, struct serial_rule_t* s_rule, int rule_num, int* multi_cmd_seq, unsigned int *cnt, int offset) void _exec_serial_rule(redisContext* ctx, long long version, struct serial_rule_t* s_rule, int rule_num, int* multi_cmd_seq, unsigned int *cnt, int offset)
{ {
int i=0,j=0,ret=0; int i=0;
redisReply* data_reply=NULL; redisReply* data_reply=NULL;
int append_cmd_cnt=0; int append_cmd_cnt=0;
for(i=0;i<rule_num;i++) for(i=0;i<rule_num;i++)
@@ -894,12 +858,43 @@ void _exec_serial_rule(redisContext* ctx, long long version, struct serial_rule_
} }
else else
{ {
ret=del_rule_from_redis(ctx,s_rule+i,version); redisAppendCommand(ctx,"RENAME %s:%s,%d %s:%s,%d"
for(j=0;j<ret;j++) ,rm_key_prefix[MAAT_OP_ADD]
{ ,s_rule[i].table_name
,s_rule[i].rule_id
,rm_key_prefix[MAAT_OP_DEL]
,s_rule[i].table_name
,s_rule[i].rule_id
);
multi_cmd_seq[(*cnt)++]=i+offset; multi_cmd_seq[(*cnt)++]=i+offset;
} append_cmd_cnt++;
append_cmd_cnt+=ret;
redisAppendCommand(ctx,"EXPIRE %s:%s,%d %d",rm_key_prefix[MAAT_OP_DEL]
,s_rule[i].table_name
,s_rule[i].rule_id
,MAAT_REDIS_SYNC_TIME);
multi_cmd_seq[(*cnt)++]=i+offset;
append_cmd_cnt++;
//NX: Don't update already exisiting elements. Always add new elements.
redisAppendCommand(ctx,"ZADD %s NX %d DEL,%s,%d",rm_status_sset
,version
,s_rule[i].table_name
,s_rule[i].rule_id);
multi_cmd_seq[(*cnt)++]=i+offset;
append_cmd_cnt++;
// Try to remove from expiration sorted set, no matter wheather it exists or not.
redisAppendCommand(ctx,"ZREM %s %s,%d",rm_expire_sset
,s_rule[i].table_name
,s_rule[i].rule_id);
multi_cmd_seq[(*cnt)++]=-1;
append_cmd_cnt++;
redisAppendCommand(ctx,"ZREM %s %d",rm_label_sset
,s_rule[i].rule_id);
multi_cmd_seq[(*cnt)++]=-1;
append_cmd_cnt++;
} }
@@ -940,12 +935,13 @@ int exec_serial_rule(redisContext* ctx,struct serial_rule_t* s_rule,int serial_r
for(i=0;i<transaction_reply->elements;i++) for(i=0;i<transaction_reply->elements;i++)
{ {
p=transaction_reply->element[i]; p=transaction_reply->element[i];
if(0==mr_operation_success(p))
{
j=multi_cmd_seq[i]; j=multi_cmd_seq[i];
if(j!=-1&&0==mr_operation_success(p))
{
assert(j<serial_rule_num); assert(j<serial_rule_num);
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_command MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_command
,"exec rule %s, %d failed, rule id maybe conflicts.", s_rule[j].table_name,s_rule[j].rule_id); ,"%s %s %d failed, rule id maybe conflicts.",(s_rule[j].op==MAAT_OP_ADD)?"ADD":"DEL"
, s_rule[j].table_name,s_rule[j].rule_id);
success_cnt--; success_cnt--;
} }
} }
@@ -1363,7 +1359,7 @@ int Maat_cmd_set_lines(Maat_feather_t feather,const struct Maat_line_t** line_ru
if(retry>5) if(retry>5)
{ {
MESA_handle_runtime_log(_feather->logger,RLOG_LV_INFO,maat_command MESA_handle_runtime_log(_feather->logger,RLOG_LV_INFO,maat_command
,"Command set line id %d success after retry %d times." ,"Command set line id %d success after retry %d times."
, line_rule[0]->rule_id, retry , line_rule[0]->rule_id, retry
); );
} }

View File

@@ -30,7 +30,7 @@
#include "stream_fuzzy_hash.h" #include "stream_fuzzy_hash.h"
#include "gram_index_engine.h" #include "gram_index_engine.h"
int MAAT_FRAME_VERSION_2_1_20180322=1; int MAAT_FRAME_VERSION_2_1_20180424=1;
const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin", const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin",
"unicode_ascii_esc","unicode_ascii_aligned","unicode_ncr_dec","unicode_ncr_hex","url_encode_gb2312","url_encode_utf8",""}; "unicode_ascii_esc","unicode_ascii_aligned","unicode_ncr_dec","unicode_ncr_hex","url_encode_gb2312","url_encode_utf8",""};

View File

@@ -22,7 +22,7 @@ void maat_tool_print_usage(void)
printf("\t-n [db], redis db, 0 as default.\n"); printf("\t-n [db], redis db, 0 as default.\n");
printf("\t-d [dir], dump rules from redis to [dir], %s as default.\n",redis_dump_dir); printf("\t-d [dir], dump rules from redis to [dir], %s as default.\n",redis_dump_dir);
printf("\t-j [payload.json], add or delete rules as maat json. Must have field compile_table field, and plugin table's valid flag must be in the last column.\n"); printf("\t-j [payload.json], add or delete rules as maat json. Must have field compile_table field, and plugin table's valid flag must be in the last column.\n");
printf("\t-t [timeout], timeout config after t seconds, default 0, not timeout.\n"); printf("\t-t [timeout], timeout config after t seconds, default is 0 which means never timeout.\n");
printf("example: ./maat_redis_tool -h 127.0.0.1 -p 6379 -d %s\n",redis_dump_dir); printf("example: ./maat_redis_tool -h 127.0.0.1 -p 6379 -d %s\n",redis_dump_dir);
printf(" ./maat_redis_tool -h 127.0.0.1 -p 6379 -j payload.json -t 300\n"); printf(" ./maat_redis_tool -h 127.0.0.1 -p 6379 -j payload.json -t 300\n");
return; return;