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

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


The following commit(s) were added to refs/heads/master by this push:
     new 66cffbc  Document transport pool unreserved queue (#1548)
66cffbc is described below

commit 66cffbc33aeffb654c6a655cafe58b347b81251d
Author: Keith Turner <ktur...@apache.org>
AuthorDate: Fri Mar 13 16:53:58 2020 -0400

    Document transport pool unreserved queue (#1548)
---
 .../core/clientImpl/ThriftTransportPool.java        | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportPool.java
 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportPool.java
index 98f7170..2116010 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportPool.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportPool.java
@@ -59,11 +59,28 @@ public class ThriftTransportPool {
   private long killTime = 1000 * 3;
 
   private static class CachedConnections {
+    /*
+     * Items are added and removed from this queue in such a way that the 
queue is ordered from most
+     * recently used to least recently used. The first position being the most 
recently used and the
+     * last position being the least recently used. This is done in the 
following way.
+     *
+     * - Newly unreserved connections are be added using addFirst(). When a 
connection is added, its
+     * lastReturnTime is set.
+     *
+     * - When an unreserved connection is needed, its taken off using 
pollFirst().
+     *
+     * - Unreserved connections that haven been idle too long are removed 
using removeLast()
+     *
+     * The purpose of maintaining this ordering it to allow efficient removal 
of idle connection.
+     * The efficiency comes from avoiding a linear search for idle connection. 
Since this search is
+     * done by a background thread holding a lock, thats good for any thread 
attempting to reserve a
+     * connection.
+     */
     Deque<CachedConnection> unreserved = new ArrayDeque<>(); // stack - LIFO
     Map<CachedTTransport,CachedConnection> reserved = new HashMap<>();
 
     public CachedConnection reserveAny() {
-      CachedConnection cachedConnection = unreserved.poll(); // safe pop
+      CachedConnection cachedConnection = unreserved.pollFirst(); // safe pop
       if (cachedConnection != null) {
         cachedConnection.reserve();
         reserved.put(cachedConnection.transport, cachedConnection);
@@ -324,7 +341,7 @@ public class ThriftTransportPool {
       // set size that the idle times at the end of the list grow. The 
connections with
       // large idle times will be cleaned up. Using a FIFO could continually 
reset the idle
       // times of all connections, even when there are more than the working 
set size.
-      connections.unreserved.push(connection);
+      connections.unreserved.addFirst(connection);
     }
 
     List<CachedConnection> removeExpiredConnections(final long killTime) {

Reply via email to