예제 #1
0
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;
}
예제 #2
0
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;
}