add_expr_rule的去重功能,回终止在grouprule中记录的expr_id的加载,导致delete时,删除未在rulescan中加载的expr_id,命中batchupdate中的assert。

This commit is contained in:
zhengchao
2017-05-24 13:55:35 +08:00
parent 1f3d16e66f
commit f6249e31dd

View File

@@ -1306,6 +1306,19 @@ struct _Maat_group_rule_t* add_region_to_group(struct _Maat_group_rule_t* group,
pthread_mutex_unlock(&(group->mutex));
return group;
}
void cancel_last_region_from_group(struct _Maat_group_rule_t* group,int region_id,int expr_id)
{
struct _Maat_region_rule_t* region_rule=NULL;
pthread_mutex_lock(&(group->mutex));
region_rule=dynamic_array_read(group->region_rules,group->region_boundary);
assert(region_rule->expr_id==expr_id&&region_rule->region_id==region_id);
free(region_rule);
dynamic_array_write(group->region_rules,group->region_boundary,NULL);
group->region_cnt--;
group->region_boundary--;
pthread_mutex_unlock(&(group->mutex));
return;
}
unsigned int del_region_from_group(struct _Maat_group_rule_t* group,int region_id,unsigned int *output_expr_id,int output_size)
{
int i=0,j=0;
@@ -1691,6 +1704,7 @@ int add_expr_rule(struct _Maat_table_info_t* table,struct db_str_rule_t* db_rule
op_expr->convert_failed>0)
{
scanner->dedup_expr_num++;
cancel_last_region_from_group(group_rule,db_rule->region_id,op_expr->p_expr->expr_id);
destroy_op_expr(op_expr);
op_expr=NULL;
}