修复MESA_htable#3提到的问题

This commit is contained in:
崔一鸣
2019-06-25 09:26:33 +06:00
parent 64760edb08
commit 81e4ee9347

View File

@@ -438,24 +438,11 @@ static void keepalive_replay_htable_del(struct pme_info *pmeinfo){
// "keepalive_replay_htable", stream_addr); // "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; void *logger = g_kni_handle->local_logger;
int ret; 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){ if(pmeinfo->do_log == 1){
ret = log_generate(pmeinfo, logger); ret = log_generate(pmeinfo, logger);
if(ret < 0){ if(ret < 0){
@@ -467,20 +454,6 @@ static void judge_pme_destroy(struct pme_info *pmeinfo, int caller){
} }
//only intercetp stream need del htable //only intercetp stream need del htable
if(pmeinfo->action == KNI_ACTION_INTERCEPT){ 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 //del keepalive_replay_htable
if(g_kni_handle->keepalive_replay_switch == 1){ if(g_kni_handle->keepalive_replay_switch == 1){
keepalive_replay_htable_del(pmeinfo); keepalive_replay_htable_del(pmeinfo);
@@ -488,14 +461,28 @@ static void judge_pme_destroy(struct pme_info *pmeinfo, int caller){
} }
//free pme //free pme
pme_info_destroy(pmeinfo); pme_info_destroy(pmeinfo);
return;
} }
//KNI_LOG_DEBUG(logger, "can not destroy pmeinfo, sapp_release = %d, tfe_release = %d", pmeinfo->sapp_release, pmeinfo->tfe_release);
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;
}
pthread_mutex_unlock(&(pmeinfo->lock)); pthread_mutex_unlock(&(pmeinfo->lock));
} }
else{ 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){ 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 //from syn
extern "C" char kni_tcpall_entry(const struct streaminfo *stream, void** pme, int thread_seq, const void* a_packet){ 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; void *logger = g_kni_handle->local_logger;
int ret; int ret;
int can_destroy;
struct pme_info *pmeinfo = *(struct pme_info **)pme; struct pme_info *pmeinfo = *(struct pme_info **)pme;
if(stream->addr.addrtype == ADDR_TYPE_IPV6){ 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); 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 //sapp release: bypass or intercept
if((ret & APP_STATE_DROPME)){ 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; return ret;
@@ -1405,6 +1418,7 @@ static long traceid2pme_htable_search_cb(void *data, const uchar *key, uint size
void *logger = args->logger; void *logger = args->logger;
struct kni_cmsg *cmsg = args->cmsg; struct kni_cmsg *cmsg = args->cmsg;
struct pme_info *pmeinfo = (struct pme_info*)data; struct pme_info *pmeinfo = (struct pme_info*)data;
int can_destroy;
if(pmeinfo != NULL){ 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_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); 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); wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_ERROR, sizeof(pmeinfo->ssl_error), logger);
clock_gettime(CLOCK_REALTIME, &(pmeinfo->end_time)); clock_gettime(CLOCK_REALTIME, &(pmeinfo->end_time));
KNI_LOG_DEBUG(logger, "recv cmsg from tfe, stream traceid is %s", pmeinfo->stream_traceid); 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); kni_cmsg_destroy(cmsg);
return 0; 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 //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){ static int traceid2pme_htable_expire_notify_cb(void *data, int eliminate_type){
struct pme_info *pmeinfo = (struct pme_info*)data; struct pme_info *pmeinfo = (struct pme_info*)data;
int can_destroy;
if(pmeinfo->sapp_release == 1){ 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; return 0;
} }