use of org.apache.bookkeeper.api.kv.result.Result 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.api.kv.result.Result in project bookkeeper by apache.
the class MVCCAsyncStore method rDelete.
@Override
default CompletableFuture<KeyValue<K, V>> rDelete(K k, long expectedRevision) {
TxnOp<K, V> op = getOpFactory().newTxn().If(newCompareModRevision(CompareResult.EQUAL, k, expectedRevision)).Then(getOpFactory().newDelete(k, Options.deleteAndGet())).build();
return txn(op).thenCompose(result -> {
try {
Code code = result.code();
if (Code.OK == code && !result.isSuccess()) {
code = Code.BAD_REVISION;
}
if (Code.OK == code) {
List<Result<K, V>> subResults = result.results();
DeleteResult<K, V> deleteResult = (DeleteResult<K, V>) subResults.get(0);
List<KeyValue<K, V>> prevKvs = deleteResult.getPrevKvsAndClear();
if (prevKvs.isEmpty()) {
return FutureUtils.value(null);
} else {
return FutureUtils.value(prevKvs.get(0));
}
} else {
return failWithCode(code, "Failed to rDelete key " + k + " (mod_rev=" + expectedRevision + ") to store " + name());
}
} finally {
result.close();
}
});
}
use of org.apache.bookkeeper.api.kv.result.Result in project bookkeeper by apache.
the class MVCCAsyncStore method vDelete.
@Override
default CompletableFuture<KeyValue<K, V>> vDelete(K k, long expectedVersion) {
TxnOp<K, V> op = getOpFactory().newTxn().If(newCompareVersion(CompareResult.EQUAL, k, expectedVersion)).Then(getOpFactory().newDelete(k, Options.deleteAndGet())).build();
return txn(op).thenCompose(result -> {
try {
Code code = result.code();
if (Code.OK == code && !result.isSuccess()) {
code = Code.BAD_REVISION;
}
if (Code.OK == code) {
List<Result<K, V>> subResults = result.results();
DeleteResult<K, V> deleteResult = (DeleteResult<K, V>) subResults.get(0);
List<KeyValue<K, V>> prevKvs = deleteResult.getPrevKvsAndClear();
if (prevKvs.isEmpty()) {
return FutureUtils.value(null);
} else {
return FutureUtils.value(prevKvs.get(0));
}
} else {
return failWithCode(code, "Failed to vDelete key " + k + " (version=" + expectedVersion + ") to store " + name());
}
} finally {
result.close();
}
});
}
use of org.apache.bookkeeper.api.kv.result.Result in project bookkeeper by apache.
the class MetaRangeImpl method unsafeCreate.
private void unsafeCreate(CompletableFuture<Boolean> createFuture, StreamProperties streamProps) {
// 1. verify the state
checkLifecycleState(LifecycleState.UNINIT);
this.lifecycleState = LifecycleState.CREATING;
// 2. store the props/configuration
synchronized (this) {
this.streamProps = streamProps;
}
this.streamId = streamProps.getStreamId();
this.cTime = this.mTime = System.currentTimeMillis();
// 3. create the ranges
List<RangeProperties> propertiesList = split(streamId, streamProps.getStreamConf().getInitialNumRanges(), nextRangeId, placementPolicy);
List<Op<byte[], byte[]>> successOps = Lists.newArrayListWithExpectedSize(propertiesList.size() + 1);
for (RangeProperties props : propertiesList) {
RangeMetadata meta = RangeMetadata.newBuilder().setProps(props).setCreateTime(cTime).setFenceTime(Long.MAX_VALUE).setState(RangeState.RANGE_ACTIVE).addAllParents(Lists.newArrayList()).build();
ranges.put(props.getRangeId(), meta);
currentRanges.add(props.getRangeId());
successOps.add(store.newPut(getStreamRangeKey(streamId, props.getRangeId()), meta.toByteArray()));
}
nextRangeId += propertiesList.size();
// serialize the stream metadata
byte[] streamMetadataKey = getStreamMetadataKey(streamId);
successOps.add(store.newPut(streamMetadataKey, toStreamMetadata(LifecycleState.CREATED).toByteArray()));
TxnOp<byte[], byte[]> txn = store.newTxn().If(store.newCompareValue(CompareResult.EQUAL, streamMetadataKey, null)).Then(successOps.toArray(new Op[successOps.size()])).build();
if (log.isTraceEnabled()) {
log.trace("Execute create stream metadata range txn {}", streamProps);
}
store.txn(txn).thenApplyAsync(txnResult -> {
try {
if (log.isTraceEnabled()) {
log.trace("Create stream metadata range txn result = {}", txnResult.isSuccess());
}
if (txnResult.isSuccess()) {
List<Result<byte[], byte[]>> results = txnResult.results();
MetaRangeImpl.this.revision = results.get(results.size() - 1).revision();
// mark the state to CREATED
this.lifecycleState = LifecycleState.CREATED;
createFuture.complete(true);
} else {
createFuture.complete(false);
}
return null;
} finally {
txnResult.close();
}
}, executor).exceptionally(cause -> {
createFuture.completeExceptionally(cause);
return null;
});
}
Aggregations