This is an automated email from the ASF dual-hosted git repository.

jxue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git

commit f41a2c606c715a5da436c47f5063978e893aee68
Author: Marcos Rico Peng <[email protected]>
AuthorDate: Wed Jul 12 13:07:21 2023 -0400

    MetaClient LockClient and Semaphore Creation Edge Cases and Added 
Exception(#2550)
    
    
    Co-authored-by: mapeng <[email protected]>
---
 .../helix/metaclient/api/MetaClientInterface.java  |  6 ++++
 .../exception/MetaClientNodeExistsException.java   | 38 ++++++++++++++++++++++
 .../helix/metaclient/impl/zk/ZkMetaClient.java     |  5 +++
 .../metaclient/impl/zk/util/ZkMetaClientUtil.java  |  4 +++
 .../recipes/lock/DistributedSemaphore.java         |  7 ++--
 .../helix/metaclient/recipes/lock/LockClient.java  |  6 ++--
 6 files changed, 62 insertions(+), 4 deletions(-)

diff --git 
a/meta-client/src/main/java/org/apache/helix/metaclient/api/MetaClientInterface.java
 
b/meta-client/src/main/java/org/apache/helix/metaclient/api/MetaClientInterface.java
index b4bfaac2e..5b26896a9 100644
--- 
a/meta-client/src/main/java/org/apache/helix/metaclient/api/MetaClientInterface.java
+++ 
b/meta-client/src/main/java/org/apache/helix/metaclient/api/MetaClientInterface.java
@@ -429,6 +429,12 @@ public interface MetaClientInterface<T> {
    */
   void disconnect();
 
+  /**
+   * Check whether client is closed
+   * @return true if client is closed, false otherwise
+   */
+   boolean isClosed();
+
   /**
    * @return client current connection state with metadata service.
    */
diff --git 
a/meta-client/src/main/java/org/apache/helix/metaclient/exception/MetaClientNodeExistsException.java
 
b/meta-client/src/main/java/org/apache/helix/metaclient/exception/MetaClientNodeExistsException.java
new file mode 100644
index 000000000..74e6d4f0f
--- /dev/null
+++ 
b/meta-client/src/main/java/org/apache/helix/metaclient/exception/MetaClientNodeExistsException.java
@@ -0,0 +1,38 @@
+package org.apache.helix.metaclient.exception;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+public final class MetaClientNodeExistsException extends MetaClientException {
+  public MetaClientNodeExistsException() {
+    super();
+  }
+
+  public MetaClientNodeExistsException(String message, Throwable cause) {
+    super(message, cause);
+  }
+
+  public MetaClientNodeExistsException(String message) {
+    super(message);
+  }
+
+  public MetaClientNodeExistsException(Throwable cause) {
+    super(cause);
+  }
+}
diff --git 
a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/ZkMetaClient.java
 
b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/ZkMetaClient.java
index fc8998e95..a1b6eb1ad 100644
--- 
a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/ZkMetaClient.java
+++ 
b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/ZkMetaClient.java
@@ -420,6 +420,11 @@ public class ZkMetaClient<T> implements 
MetaClientInterface<T>, AutoCloseable {
     disconnect();
   }
 
+  @Override
+  public boolean isClosed() {
+    return _zkClient.isClosed();
+  }
+
   @Override
   public List<OpResult> transactionOP(Iterable<Op> ops) {
     // Convert list of MetaClient Ops to Zk Ops
diff --git 
a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/util/ZkMetaClientUtil.java
 
b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/util/ZkMetaClientUtil.java
index 6bf0ce74b..dec8711cf 100644
--- 
a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/util/ZkMetaClientUtil.java
+++ 
b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/util/ZkMetaClientUtil.java
@@ -34,11 +34,13 @@ import 
org.apache.helix.metaclient.exception.MetaClientException;
 import org.apache.helix.metaclient.exception.MetaClientInterruptException;
 import org.apache.helix.metaclient.exception.MetaClientNoNodeException;
 import org.apache.helix.metaclient.exception.MetaClientTimeoutException;
+import org.apache.helix.metaclient.exception.MetaClientNodeExistsException;
 import org.apache.helix.zookeeper.zkclient.exception.ZkBadVersionException;
 import org.apache.helix.zookeeper.zkclient.exception.ZkException;
 import org.apache.helix.zookeeper.zkclient.exception.ZkInterruptedException;
 import org.apache.helix.zookeeper.zkclient.exception.ZkNoNodeException;
 import org.apache.helix.zookeeper.zkclient.exception.ZkTimeoutException;
+import org.apache.helix.zookeeper.zkclient.exception.ZkNodeExistsException;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.Op;
@@ -235,6 +237,8 @@ public class ZkMetaClientUtil {
       return new MetaClientTimeoutException(e);
     } else if (e instanceof ZkInterruptedException) {
       return new MetaClientInterruptException(e);
+    } else if (e instanceof ZkNodeExistsException) {
+      return new MetaClientNodeExistsException(e);
     }
     return new MetaClientException(e);
   }
diff --git 
a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/lock/DistributedSemaphore.java
 
b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/lock/DistributedSemaphore.java
index 7b16e78fd..b5660bed9 100644
--- 
a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/lock/DistributedSemaphore.java
+++ 
b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/lock/DistributedSemaphore.java
@@ -26,6 +26,7 @@ import 
org.apache.helix.metaclient.exception.MetaClientException;
 import org.apache.helix.metaclient.factories.MetaClientConfig;
 import org.apache.helix.metaclient.impl.zk.factory.ZkMetaClientConfig;
 import org.apache.helix.metaclient.impl.zk.factory.ZkMetaClientFactory;
+import org.apache.helix.metaclient.impl.zk.util.ZkMetaClientUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,11 +74,13 @@ public class DistributedSemaphore {
     }
     LOG.info("Connecting to existing DistributedSemaphore Client");
     _metaClient = client;
+    if (_metaClient.isClosed()) {
+      throw new IllegalStateException("Client already closed!");
+    }
     try {
       _metaClient.connect();
-      // TODO: Differentiate exception catch between already connected and 
already closed.
     } catch (IllegalStateException e) {
-      // Ignore as it either has already been connected or already been closed.
+      // Already connected.
     }
   }
 
diff --git 
a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/lock/LockClient.java
 
b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/lock/LockClient.java
index 8a9c489e3..480e87c30 100644
--- 
a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/lock/LockClient.java
+++ 
b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/lock/LockClient.java
@@ -64,11 +64,13 @@ public class LockClient implements LockClientInterface, 
AutoCloseable {
       throw new IllegalArgumentException("MetaClient cannot be null.");
     }
     _metaClient = client;
+    if (_metaClient.isClosed()) {
+      throw new IllegalStateException("Client already closed!");
+    }
     try {
-      LOG.info("Connecting to existing MetaClient for LockClient");
       _metaClient.connect();
     } catch (IllegalStateException e) {
-      // Ignore as it either has already been connected or already been closed.
+      // Already connected.
     }
   }
 

Reply via email to