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. } }
