use of org.apache.pulsar.metadata.api.Stat in project pulsar by yahoo.
the class RocksdbMetadataStore method storeGet.
@Override
public CompletableFuture<Optional<GetResult>> storeGet(String path) {
if (log.isDebugEnabled()) {
log.debug("getFromStore.path={},instanceId={}", path, instanceId);
}
try {
dbStateLock.readLock().lock();
if (state == State.CLOSED) {
throw new MetadataStoreException.AlreadyClosedException("");
}
byte[] value = db.get(optionCache, toBytes(path));
if (value == null) {
return CompletableFuture.completedFuture(Optional.empty());
}
MetaValue metaValue = MetaValue.parse(value);
if (metaValue.ephemeral && metaValue.owner != instanceId) {
delete(path, Optional.empty());
return CompletableFuture.completedFuture(Optional.empty());
}
GetResult result = new GetResult(metaValue.getData(), new Stat(path, metaValue.getVersion(), metaValue.getCreatedTimestamp(), metaValue.getModifiedTimestamp(), metaValue.ephemeral, metaValue.getOwner() == instanceId));
return CompletableFuture.completedFuture(Optional.of(result));
} catch (Throwable e) {
return FutureUtil.failedFuture(MetadataStoreException.wrap(e));
} finally {
dbStateLock.readLock().unlock();
}
}
use of org.apache.pulsar.metadata.api.Stat in project pulsar by yahoo.
the class ZKMetadataStore method handlePutResult.
private void handlePutResult(OpPut op, OpResult opr) {
if (opr instanceof OpResult.ErrorResult) {
OpResult.ErrorResult er = (OpResult.ErrorResult) opr;
Code code = Code.get(er.getErr());
if (code == Code.NONODE) {
// Receiving no-node for a put operation, means that parent node are not
// existing: let's make sure to create them
internalStorePut(op);
} else if (code == Code.NODEEXISTS) {
// We're emulating a request to create node, so the version is invalid
op.getFuture().completeExceptionally(getException(Code.BADVERSION, op.getPath()));
} else if (code == Code.RUNTIMEINCONSISTENCY || code == Code.OK) {
// This error will happen when other items in the batch did already fail. In this case, we're
// retrying the operation individually
internalStorePut(op);
} else {
op.getFuture().completeExceptionally(getException(code, op.getPath()));
}
} else if (opr instanceof OpResult.CreateResult) {
OpResult.CreateResult cr = (OpResult.CreateResult) opr;
op.getFuture().complete(new Stat(cr.getPath(), 0, 0, 0, op.isEphemeral(), true));
} else {
OpResult.SetDataResult sdr = (OpResult.SetDataResult) opr;
op.getFuture().complete(getStat(op.getPath(), sdr.getStat()));
}
}
use of org.apache.pulsar.metadata.api.Stat in project pulsar by yahoo.
the class LocalMemoryMetadataStore method storePut.
@Override
public CompletableFuture<Stat> storePut(String path, byte[] data, Optional<Long> optExpectedVersion, EnumSet<CreateOption> options) {
if (!isValidPath(path)) {
return FutureUtil.failedFuture(new MetadataStoreException.InvalidPathException(path));
}
synchronized (map) {
boolean hasVersion = optExpectedVersion.isPresent();
int expectedVersion = optExpectedVersion.orElse(-1L).intValue();
if (options.contains(CreateOption.Sequential)) {
path += Long.toString(sequentialIdGenerator.getAndIncrement());
}
long now = System.currentTimeMillis();
if (hasVersion && expectedVersion == -1) {
Value newValue = new Value(0, data, now, now, options.contains(CreateOption.Ephemeral));
Value existingValue = map.putIfAbsent(path, newValue);
if (existingValue != null) {
return FutureUtils.exception(new BadVersionException(""));
} else {
receivedNotification(new Notification(NotificationType.Created, path));
notifyParentChildrenChanged(path);
return FutureUtils.value(new Stat(path, 0, now, now, newValue.isEphemeral(), true));
}
} else {
Value existingValue = map.get(path);
long existingVersion = existingValue != null ? existingValue.version : -1;
if (hasVersion && expectedVersion != existingVersion) {
return FutureUtils.exception(new BadVersionException(""));
} else {
long newVersion = existingValue != null ? existingValue.version + 1 : 0;
long createdTimestamp = existingValue != null ? existingValue.createdTimestamp : now;
Value newValue = new Value(newVersion, data, createdTimestamp, now, options.contains(CreateOption.Ephemeral));
map.put(path, newValue);
NotificationType type = existingValue == null ? NotificationType.Created : NotificationType.Modified;
receivedNotification(new Notification(type, path));
if (type == NotificationType.Created) {
notifyParentChildrenChanged(path);
}
return FutureUtils.value(new Stat(path, newValue.version, newValue.createdTimestamp, newValue.modifiedTimestamp, false, true));
}
}
}
}
use of org.apache.pulsar.metadata.api.Stat in project pulsar by yahoo.
the class PulsarLedgerManager method readLedgerMetadata.
@Override
public CompletableFuture<Versioned<LedgerMetadata>> readLedgerMetadata(long ledgerId) {
CompletableFuture<Versioned<LedgerMetadata>> promise = new CompletableFuture<>();
String ledgerPath = getLedgerPath(ledgerId);
cache.getWithStats(ledgerPath).thenAccept(optRes -> {
if (!optRes.isPresent()) {
if (log.isDebugEnabled()) {
log.debug("No such ledger: {} at path {}", ledgerId, ledgerPath);
}
promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
}
Stat stat = optRes.get().getStat();
LongVersion version = new LongVersion(stat.getVersion());
LedgerMetadata metadata = optRes.get().getValue();
promise.complete(new Versioned<>(metadata, version));
}).exceptionally(ex -> {
log.error("Could not read metadata for ledger: {}: {}", ledgerId, ex.getMessage());
promise.completeExceptionally(new BKException.ZKException(ex.getCause()));
return null;
});
return promise;
}
use of org.apache.pulsar.metadata.api.Stat in project incubator-pulsar by apache.
the class ManagedCursorImpl method persistPositionMetaStore.
private void persistPositionMetaStore(long cursorsLedgerId, PositionImpl position, Map<String, Long> properties, MetaStoreCallback<Void> callback, boolean persistIndividualDeletedMessageRanges) {
if (state == State.Closed) {
ledger.getExecutor().execute(safeRun(() -> callback.operationFailed(new MetaStoreException(new CursorAlreadyClosedException(name + " cursor already closed")))));
return;
}
// When closing we store the last mark-delete position in the z-node itself, so we won't need the cursor ledger,
// hence we write it as -1. The cursor ledger is deleted once the z-node write is confirmed.
ManagedCursorInfo.Builder info = //
ManagedCursorInfo.newBuilder().setCursorsLedgerId(//
cursorsLedgerId).setMarkDeleteLedgerId(//
position.getLedgerId()).setMarkDeleteEntryId(//
position.getEntryId()).setLastActive(//
lastActive);
info.addAllProperties(buildPropertiesMap(properties));
if (persistIndividualDeletedMessageRanges) {
info.addAllIndividualDeletedMessages(buildIndividualDeletedMessageRanges());
if (config.isDeletionAtBatchIndexLevelEnabled()) {
info.addAllBatchedEntryDeletionIndexInfo(buildBatchEntryDeletionIndexInfoList());
}
}
if (log.isDebugEnabled()) {
log.debug("[{}][{}] Closing cursor at md-position: {}", ledger.getName(), name, position);
}
ledger.getStore().asyncUpdateCursorInfo(ledger.getName(), name, info.build(), cursorLedgerStat, new MetaStoreCallback<Void>() {
@Override
public void operationComplete(Void result, Stat stat) {
cursorLedgerStat = stat;
callback.operationComplete(result, stat);
}
@Override
public void operationFailed(MetaStoreException e) {
if (e instanceof MetaStoreException.BadVersionException) {
log.warn("[{}] Failed to update cursor metadata for {} due to version conflict {}", ledger.name, name, e.getMessage());
// the ownership and refresh the version again.
if (ledger.mlOwnershipChecker != null && ledger.mlOwnershipChecker.get()) {
ledger.getStore().asyncGetCursorInfo(ledger.getName(), name, new MetaStoreCallback<ManagedCursorInfo>() {
@Override
public void operationComplete(ManagedCursorInfo info, Stat stat) {
cursorLedgerStat = stat;
}
@Override
public void operationFailed(MetaStoreException e) {
if (log.isDebugEnabled()) {
log.debug("[{}] Failed to refresh cursor metadata-version for {} due " + "to {}", ledger.name, name, e.getMessage());
}
}
});
}
}
callback.operationFailed(e);
}
});
}
Aggregations