use of org.apache.bookkeeper.statelib.api.exceptions.StateStoreRuntimeException in project bookkeeper by apache.
the class RocksdbKVStore method putRaw.
private void putRaw(K key, byte[] keyBytes, V value, long revision) {
WriteBatch batch = new WriteBatch();
if (revision > 0) {
// last revision has been set to revision bytes
batch.put(metaCfHandle, LAST_REVISION, lastRevisionBytes);
}
if (null == value) {
// delete a key if value is null
batch.remove(dataCfHandle, keyBytes);
} else {
byte[] valBytes = valCoder.encode(value);
batch.put(dataCfHandle, keyBytes, valBytes);
}
try {
db.write(writeOpts, batch);
} catch (RocksDBException e) {
throw new StateStoreRuntimeException("Error while updating key " + key + " to value " + value + " from store " + name, e);
}
}
use of org.apache.bookkeeper.statelib.api.exceptions.StateStoreRuntimeException in project bookkeeper by apache.
the class MVCCStoreImpl method processTxn.
synchronized TxnResult<K, V> processTxn(long revision, TxnOp<K, V> op) {
checkStoreOpen();
// 1. process the compares
boolean success = processCompares(op);
// 2. prepare the response list
List<Op<K, V>> operations;
List<Result<K, V>> results;
if (success) {
operations = op.successOps();
} else {
operations = op.failureOps();
}
if (operations == null) {
operations = Collections.emptyList();
}
results = Lists.newArrayListWithExpectedSize(operations.size());
// 3. process the operations
try (WriteBatch batch = new WriteBatch()) {
for (Op<K, V> o : operations) {
results.add(executeOp(revision, batch, o));
}
executeBatch(batch);
// 4. repare the result
TxnResultImpl<K, V> txnResult = resultFactory.newTxnResult(revision);
txnResult.isSuccess(success);
txnResult.results(results);
txnResult.code(Code.OK);
return txnResult;
} catch (StateStoreRuntimeException e) {
results.forEach(Result::close);
throw e;
}
}
use of org.apache.bookkeeper.statelib.api.exceptions.StateStoreRuntimeException in project bookkeeper by apache.
the class MVCCStoreImpl method processIncrement.
synchronized IncrementResult<K, V> processIncrement(long revision, IncrementOp<K, V> op) {
checkStoreOpen();
WriteBatch batch = new WriteBatch();
IncrementResult<K, V> result = null;
try {
result = increment(revision, batch, op);
executeBatch(batch);
return result;
} catch (StateStoreRuntimeException e) {
if (null != result) {
result.close();
}
throw e;
} finally {
RocksUtils.close(batch);
}
}
use of org.apache.bookkeeper.statelib.api.exceptions.StateStoreRuntimeException in project bookkeeper by apache.
the class MVCCRecordCoder method decode.
@Override
public MVCCRecord decode(ByteBuf data) {
ByteBuf copy = data.slice();
int metaLen = copy.readInt();
ByteBuffer metaBuf = copy.slice(copy.readerIndex(), metaLen).nioBuffer();
KeyMeta meta;
try {
meta = KeyMeta.parseFrom(metaBuf);
} catch (InvalidProtocolBufferException e) {
throw new StateStoreRuntimeException("Failed to deserialize key metadata", e);
}
copy.skipBytes(metaLen);
int valLen = copy.readInt();
ByteBuf valBuf = copy.retainedSlice(copy.readerIndex(), valLen);
MVCCRecord record = MVCCRecord.newRecord();
record.setCreateRev(meta.getCreateRevision());
record.setModRev(meta.getModRevision());
record.setVersion(meta.getVersion());
record.setValue(valBuf, meta.getValueType());
return record;
}
use of org.apache.bookkeeper.statelib.api.exceptions.StateStoreRuntimeException in project bookkeeper by apache.
the class MVCCRecordCoder method encode.
@Override
public byte[] encode(MVCCRecord record) {
KeyMeta meta = KeyMeta.newBuilder().setCreateRevision(record.getCreateRev()).setModRevision(record.getModRev()).setVersion(record.getVersion()).setValueType(record.getValueType()).build();
int metaLen = meta.getSerializedSize();
int valLen = record.getValue().readableBytes();
int totalLen = // meta len
Integer.BYTES + // meta bytes
metaLen + // val len
Integer.BYTES + // val bytes
valLen;
// NOTE: currently rocksdb jni only supports `byte[]`
// we can improve this if rocksdb jni support ByteBuffer or ByteBuf
byte[] data = new byte[totalLen];
ByteBuf buf = Unpooled.wrappedBuffer(data);
buf.writerIndex(0);
buf.writeInt(metaLen);
CodedOutputStream out = CodedOutputStream.newInstance(data, Integer.BYTES, metaLen);
try {
meta.writeTo(out);
} catch (IOException e) {
throw new StateStoreRuntimeException("Failed to serialize key metadata", e);
}
buf.writerIndex(buf.writerIndex() + metaLen);
buf.writeInt(valLen);
buf.writeBytes(record.getValue().slice());
buf.release();
return data;
}
Aggregations