修复MESA_htable#3提到的问题
This commit is contained in:
@@ -438,24 +438,11 @@ static void keepalive_replay_htable_del(struct pme_info *pmeinfo){
|
||||
// "keepalive_replay_htable", stream_addr);
|
||||
}
|
||||
}
|
||||
static void judge_pme_destroy(struct pme_info *pmeinfo, int caller){
|
||||
|
||||
void stream_destroy(struct pme_info *pmeinfo){
|
||||
//sendlog
|
||||
void *logger = g_kni_handle->local_logger;
|
||||
int ret;
|
||||
if(pmeinfo != NULL){
|
||||
void *logger = g_kni_handle->local_logger;
|
||||
pthread_mutex_lock(&(pmeinfo->lock));
|
||||
if(caller == CALLER_SAPP){
|
||||
//KNI_LOG_DEBUG(logger, "set sapp_release = 1, caller is %d, stream_trace_id is %s, thread id is %p",
|
||||
// caller, pmeinfo->stream_traceid, pthread_self());
|
||||
pmeinfo->sapp_release = 1;
|
||||
}
|
||||
if(caller == CALLER_TFE){
|
||||
//KNI_LOG_DEBUG(logger, "set tfe_release = 1, caller is %d, stream_trace_id is %s, thread id is %p",
|
||||
// caller, pmeinfo->stream_traceid, pthread_self());
|
||||
pmeinfo->tfe_release = 1;
|
||||
}
|
||||
if(pmeinfo->sapp_release == 1 && pmeinfo->tfe_release == 1){
|
||||
//sendlog
|
||||
if(pmeinfo->do_log == 1){
|
||||
ret = log_generate(pmeinfo, logger);
|
||||
if(ret < 0){
|
||||
@@ -467,20 +454,6 @@ static void judge_pme_destroy(struct pme_info *pmeinfo, int caller){
|
||||
}
|
||||
//only intercetp stream need del htable
|
||||
if(pmeinfo->action == KNI_ACTION_INTERCEPT){
|
||||
//del traceid2pme htable
|
||||
int key_size = strnlen(pmeinfo->stream_traceid, sizeof(pmeinfo->stream_traceid));
|
||||
ret = MESA_htable_del(g_kni_handle->traceid2pme_htable, (const unsigned char *)pmeinfo->stream_traceid,
|
||||
key_size, NULL);
|
||||
if(ret < 0){
|
||||
KNI_LOG_ERROR(logger, "MESA_htable: Failed at del, table is %s, key is %s, key_size is %d, ret is %d",
|
||||
"traceid2pme_htable", pmeinfo->stream_traceid, key_size, ret);
|
||||
FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_ID2PME_DEL_FAIL], 0, FS_OP_ADD, 1);
|
||||
}
|
||||
else{
|
||||
//KNI_LOG_DEBUG(logger, "MESA_htable: Succeed at del, table is %s, key is %s, key_size is %d",
|
||||
// "traceid2pme_htable", pmeinfo->stream_traceid, key_size);
|
||||
FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_ID2PME_DEL_SUCC], 0, FS_OP_ADD, 1);
|
||||
}
|
||||
//del keepalive_replay_htable
|
||||
if(g_kni_handle->keepalive_replay_switch == 1){
|
||||
keepalive_replay_htable_del(pmeinfo);
|
||||
@@ -488,14 +461,28 @@ static void judge_pme_destroy(struct pme_info *pmeinfo, int caller){
|
||||
}
|
||||
//free pme
|
||||
pme_info_destroy(pmeinfo);
|
||||
return;
|
||||
}
|
||||
|
||||
static int judge_stream_destroy(struct pme_info *pmeinfo, int caller){
|
||||
void *logger = g_kni_handle->local_logger;
|
||||
int can_destroy = 0;
|
||||
if(pmeinfo != NULL){
|
||||
pthread_mutex_lock(&(pmeinfo->lock));
|
||||
if(caller == CALLER_SAPP){
|
||||
pmeinfo->sapp_release = 1;
|
||||
}
|
||||
if(caller == CALLER_TFE){
|
||||
pmeinfo->tfe_release = 1;
|
||||
}
|
||||
if(pmeinfo->sapp_release == 1 && pmeinfo->tfe_release == 1){
|
||||
can_destroy = 1;
|
||||
}
|
||||
//KNI_LOG_DEBUG(logger, "can not destroy pmeinfo, sapp_release = %d, tfe_release = %d", pmeinfo->sapp_release, pmeinfo->tfe_release);
|
||||
pthread_mutex_unlock(&(pmeinfo->lock));
|
||||
}
|
||||
else{
|
||||
KNI_LOG_ERROR(logger, "Failed at judge_pme_info, pmeinfo is null");
|
||||
KNI_LOG_ERROR(logger, "Failed at judge_stream_destroy, pmeinfo is null");
|
||||
}
|
||||
return can_destroy;
|
||||
}
|
||||
|
||||
static int protocol_identify(const struct streaminfo* stream, char *buf, int len, struct protocol_identify_result *result){
|
||||
@@ -1036,11 +1023,33 @@ static char close_opstate(const struct streaminfo *stream, struct pme_info *pmei
|
||||
}
|
||||
}
|
||||
|
||||
static void traceid2pme_htable_del(struct pme_info *pmeinfo){
|
||||
//del traceid2pme htable
|
||||
if(pmeinfo->action == KNI_ACTION_INTERCEPT){
|
||||
void *logger = g_kni_handle->local_logger;
|
||||
int key_size = strnlen(pmeinfo->stream_traceid, sizeof(pmeinfo->stream_traceid));
|
||||
int ret;
|
||||
ret = MESA_htable_del(g_kni_handle->traceid2pme_htable, (const unsigned char *)pmeinfo->stream_traceid,
|
||||
key_size, NULL);
|
||||
if(ret < 0){
|
||||
KNI_LOG_ERROR(logger, "MESA_htable: Failed at del, table is %s, key is %s, key_size is %d, ret is %d",
|
||||
"traceid2pme_htable", pmeinfo->stream_traceid, key_size, ret);
|
||||
FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_ID2PME_DEL_FAIL], 0, FS_OP_ADD, 1);
|
||||
}
|
||||
else{
|
||||
//KNI_LOG_DEBUG(logger, "MESA_htable: Succeed at del, table is %s, key is %s, key_size is %d",
|
||||
// "traceid2pme_htable", pmeinfo->stream_traceid, key_size);
|
||||
FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_ID2PME_DEL_SUCC], 0, FS_OP_ADD, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//from syn
|
||||
extern "C" char kni_tcpall_entry(const struct streaminfo *stream, void** pme, int thread_seq, const void* a_packet){
|
||||
|
||||
void *logger = g_kni_handle->local_logger;
|
||||
int ret;
|
||||
int can_destroy;
|
||||
struct pme_info *pmeinfo = *(struct pme_info **)pme;
|
||||
if(stream->addr.addrtype == ADDR_TYPE_IPV6){
|
||||
FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_IPV6_STM], 0, FS_OP_ADD, 1);
|
||||
@@ -1103,7 +1112,11 @@ extern "C" char kni_tcpall_entry(const struct streaminfo *stream, void** pme, in
|
||||
}
|
||||
//sapp release: bypass or intercept
|
||||
if((ret & APP_STATE_DROPME)){
|
||||
judge_pme_destroy(pmeinfo, CALLER_SAPP);
|
||||
can_destroy = judge_stream_destroy(pmeinfo, CALLER_SAPP);
|
||||
if(can_destroy == 1){
|
||||
traceid2pme_htable_del(pmeinfo);
|
||||
stream_destroy(pmeinfo);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
||||
@@ -1405,6 +1418,7 @@ static long traceid2pme_htable_search_cb(void *data, const uchar *key, uint size
|
||||
void *logger = args->logger;
|
||||
struct kni_cmsg *cmsg = args->cmsg;
|
||||
struct pme_info *pmeinfo = (struct pme_info*)data;
|
||||
int can_destroy;
|
||||
if(pmeinfo != NULL){
|
||||
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_INTERCEPT_STATE, sizeof(pmeinfo->intercept_state), logger);
|
||||
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_UPSTREAM_LATENCY, sizeof(pmeinfo->ssl_server_side_latency), logger);
|
||||
@@ -1416,7 +1430,11 @@ static long traceid2pme_htable_search_cb(void *data, const uchar *key, uint size
|
||||
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_ERROR, sizeof(pmeinfo->ssl_error), logger);
|
||||
clock_gettime(CLOCK_REALTIME, &(pmeinfo->end_time));
|
||||
KNI_LOG_DEBUG(logger, "recv cmsg from tfe, stream traceid is %s", pmeinfo->stream_traceid);
|
||||
judge_pme_destroy(pmeinfo, CALLER_TFE);
|
||||
can_destroy = judge_stream_destroy(pmeinfo, CALLER_TFE);
|
||||
if(can_destroy == 1){
|
||||
traceid2pme_htable_del(pmeinfo);
|
||||
stream_destroy(pmeinfo);
|
||||
}
|
||||
}
|
||||
kni_cmsg_destroy(cmsg);
|
||||
return 0;
|
||||
@@ -1741,8 +1759,13 @@ extern "C" void kni_destroy(struct kni_handle *handle){
|
||||
//ret: 1: the item can be eliminated; 0: the item can't be eliminated
|
||||
static int traceid2pme_htable_expire_notify_cb(void *data, int eliminate_type){
|
||||
struct pme_info *pmeinfo = (struct pme_info*)data;
|
||||
int can_destroy;
|
||||
if(pmeinfo->sapp_release == 1){
|
||||
judge_pme_destroy(pmeinfo, CALLER_TFE);
|
||||
can_destroy = judge_stream_destroy(pmeinfo, CALLER_TFE);
|
||||
if(can_destroy == 1){
|
||||
stream_destroy(pmeinfo);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user