コード例 #1
0
ファイル: kv.c プロジェクト: skuanr/sheepdog
static int onode_populate_data(struct kv_onode *onode, struct http_request *req)
{
	ssize_t size;
	int ret = SD_RES_SUCCESS;

	if (req->data_length <= KV_ONODE_INLINE_SIZE) {
		onode->inlined = 1;
		size = http_request_read(req, onode->data, sizeof(onode->data));
		if (size < 0 || req->data_length != size) {
			sd_err("Failed to read from web server for %s",
			       onode->name);
			ret = SD_RES_SYSTEM_ERROR;
			goto out;
		}
	} else {
		ret = onode_populate_extents(onode, req);
		if (ret != SD_RES_SUCCESS)
			goto out;
	}

	onode->mtime = get_seconds();
	onode->size = req->data_length;
out:
	return ret;
}
コード例 #2
0
ファイル: splashd.c プロジェクト: xunmengdeganjue/nocatsplash
gboolean handle_read( GIOChannel *sock, GIOCondition cond, http_request *h ) {
    g_debug( "entering handle_read");

    if (http_request_read( h )) {
        if (! http_request_ok(h))
            return TRUE;
        handle_request(h);
    }

    http_request_free( h );
    g_debug( "exiting handle_read" );
    return FALSE;
}
コード例 #3
0
ファイル: kv.c プロジェクト: cephpp/sheepdog
static int onode_populate_extents(struct kv_onode *onode,
				  struct http_request *req)
{
	ssize_t size;
	uint64_t start = 0, count, done = 0, total, offset;
	int ret;
	char *data_buf = NULL;
	uint32_t data_vid = onode->data_vid;
	uint64_t write_buffer_size = MIN(MAX_RW_BUFFER, req->data_length);

	count = DIV_ROUND_UP(req->data_length, SD_DATA_OBJ_SIZE);
	sys->cdrv->lock(data_vid);
	ret = oalloc_new_prepare(data_vid, &start, count);
	sys->cdrv->unlock(data_vid);
	if (ret != SD_RES_SUCCESS) {
		sd_err("oalloc_new_prepare failed for %s, %s", onode->name,
		       sd_strerror(ret));
		goto out;
	}

	data_buf = xmalloc(write_buffer_size);
	offset = start * SD_DATA_OBJ_SIZE;
	total = req->data_length;
	while (done < total) {
		size = http_request_read(req, data_buf, write_buffer_size);
		ret = vdi_read_write(data_vid, data_buf, size, offset, false);
		if (ret != SD_RES_SUCCESS) {
			sd_err("Failed to write data object for %s, %s",
			       onode->name, sd_strerror(ret));
			goto out;
		}
		done += size;
		offset += size;
	}

	sys->cdrv->lock(data_vid);
	ret = oalloc_new_finish(data_vid, start, count);
	sys->cdrv->unlock(data_vid);
	if (ret != SD_RES_SUCCESS) {
		sd_err("oalloc_new_finish failed for %s, %s", onode->name,
		       sd_strerror(ret));
		goto out;
	}

	onode->o_extent[0].start = start;
	onode->o_extent[0].count = count;
	onode->nr_extent = 1;
out:
	free(data_buf);
	return ret;
}
コード例 #4
0
ファイル: sock_epoll.c プロジェクト: wsjtangy/loongsso
int sock_epoll_wait(int timeout) 
{
	int n, i;
	time_t epoll_time;
	struct epoll_event *cevents;

	for( ; ; )
    {
		n = epoll_wait(ct.efd, ct.events, ct.max_events, timeout);
		if(n <= 0) continue;
		
		
		// check timeout 
		epoll_time = time((time_t*)0);
		for(i = 0; i <= server.maxfd; i++)
		{
			struct conn_t *c = &server.conn[i];
			if(c->fd &&  (c->fd != server.listen_fd) && (epoll_time > (c->now + SOCK_TIMEOUT)))
			{
				sock_close(c->fd);
			}
		}
		

		for (i = 0, cevents = ct.events; i < n; i++, cevents++) 
		{	
			if(cevents->events & (EPOLLHUP | EPOLLERR) && cevents->data.fd != server.listen_fd)
			{
				sock_close(cevents->data.fd);
			}
			else if(cevents->events & EPOLLIN && cevents->data.fd == server.listen_fd)
			{
				http_request_accept(cevents->data.fd);
			}
			else if(cevents->events & EPOLLIN)
			{
				http_request_read(cevents->data.fd);
			}
			else if(cevents->events & EPOLLOUT)
			{
				http_request_write(cevents->data.fd);
			}
		}
    }
}