Search in sources :

Example 1 with POLICIES_ROOT

use of org.apache.pulsar.broker.cache.ConfigurationCacheService.POLICIES_ROOT in project incubator-pulsar by apache.

the class LocalZooKeeperCacheService method createPolicies.

/**
 * Create LocalPolicies with bundle-data in LocalZookeeper by fetching it from GlobalZookeeper
 *
 * @param path
 *            znode path
 * @param readFromGlobal
 *            if true copy policies from global zk to local zk else create a new znode with empty {@link Policies}
 * @throws Exception
 */
@SuppressWarnings("deprecation")
public CompletableFuture<Optional<LocalPolicies>> createPolicies(String path, boolean readFromGlobal) {
    CompletableFuture<Optional<LocalPolicies>> future = new CompletableFuture<>();
    if (path == null || !path.startsWith(LOCAL_POLICIES_ROOT)) {
        future.completeExceptionally(new IllegalArgumentException("Invalid path of local policies " + path));
        return future;
    }
    if (LOG.isDebugEnabled()) {
        LOG.debug("Creating local namespace policies for {} - readFromGlobal: {}", path, readFromGlobal);
    }
    CompletableFuture<Optional<LocalPolicies>> readFromGlobalFuture = new CompletableFuture<>();
    if (readFromGlobal) {
        String globalPath = joinPath(POLICIES_ROOT, path.substring(path.indexOf(LOCAL_POLICIES_ROOT) + LOCAL_POLICIES_ROOT.length() + 1));
        checkNotNull(configurationCacheService);
        checkNotNull(configurationCacheService.policiesCache());
        checkNotNull(configurationCacheService.policiesCache().getAsync(globalPath));
        configurationCacheService.policiesCache().getAsync(globalPath).thenAccept(policies -> {
            if (policies.isPresent()) {
                // Copying global bundles information to local policies
                LocalPolicies localPolicies = new LocalPolicies();
                localPolicies.bundles = policies.get().bundles;
                readFromGlobalFuture.complete(Optional.of(localPolicies));
            } else {
                // Policies are not present in global zk
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Global policies not found at {}", globalPath);
                }
                readFromGlobalFuture.complete(Optional.empty());
            }
        }).exceptionally(ex -> {
            future.completeExceptionally(ex);
            return null;
        });
    } else {
        // Use default local policies
        readFromGlobalFuture.complete(Optional.of(new LocalPolicies()));
    }
    readFromGlobalFuture.thenAccept(localPolicies -> {
        if (!localPolicies.isPresent()) {
            future.complete(Optional.empty());
        }
        // When we have the updated localPolicies, we can write them back in local ZK
        byte[] content;
        try {
            content = ObjectMapperFactory.getThreadLocal().writeValueAsBytes(localPolicies.get());
        } catch (Throwable t) {
            // Failed to serialize to json
            future.completeExceptionally(t);
            return;
        }
        ZkUtils.asyncCreateFullPathOptimistic(cache.getZooKeeper(), path, content, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, (rc, path1, ctx, name) -> {
            if (rc == KeeperException.Code.OK.intValue() || rc == KeeperException.Code.NODEEXISTS.intValue()) {
                LOG.info("Successfully copyied bundles data to local zk at {}", path);
                future.complete(localPolicies);
            } else {
                LOG.error("Failed to create policies for {} in local zookeeper: {}", path, KeeperException.Code.get(rc));
                future.completeExceptionally(new PulsarServerException(KeeperException.create(rc)));
            }
        }, null);
    }).exceptionally(ex -> {
        future.completeExceptionally(ex);
        return null;
    });
    return future;
}
Also used : CreateMode(org.apache.zookeeper.CreateMode) ZooKeeper(org.apache.zookeeper.ZooKeeper) Logger(org.slf4j.Logger) KeeperException(org.apache.zookeeper.KeeperException) Ids(org.apache.zookeeper.ZooDefs.Ids) ObjectMapperFactory(org.apache.pulsar.common.util.ObjectMapperFactory) Preconditions.checkNotNull(com.google.common.base.Preconditions.checkNotNull) LoggerFactory(org.slf4j.LoggerFactory) NamespaceEphemeralData(org.apache.pulsar.broker.namespace.NamespaceEphemeralData) LocalPolicies(org.apache.pulsar.common.policies.data.LocalPolicies) ZooKeeperChildrenCache(org.apache.pulsar.zookeeper.ZooKeeperChildrenCache) CompletableFuture(java.util.concurrent.CompletableFuture) Stat(org.apache.zookeeper.data.Stat) PulsarWebResource.joinPath(org.apache.pulsar.broker.web.PulsarWebResource.joinPath) Maps(com.google.common.collect.Maps) ZkUtils(org.apache.bookkeeper.util.ZkUtils) Policies(org.apache.pulsar.common.policies.data.Policies) PulsarServerException(org.apache.pulsar.broker.PulsarServerException) ZooKeeperCache(org.apache.pulsar.zookeeper.ZooKeeperCache) ZooKeeperDataCache(org.apache.pulsar.zookeeper.ZooKeeperDataCache) Entry(java.util.Map.Entry) Optional(java.util.Optional) POLICIES_ROOT(org.apache.pulsar.broker.cache.ConfigurationCacheService.POLICIES_ROOT) PulsarServerException(org.apache.pulsar.broker.PulsarServerException) CompletableFuture(java.util.concurrent.CompletableFuture) Optional(java.util.Optional) LocalPolicies(org.apache.pulsar.common.policies.data.LocalPolicies)

Aggregations

Preconditions.checkNotNull (com.google.common.base.Preconditions.checkNotNull)1 Maps (com.google.common.collect.Maps)1 Entry (java.util.Map.Entry)1 Optional (java.util.Optional)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 ZkUtils (org.apache.bookkeeper.util.ZkUtils)1 PulsarServerException (org.apache.pulsar.broker.PulsarServerException)1 POLICIES_ROOT (org.apache.pulsar.broker.cache.ConfigurationCacheService.POLICIES_ROOT)1 NamespaceEphemeralData (org.apache.pulsar.broker.namespace.NamespaceEphemeralData)1 PulsarWebResource.joinPath (org.apache.pulsar.broker.web.PulsarWebResource.joinPath)1 LocalPolicies (org.apache.pulsar.common.policies.data.LocalPolicies)1 Policies (org.apache.pulsar.common.policies.data.Policies)1 ObjectMapperFactory (org.apache.pulsar.common.util.ObjectMapperFactory)1 ZooKeeperCache (org.apache.pulsar.zookeeper.ZooKeeperCache)1 ZooKeeperChildrenCache (org.apache.pulsar.zookeeper.ZooKeeperChildrenCache)1 ZooKeeperDataCache (org.apache.pulsar.zookeeper.ZooKeeperDataCache)1 CreateMode (org.apache.zookeeper.CreateMode)1 KeeperException (org.apache.zookeeper.KeeperException)1 Ids (org.apache.zookeeper.ZooDefs.Ids)1 ZooKeeper (org.apache.zookeeper.ZooKeeper)1