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; }
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; }
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; }
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); } } } }