Future<BKLogWriteHandler> asyncCreateWriteHandler(final boolean lockHandler) { final ZooKeeper zk; try { zk = writerZKC.get(); } catch (InterruptedException e) { LOG.error("Failed to initialize zookeeper client : ", e); return Future.exception(new DLInterruptedException("Failed to initialize zookeeper client", e)); } catch (ZooKeeperClient.ZooKeeperConnectionException e) { return Future.exception(FutureUtils.zkException(e, uri.getPath())); } boolean ownAllocator = null == ledgerAllocator; // Fetching Log Metadata Future<ZKLogMetadataForWriter> metadataFuture = ZKLogMetadataForWriter.of(uri, name, streamIdentifier, zk, writerZKC.getDefaultACL(), ownAllocator, conf.getCreateStreamIfNotExists() || ownAllocator); return metadataFuture.flatMap(new AbstractFunction1<ZKLogMetadataForWriter, Future<BKLogWriteHandler>>() { @Override public Future<BKLogWriteHandler> apply(ZKLogMetadataForWriter logMetadata) { Promise<BKLogWriteHandler> createPromise = new Promise<BKLogWriteHandler>(); createWriteHandler(logMetadata, lockHandler, createPromise); return createPromise; } }); }
public static void propagateConfiguration(BKDLConfig bkdlConfig, DistributedLogConfiguration dlConf) { dlConf.setSanityCheckTxnID(bkdlConfig.getSanityCheckTxnID()); dlConf.setEncodeRegionIDInLogSegmentMetadata(bkdlConfig.getEncodeRegionID()); dlConf.setFirstLogSegmentSequenceNumber(bkdlConfig.getFirstLogSegmentSeqNo()); if (bkdlConfig.isFederatedNamespace()) { dlConf.setCreateStreamIfNotExists(false); LOG.info("Disabled createIfNotExists for federated namespace."); } LOG.info("Propagate BKDLConfig to DLConfig : sanityCheckTxnID = {}, encodeRegionID = {}," + " firstLogSegmentSequenceNumber = {}, createStreamIfNotExists = {}, isFederated = {}.", new Object[] { dlConf.getSanityCheckTxnID(), dlConf.getEncodeRegionIDInLogSegmentMetadata(), dlConf.getFirstLogSegmentSequenceNumber(), dlConf.getCreateStreamIfNotExists(), bkdlConfig.isFederatedNamespace() }); }
@Test(timeout = 60000) public void testFederatedNamespace() throws Exception { DistributedLogConfiguration dlConf = new DistributedLogConfiguration(); URI uri = createURI("/messaging/distributedlog-testfederatednamespace/dl1"); DLMetadata meta1 = DLMetadata.create(new BKDLConfig("127.0.0.1:7000", "ledgers")); meta1.create(uri); BKDLConfig read1 = BKDLConfig.resolveDLConfig(zkc, uri); BKDLConfig.propagateConfiguration(read1, dlConf); assertTrue(dlConf.getCreateStreamIfNotExists()); BKDLConfig.clearCachedDLConfigs(); DLMetadata meta2 = DLMetadata.create(new BKDLConfig("127.0.0.1:7000", "ledgers") .setFederatedNamespace(true)); meta2.update(uri); BKDLConfig read2 = BKDLConfig.resolveDLConfig(zkc, uri); BKDLConfig.propagateConfiguration(read2, dlConf); assertFalse(dlConf.getCreateStreamIfNotExists()); BKDLConfig.clearCachedDLConfigs(); DLMetadata meta3 = DLMetadata.create(new BKDLConfig("127.0.0.1:7000", "ledgers") .setFederatedNamespace(false)); meta3.update(uri); BKDLConfig read3 = BKDLConfig.resolveDLConfig(zkc, uri); BKDLConfig.propagateConfiguration(read3, dlConf); // if it is non-federated namespace, it won't change the create stream behavior. assertFalse(dlConf.getCreateStreamIfNotExists()); BKDLConfig.clearCachedDLConfigs(); }