From 2768eef1dc34f6496eeaa4781308792c00276a35 Mon Sep 17 00:00:00 2001 From: Jay J Wylie Date: Thu, 8 Nov 2012 14:48:38 -0800 Subject: [PATCH] Changed reset and destroyRequestQueue to avoid any heavy weight synchronization methods. This should fix deadlock issue. --- .../utils/pool/QueuedKeyedResourcePool.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/java/voldemort/utils/pool/QueuedKeyedResourcePool.java b/src/java/voldemort/utils/pool/QueuedKeyedResourcePool.java index e545019ce1..9c5cdc7bd2 100644 --- a/src/java/voldemort/utils/pool/QueuedKeyedResourcePool.java +++ b/src/java/voldemort/utils/pool/QueuedKeyedResourcePool.java @@ -243,11 +243,13 @@ protected void destroyRequest(AsyncResourceRequest resourceRequest) { * @param requestQueue The queue for which all resource requests are to be * destroyed. */ - private synchronized void destroyRequestQueue(Queue> requestQueue) { - AsyncResourceRequest resourceRequest = requestQueue.poll(); - while(resourceRequest != null) { - destroyRequest(resourceRequest); - resourceRequest = requestQueue.poll(); + private void destroyRequestQueue(Queue> requestQueue) { + if(requestQueue != null) { + AsyncResourceRequest resourceRequest = requestQueue.poll(); + while(resourceRequest != null) { + destroyRequest(resourceRequest); + resourceRequest = requestQueue.poll(); + } } } @@ -283,9 +285,14 @@ public void close() { @Override public void reset(K key) { // First, destroy enqueued resource requests (if any exist). - Queue> requestQueue = requestQueueMap.get(key); - if(requestQueue != null) { - destroyRequestQueue(requestQueue); + Queue> requestQueueToDestroy = requestQueueMap.get(key); + if(requestQueueToDestroy != null) { + // Swap in a new requestQueue so that the current requestQueue can + // be destroyed without the need of any synchronization primitives + Queue> newRequestQueue = new ConcurrentLinkedQueue>(); + if(requestQueueMap.replace(key, requestQueueToDestroy, newRequestQueue)) { + destroyRequestQueue(requestQueueToDestroy); + } } // Second, destroy resources in the pool.