Skip to content

Commit 665cc9b

Browse files
committed
Add initial ServerDescription to InternalConnection
JAVA-3626
1 parent f11f151 commit 665cc9b

16 files changed

+313
-111
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.mongodb.connection.ConnectionDescription;
2222
import com.mongodb.connection.ConnectionId;
2323
import com.mongodb.connection.ConnectionPoolSettings;
24+
import com.mongodb.connection.ServerDescription;
2425
import com.mongodb.connection.ServerId;
2526
import com.mongodb.diagnostics.logging.Logger;
2627
import com.mongodb.diagnostics.logging.Loggers;
@@ -528,6 +529,12 @@ public void onResult(final ResponseBuffers result, final Throwable t) {
528529
public ConnectionDescription getDescription() {
529530
return wrapped.getDescription();
530531
}
532+
533+
@Override
534+
public ServerDescription getInitialServerDescription() {
535+
isTrue("open", !isClosed.get());
536+
return wrapped.getInitialServerDescription();
537+
}
531538
}
532539

533540
private class UsageTrackingInternalConnectionItemFactory implements ConcurrentPool.ItemFactory<UsageTrackingInternalConnection> {

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

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -116,30 +116,26 @@ public synchronized void run() {
116116
connection = internalConnectionFactory.create(serverId);
117117
try {
118118
connection.open();
119+
currentServerDescription = connection.getInitialServerDescription();
119120
} catch (Throwable t) {
120121
connection = null;
121122
throw t;
122123
}
123-
}
124-
try {
125-
currentServerDescription = lookupServerDescription(connection);
126-
} catch (MongoSocketException e) {
127-
connectionPool.invalidate();
128-
connection.close();
129-
connection = null;
130-
connection = internalConnectionFactory.create(serverId);
131-
try {
132-
connection.open();
133-
} catch (Throwable t) {
134-
connection = null;
135-
throw t;
136-
}
124+
} else {
137125
try {
138126
currentServerDescription = lookupServerDescription(connection);
139-
} catch (MongoSocketException e1) {
127+
} catch (MongoSocketException e) {
128+
connectionPool.invalidate();
140129
connection.close();
141130
connection = null;
142-
throw e1;
131+
connection = internalConnectionFactory.create(serverId);
132+
try {
133+
connection.open();
134+
currentServerDescription = connection.getInitialServerDescription();
135+
} catch (Throwable t) {
136+
connection = null;
137+
throw t;
138+
}
143139
}
144140
}
145141
} catch (Throwable t) {

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616

1717
package com.mongodb.internal.connection;
1818

19-
import com.mongodb.internal.async.SingleResultCallback;
2019
import com.mongodb.connection.BufferProvider;
2120
import com.mongodb.connection.ConnectionDescription;
21+
import com.mongodb.connection.ServerDescription;
22+
import com.mongodb.internal.async.SingleResultCallback;
2223
import com.mongodb.internal.session.SessionContext;
2324
import org.bson.ByteBuf;
2425
import org.bson.codecs.Decoder;
@@ -34,6 +35,13 @@ public interface InternalConnection extends BufferProvider {
3435
*/
3536
ConnectionDescription getDescription();
3637

38+
/**
39+
* Get the initial server description
40+
*
41+
* @return the initial server description
42+
*/
43+
ServerDescription getInitialServerDescription();
44+
3745
/**
3846
* Opens the connection so its ready for use
3947
*/
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2008-present MongoDB, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.mongodb.internal.connection;
18+
19+
import com.mongodb.connection.ConnectionDescription;
20+
import com.mongodb.connection.ServerDescription;
21+
22+
public class InternalConnectionInitializationDescription {
23+
private final ConnectionDescription connectionDescription;
24+
private final ServerDescription serverDescription;
25+
26+
public InternalConnectionInitializationDescription(final ConnectionDescription connectionDescription,
27+
final ServerDescription serverDescription) {
28+
this.connectionDescription = connectionDescription;
29+
this.serverDescription = serverDescription;
30+
}
31+
32+
public ConnectionDescription getConnectionDescription() {
33+
return connectionDescription;
34+
}
35+
36+
public ServerDescription getServerDescription() {
37+
return serverDescription;
38+
}
39+
40+
public InternalConnectionInitializationDescription withConnectionDescription(final ConnectionDescription connectionDescription) {
41+
return new InternalConnectionInitializationDescription(connectionDescription, serverDescription);
42+
}
43+
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@
1717
package com.mongodb.internal.connection;
1818

1919
import com.mongodb.internal.async.SingleResultCallback;
20-
import com.mongodb.connection.ConnectionDescription;
2120

2221
interface InternalConnectionInitializer {
2322

24-
ConnectionDescription initialize(InternalConnection internalConnection);
23+
InternalConnectionInitializationDescription initialize(InternalConnection internalConnection);
2524

26-
void initializeAsync(InternalConnection internalConnection, SingleResultCallback<ConnectionDescription> callback);
25+
void initializeAsync(InternalConnection internalConnection, SingleResultCallback<InternalConnectionInitializationDescription> callback);
2726

2827
}

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

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,19 @@
2727
import com.mongodb.MongoSocketWriteException;
2828
import com.mongodb.ServerAddress;
2929
import com.mongodb.annotations.NotThreadSafe;
30-
import com.mongodb.internal.async.SingleResultCallback;
3130
import com.mongodb.connection.AsyncCompletionHandler;
3231
import com.mongodb.connection.ConnectionDescription;
3332
import com.mongodb.connection.ConnectionId;
33+
import com.mongodb.connection.ServerConnectionState;
34+
import com.mongodb.connection.ServerDescription;
3435
import com.mongodb.connection.ServerId;
36+
import com.mongodb.connection.ServerType;
3537
import com.mongodb.connection.Stream;
3638
import com.mongodb.connection.StreamFactory;
3739
import com.mongodb.diagnostics.logging.Logger;
3840
import com.mongodb.diagnostics.logging.Loggers;
3941
import com.mongodb.event.CommandListener;
42+
import com.mongodb.internal.async.SingleResultCallback;
4043
import com.mongodb.internal.session.SessionContext;
4144
import org.bson.BsonBinaryReader;
4245
import org.bson.BsonDocument;
@@ -92,6 +95,7 @@ public class InternalStreamConnection implements InternalConnection {
9295
private final InternalConnectionInitializer connectionInitializer;
9396

9497
private volatile ConnectionDescription description;
98+
private volatile ServerDescription initialServerDescription;
9599
private volatile Stream stream;
96100

97101
private final AtomicBoolean isClosed = new AtomicBoolean();
@@ -112,20 +116,33 @@ public InternalStreamConnection(final ServerId serverId, final StreamFactory str
112116
this.commandListener = commandListener;
113117
this.connectionInitializer = notNull("connectionInitializer", connectionInitializer);
114118
description = new ConnectionDescription(serverId);
119+
initialServerDescription = ServerDescription.builder()
120+
.address(serverId.getAddress())
121+
.type(ServerType.UNKNOWN)
122+
.state(ServerConnectionState.CONNECTING)
123+
.build();
115124
}
116125

117126
@Override
118127
public ConnectionDescription getDescription() {
119128
return description;
120129
}
121130

131+
@Override
132+
public ServerDescription getInitialServerDescription() {
133+
return initialServerDescription;
134+
}
135+
122136
@Override
123137
public void open() {
124138
isTrue("Open already called", stream == null);
125139
stream = streamFactory.create(serverId.getAddress());
126140
try {
127141
stream.open();
128-
description = connectionInitializer.initialize(this);
142+
LOGGER.debug("Done opening stream to " + serverId.toString());
143+
InternalConnectionInitializationDescription initializationDescription = connectionInitializer.initialize(this);
144+
description = initializationDescription.getConnectionDescription();
145+
initialServerDescription = initializationDescription.getServerDescription();
129146
opened.set(true);
130147
sendCompressor = findSendCompressor(description);
131148
LOGGER.info(format("Opened connection [%s] to %s", getId(), serverId.getAddress()));
@@ -151,14 +168,16 @@ public void openAsync(final SingleResultCallback<Void> callback) {
151168
stream.openAsync(new AsyncCompletionHandler<Void>() {
152169
@Override
153170
public void completed(final Void aVoid) {
154-
connectionInitializer.initializeAsync(InternalStreamConnection.this, new SingleResultCallback<ConnectionDescription>() {
171+
connectionInitializer.initializeAsync(InternalStreamConnection.this,
172+
new SingleResultCallback<InternalConnectionInitializationDescription>() {
155173
@Override
156-
public void onResult(final ConnectionDescription result, final Throwable t) {
174+
public void onResult(final InternalConnectionInitializationDescription result, final Throwable t) {
157175
if (t != null) {
158176
close();
159177
callback.onResult(null, t);
160178
} else {
161-
description = result;
179+
description = result.getConnectionDescription();
180+
initialServerDescription = result.getServerDescription();
162181
opened.set(true);
163182
sendCompressor = findSendCompressor(description);
164183
if (LOGGER.isInfoEnabled()) {

0 commit comments

Comments
 (0)