Search in sources :

Example 6 with KeyWrapper

use of org.apache.geode.internal.memcached.KeyWrapper in project geode by apache.

the class IncrementCommand method processBinaryProtocol.

private ByteBuffer processBinaryProtocol(RequestReader request, Cache cache) {
    ByteBuffer buffer = request.getRequest();
    int extrasLength = buffer.get(EXTRAS_LENGTH_INDEX);
    final KeyWrapper key = getKey(buffer, HEADER_LENGTH + extrasLength);
    long incrBy = buffer.getLong(HEADER_LENGTH);
    long initialVal = buffer.getLong(HEADER_LENGTH + LONG_LENGTH);
    int expiration = buffer.getInt(HEADER_LENGTH + LONG_LENGTH + LONG_LENGTH);
    final Region<Object, ValueWrapper> r = getMemcachedRegion(cache);
    ByteBuffer newVal = ByteBuffer.allocate(8);
    boolean notFound = false;
    ValueWrapper newValWrapper = null;
    try {
        while (true) {
            ValueWrapper oldValWrapper = r.get(key);
            if (oldValWrapper == null) {
                if (expiration == -1) {
                    notFound = true;
                } else {
                    newVal.putLong(0, initialVal);
                    newValWrapper = ValueWrapper.getWrappedValue(newVal.array(), 0);
                    r.put(key, newValWrapper);
                }
                break;
            }
            byte[] oldVal = oldValWrapper.getValue();
            long oldLong = getLongFromByteArray(oldVal);
            long newLong = oldLong + incrBy;
            newVal.putLong(0, newLong);
            newValWrapper = ValueWrapper.getWrappedValue(newVal.array(), 0);
            if (r.replace(key, oldValWrapper, newValWrapper)) {
                break;
            }
        }
    } catch (Exception e) {
        return handleBinaryException(key, request, request.getResponse(), "increment", e);
    }
    if (expiration > 0) {
        StorageCommand.getExpiryExecutor().schedule(new Runnable() {

            @Override
            public void run() {
                r.destroy(key);
            }
        }, expiration, TimeUnit.SECONDS);
    }
    if (getLogger().fineEnabled()) {
        getLogger().fine("incr:key:" + key + " incrBy:" + incrBy + " initVal:" + initialVal + " exp:" + expiration + " notFound:" + notFound);
    }
    ByteBuffer response = null;
    if (notFound) {
        response = request.getResponse();
        response.putShort(POSITION_RESPONSE_STATUS, ResponseStatus.KEY_NOT_FOUND.asShort());
    } else {
        if (isQuiet()) {
            return null;
        }
        response = request.getResponse(HEADER_LENGTH + LONG_LENGTH);
        response.putInt(TOTAL_BODY_LENGTH_INDEX, LONG_LENGTH);
        response.putLong(HEADER_LENGTH, newVal.getLong(0));
        response.putLong(POSITION_CAS, newValWrapper.getVersion());
    }
    return response;
}
Also used : KeyWrapper(org.apache.geode.internal.memcached.KeyWrapper) ValueWrapper(org.apache.geode.internal.memcached.ValueWrapper) ByteBuffer(java.nio.ByteBuffer)

Aggregations

KeyWrapper (org.apache.geode.internal.memcached.KeyWrapper)6 ByteBuffer (java.nio.ByteBuffer)5 ValueWrapper (org.apache.geode.internal.memcached.ValueWrapper)5 EntryNotFoundException (org.apache.geode.cache.EntryNotFoundException)1