diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/cli/SyncCommand.java b/zookeeper-server/src/main/java/org/apache/zookeeper/cli/SyncCommand.java index c0be18d7379..f82ff8434c3 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/cli/SyncCommand.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/cli/SyncCommand.java @@ -16,6 +16,11 @@ */ package org.apache.zookeeper.cli; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; @@ -30,6 +35,7 @@ public class SyncCommand extends CliCommand { private static Options options = new Options(); private String[] args; + public static final long SYNC_TIMEOUT = TimeUnit.SECONDS.toMillis(30L); public SyncCommand() { super("sync", "path"); @@ -55,18 +61,30 @@ public CliCommand parse(String[] cmdArgs) throws CliParseException { @Override public boolean exec() throws CliException { String path = args[1]; + CompletableFuture cf = new CompletableFuture<>(); + try { zk.sync(path, new AsyncCallback.VoidCallback() { - public void processResult(int rc, String path, Object ctx) { - out.println("Sync returned " + rc); + cf.complete(rc); } }, null); + + int resultCode = cf.get(SYNC_TIMEOUT, TimeUnit.MILLISECONDS); + if(resultCode == 0) { + out.println("Sync is OK"); + } else { + out.println("Sync has failed. rc=" + resultCode); + } } catch (IllegalArgumentException ex) { throw new MalformedPathException(ex.getMessage()); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw new CliWrapperException(ie); + } catch (TimeoutException | ExecutionException ex) { + throw new CliWrapperException(ex); } - return false; } } diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/ZooKeeperTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/ZooKeeperTest.java index 9c67374de93..00c4125e722 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/ZooKeeperTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/ZooKeeperTest.java @@ -619,4 +619,15 @@ public void testClientReconnectWithZKClientConfig() throws Exception { } } + @Test + public void testSyncCommand() throws Exception { + final ZooKeeper zk = createClient(); + SyncCommand cmd = new SyncCommand(); + cmd.setZk(zk); + cmd.parse("sync /".split(" ")); + List expected = new ArrayList(); + expected.add("Sync is OK"); + + runCommandExpect(cmd, expected); + } }