Search in sources :

Example 41 with Stat

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();
    }
}
Also used : Stat(org.apache.pulsar.metadata.api.Stat) GetResult(org.apache.pulsar.metadata.api.GetResult)

Example 42 with Stat

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()));
    }
}
Also used : Stat(org.apache.pulsar.metadata.api.Stat) OpResult(org.apache.zookeeper.OpResult) Code(org.apache.zookeeper.KeeperException.Code)

Example 43 with Stat

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));
            }
        }
    }
}
Also used : MetadataStoreException(org.apache.pulsar.metadata.api.MetadataStoreException) Stat(org.apache.pulsar.metadata.api.Stat) NotificationType(org.apache.pulsar.metadata.api.NotificationType) BadVersionException(org.apache.pulsar.metadata.api.MetadataStoreException.BadVersionException) Notification(org.apache.pulsar.metadata.api.Notification)

Example 44 with Stat

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;
}
Also used : StringUtils(org.apache.bookkeeper.util.StringUtils) LongVersion(org.apache.bookkeeper.versioning.LongVersion) DefaultThreadFactory(io.netty.util.concurrent.DefaultThreadFactory) MetadataStore(org.apache.pulsar.metadata.api.MetadataStore) CompletableFuture(java.util.concurrent.CompletableFuture) BookkeeperInternalCallbacks(org.apache.bookkeeper.proto.BookkeeperInternalCallbacks) ConcurrentMap(java.util.concurrent.ConcurrentMap) HashSet(java.util.HashSet) Notification(org.apache.pulsar.metadata.api.Notification) MetadataCache(org.apache.pulsar.metadata.api.MetadataCache) MetadataSerde(org.apache.pulsar.metadata.api.MetadataSerde) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Versioned(org.apache.bookkeeper.versioning.Versioned) MetadataStoreException(org.apache.pulsar.metadata.api.MetadataStoreException) Stat(org.apache.pulsar.metadata.api.Stat) LedgerMetadataSerDe(org.apache.bookkeeper.meta.LedgerMetadataSerDe) LedgerManager(org.apache.bookkeeper.meta.LedgerManager) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Set(java.util.Set) IOException(java.io.IOException) Executors(java.util.concurrent.Executors) BKException(org.apache.bookkeeper.client.BKException) TimeUnit(java.util.concurrent.TimeUnit) Slf4j(lombok.extern.slf4j.Slf4j) FutureUtil(org.apache.pulsar.common.util.FutureUtil) Optional(java.util.Optional) AsyncCallback(org.apache.zookeeper.AsyncCallback) Pattern(java.util.regex.Pattern) LedgerMetadata(org.apache.bookkeeper.client.api.LedgerMetadata) LedgerMetadataBuilder(org.apache.bookkeeper.client.LedgerMetadataBuilder) Version(org.apache.bookkeeper.versioning.Version) CompletableFuture(java.util.concurrent.CompletableFuture) Stat(org.apache.pulsar.metadata.api.Stat) Versioned(org.apache.bookkeeper.versioning.Versioned) LedgerMetadata(org.apache.bookkeeper.client.api.LedgerMetadata) LongVersion(org.apache.bookkeeper.versioning.LongVersion) BKException(org.apache.bookkeeper.client.BKException)

Example 45 with Stat

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);
        }
    });
}
Also used : MetaStoreException(org.apache.bookkeeper.mledger.ManagedLedgerException.MetaStoreException) Stat(org.apache.pulsar.metadata.api.Stat) ManagedCursorInfo(org.apache.bookkeeper.mledger.proto.MLDataFormats.ManagedCursorInfo) MetaStoreCallback(org.apache.bookkeeper.mledger.impl.MetaStore.MetaStoreCallback) CursorAlreadyClosedException(org.apache.bookkeeper.mledger.ManagedLedgerException.CursorAlreadyClosedException)

Aggregations

Stat (org.apache.pulsar.metadata.api.Stat)132 MetaStoreException (org.apache.bookkeeper.mledger.ManagedLedgerException.MetaStoreException)69 Test (org.testng.annotations.Test)66 CountDownLatch (java.util.concurrent.CountDownLatch)42 CompletableFuture (java.util.concurrent.CompletableFuture)40 ManagedLedgerException (org.apache.bookkeeper.mledger.ManagedLedgerException)39 ManagedLedgerInfo (org.apache.bookkeeper.mledger.proto.MLDataFormats.ManagedLedgerInfo)36 Cleanup (lombok.Cleanup)33 MetadataStoreException (org.apache.pulsar.metadata.api.MetadataStoreException)33 MetaStoreCallback (org.apache.bookkeeper.mledger.impl.MetaStore.MetaStoreCallback)30 MetadataStore (org.apache.pulsar.metadata.api.MetadataStore)27 Optional (java.util.Optional)24 ManagedCursorInfo (org.apache.bookkeeper.mledger.proto.MLDataFormats.ManagedCursorInfo)24 MLDataFormats (org.apache.bookkeeper.mledger.proto.MLDataFormats)21 Notification (org.apache.pulsar.metadata.api.Notification)21 ArrayList (java.util.ArrayList)18 List (java.util.List)18 Slf4j (lombok.extern.slf4j.Slf4j)18 BKException (org.apache.bookkeeper.client.BKException)18 BookKeeper (org.apache.bookkeeper.client.BookKeeper)18