int parseMemcache(struct conn *c, struct slice *slice, size_t *out) { ssize_t nparsed; struct memcacheProcData *memcache_data = c->protocol_data; nparsed = memcacheParseReq(memcache_data, slice); if (nparsed == -1) { sendMemcacheResponse(c, ERROR, sizeof(ERROR)); return WHEAT_WRONG; } if (out) *out = nparsed; slice->len = nparsed; if (MEMCACHE_FINISHED(memcache_data)) { return WHEAT_OK; } return 1; }
int callRamcloud(struct conn *c, void *arg) { enum memcacheCommand command = getMemcacheCommand(c->protocol_data); struct RejectRules rule; struct ramcloudData *d = c->app_private_data; int owner = c->client->owner; uint64_t table_id; ASSERT(owner); if (getTableId(owner, &table_id) < 0) { sliceTo(&d->storage_response, (uint8_t*)SERVER_ERROR, sizeof(SERVER_ERROR)-1); sendMemcacheResponse(c, &d->storage_response); return WHEAT_OK; } d->table_id = table_id; memset(&rule, 0, sizeof(rule)); switch (command) { case REQ_MC_GET: case REQ_MC_GETS: d->retrievals = arrayCreate(sizeof(wstr), 1); d->retrievals_keys = arrayCreate(sizeof(struct slice), 1); d->retrievals_vals = arrayCreate(sizeof(struct slice), 1); d->retrievals_flags = arrayCreate(FLAG_SIZE, 1); d->retrievals_versions = arrayCreate(sizeof(uint64_t), 1); arrayEach2(getMemcacheKeys(c->protocol_data), ramcloudRead, d); buildRetrievalResponse(d, command == REQ_MC_GETS ? 1 : 0); sliceTo(&d->storage_response, (uint8_t*)d->retrieval_response, wstrlen(d->retrieval_response)); break; case REQ_MC_DELETE: rule.doesntExist = 1; ramcloudDelete(d, getMemcacheKey(c->protocol_data), &rule); break; case REQ_MC_ADD: rule.exists = 1; ramcloudSet(d, getMemcacheKey(c->protocol_data), getMemcacheVal(c->protocol_data), getMemcacheValLen(c->protocol_data), getMemcacheFlag(c->protocol_data), &rule); break; case REQ_MC_REPLACE: rule.doesntExist = 1; ramcloudSet(d, getMemcacheKey(c->protocol_data), getMemcacheVal(c->protocol_data), getMemcacheValLen(c->protocol_data), getMemcacheFlag(c->protocol_data), &rule); break; case REQ_MC_CAS: rule.givenVersion = getMemcacheCas(c->protocol_data); rule.versionNeGiven = 1; rule.doesntExist = 1; ramcloudSet(d, getMemcacheKey(c->protocol_data), getMemcacheVal(c->protocol_data), getMemcacheValLen(c->protocol_data), getMemcacheFlag(c->protocol_data), &rule); break; case REQ_MC_SET: ramcloudSet(d, getMemcacheKey(c->protocol_data), getMemcacheVal(c->protocol_data), getMemcacheValLen(c->protocol_data), getMemcacheFlag(c->protocol_data), &rule); break; case REQ_MC_INCR: ramcloudIncr(d, getMemcacheKey(c->protocol_data), getMemcacheNum(c->protocol_data), 1); break; case REQ_MC_DECR: ramcloudIncr(d, getMemcacheKey(c->protocol_data), getMemcacheNum(c->protocol_data), 0); break; case REQ_MC_APPEND: ramcloudAppend(d, getMemcacheKey(c->protocol_data), getMemcacheVal(c->protocol_data), getMemcacheValLen(c->protocol_data), getMemcacheFlag(c->protocol_data), 1); break; case REQ_MC_PREPEND: ramcloudAppend(d, getMemcacheKey(c->protocol_data), getMemcacheVal(c->protocol_data), getMemcacheValLen(c->protocol_data), getMemcacheFlag(c->protocol_data), 0); break; default: ASSERT(0); } sendMemcacheResponse(c, &d->storage_response); return WHEAT_OK; }