zookeeper-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From h...@apache.org
Subject zookeeper git commit: This PR adds support for TTL nodes to the CLI
Date Thu, 23 Mar 2017 17:46:45 GMT
Repository: zookeeper
Updated Branches:
  refs/heads/master fb7ddacfc -> 54c7f6b47


This PR adds support for TTL nodes to the CLI

Author: randgalt <jordan@jordanzimmerman.com>

Reviewers: Michael Han <hanm@apache.org>, Camille Fournier <camille@apache.org>

Closes #193 from Randgalt/ZOOKEEPER-2608 and squashes the following commits:

bd57197 [randgalt] fixed spacing nits
f241102 [randgalt] Merge branch 'master' into ZOOKEEPER-2608
72fdda9 [randgalt] Added ttl option to CLI create command
02fd557 [randgalt] Removed bogus import
9cb973c [randgalt] This patch takes advantage of 3.5's container support. Most of the work
needed to support TTLs is there already. In order not to break on-disk and protocol compatibility
the ephemeralOwner is yet-again overloaded to have special meaning. New opcodes and transaction
records had to be added in a similar manner to Containers


Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/54c7f6b4
Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/54c7f6b4
Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/54c7f6b4

Branch: refs/heads/master
Commit: 54c7f6b472ed7bb10fd86cb3c28262fa4f7351d9
Parents: fb7ddac
Author: randgalt <jordan@jordanzimmerman.com>
Authored: Thu Mar 23 10:46:42 2017 -0700
Committer: Michael Han <hanm@apache.org>
Committed: Thu Mar 23 10:46:42 2017 -0700

----------------------------------------------------------------------
 .../org/apache/zookeeper/cli/CreateCommand.java | 37 +++++++++++++++++---
 1 file changed, 32 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/54c7f6b4/src/java/main/org/apache/zookeeper/cli/CreateCommand.java
----------------------------------------------------------------------
diff --git a/src/java/main/org/apache/zookeeper/cli/CreateCommand.java b/src/java/main/org/apache/zookeeper/cli/CreateCommand.java
index 2c37784..ee6f58a 100644
--- a/src/java/main/org/apache/zookeeper/cli/CreateCommand.java
+++ b/src/java/main/org/apache/zookeeper/cli/CreateCommand.java
@@ -23,6 +23,8 @@ import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
+import org.apache.zookeeper.data.Stat;
+import org.apache.zookeeper.server.EphemeralType;
 
 /**
  * create command for cli
@@ -33,14 +35,15 @@ public class CreateCommand extends CliCommand {
     private String[] args;
     private CommandLine cl;
 
-    {
+    static {
         options.addOption(new Option("e", false, "ephemeral"));
         options.addOption(new Option("s", false, "sequential"));
         options.addOption(new Option("c", false, "container"));
+        options.addOption(new Option("t", true, "ttl"));
     }
 
     public CreateCommand() {
-        super("create", "[-s] [-e] [-c] path [data] [acl]");
+        super("create", "[-s] [-e] [-c] [-t ttl] path [data] [acl]");
     }
 
 
@@ -62,23 +65,47 @@ public class CreateCommand extends CliCommand {
 
     @Override
     public boolean exec() throws CliException {
-        CreateMode flags = CreateMode.PERSISTENT;
         boolean hasE = cl.hasOption("e");
         boolean hasS = cl.hasOption("s");
         boolean hasC = cl.hasOption("c");
+        boolean hasT = cl.hasOption("t");
         if (hasC && (hasE || hasS)) {
             throw new MalformedCommandException("-c cannot be combined with -s or -e. Containers
cannot be ephemeral or sequential.");
         }
+        long ttl;
+        try {
+            ttl = hasT ? Long.parseLong(cl.getOptionValue("t")) : 0;
+        } catch (NumberFormatException e) {
+            throw new MalformedCommandException("-t argument must be a long value");
+        }
 
+        if (hasT && hasE) {
+            throw new MalformedCommandException("TTLs cannot be used with Ephemeral znodes");
+        }
+        if (hasT && hasC) {
+            throw new MalformedCommandException("TTLs cannot be used with Container znodes");
+        }
+
+        CreateMode flags;
         if(hasE && hasS) {
             flags = CreateMode.EPHEMERAL_SEQUENTIAL;
         } else if (hasE) {
             flags = CreateMode.EPHEMERAL;
         } else if (hasS) {
-            flags = CreateMode.PERSISTENT_SEQUENTIAL;
+            flags = hasT ? CreateMode.PERSISTENT_SEQUENTIAL_WITH_TTL : CreateMode.PERSISTENT_SEQUENTIAL;
         } else if (hasC) {
             flags = CreateMode.CONTAINER;
+        } else {
+            flags = hasT ? CreateMode.PERSISTENT_WITH_TTL : CreateMode.PERSISTENT;
+        }
+        if (hasT) {
+            try {
+                EphemeralType.ttlToEphemeralOwner(ttl);
+            } catch (IllegalArgumentException e) {
+                throw new MalformedCommandException(e.getMessage());
+            }
         }
+
         String path = args[1];
         byte[] data = null;
         if (args.length > 2) {
@@ -89,7 +116,7 @@ public class CreateCommand extends CliCommand {
             acl = AclParser.parse(args[3]);
         }
         try {
-            String newPath = zk.create(path, data, acl, flags);
+            String newPath = hasT ? zk.create(path, data, acl, flags, new Stat(), ttl) :
zk.create(path, data, acl, flags);
             err.println("Created " + newPath);
         } catch(KeeperException.EphemeralOnLocalSessionException e) {
             err.println("Unable to create ephemeral node on a local session");


Mime
View raw message