对expr_plus类表,降低Maat_set_scan_status设置MAAT_SET_SCAN_DISTRICT选项时的锁冲突。
This commit is contained in:
@@ -26,7 +26,7 @@
|
|||||||
#include "mesa_fuzzy.h"
|
#include "mesa_fuzzy.h"
|
||||||
#include "great_index_engine.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 *maat_module="MAAT Frame";
|
||||||
|
|
||||||
const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin",
|
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->group_hash, NULL);
|
||||||
MESA_htable_destroy(scanner->region_hash, NULL);
|
MESA_htable_destroy(scanner->region_hash, NULL);
|
||||||
map_destroy(scanner->district_map);
|
map_destroy(scanner->district_map);
|
||||||
|
scanner->district_map=NULL;
|
||||||
|
assert(scanner->tmp_district_map==NULL);
|
||||||
destroy_bool_matcher((void*)scanner->expr_compiler);
|
destroy_bool_matcher((void*)scanner->expr_compiler);
|
||||||
q_cnt=MESA_lqueue_get_count(scanner->region_update_q);
|
q_cnt=MESA_lqueue_get_count(scanner->region_update_q);
|
||||||
for(i=0;i<q_cnt;i++)
|
for(i=0;i<q_cnt;i++)
|
||||||
@@ -1337,8 +1339,12 @@ int get_district_id(_Maat_scanner_t *scanner,const char* district_str)
|
|||||||
map_ret=map_str2int(scanner->district_map, district_str,&district_id);
|
map_ret=map_str2int(scanner->district_map, district_str,&district_id);
|
||||||
if(map_ret<0)
|
if(map_ret<0)
|
||||||
{
|
{
|
||||||
|
if(scanner->tmp_district_map==NULL)
|
||||||
|
{
|
||||||
|
scanner->tmp_district_map=map_duplicate(scanner->district_map);
|
||||||
|
}
|
||||||
district_id= scanner->district_num;
|
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++;
|
scanner->district_num++;
|
||||||
}
|
}
|
||||||
return district_id;
|
return district_id;
|
||||||
@@ -2427,6 +2433,9 @@ void garbage_bury(MESA_lqueue_head garbage_q,void *logger)
|
|||||||
case GARBAGE_BOOL_MATCHER:
|
case GARBAGE_BOOL_MATCHER:
|
||||||
destroy_bool_matcher(bag->bool_matcher);
|
destroy_bool_matcher(bag->bool_matcher);
|
||||||
break;
|
break;
|
||||||
|
case GARBAGE_MAP_STR2INT:
|
||||||
|
map_destroy(bag->str2int_map);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
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 do_scanner_update(struct _Maat_scanner_t* scanner,MESA_lqueue_head garbage_q,int scan_thread_num,void* logger)
|
||||||
{
|
{
|
||||||
void *tmp1=NULL,*tmp2=NULL;
|
void *tmp1=NULL,*tmp2=NULL;
|
||||||
|
MESA_htable_handle tmp_map=NULL;
|
||||||
int i=0;
|
int i=0;
|
||||||
long q_cnt;
|
long q_cnt;
|
||||||
GIE_create_para_t para;
|
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);
|
digest_batch_update(scanner->digest_handle[i], scanner->digest_update_q[i],logger);
|
||||||
pthread_rwlock_unlock(&(scanner->digest_rwlock[i]));
|
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);
|
scanner->last_update_time=time(NULL);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -271,7 +271,8 @@ enum maat_garbage_type
|
|||||||
GARBAGE_SCANNER=0,
|
GARBAGE_SCANNER=0,
|
||||||
GARBAGE_GROUP_RULE,
|
GARBAGE_GROUP_RULE,
|
||||||
GARBAGE_COMPILE_RULE,
|
GARBAGE_COMPILE_RULE,
|
||||||
GARBAGE_BOOL_MATCHER
|
GARBAGE_BOOL_MATCHER,
|
||||||
|
GARBAGE_MAP_STR2INT
|
||||||
};
|
};
|
||||||
struct iconv_handle_t
|
struct iconv_handle_t
|
||||||
{
|
{
|
||||||
@@ -310,6 +311,7 @@ struct _Maat_scanner_t
|
|||||||
MESA_htable_handle group_hash;
|
MESA_htable_handle group_hash;
|
||||||
MESA_htable_handle compile_hash;
|
MESA_htable_handle compile_hash;
|
||||||
MESA_htable_handle district_map;
|
MESA_htable_handle district_map;
|
||||||
|
MESA_htable_handle tmp_district_map;
|
||||||
unsigned int district_num;
|
unsigned int district_num;
|
||||||
unsigned int cfg_num;
|
unsigned int cfg_num;
|
||||||
unsigned int exprid_generator;
|
unsigned int exprid_generator;
|
||||||
@@ -366,6 +368,7 @@ struct _maat_garbage_t
|
|||||||
struct _Maat_compile_rule_t* compile_rule;
|
struct _Maat_compile_rule_t* compile_rule;
|
||||||
void* bool_matcher;
|
void* bool_matcher;
|
||||||
void * raw;
|
void * raw;
|
||||||
|
MESA_htable_handle str2int_map;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
void garbage_bagging(enum maat_garbage_type type,void *p,MESA_lqueue_head garbage_q);
|
void garbage_bagging(enum maat_garbage_type type,void *p,MESA_lqueue_head garbage_q);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ MESA_htable_handle map_create(void)
|
|||||||
MESA_htable_handle string2int_map;
|
MESA_htable_handle string2int_map;
|
||||||
MESA_htable_create_args_t hargs;
|
MESA_htable_create_args_t hargs;
|
||||||
memset(&hargs,0,sizeof(hargs));
|
memset(&hargs,0,sizeof(hargs));
|
||||||
hargs.thread_safe=8;
|
hargs.thread_safe=0;
|
||||||
hargs.hash_slot_size = 4*1024;
|
hargs.hash_slot_size = 4*1024;
|
||||||
hargs.max_elem_num = 0;
|
hargs.max_elem_num = 0;
|
||||||
hargs.eliminate_type = HASH_ELIMINATE_ALGO_FIFO;
|
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;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,5 +4,6 @@ MESA_htable_handle map_create(void);
|
|||||||
void map_destroy(MESA_htable_handle p);
|
void map_destroy(MESA_htable_handle p);
|
||||||
int map_register(MESA_htable_handle handle,const char* string,int value);
|
int map_register(MESA_htable_handle handle,const char* string,int value);
|
||||||
int map_str2int(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
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user