diff --git a/src/sf_nio.c b/src/sf_nio.c index f9bf211..d3e1b2b 100644 --- a/src/sf_nio.c +++ b/src/sf_nio.c @@ -732,8 +732,20 @@ static int calc_iops_and_trigger_polling(struct fast_task_info *task) task->polling.in_queue = true; result = ioevent_detach(&task->thread_data-> ev_puller, task->event.fd); + fast_timer_remove(&task->thread_data->timer, + &task->event.timer); + + if (fc_list_empty(&task->thread_data->polling_queue)) { + ioevent_set_timeout(&task->thread_data-> + ev_puller, 0); + } fc_list_add_tail(&task->polling.dlink, &task->thread_data->polling_queue); + + logInfo("file: "__FILE__", line: %d, client: %s:%u, " + "trigger polling iops: %"PRId64, __LINE__, + task->client_ip, task->port, (task->req_count - + task->polling.last_req_count) / time_distance); } } else { if (task->polling.continuous_count > 0) { @@ -741,9 +753,6 @@ static int calc_iops_and_trigger_polling(struct fast_task_info *task) } } - logInfo("====== trigger_polling iops: %"PRId64, (task->req_count - - task->polling.last_req_count) / time_distance); - task->polling.last_calc_time = g_current_time; task->polling.last_req_count = task->req_count; } @@ -768,8 +777,17 @@ static int calc_iops_and_remove_polling(struct fast_task_info *task) task->polling.continuous_count = 0; task->polling.in_queue = false; fc_list_del_init(&task->polling.dlink); + if (fc_list_empty(&task->thread_data->polling_queue)) { + ioevent_set_timeout(&task->thread_data->ev_puller, + task->thread_data->timeout_ms); + } result = sf_ioevent_add(task, (IOEventCallback) sf_client_sock_read, task->network_timeout); + + logInfo("file: "__FILE__", line: %d, client: %s:%u, " + "remove polling iops: %"PRId64, __LINE__, + task->client_ip, task->port, (task->req_count - + task->polling.last_req_count) / time_distance); } } else { if (task->polling.continuous_count > 0) { @@ -777,9 +795,6 @@ static int calc_iops_and_remove_polling(struct fast_task_info *task) } } - logInfo("@@@@@ remove_polling iops: %"PRId64, (task->req_count - - task->polling.last_req_count) / time_distance); - task->polling.last_calc_time = g_current_time; task->polling.last_req_count = task->req_count; } @@ -797,16 +812,15 @@ int sf_rdma_busy_polling_callback(struct nio_thread_data *thread_data) fc_list_for_each_entry_safe(task, tmp, &thread_data-> polling_queue, polling.dlink) { + if (task->canceled) { + continue; + } if ((bytes=task->handler->recv_data(task, &action)) < 0) { ioevent_add_to_deleted_list(task); continue; } if (action == sf_comm_action_finish) { - fast_timer_modify(&task->thread_data->timer, - &task->event.timer, g_current_time + - task->network_timeout); - task->req_count++; task->nio_stages.current = SF_NIO_STAGE_SEND; if (SF_CTX->deal_task(task, SF_NIO_STAGE_SEND) < 0) { //fatal error diff --git a/src/sf_service.c b/src/sf_service.c index 975c2c4..a953419 100644 --- a/src/sf_service.c +++ b/src/sf_service.c @@ -187,6 +187,7 @@ int sf_service_init_ex2(SFContext *sf_context, const char *name, for (thread_data=sf_context->thread_data,thread_ctx=thread_contexts; thread_datatimeout_ms = net_timeout_ms; FC_INIT_LIST_HEAD(&thread_data->polling_queue); if (sf_context->smart_polling.enabled) { thread_data->busy_polling_callback =