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