Exemple #1
0
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);
}
Exemple #2
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);
}
Exemple #3
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);
}
Exemple #4
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);
}
Exemple #5
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);
}
Exemple #6
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);
}
Exemple #7
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);
}