Example #1
0
/*
 * The functions below are used to process write requests.
 * - on_write_request_read1 and on_write_request_read2 read the request itself
 * - on_write_request_process processes it (if the client requests to
 *    cache the negative result, the on_negative_write_request_process is used)
 * - on_write_response_write1 sends the response
 */
static int
on_write_request_read1(struct query_state *qstate)
{
	struct cache_write_request	*write_request;
	ssize_t	result;

	TRACE_IN(on_write_request_read1);
	if (qstate->kevent_watermark == 0)
		qstate->kevent_watermark = sizeof(size_t) * 3;
	else {
		init_comm_element(&qstate->request, CET_WRITE_REQUEST);
		write_request = get_cache_write_request(&qstate->request);

		result = qstate->read_func(qstate, &write_request->entry_length,
			sizeof(size_t));
		result += qstate->read_func(qstate,
			&write_request->cache_key_size, sizeof(size_t));
		result += qstate->read_func(qstate,
			&write_request->data_size, sizeof(size_t));

		if (result != sizeof(size_t) * 3) {
			TRACE_OUT(on_write_request_read1);
			return (-1);
		}

		if (BUFSIZE_INVALID(write_request->entry_length) ||
			BUFSIZE_INVALID(write_request->cache_key_size) ||
			(BUFSIZE_INVALID(write_request->data_size) &&
			(write_request->data_size != 0))) {
			TRACE_OUT(on_write_request_read1);
			return (-1);
		}

		write_request->entry = (char *)calloc(1,
			write_request->entry_length + 1);
		assert(write_request->entry != NULL);

		write_request->cache_key = (char *)calloc(1,
			write_request->cache_key_size +
			qstate->eid_str_length);
		assert(write_request->cache_key != NULL);
		memcpy(write_request->cache_key, qstate->eid_str,
			qstate->eid_str_length);

		if (write_request->data_size != 0) {
			write_request->data = (char *)calloc(1,
				write_request->data_size);
			assert(write_request->data != NULL);
		}

		qstate->kevent_watermark = write_request->entry_length +
			write_request->cache_key_size +
			write_request->data_size;
		qstate->process_func = on_write_request_read2;
	}

	TRACE_OUT(on_write_request_read1);
	return (0);
}
Example #2
0
/*
 * The functions below are used to process read requests.
 * - on_read_request_read1 and on_read_request_read2 read the request itself
 * - on_read_request_process processes it
 * - on_read_response_write1 and on_read_response_write2 send the response
 */
static int
on_read_request_read1(struct query_state *qstate)
{
	struct cache_read_request *read_request;
	ssize_t	result;

	TRACE_IN(on_read_request_read1);
	if (qstate->kevent_watermark == 0)
		qstate->kevent_watermark = sizeof(size_t) * 2;
	else {
		init_comm_element(&qstate->request, CET_READ_REQUEST);
		read_request = get_cache_read_request(&qstate->request);

		result = qstate->read_func(qstate,
			&read_request->entry_length, sizeof(size_t));
		result += qstate->read_func(qstate,
			&read_request->cache_key_size, sizeof(size_t));

		if (result != sizeof(size_t) * 2) {
			TRACE_OUT(on_read_request_read1);
			return (-1);
		}

		if (BUFSIZE_INVALID(read_request->entry_length) ||
			BUFSIZE_INVALID(read_request->cache_key_size)) {
			TRACE_OUT(on_read_request_read1);
			return (-1);
		}

		read_request->entry = (char *)calloc(1,
			read_request->entry_length + 1);
		assert(read_request->entry != NULL);

		read_request->cache_key = (char *)calloc(1,
			read_request->cache_key_size +
			qstate->eid_str_length);
		assert(read_request->cache_key != NULL);
		memcpy(read_request->cache_key, qstate->eid_str,
			qstate->eid_str_length);

		qstate->kevent_watermark = read_request->entry_length +
			read_request->cache_key_size;
		qstate->process_func = on_read_request_read2;
	}

	TRACE_OUT(on_read_request_read1);
	return (0);
}
Example #3
0
/*
 * The functions below are used to process write requests.
 * - on_transform_request_read1 and on_transform_request_read2 read the
 *   request itself
 * - on_transform_request_process processes it
 * - on_transform_response_write1 sends the response
 */
static int
on_transform_request_read1(struct query_state *qstate)
{
	struct cache_transform_request *transform_request;
	ssize_t	result;

	TRACE_IN(on_transform_request_read1);
	if (qstate->kevent_watermark == 0)
		qstate->kevent_watermark = sizeof(size_t) + sizeof(int);
	else {
		init_comm_element(&qstate->request, CET_TRANSFORM_REQUEST);
		transform_request =
			get_cache_transform_request(&qstate->request);

		result = qstate->read_func(qstate,
			&transform_request->entry_length, sizeof(size_t));
		result += qstate->read_func(qstate,
			&transform_request->transformation_type, sizeof(int));

		if (result != sizeof(size_t) + sizeof(int)) {
			TRACE_OUT(on_transform_request_read1);
			return (-1);
		}

		if ((transform_request->transformation_type != TT_USER) &&
		    (transform_request->transformation_type != TT_ALL)) {
			TRACE_OUT(on_transform_request_read1);
			return (-1);
		}

		if (transform_request->entry_length != 0) {
			if (BUFSIZE_INVALID(transform_request->entry_length)) {
				TRACE_OUT(on_transform_request_read1);
				return (-1);
			}

			transform_request->entry = (char *)calloc(1,
				transform_request->entry_length + 1);
			assert(transform_request->entry != NULL);

			qstate->process_func = on_transform_request_read2;
		} else
			qstate->process_func = on_transform_request_process;

		qstate->kevent_watermark = transform_request->entry_length;
	}

	TRACE_OUT(on_transform_request_read1);
	return (0);
}
Example #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);
}
Example #5
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);
}