Skip to content

Commit 447c519

Browse files
committed
Make PoolEntry depend on Clock instead of Supplier<Long>.
1 parent 0af878f commit 447c519

5 files changed

Lines changed: 47 additions & 21 deletions

File tree

httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ private PoolEntry<T, C> createPoolEntry() {
431431
prev = allocated.get();
432432
next = (prev < poolMax) ? prev + 1 : prev;
433433
} while (!allocated.compareAndSet(prev, next));
434-
return prev < next ? new PoolEntry<>(route, timeToLive, disposalCallback, clock::millis) : null;
434+
return prev < next ? new PoolEntry<>(route, timeToLive, disposalCallback, clock) : null;
435435
}
436436

437437
private void deallocatePoolEntry() {

httpcore5/src/main/java/org/apache/hc/core5/pool/PoolEntry.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
*/
2727
package org.apache.hc.core5.pool;
2828

29+
import java.time.Clock;
2930
import java.util.concurrent.atomic.AtomicReference;
3031

31-
import org.apache.hc.core5.function.Supplier;
3232
import org.apache.hc.core5.io.CloseMode;
3333
import org.apache.hc.core5.io.ModalCloseable;
3434
import org.apache.hc.core5.util.Args;
@@ -53,7 +53,7 @@ public final class PoolEntry<T, C extends ModalCloseable> {
5353
private final TimeValue timeToLive;
5454
private final AtomicReference<C> connRef;
5555
private final DisposalCallback<C> disposalCallback;
56-
private final Supplier<Long> currentTimeSupplier;
56+
private final Clock clock;
5757

5858
private volatile Object state;
5959
private volatile long created;
@@ -62,17 +62,17 @@ public final class PoolEntry<T, C extends ModalCloseable> {
6262
private volatile Deadline validityDeadline = Deadline.MIN_VALUE;
6363

6464
PoolEntry(final T route, final TimeValue timeToLive, final DisposalCallback<C> disposalCallback,
65-
final Supplier<Long> currentTimeSupplier) {
65+
final Clock clock) {
6666
super();
6767
this.route = Args.notNull(route, "Route");
6868
this.timeToLive = TimeValue.defaultsToNegativeOneMillisecond(timeToLive);
6969
this.connRef = new AtomicReference<>();
7070
this.disposalCallback = disposalCallback;
71-
this.currentTimeSupplier = currentTimeSupplier;
71+
this.clock = clock;
7272
}
7373

74-
PoolEntry(final T route, final TimeValue timeToLive, final Supplier<Long> currentTimeSupplier) {
75-
this(route, timeToLive, null, currentTimeSupplier);
74+
PoolEntry(final T route, final TimeValue timeToLive, final Clock clock) {
75+
this(route, timeToLive, null, clock);
7676
}
7777

7878
/**
@@ -103,7 +103,7 @@ public PoolEntry(final T route) {
103103
}
104104

105105
long getCurrentTime() {
106-
return currentTimeSupplier != null ? currentTimeSupplier.get() : System.currentTimeMillis();
106+
return clock != null ? clock.millis() : System.currentTimeMillis();
107107
}
108108

109109
public T getRoute() {

httpcore5/src/main/java/org/apache/hc/core5/pool/RouteSegmentedConnPool.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ public Future<PoolEntry<R, C>> lease(
264264

265265
// 2) Try to allocate new within caps
266266
if (tryAllocateOne(route, seg)) {
267-
final PoolEntry<R, C> entry = new PoolEntry<>(route, timeToLive, disposal, clock::millis);
267+
final PoolEntry<R, C> entry = new PoolEntry<>(route, timeToLive, disposal, clock);
268268
fireOnLease(route);
269269
if (callback != null) {
270270
callback.completed(entry);
@@ -747,7 +747,7 @@ private void serveRoundRobin(final int budget) {
747747
seg.allocated.decrementAndGet();
748748
totalAllocated.decrementAndGet();
749749
} else {
750-
final PoolEntry<R, C> entry = new PoolEntry<>(route, timeToLive, disposal, clock::millis);
750+
final PoolEntry<R, C> entry = new PoolEntry<>(route, timeToLive, disposal, clock);
751751
cancelTimeout(w);
752752
w.complete(entry);
753753
fireOnLease(w.route);

httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ public void free(final PoolEntry<T, C> entry, final boolean reusable) {
860860
}
861861

862862
public PoolEntry<T, C> createEntry(final TimeValue timeToLive) {
863-
final PoolEntry<T, C> entry = new PoolEntry<>(this.route, timeToLive, disposalCallback, clock::millis);
863+
final PoolEntry<T, C> entry = new PoolEntry<>(this.route, timeToLive, disposalCallback, clock);
864864
this.leased.add(entry);
865865
return entry;
866866
}

httpcore5/src/test/java/org/apache/hc/core5/pool/TestPoolEntry.java

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@
2626
*/
2727
package org.apache.hc.core5.pool;
2828

29+
import java.time.Clock;
30+
import java.time.Instant;
31+
import java.time.ZoneId;
2932
import java.util.concurrent.TimeUnit;
3033
import java.util.concurrent.atomic.AtomicLong;
3134

32-
import org.apache.hc.core5.function.Supplier;
3335
import org.apache.hc.core5.http.HttpConnection;
3436
import org.apache.hc.core5.io.CloseMode;
3537
import org.apache.hc.core5.util.Deadline;
@@ -42,18 +44,42 @@
4244
class TestPoolEntry {
4345

4446
private AtomicLong count;
45-
private Supplier<Long> currentTimeSupplier;
47+
private Clock clock;
4648

4749
@BeforeEach
4850
void setup() {
4951
count = new AtomicLong(1);
50-
currentTimeSupplier = () -> count.addAndGet(1);
52+
clock = new Clock() {
53+
54+
private final ZoneId zoneId = ZoneId.systemDefault();
55+
56+
@Override
57+
public ZoneId getZone() {
58+
return zoneId;
59+
}
60+
61+
@Override
62+
public Clock withZone(final ZoneId zone) {
63+
return this;
64+
}
65+
66+
@Override
67+
public long millis() {
68+
return count.addAndGet(1);
69+
}
70+
71+
@Override
72+
public Instant instant() {
73+
return Instant.ofEpochMilli(millis());
74+
}
75+
76+
};
5177
}
5278

5379
@Test
5480
void testBasics() {
5581
final PoolEntry<String, HttpConnection> entry1 = new PoolEntry<>(
56-
"route1", TimeValue.of(10L, TimeUnit.MILLISECONDS), currentTimeSupplier);
82+
"route1", TimeValue.of(10L, TimeUnit.MILLISECONDS), clock);
5783

5884
Assertions.assertEquals("route1", entry1.getRoute());
5985
Assertions.assertEquals(0, entry1.getUpdated());
@@ -80,7 +106,7 @@ void testNullConstructor() {
80106
@Test
81107
void testValidInfinitely() {
82108
final PoolEntry<String, HttpConnection> entry1 = new PoolEntry<>(
83-
"route1", TimeValue.ZERO_MILLISECONDS, currentTimeSupplier);
109+
"route1", TimeValue.ZERO_MILLISECONDS, clock);
84110
entry1.assignConnection(Mockito.mock(HttpConnection.class));
85111
Assertions.assertEquals(Deadline.MAX_VALUE, entry1.getValidityDeadline());
86112
Assertions.assertEquals(entry1.getValidityDeadline(), entry1.getExpiryDeadline());
@@ -89,7 +115,7 @@ void testValidInfinitely() {
89115
@Test
90116
void testExpiry() {
91117
final PoolEntry<String, HttpConnection> entry1 = new PoolEntry<>(
92-
"route1", TimeValue.ZERO_MILLISECONDS, currentTimeSupplier);
118+
"route1", TimeValue.ZERO_MILLISECONDS, clock);
93119
entry1.assignConnection(Mockito.mock(HttpConnection.class));
94120
Assertions.assertEquals(Deadline.MAX_VALUE, entry1.getExpiryDeadline());
95121
entry1.updateExpiry(TimeValue.of(50L, TimeUnit.MILLISECONDS));
@@ -98,7 +124,7 @@ void testExpiry() {
98124
Assertions.assertEquals(Deadline.MAX_VALUE, entry1.getExpiryDeadline());
99125

100126
final PoolEntry<String, HttpConnection> entry2 = new PoolEntry<>(
101-
"route1", TimeValue.of(100L, TimeUnit.MILLISECONDS), currentTimeSupplier);
127+
"route1", TimeValue.of(100L, TimeUnit.MILLISECONDS), clock);
102128
entry2.assignConnection(Mockito.mock(HttpConnection.class));
103129
final Deadline validityDeadline = entry2.getValidityDeadline();
104130
Assertions.assertEquals(entry2.getUpdated() + 100L, entry2.getExpiryDeadline().getValue());
@@ -111,17 +137,17 @@ void testExpiry() {
111137
@Test
112138
void testInvalidExpiry() {
113139
final PoolEntry<String, HttpConnection> entry = new PoolEntry<>(
114-
"route1", TimeValue.of(0L, TimeUnit.MILLISECONDS), currentTimeSupplier);
140+
"route1", TimeValue.of(0L, TimeUnit.MILLISECONDS), clock);
115141
Assertions.assertThrows(NullPointerException.class, () ->
116142
entry.updateExpiry(null));
117143
}
118144

119145
@Test
120146
void testExpiryDoesNotOverflow() {
121147
final PoolEntry<String, HttpConnection> entry = new PoolEntry<>(
122-
"route1", TimeValue.of(Long.MAX_VALUE, TimeUnit.MILLISECONDS), currentTimeSupplier);
148+
"route1", TimeValue.of(Long.MAX_VALUE, TimeUnit.MILLISECONDS), clock);
123149
entry.assignConnection(Mockito.mock(HttpConnection.class));
124150
Assertions.assertEquals(Deadline.MAX_VALUE, entry.getValidityDeadline());
125151
}
126152

127-
}
153+
}

0 commit comments

Comments
 (0)