void storage_recv_notify_read(int sock, short event, void *arg) { struct fast_task_info *pTask; StorageClientInfo *pClientInfo; long task_addr; int64_t remain_bytes; int bytes; int result; while (1) { if ((bytes=read(sock, &task_addr, sizeof(task_addr))) < 0) { if (!(errno == EAGAIN || errno == EWOULDBLOCK)) { logError("file: "__FILE__", line: %d, " \ "call read failed, " \ "errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); } break; } else if (bytes == 0) { logError("file: "__FILE__", line: %d, " \ "call read failed, end of file", __LINE__); break; } pTask = (struct fast_task_info *)task_addr; pClientInfo = (StorageClientInfo *)pTask->arg; if (pTask->event.fd < 0) //quit flag { return; } /* //logInfo("=====thread index: %d, pTask->event.fd=%d", \ pClientInfo->nio_thread_index, pTask->event.fd); */ if (pClientInfo->stage & FDFS_STORAGE_STAGE_DIO_THREAD) { pClientInfo->stage &= ~FDFS_STORAGE_STAGE_DIO_THREAD; } switch (pClientInfo->stage) { case FDFS_STORAGE_STAGE_NIO_INIT: result = storage_nio_init(pTask); break; case FDFS_STORAGE_STAGE_NIO_RECV: pTask->offset = 0; remain_bytes = pClientInfo->total_length - \ pClientInfo->total_offset; if (remain_bytes > pTask->size) { pTask->length = pTask->size; } else { pTask->length = remain_bytes; } if (set_recv_event(pTask) == 0) { client_sock_read(pTask->event.fd, IOEVENT_READ, pTask); } result = 0; break; case FDFS_STORAGE_STAGE_NIO_SEND: result = storage_send_add_event(pTask); break; case FDFS_STORAGE_STAGE_NIO_CLOSE: result = EIO; //close this socket break; default: logError("file: "__FILE__", line: %d, " \ "invalid stage: %d", __LINE__, \ pClientInfo->stage); result = EINVAL; break; } if (result != 0) { add_to_deleted_list(pTask); } } }
void storage_recv_notify_read(int sock, short event, void *arg) { struct fast_task_info *pTask; StorageClientInfo *pClientInfo; long task_addr; int64_t remain_bytes; int bytes; int result; while (1) { if ((bytes=read(sock, &task_addr, sizeof(task_addr))) < 0) { if (!(errno == EAGAIN || errno == EWOULDBLOCK)) { logError("file: "__FILE__", line: %d, " \ "call read failed, " \ "errno: %d, error info: %s", \ __LINE__, errno, STRERROR(errno)); } break; } else if (bytes == 0) { logError("file: "__FILE__", line: %d, " \ "call read failed, end of file", __LINE__); break; } pTask = (struct fast_task_info *)task_addr; pClientInfo = (StorageClientInfo *)pTask->arg; if (pClientInfo->sock < 0) //quit flag { struct storage_nio_thread_data *pThreadData; struct timeval tv; pThreadData = g_nio_thread_data + \ pClientInfo->nio_thread_index; tv.tv_sec = 1; tv.tv_usec = 0; event_base_loopexit(pThreadData->ev_base, &tv); return; } /* //logInfo("=====thread index: %d, pClientInfo->sock=%d", \ pClientInfo->nio_thread_index, pClientInfo->sock); */ switch (pClientInfo->stage) { case FDFS_STORAGE_STAGE_NIO_INIT: result = storage_nio_init(pTask); break; case FDFS_STORAGE_STAGE_NIO_RECV: pTask->offset = 0; remain_bytes = pClientInfo->total_length - \ pClientInfo->total_offset; if (remain_bytes > pTask->size) { pTask->length = pTask->size; } else { pTask->length = remain_bytes; } client_sock_read(pClientInfo->sock, EV_READ, pTask); result = 0; /* if ((result=event_add(&pTask->ev_read, \ &g_network_tv)) != 0) { logError("file: "__FILE__", line: %d, " \ "event_add fail.", __LINE__); } */ break; case FDFS_STORAGE_STAGE_NIO_SEND: result = storage_send_add_event(pTask); break; default: logError("file: "__FILE__", line: %d, " \ "invalid stage: %d", __LINE__, \ pClientInfo->stage); result = EINVAL; break; } if (result != 0) { task_finish_clean_up(pTask); } } }