List of usage examples for org.apache.zookeeper ZooKeeper multi
public void multi(Iterable<Op> ops, MultiCallback cb, Object ctx)
From source file:com.twitter.distributedlog.impl.metadata.ZKLogMetadataForWriter.java
License:Apache License
static void createMissingMetadata(final ZooKeeper zk, final String logRootPath, final List<Versioned<byte[]>> metadatas, final List<ACL> acl, final boolean ownAllocator, final boolean createIfNotExists, final Promise<List<Versioned<byte[]>>> promise) { final List<byte[]> pathsToCreate = Lists.newArrayListWithExpectedSize(metadatas.size()); final List<Op> zkOps = Lists.newArrayListWithExpectedSize(metadatas.size()); CreateMode createMode = CreateMode.PERSISTENT; // log root parent path if (pathExists(metadatas.get(MetadataIndex.LOG_ROOT_PARENT))) { pathsToCreate.add(null);/* w ww.j a v a 2s .c om*/ } else { String logRootParentPath = new File(logRootPath).getParent(); pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add(Op.create(logRootParentPath, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } // log root path if (pathExists(metadatas.get(MetadataIndex.LOG_ROOT))) { pathsToCreate.add(null); } else { pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add(Op.create(logRootPath, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } // max id if (pathExists(metadatas.get(MetadataIndex.MAX_TXID))) { pathsToCreate.add(null); } else { byte[] zeroTxnIdData = DLUtils.serializeTransactionId(0L); pathsToCreate.add(zeroTxnIdData); zkOps.add(Op.create(logRootPath + MAX_TXID_PATH, zeroTxnIdData, acl, createMode)); } // version if (pathExists(metadatas.get(MetadataIndex.VERSION))) { pathsToCreate.add(null); } else { byte[] versionData = intToBytes(LAYOUT_VERSION); pathsToCreate.add(versionData); zkOps.add(Op.create(logRootPath + VERSION_PATH, versionData, acl, createMode)); } // lock path if (pathExists(metadatas.get(MetadataIndex.LOCK))) { pathsToCreate.add(null); } else { pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add(Op.create(logRootPath + LOCK_PATH, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } // read lock path if (pathExists(metadatas.get(MetadataIndex.READ_LOCK))) { pathsToCreate.add(null); } else { pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add( Op.create(logRootPath + READ_LOCK_PATH, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } // log segments path if (pathExists(metadatas.get(MetadataIndex.LOGSEGMENTS))) { pathsToCreate.add(null); } else { byte[] logSegmentsData = DLUtils .serializeLogSegmentSequenceNumber(DistributedLogConstants.UNASSIGNED_LOGSEGMENT_SEQNO); pathsToCreate.add(logSegmentsData); zkOps.add(Op.create(logRootPath + LOGSEGMENTS_PATH, logSegmentsData, acl, createMode)); } // allocation path if (ownAllocator) { if (pathExists(metadatas.get(MetadataIndex.ALLOCATION))) { pathsToCreate.add(null); } else { pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add(Op.create(logRootPath + ALLOCATION_PATH, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } } if (zkOps.isEmpty()) { // nothing missed promise.setValue(metadatas); return; } if (!createIfNotExists) { promise.setException(new LogNotFoundException("Log " + logRootPath + " not found")); return; } zk.multi(zkOps, new AsyncCallback.MultiCallback() { @Override public void processResult(int rc, String path, Object ctx, List<OpResult> resultList) { if (KeeperException.Code.OK.intValue() == rc) { List<Versioned<byte[]>> finalMetadatas = Lists.newArrayListWithExpectedSize(metadatas.size()); for (int i = 0; i < pathsToCreate.size(); i++) { byte[] dataCreated = pathsToCreate.get(i); if (null == dataCreated) { finalMetadatas.add(metadatas.get(i)); } else { finalMetadatas.add(new Versioned<byte[]>(dataCreated, new ZkVersion(0))); } } promise.setValue(finalMetadatas); } else if (KeeperException.Code.NODEEXISTS.intValue() == rc) { promise.setException(new LogExistsException("Someone just created log " + logRootPath)); } else { if (LOG.isDebugEnabled()) { StringBuilder builder = new StringBuilder(); for (OpResult result : resultList) { if (result instanceof OpResult.ErrorResult) { OpResult.ErrorResult errorResult = (OpResult.ErrorResult) result; builder.append(errorResult.getErr()).append(","); } else { builder.append(0).append(","); } } String resultCodeList = builder.substring(0, builder.length() - 1); LOG.debug("Failed to create log, full rc list = {}", resultCodeList); } promise.setException( new ZKException("Failed to create log " + logRootPath, KeeperException.Code.get(rc))); } } }, null); }
From source file:org.apache.bookkeeper.zookeeper.BkZooKeeperClient.java
License:Apache License
@Override public void multi(final Iterable<Op> ops, final MultiCallback cb, final Object context) { final Runnable proc = new ZkRetryRunnable(operationRetryPolicy, rateLimiter, createStats) { final MultiCallback multiCb = new MultiCallback() { @Override/*from ww w . ja v a2 s . co m*/ public void processResult(int rc, String path, Object ctx, List<OpResult> results) { BkZooWorker worker = (BkZooWorker) ctx; if (allowRetry(worker, rc)) { backOffAndRetry(that, worker.nextRetryWaitTime()); } else { cb.processResult(rc, path, context, results); } } }; @Override void zkRun() { ZooKeeper zkHandle = zk.get(); if (null == zkHandle) { BkZooKeeperClient.super.multi(ops, multiCb, worker); } else { zkHandle.multi(ops, multiCb, worker); } } @Override public String toString() { return "multi"; } }; // execute it immediately proc.run(); }
From source file:org.apache.bookkeeper.zookeeper.ZooKeeperClient.java
License:Apache License
@Override public void multi(final Iterable<Op> ops, final MultiCallback cb, final Object context) { final Runnable proc = new ZkRetryRunnable(operationRetryPolicy, rateLimiter, createStats) { final MultiCallback multiCb = new MultiCallback() { @Override/*from w w w . ja va2 s. c o m*/ public void processResult(int rc, String path, Object ctx, List<OpResult> results) { ZooWorker worker = (ZooWorker) ctx; if (allowRetry(worker, rc)) { backOffAndRetry(that, worker.nextRetryWaitTime()); } else { cb.processResult(rc, path, context, results); } } }; @Override void zkRun() { ZooKeeper zkHandle = zk.get(); if (null == zkHandle) { ZooKeeperClient.super.multi(ops, multiCb, worker); } else { zkHandle.multi(ops, multiCb, worker); } } @Override public String toString() { return "multi"; } }; // execute it immediately proc.run(); }
From source file:org.apache.distributedlog.impl.metadata.ZKLogStreamMetadataStore.java
License:Apache License
static void createMissingMetadata(final ZooKeeper zk, final String logRootPath, final List<Versioned<byte[]>> metadatas, final List<ACL> acl, final boolean ownAllocator, final boolean createIfNotExists, final CompletableFuture<List<Versioned<byte[]>>> promise) { final List<byte[]> pathsToCreate = Lists.newArrayListWithExpectedSize(metadatas.size()); final List<Op> zkOps = Lists.newArrayListWithExpectedSize(metadatas.size()); CreateMode createMode = CreateMode.PERSISTENT; // log root parent path if (pathExists(metadatas.get(MetadataIndex.LOG_ROOT_PARENT))) { pathsToCreate.add(null);//from w w w. j av a 2 s. c om } else { String logRootParentPath = Utils.getParent(logRootPath); pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add(Op.create(logRootParentPath, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } // log root path if (pathExists(metadatas.get(MetadataIndex.LOG_ROOT))) { pathsToCreate.add(null); } else { pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add(Op.create(logRootPath, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } // max id if (pathExists(metadatas.get(MetadataIndex.MAX_TXID))) { pathsToCreate.add(null); } else { byte[] zeroTxnIdData = DLUtils.serializeTransactionId(0L); pathsToCreate.add(zeroTxnIdData); zkOps.add(Op.create(logRootPath + MAX_TXID_PATH, zeroTxnIdData, acl, createMode)); } // version if (pathExists(metadatas.get(MetadataIndex.VERSION))) { pathsToCreate.add(null); } else { byte[] versionData = intToBytes(LAYOUT_VERSION); pathsToCreate.add(versionData); zkOps.add(Op.create(logRootPath + VERSION_PATH, versionData, acl, createMode)); } // lock path if (pathExists(metadatas.get(MetadataIndex.LOCK))) { pathsToCreate.add(null); } else { pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add(Op.create(logRootPath + LOCK_PATH, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } // read lock path if (pathExists(metadatas.get(MetadataIndex.READ_LOCK))) { pathsToCreate.add(null); } else { pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add( Op.create(logRootPath + READ_LOCK_PATH, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } // log segments path if (pathExists(metadatas.get(MetadataIndex.LOGSEGMENTS))) { pathsToCreate.add(null); } else { byte[] logSegmentsData = DLUtils .serializeLogSegmentSequenceNumber(DistributedLogConstants.UNASSIGNED_LOGSEGMENT_SEQNO); pathsToCreate.add(logSegmentsData); zkOps.add(Op.create(logRootPath + LOGSEGMENTS_PATH, logSegmentsData, acl, createMode)); } // allocation path if (ownAllocator) { if (pathExists(metadatas.get(MetadataIndex.ALLOCATION))) { pathsToCreate.add(null); } else { pathsToCreate.add(DistributedLogConstants.EMPTY_BYTES); zkOps.add(Op.create(logRootPath + ALLOCATION_PATH, DistributedLogConstants.EMPTY_BYTES, acl, createMode)); } } if (zkOps.isEmpty()) { // nothing missed promise.complete(metadatas); return; } if (!createIfNotExists) { promise.completeExceptionally(new LogNotFoundException("Log " + logRootPath + " not found")); return; } zk.multi(zkOps, new AsyncCallback.MultiCallback() { @Override public void processResult(int rc, String path, Object ctx, List<OpResult> resultList) { if (KeeperException.Code.OK.intValue() == rc) { List<Versioned<byte[]>> finalMetadatas = Lists.newArrayListWithExpectedSize(metadatas.size()); for (int i = 0; i < pathsToCreate.size(); i++) { byte[] dataCreated = pathsToCreate.get(i); if (null == dataCreated) { finalMetadatas.add(metadatas.get(i)); } else { finalMetadatas.add(new Versioned<byte[]>(dataCreated, new LongVersion(0))); } } promise.complete(finalMetadatas); } else if (KeeperException.Code.NODEEXISTS.intValue() == rc) { promise.completeExceptionally( new LogExistsException("Someone just created log " + logRootPath)); } else { if (LOG.isDebugEnabled()) { StringBuilder builder = new StringBuilder(); for (OpResult result : resultList) { if (result instanceof OpResult.ErrorResult) { OpResult.ErrorResult errorResult = (OpResult.ErrorResult) result; builder.append(errorResult.getErr()).append(","); } else { builder.append(0).append(","); } } String resultCodeList = builder.substring(0, builder.length() - 1); LOG.debug("Failed to create log, full rc list = {}", resultCodeList); } promise.completeExceptionally( new ZKException("Failed to create log " + logRootPath, KeeperException.Code.get(rc))); } } }, null); }