Update RAMCloud start-up procedure

This patch will enable RAMCloud coordinator failover and
server failover if number of replica is properly configured.

- Update onos.sh RAMCloud start-up procedure
  - Use ZooKeeper to manage cluster member
  - Specify cluster name, num replicas,...
  - WARN: ramcloud.coordinator.ip is now a configuration to specify listen address
  - Specify ZooKeeper address/ClusterName in RAMCloud client config (conf/ramcloud.conf)
    - Note: conf/ramcloud.conf ramcloud.coordinatorIp, etc. is no longer used for connection
  - Enable failure detector, which is required for fail-over feature
- Undocumented maintenance option "deldb" to remove:
  - RAMCloud coordination info in ZK
    - Note: ZooKeeper must be running in order to execute "./onos.sh rc-c deldb"
  - BackupData file created by RAMCloud Storage Server
- Update RAMCloud Java bindings
  - Expose API to specify RAMCloud ClusterName
  - Expose ClientExeption
  - Note: You need to run ./build-ramcloud-java-bindings.sh to update Java bindings
- Utility function to check if ZooKeeper is running
- Utility function to wait for ZooKeeper to start
- Modified kill-processes() to try killing process gracefully first then KILL
- Specify absolute path to pgrep/pkill
- Added "rc" to manipulate both server and coordinator

Change-Id: Ia8a282f81bf82810a4d000883611ce12f504bd16
diff --git a/src/main/java/edu/stanford/ramcloud/JRamCloud.java b/src/main/java/edu/stanford/ramcloud/JRamCloud.java
index 2bfd145..d7a1f63 100644
--- a/src/main/java/edu/stanford/ramcloud/JRamCloud.java
+++ b/src/main/java/edu/stanford/ramcloud/JRamCloud.java
@@ -278,9 +278,15 @@
      * underlying RamCloud C++ object.
      */
     public
+    JRamCloud(String coordinatorLocator, String clusterName)
+    {
+        ramcloudObjectPointer = connect(coordinatorLocator, clusterName);
+    }
+
+    public
     JRamCloud(String coordinatorLocator)
     {
-        ramcloudObjectPointer = connect(coordinatorLocator);
+        this(coordinatorLocator, "main");
     }
 
     /**
@@ -389,7 +395,7 @@
         return write(tableId, key.getBytes(StandardCharsets.UTF_8), value, rules);
     }
 
-    private static native long connect(String coordinatorLocator);
+    private static native long connect(String coordinatorLocator, String clusterName);
     private static native void disconnect(long ramcloudObjectPointer);
 
     public native long createTable(String name);
@@ -453,6 +459,13 @@
         }
     }
 
+    // TODO Define and support some of ClientException sub-classes.
+    public static class ClientException extends Exception {
+        public ClientException(String message) {
+            super(message);
+        }
+    }
+
     public static void tableEnumeratorTest(JRamCloud ramcloud) {
         long startTime = 0;
         for (int x = 0 ; x < 2 ; x ++){
diff --git a/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCClient.java b/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCClient.java
index c651e5f..a2d23a5 100644
--- a/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCClient.java
+++ b/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCClient.java
@@ -38,8 +38,12 @@
 import edu.stanford.ramcloud.JRamCloud.TableEnumerator2;
 
 public class RCClient implements IKVClient {
+
     private static final Logger log = LoggerFactory.getLogger(RCClient.class);
 
+    private static final String DEFAULT_LOCATOR = "zk:localhost:2181";
+    private static final String DEFAULT_CLUSTERNAME = "ONOS-RC";
+
     private static final String DB_CONFIG_FILE = "conf/ramcloud.conf";
     public static final Configuration CONFIG = getConfiguration();
 
@@ -74,7 +78,7 @@
     private static final ThreadLocal<JRamCloud> TLS_RC_CLIENT = new ThreadLocal<JRamCloud>() {
         @Override
         protected JRamCloud initialValue() {
-            return new JRamCloud(getCoordinatorUrl(CONFIG));
+            return new JRamCloud(getLocator(CONFIG), getClusterName(CONFIG));
         }
     };
 
@@ -116,13 +120,37 @@
         }
     }
 
-    public static String getCoordinatorUrl(final Configuration configuration) {
-        final String coordinatorIp = configuration.getString("ramcloud.coordinatorIp", "fast+udp:host=127.0.0.1");
-        final String coordinatorPort = configuration.getString("ramcloud.coordinatorPort", "port=12246");
+    public static String getLocator(final Configuration configuration) {
+
+        final String locator = configuration.getString("ramcloud.locator");
+        if (locator != null) {
+            return locator;
+        }
+
+        // TODO Stop reading obsolete coordinatorIp, etc. once we're ready.
+        final String coordinatorIp = configuration.getString("ramcloud.coordinatorIp");
+        if (coordinatorIp == null) {
+            return DEFAULT_LOCATOR;
+        }
+
+        final String coordinatorPort = configuration.getString("ramcloud.coordinatorPort");
+        if (coordinatorPort == null) {
+            return DEFAULT_LOCATOR;
+        }
+
         final String coordinatorURL = coordinatorIp + "," + coordinatorPort;
         return coordinatorURL;
     }
 
+    public static String getClusterName(final Configuration configuration) {
+        final String clusterName = configuration.getString("ramcloud.clusterName");
+        if (clusterName != null) {
+            return clusterName;
+        }
+
+        return DEFAULT_CLUSTERNAME;
+    }
+
     @Override
     public IMultiEntryOperation createOp(IKVTableID tableId, byte[] key, byte[] value) {
         return RCMultiEntryOperation.create(tableId, key, value);