code: private Future<?> validateBuildString(final String buildString, ZooKeeper zk) {
          final SettableFuture<Object> retval = SettableFuture.create();
          byte buildStringBytes[] = null;
          try {
              buildStringBytes = buildString.getBytes("UTF-8");
          } catch (UnsupportedEncodingException e) {
              throw new AssertionError(e);
          }
          final byte buildStringBytesFinal[] = buildStringBytes;
  
          //Can use a void callback because ZK will execute the create and then the get in order
          //It's a race so it doesn't have to succeed
          zk.create(
                  VoltZK.buildstring,
                  buildStringBytes,
                  Ids.OPEN_ACL_UNSAFE,
                  CreateMode.PERSISTENT,
                  new ZKUtil.StringCallback(),
                  null);
  
          zk.getData(VoltZK.buildstring, false, new org.apache.zookeeper_voltpatches.AsyncCallback.DataCallback() {
  
              @Override
              public void processResult(int rc, String path, Object ctx,
                      byte[] data, Stat stat) {
                  KeeperException.Code code = KeeperException.Code.get(rc);
                  if (code == KeeperException.Code.OK) {
                      if (Arrays.equals(buildStringBytesFinal, data)) {
                          retval.set(null);
                      } else {
                          try {
                              hostLog.info("Different but compatible software versions on the cluster " +
                                           "and the rejoining node. Cluster version is {" + (new String(data, "UTF-8")).split("_")[0] +
                                           "}. Rejoining node version is {" + m_defaultVersionString + "}.");
                              retval.set(null);
                          } catch (UnsupportedEncodingException e) {
                              retval.setException(new AssertionError(e));
                          }
                      }
                  } else {
                      retval.setException(KeeperException.create(code));
                  }
              }
  
          }, null);
  
          return retval;
      }
docs: /*
  Validate the build string with the rest of the cluster
  by racing to publish it to ZK and then comparing the one this process
  has to the one in ZK. They should all match. The method returns a future
  so that init can continue while the ZK call is pending since it ZK is pretty
  slow.