Description
When we create a new PhoenixConnection, we update connectionQueues in CQSI:
@Override public void addConnection(PhoenixConnection connection) throws SQLException { connectionQueues.get(getQueueIndex(connection)).add(new WeakReference<PhoenixConnection>(connection)); if (returnSequenceValues) { synchronized (connectionCountLock) { connectionCount++; } } }
We use connectionQueues to determine what needs lease renewal done.
However, when the user closes a connection, this datastructure is never cleaned up.
@Override public void removeConnection(PhoenixConnection connection) throws SQLException { if (returnSequenceValues) { ConcurrentMap<SequenceKey,Sequence> formerSequenceMap = null; synchronized (connectionCountLock) { if (--connectionCount <= 0) { if (!this.sequenceMap.isEmpty()) { formerSequenceMap = this.sequenceMap; this.sequenceMap = Maps.newConcurrentMap(); } } if (connectionCount < 0) { connectionCount = 0; } } // Since we're using the former sequenceMap, we can do this outside // the lock. if (formerSequenceMap != null) { // When there are no more connections, attempt to return any sequences returnAllSequences(formerSequenceMap); } } else if (shouldThrottleNumConnections){ //still need to decrement connection count synchronized (connectionCountLock) { if (connectionCount > 0) { --connectionCount; } } } }
Running a test now, but seems to be the case on master.