static int on_mp_write_session_write_response_write1(struct query_state *qstate) { struct cache_mp_write_session_write_response *write_response; ssize_t result; TRACE_IN(on_mp_write_session_write_response_write1); write_response = get_cache_mp_write_session_write_response( &qstate->response); result = qstate->write_func(qstate, &write_response->error_code, sizeof(int)); if (result != sizeof(int)) { LOG_ERR_3("on_mp_write_session_write_response_write1", "write failed"); TRACE_OUT(on_mp_write_session_write_response_write1); return (-1); } if (write_response->error_code == 0) { finalize_comm_element(&qstate->request); finalize_comm_element(&qstate->response); qstate->kevent_watermark = sizeof(int); qstate->process_func = on_mp_write_session_mapper; qstate->kevent_filter = EVFILT_READ; } else { qstate->kevent_watermark = 0; qstate->process_func = 0; } TRACE_OUT(on_mp_write_session_write_response_write1); return (0); }
static int on_mp_write_session_write_request_read2(struct query_state *qstate) { struct cache_mp_write_session_write_request *write_request; ssize_t result; TRACE_IN(on_mp_write_session_write_request_read2); write_request = get_cache_mp_write_session_write_request( &qstate->request); result = qstate->read_func(qstate, write_request->data, write_request->data_size); if (result < 0 || (size_t)result != qstate->kevent_watermark) { LOG_ERR_3("on_mp_write_session_write_request_read2", "read failed"); TRACE_OUT(on_mp_write_session_write_request_read2); return (-1); } qstate->kevent_watermark = 0; qstate->process_func = on_mp_write_session_write_request_process; TRACE_OUT(on_mp_write_session_write_request_read2); return (0); }
static int on_mp_read_session_read_response_write2(struct query_state *qstate) { struct cache_mp_read_session_read_response *read_response; ssize_t result; TRACE_IN(on_mp_read_session_read_response_write2); read_response = get_cache_mp_read_session_read_response( &qstate->response); result = qstate->write_func(qstate, read_response->data, read_response->data_size); if (result < 0 || (size_t)result != qstate->kevent_watermark) { LOG_ERR_3("on_mp_read_session_read_response_write2", "write failed"); TRACE_OUT(on_mp_read_session_read_response_write2); return (-1); } finalize_comm_element(&qstate->request); finalize_comm_element(&qstate->response); qstate->kevent_watermark = sizeof(int); qstate->process_func = on_mp_read_session_mapper; qstate->kevent_filter = EVFILT_READ; TRACE_OUT(on_mp_read_session_read_response_write2); return (0); }
/* * The functions below are used to process multipart write session initiation * requests. * - on_mp_write_session_request_read1 and on_mp_write_session_request_read2 * read the request itself * - on_mp_write_session_request_process processes it * - on_mp_write_session_response_write1 sends the response */ int on_mp_write_session_request_read1(struct query_state *qstate) { struct cache_mp_write_session_request *c_mp_ws_request; ssize_t result; TRACE_IN(on_mp_write_session_request_read1); if (qstate->kevent_watermark == 0) qstate->kevent_watermark = sizeof(size_t); else { init_comm_element(&qstate->request, CET_MP_WRITE_SESSION_REQUEST); c_mp_ws_request = get_cache_mp_write_session_request( &qstate->request); result = qstate->read_func(qstate, &c_mp_ws_request->entry_length, sizeof(size_t)); if (result != sizeof(size_t)) { LOG_ERR_3("on_mp_write_session_request_read1", "read failed"); TRACE_OUT(on_mp_write_session_request_read1); return (-1); } if (BUFSIZE_INVALID(c_mp_ws_request->entry_length)) { LOG_ERR_3("on_mp_write_session_request_read1", "invalid entry_length value"); TRACE_OUT(on_mp_write_session_request_read1); return (-1); } c_mp_ws_request->entry = calloc(1, c_mp_ws_request->entry_length + 1); assert(c_mp_ws_request->entry != NULL); qstate->kevent_watermark = c_mp_ws_request->entry_length; qstate->process_func = on_mp_write_session_request_read2; } TRACE_OUT(on_mp_write_session_request_read1); return (0); }
/* * Mapper function is used to avoid multiple connections for each session * write or read requests. After processing the request, it does not close * the connection, but waits for the next request. */ static int on_mp_read_session_mapper(struct query_state *qstate) { ssize_t result; int elem_type; TRACE_IN(on_mp_read_session_mapper); if (qstate->kevent_watermark == 0) { qstate->kevent_watermark = sizeof(int); } else { result = qstate->read_func(qstate, &elem_type, sizeof(int)); if (result != sizeof(int)) { LOG_ERR_3("on_mp_read_session_mapper", "read failed"); TRACE_OUT(on_mp_read_session_mapper); return (-1); } switch (elem_type) { case CET_MP_READ_SESSION_READ_REQUEST: qstate->kevent_watermark = 0; qstate->process_func = on_mp_read_session_read_request_process; break; case CET_MP_READ_SESSION_CLOSE_NOTIFICATION: qstate->kevent_watermark = 0; qstate->process_func = on_mp_read_session_close_notification; break; default: qstate->kevent_watermark = 0; qstate->process_func = NULL; LOG_ERR_3("on_mp_read_session_mapper", "unknown element type"); TRACE_OUT(on_mp_read_session_mapper); return (-1); } } TRACE_OUT(on_mp_read_session_mapper); return (0); }
static int on_mp_read_session_read_response_write1(struct query_state *qstate) { struct cache_mp_read_session_read_response *read_response; ssize_t result; TRACE_IN(on_mp_read_session_read_response_write1); read_response = get_cache_mp_read_session_read_response( &qstate->response); result = qstate->write_func(qstate, &read_response->error_code, sizeof(int)); if (read_response->error_code == 0) { result += qstate->write_func(qstate, &read_response->data_size, sizeof(size_t)); if (result < 0 || (size_t)result != qstate->kevent_watermark) { TRACE_OUT(on_mp_read_session_read_response_write1); LOG_ERR_3("on_mp_read_session_read_response_write1", "write failed"); return (-1); } qstate->kevent_watermark = read_response->data_size; qstate->process_func = on_mp_read_session_read_response_write2; } else { if (result < 0 || (size_t)result != qstate->kevent_watermark) { LOG_ERR_3("on_mp_read_session_read_response_write1", "write failed"); TRACE_OUT(on_mp_read_session_read_response_write1); return (-1); } qstate->kevent_watermark = 0; qstate->process_func = NULL; } TRACE_OUT(on_mp_read_session_read_response_write1); return (0); }
/* * The functions below are used to process multipart write sessions write * requests. * - on_mp_write_session_write_request_read1 and * on_mp_write_session_write_request_read2 read the request itself * - on_mp_write_session_write_request_process processes it * - on_mp_write_session_write_response_write1 sends the response */ static int on_mp_write_session_write_request_read1(struct query_state *qstate) { struct cache_mp_write_session_write_request *write_request; ssize_t result; TRACE_IN(on_mp_write_session_write_request_read1); init_comm_element(&qstate->request, CET_MP_WRITE_SESSION_WRITE_REQUEST); write_request = get_cache_mp_write_session_write_request( &qstate->request); result = qstate->read_func(qstate, &write_request->data_size, sizeof(size_t)); if (result != sizeof(size_t)) { LOG_ERR_3("on_mp_write_session_write_request_read1", "read failed"); TRACE_OUT(on_mp_write_session_write_request_read1); return (-1); } if (BUFSIZE_INVALID(write_request->data_size)) { LOG_ERR_3("on_mp_write_session_write_request_read1", "invalid data_size value"); TRACE_OUT(on_mp_write_session_write_request_read1); return (-1); } write_request->data = calloc(1, write_request->data_size); assert(write_request->data != NULL); qstate->kevent_watermark = write_request->data_size; qstate->process_func = on_mp_write_session_write_request_read2; TRACE_OUT(on_mp_write_session_write_request_read1); return (0); }