poorbarcode commented on code in PR #16165:
URL: https://github.com/apache/pulsar/pull/16165#discussion_r931323513


##########
pulsar-client/src/main/java/org/apache/pulsar/client/impl/ClientCnx.java:
##########
@@ -1265,4 +1278,165 @@ private void checkRequestTimeout() {
     }
 
     private static final Logger log = LoggerFactory.getLogger(ClientCnx.class);
+
+    /**
+     * Check client connection is now free. This method may change the state 
to idle.
+     * This method will not change the state to idle.
+     * @return true if the connection is eligible.
+     */
+    public boolean idleCheck(){
+        if (pendingRequests != null && !pendingRequests.isEmpty()){
+            return false;
+        }
+        if (waitingLookupRequests != null  && 
!waitingLookupRequests.isEmpty()){
+            return false;
+        }
+        if (!consumers.isEmpty()){
+            return false;
+        }
+        if (!producers.isEmpty()){
+            return false;
+        }
+        if (!transactionMetaStoreHandlers.isEmpty()){
+            return false;
+        }
+        return true;
+    }
+    /**
+     * Get idle-stat.
+     * @return connection idle-stat
+     */
+    public IdleState getIdleStat(){
+        return STATE_UPDATER.get(this);
+    }
+    /**
+     * Compare and switch idle-stat.
+     * @return Whether the update is successful.Because there may be other 
threads competing, possible return false.
+     */
+    public boolean compareAndSetIdleStat(IdleState originalStat, IdleState 
newStat){
+        return STATE_UPDATER.compareAndSet(this, originalStat, newStat);
+    }
+
+    /**
+     * Indicates the usage status of the connection and whether it has been 
released.
+     */
+    public enum IdleState {
+        /** The connection is in use. **/
+        USING,
+        /** The connection is in idle. **/
+        IDLE_MARKED,
+        /** The connection is in idle and will be released soon. **/
+        BEFORE_RELEASE,
+        /** The connection has already been released. **/
+        RELEASED;
+    }
+
+    /**
+     * @return Whether this connection is in use.
+     */
+    public boolean isUsing(){
+        return getIdleStat() == IdleState.USING;
+    }
+
+    /**
+     * @return Whether this connection is in idle.
+     */
+    public boolean isIdle(){
+        return getIdleStat() == IdleState.IDLE_MARKED;
+    }
+
+    /**
+     * @return Whether this connection is in idle and will be released soon.
+     */
+    public boolean isWillBeRelease(){
+        return getIdleStat() == IdleState.BEFORE_RELEASE;
+    }
+
+    /**
+     * @return Whether this connection has already been released.
+     */
+    public boolean alreadyRelease(){
+        return getIdleStat() == IdleState.RELEASED;
+    }
+
+    /**
+     * Try to transform the state of the connection to #{@link 
IdleState#IDLE_MARKED}, state should only be transformed
+     * to #{@link IdleState#IDLE_MARKED} from state  #{@link IdleState#USING}. 
if the state is successfully transformed,
+     * "idleMarkTime" will be  assigned to current time.
+     */
+    public void tryMarkIdle(){
+        if (compareAndSetIdleStat(IdleState.USING, IdleState.IDLE_MARKED)){
+            this.idleMarkTime = System.currentTimeMillis();
+        }
+    }
+
+    /**
+     * Changes the idle-state of the connection to #{@link IdleState#USING} as 
much as possible, This method is used
+     * when connection borrow.
+     * @return Whether change idle-stat to #{@link IdleState#USING} success. 
False is returned only if the connection
+     * has already been released.
+     */
+    public boolean tryMarkReuse(){
+        while (true){

Review Comment:
   When `state change` is in race condition, it may take more than one 
execution to succeed.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to