class ZookeeperClient implements Watcher {

    void createAll(List<String> paths, CreateMode createMode)
        throws ZookeeperClientFailedException, InterruptedException {
        if (paths.isEmpty())
            return;

        List<List<Op>> batches = new LinkedList<>();

        int batchSize = 0;

        List<Op> batch = new LinkedList<>();

        for (String path : paths) {
            //TODO ZK: https://issues.apache.org/jira/browse/IGNITE-8187
            int size = requestOverhead(path) + 48 /* overhead */;

            assert size <= MAX_REQ_SIZE;

            if (batchSize + size > MAX_REQ_SIZE) {
                batches.add(batch);

                batch = new LinkedList<>();

                batchSize = 0;
            }

            batch.add(Op.create(path, EMPTY_BYTES, ZK_ACL, createMode));

            batchSize += size;
        }

        batches.add(batch);

        for (List<Op> ops : batches) {
            for (;;) {
                long connStartTime = this.connStartTime;

                try {
                    zk.multi(ops);

                    break;
                }
                catch (KeeperException.NodeExistsException e) {
                    if (log.isDebugEnabled())
                        log.debug("Failed to create nodes using bulk operation: " + e);

                    for (Op op : ops)
                        createIfNeeded(op.getPath(), null, createMode);

                    break;
                }
                catch (Exception e) {
                    onZookeeperError(connStartTime, e);
                }
            }
        }
    }

      ZookeeperClient(IgniteLogger log, String connectString, int sesTimeout, IgniteRunnable connLostC);
      ZookeeperClient(String igniteInstanceName,
        IgniteLogger log,
        String connectString,
        int sesTimeout,
        IgniteRunnable connLostC);

}