Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 4BACF200BC5 for ; Tue, 22 Nov 2016 20:46:37 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 4A4EA160B0C; Tue, 22 Nov 2016 19:46:37 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 4816E160AF1 for ; Tue, 22 Nov 2016 20:46:36 +0100 (CET) Received: (qmail 67131 invoked by uid 500); 22 Nov 2016 19:46:35 -0000 Mailing-List: contact commits-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list commits@hc.apache.org Received: (qmail 67121 invoked by uid 99); 22 Nov 2016 19:46:35 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 22 Nov 2016 19:46:35 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id E74D4C036D for ; Tue, 22 Nov 2016 19:46:34 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -1.199 X-Spam-Level: X-Spam-Status: No, score=-1.199 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RP_MATCHES_RCVD=-2.999] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id dEXwEKDH-anU for ; Tue, 22 Nov 2016 19:46:33 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTP id 6BDDC5F36D for ; Tue, 22 Nov 2016 19:46:32 +0000 (UTC) Received: from svn01-us-west.apache.org (svn.apache.org [10.41.0.6]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 3764BE028F for ; Tue, 22 Nov 2016 19:46:30 +0000 (UTC) Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id E17F73A0248 for ; Tue, 22 Nov 2016 19:46:29 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1770878 - in /httpcomponents/httpcore/branches/4.4.x/httpcore/src: main/java/org/apache/http/pool/ test/java/org/apache/http/pool/ Date: Tue, 22 Nov 2016 19:46:29 -0000 To: commits@hc.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20161122194629.E17F73A0248@svn01-us-west.apache.org> archived-at: Tue, 22 Nov 2016 19:46:37 -0000 Author: olegk Date: Tue Nov 22 19:46:29 2016 New Revision: 1770878 URL: http://svn.apache.org/viewvc?rev=1770878&view=rev Log: HTTPCORE-433: redesign of connection request future used by blocking AbstractConnPool Removed: httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/PoolEntryFuture.java Modified: httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/RouteSpecificPool.java httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/pool/TestRouteSpecificPool.java Modified: httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java?rev=1770878&r1=1770877&r2=1770878&view=diff ============================================================================== --- httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java (original) +++ httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java Tue Nov 22 19:46:29 2016 @@ -34,14 +34,16 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import org.apache.http.annotation.ThreadingBehavior; import org.apache.http.annotation.Contract; +import org.apache.http.annotation.ThreadingBehavior; import org.apache.http.concurrent.FutureCallback; import org.apache.http.util.Args; import org.apache.http.util.Asserts; @@ -66,11 +68,12 @@ public abstract class AbstractConnPool, ConnPoolControl { private final Lock lock; + private final Condition condition; private final ConnFactory connFactory; private final Map> routeToPool; private final Set leased; private final LinkedList available; - private final LinkedList> pending; + private final LinkedList> pending; private final Map maxPerRoute; private volatile boolean isShutDown; @@ -87,10 +90,11 @@ public abstract class AbstractConnPool>(); this.leased = new HashSet(); this.available = new LinkedList(); - this.pending = new LinkedList>(); + this.pending = new LinkedList>(); this.maxPerRoute = new HashMap(); } @@ -183,16 +187,77 @@ public abstract class AbstractConnPool lease(final T route, final Object state, final FutureCallback callback) { Args.notNull(route, "Route"); Asserts.check(!this.isShutDown, "Connection pool shut down"); - return new PoolEntryFuture(this.lock, callback) { + + return new Future() { + + private volatile boolean cancelled; + private volatile boolean done; + private volatile E entry; + + @Override + public boolean cancel(final boolean mayInterruptIfRunning) { + cancelled = true; + lock.lock(); + try { + condition.signalAll(); + } finally { + lock.unlock(); + } + synchronized (this) { + final boolean result = !done; + done = true; + if (callback != null) { + callback.cancelled(); + } + return result; + } + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public boolean isDone() { + return done; + } @Override - public E getPoolEntry( - final long timeout, - final TimeUnit tunit) - throws InterruptedException, TimeoutException, IOException { - final E entry = getPoolEntryBlocking(route, state, timeout, tunit, this); - onLease(entry); - return entry; + public E get() throws InterruptedException, ExecutionException { + try { + return get(0L, TimeUnit.MILLISECONDS); + } catch (TimeoutException ex) { + throw new ExecutionException(ex); + } + } + + @Override + public E get(final long timeout, final TimeUnit tunit) throws InterruptedException, ExecutionException, TimeoutException { + final E local = entry; + if (local != null) { + return local; + } + synchronized (this) { + try { + if (entry != null) { + return entry; + } + entry = getPoolEntryBlocking(route, state, timeout, tunit, this); + done = true; + onLease(entry); + if (callback != null) { + callback.completed(entry); + } + return entry; + } catch (IOException ex) { + done = true; + if (callback != null) { + callback.failed(ex); + } + throw new ExecutionException(ex); + } + } } }; @@ -221,8 +286,7 @@ public abstract class AbstractConnPool future) - throws IOException, InterruptedException, TimeoutException { + final Future future) throws IOException, InterruptedException, TimeoutException { Date deadline = null; if (timeout > 0) { @@ -302,9 +366,20 @@ public abstract class AbstractConnPool future = pool.nextPending(); + Future future = pool.nextPending(); if (future != null) { this.pending.remove(future); } else { future = this.pending.poll(); } if (future != null) { - future.wakeup(); + this.condition.signalAll(); } } } finally { Modified: httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/RouteSpecificPool.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/RouteSpecificPool.java?rev=1770878&r1=1770877&r2=1770878&view=diff ============================================================================== --- httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/RouteSpecificPool.java (original) +++ httpcomponents/httpcore/branches/4.4.x/httpcore/src/main/java/org/apache/http/pool/RouteSpecificPool.java Tue Nov 22 19:46:29 2016 @@ -30,6 +30,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.Set; +import java.util.concurrent.Future; import org.apache.http.util.Args; import org.apache.http.util.Asserts; @@ -39,14 +40,14 @@ abstract class RouteSpecificPool leased; private final LinkedList available; - private final LinkedList> pending; + private final LinkedList> pending; RouteSpecificPool(final T route) { super(); this.route = route; this.leased = new HashSet(); this.available = new LinkedList(); - this.pending = new LinkedList>(); + this.pending = new LinkedList>(); } protected abstract E createEntry(C conn); @@ -130,18 +131,18 @@ abstract class RouteSpecificPool future) { + public void queue(final Future future) { if (future == null) { return; } this.pending.add(future); } - public PoolEntryFuture nextPending() { + public Future nextPending() { return this.pending.poll(); } - public void unqueue(final PoolEntryFuture future) { + public void unqueue(final Future future) { if (future == null) { return; } @@ -150,7 +151,7 @@ abstract class RouteSpecificPool future: this.pending) { + for (final Future future: this.pending) { future.cancel(true); } this.pending.clear(); Modified: httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/pool/TestRouteSpecificPool.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/pool/TestRouteSpecificPool.java?rev=1770878&r1=1770877&r2=1770878&view=diff ============================================================================== --- httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/pool/TestRouteSpecificPool.java (original) +++ httpcomponents/httpcore/branches/4.4.x/httpcore/src/test/java/org/apache/http/pool/TestRouteSpecificPool.java Tue Nov 22 19:46:29 2016 @@ -27,6 +27,7 @@ package org.apache.http.pool; import java.io.IOException; +import java.util.concurrent.Future; import org.apache.http.HttpConnection; import org.junit.Assert; @@ -278,9 +279,9 @@ public class TestRouteSpecificPool { public void testWaitingThreadQueuing() throws Exception { final LocalRoutePool pool = new LocalRoutePool(); @SuppressWarnings("unchecked") - final PoolEntryFuture future1 = Mockito.mock(PoolEntryFuture.class); + final Future future1 = Mockito.mock(Future.class); @SuppressWarnings("unchecked") - final PoolEntryFuture future2 = Mockito.mock(PoolEntryFuture.class); + final Future future2 = Mockito.mock(Future.class); Assert.assertEquals(0, pool.getPendingCount()); pool.queue(future1); @@ -308,7 +309,7 @@ public class TestRouteSpecificPool { final LocalPoolEntry entry2 = pool.add(conn2); @SuppressWarnings("unchecked") - final PoolEntryFuture future1 = Mockito.mock(PoolEntryFuture.class); + final Future future1 = Mockito.mock(Future.class); pool.queue(future1); Assert.assertNotNull(entry1);