diff --git a/src/entry/Maat_rule.cpp b/src/entry/Maat_rule.cpp index 290d9da..4ac7936 100644 --- a/src/entry/Maat_rule.cpp +++ b/src/entry/Maat_rule.cpp @@ -26,7 +26,7 @@ #include "mesa_fuzzy.h" #include "great_index_engine.h" -int MAAT_FRAME_VERSION_1_8_20160624_PERF_TEST=1; +int MAAT_FRAME_VERSION_1_8_20160627_PERF_TEST=1; const char *maat_module="MAAT Frame"; const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin", @@ -989,6 +989,8 @@ void destroy_maat_scanner(struct _Maat_scanner_t*scanner) MESA_htable_destroy(scanner->group_hash, NULL); MESA_htable_destroy(scanner->region_hash, NULL); map_destroy(scanner->district_map); + scanner->district_map=NULL; + assert(scanner->tmp_district_map==NULL); destroy_bool_matcher((void*)scanner->expr_compiler); q_cnt=MESA_lqueue_get_count(scanner->region_update_q); for(i=0;idistrict_map, district_str,&district_id); if(map_ret<0) { + if(scanner->tmp_district_map==NULL) + { + scanner->tmp_district_map=map_duplicate(scanner->district_map); + } district_id= scanner->district_num; - map_register(scanner->district_map,district_str, district_id); + map_register(scanner->tmp_district_map,district_str, district_id); scanner->district_num++; } return district_id; @@ -2427,6 +2433,9 @@ void garbage_bury(MESA_lqueue_head garbage_q,void *logger) case GARBAGE_BOOL_MATCHER: destroy_bool_matcher(bag->bool_matcher); break; + case GARBAGE_MAP_STR2INT: + map_destroy(bag->str2int_map); + break; default: assert(0); } @@ -2468,6 +2477,7 @@ void plugin_table_callback(struct _Maat_table_info_t* table,const char* table_li void do_scanner_update(struct _Maat_scanner_t* scanner,MESA_lqueue_head garbage_q,int scan_thread_num,void* logger) { void *tmp1=NULL,*tmp2=NULL; + MESA_htable_handle tmp_map=NULL; int i=0; long q_cnt; GIE_create_para_t para; @@ -2506,6 +2516,13 @@ void do_scanner_update(struct _Maat_scanner_t* scanner,MESA_lqueue_head garbage_ digest_batch_update(scanner->digest_handle[i], scanner->digest_update_q[i],logger); pthread_rwlock_unlock(&(scanner->digest_rwlock[i])); } + if(scanner->tmp_district_map!=NULL) + { + tmp_map=scanner->district_map; + scanner->district_map=scanner->tmp_district_map; + scanner->tmp_district_map=NULL; + garbage_bagging(GARBAGE_MAP_STR2INT, tmp_map, garbage_q); + } scanner->last_update_time=time(NULL); return; diff --git a/src/entry/Maat_rule_internal.h b/src/entry/Maat_rule_internal.h index b8ad00d..2038ad8 100644 --- a/src/entry/Maat_rule_internal.h +++ b/src/entry/Maat_rule_internal.h @@ -271,7 +271,8 @@ enum maat_garbage_type GARBAGE_SCANNER=0, GARBAGE_GROUP_RULE, GARBAGE_COMPILE_RULE, - GARBAGE_BOOL_MATCHER + GARBAGE_BOOL_MATCHER, + GARBAGE_MAP_STR2INT }; struct iconv_handle_t { @@ -310,6 +311,7 @@ struct _Maat_scanner_t MESA_htable_handle group_hash; MESA_htable_handle compile_hash; MESA_htable_handle district_map; + MESA_htable_handle tmp_district_map; unsigned int district_num; unsigned int cfg_num; unsigned int exprid_generator; @@ -366,6 +368,7 @@ struct _maat_garbage_t struct _Maat_compile_rule_t* compile_rule; void* bool_matcher; void * raw; + MESA_htable_handle str2int_map; }; }; void garbage_bagging(enum maat_garbage_type type,void *p,MESA_lqueue_head garbage_q); diff --git a/src/entry/map_str2int.cpp b/src/entry/map_str2int.cpp index 2e8752e..6e5c8e4 100644 --- a/src/entry/map_str2int.cpp +++ b/src/entry/map_str2int.cpp @@ -22,7 +22,7 @@ MESA_htable_handle map_create(void) MESA_htable_handle string2int_map; MESA_htable_create_args_t hargs; memset(&hargs,0,sizeof(hargs)); - hargs.thread_safe=8; + hargs.thread_safe=0; hargs.hash_slot_size = 4*1024; hargs.max_elem_num = 0; hargs.eliminate_type = HASH_ELIMINATE_ALGO_FIFO; @@ -74,4 +74,23 @@ int map_str2int(MESA_htable_handle handle,const char* string,int* value) return -1; } } +void duplicate_func(const uchar * key, uint size, void * data, void * user) +{ + MESA_htable_handle target=(MESA_htable_handle)user; + int value=*(int*)data; + int ret=0; + char* string=(char*)calloc(sizeof(char),(size+1)); + memcpy(string,key,size); + ret=map_register(target,key,value); + assert(ret>0); +} +MESA_htable_handle map_duplicate(MESA_htable_handle origin_map) +{ + int ret=0; + MESA_htable_handle target=NULL; + target=map_create(); + ret=MESA_htable_iterate(origin_map, duplicate_func, target); + assert(ret==0); + return target; +} diff --git a/src/entry/map_str2int.h b/src/entry/map_str2int.h index 4652ee9..132a1e0 100644 --- a/src/entry/map_str2int.h +++ b/src/entry/map_str2int.h @@ -4,5 +4,6 @@ MESA_htable_handle map_create(void); void map_destroy(MESA_htable_handle p); int map_register(MESA_htable_handle handle,const char* string,int value); int map_str2int(MESA_htable_handle handle,const char* string,int* value); +MESA_htable_handle map_duplicate(MESA_htable_handle origin_map); #endif