Skip to content

Commit 6acd53d

Browse files
committed
JAVA-2027: When ensuring minimum connection pool size, open the connection in addition to creating it. Otherwise, there's little benefit of ensuring the minimum size.
1 parent c382600 commit 6acd53d

File tree

5 files changed

+235
-139
lines changed

5 files changed

+235
-139
lines changed

driver-core/src/main/com/mongodb/connection/DefaultConnectionPool.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -284,13 +284,21 @@ public synchronized void run() {
284284
if (LOGGER.isDebugEnabled()) {
285285
LOGGER.debug(format("Pruning pooled connections to %s", serverId.getAddress()));
286286
}
287-
pool.prune();
287+
try {
288+
pool.prune();
289+
} catch (Exception e) {
290+
LOGGER.warn("Exception thrown while pruning connection pool", e);
291+
}
288292
}
289293
if (shouldEnsureMinSize()) {
290294
if (LOGGER.isDebugEnabled()) {
291295
LOGGER.debug(format("Ensuring minimum pooled connections to %s", serverId.getAddress()));
292296
}
293-
pool.ensureMinSize(settings.getMinSize());
297+
try {
298+
pool.ensureMinSize(settings.getMinSize(), true);
299+
} catch (Exception e) {
300+
LOGGER.warn("Exception thrown while ensuring minimum pool size", e);
301+
}
294302
}
295303
}
296304
};
@@ -472,9 +480,12 @@ public UsageTrackingInternalConnectionItemFactory(final InternalConnectionFactor
472480
}
473481

474482
@Override
475-
public UsageTrackingInternalConnection create() {
483+
public UsageTrackingInternalConnection create(final boolean initialize) {
476484
UsageTrackingInternalConnection internalConnection =
477485
new UsageTrackingInternalConnection(internalConnectionFactory.create(serverId), generation.get());
486+
if (initialize) {
487+
internalConnection.open();
488+
}
478489
connectionPoolListener.connectionAdded(new ConnectionEvent(getId(internalConnection)));
479490
return internalConnection;
480491
}

driver-core/src/main/com/mongodb/internal/connection/ConcurrentPool.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class ConcurrentPool<T> implements Pool<T> {
4545
* @param <T>
4646
*/
4747
public interface ItemFactory<T> {
48-
T create();
48+
T create(final boolean initialize);
4949

5050
void close(T t);
5151

@@ -129,7 +129,7 @@ public T get(final long timeout, final TimeUnit timeUnit) {
129129

130130
T t = available.pollLast();
131131
if (t == null) {
132-
t = createNewAndReleasePermitIfFailure();
132+
t = createNewAndReleasePermitIfFailure(false);
133133
}
134134

135135
return t;
@@ -150,18 +150,18 @@ public void prune() {
150150
}
151151
}
152152

153-
public void ensureMinSize(final int minSize) {
153+
public void ensureMinSize(final int minSize, final boolean initialize) {
154154
while (getCount() < minSize) {
155155
if (!acquirePermit(10, TimeUnit.MILLISECONDS)) {
156156
break;
157157
}
158-
release(createNewAndReleasePermitIfFailure());
158+
release(createNewAndReleasePermitIfFailure(initialize));
159159
}
160160
}
161161

162-
private T createNewAndReleasePermitIfFailure() {
162+
private T createNewAndReleasePermitIfFailure(final boolean initialize) {
163163
try {
164-
T newMember = itemFactory.create();
164+
T newMember = itemFactory.create(initialize);
165165
if (newMember == null) {
166166
throw new MongoInternalException("The factory for the pool created a null item");
167167
}

driver-core/src/main/com/mongodb/internal/connection/PowerOfTwoBufferPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public PowerOfTwoBufferPool(final int highestPowerOfTwo) {
5353
powerOfTwoToPoolMap.put(i, new ConcurrentPool<ByteBuffer>(Integer.MAX_VALUE,
5454
new ConcurrentPool.ItemFactory<ByteBuffer>() {
5555
@Override
56-
public ByteBuffer create() {
56+
public ByteBuffer create(final boolean initialize) {
5757
return createNew(size);
5858
}
5959

0 commit comments

Comments
 (0)