2929import static com .mongodb .ClusterType .Sharded ;
3030import static com .mongodb .ClusterType .Unknown ;
3131import static com .mongodb .ServerConnectionState .Connecting ;
32+ import static com .mongodb .ServerType .ReplicaSetGhost ;
3233import static com .mongodb .ServerType .ShardRouter ;
3334import static java .lang .String .format ;
3435import static org .bson .util .Assertions .isTrue ;
@@ -41,7 +42,6 @@ final class MultiServerCluster extends BaseCluster {
4142
4243 private ClusterType clusterType ;
4344 private String replicaSetName ;
44- private int latestSetVersion = Integer .MIN_VALUE ;
4545 private final ConcurrentMap <ServerAddress , ServerTuple > addressToServerTupleMap =
4646 new ConcurrentHashMap <ServerAddress , ServerTuple >();
4747
@@ -152,7 +152,7 @@ private void handleReplicaSetMemberChanged(final ServerDescription newDescriptio
152152 return ;
153153 }
154154
155- if (newDescription .getHosts (). isEmpty () || newDescription . getSetName () == null ) {
155+ if (newDescription .getType () == ReplicaSetGhost ) {
156156 LOGGER .info (format ("Server %s does not appear to be a member of an initiated replica set." , newDescription .getAddress ()));
157157 return ;
158158 }
@@ -164,18 +164,13 @@ private void handleReplicaSetMemberChanged(final ServerDescription newDescriptio
164164 if (!replicaSetName .equals (newDescription .getSetName ())) {
165165 LOGGER .severe (format ("Expecting replica set member from set '%s', but found one from set '%s'. "
166166 + "Removing %s from client view of cluster." ,
167- replicaSetName , newDescription .getSetName (), newDescription .getAddress ()));
167+ replicaSetName , newDescription .getSetName (), newDescription .getAddress ()
168+ ));
168169 removeServer (newDescription .getAddress ());
169170 return ;
170171 }
171172
172- if (newDescription .getSetVersion () == null || newDescription .getSetVersion () > latestSetVersion ) {
173- if (newDescription .getSetVersion () != null ) {
174- latestSetVersion = newDescription .getSetVersion ();
175- }
176-
177- ensureServers (newDescription );
178- }
173+ ensureServers (newDescription );
179174
180175 if (newDescription .isPrimary ()) {
181176 if (isNotAlreadyPrimary (newDescription .getAddress ())) {
@@ -225,7 +220,6 @@ private void invalidateOldPrimaries(final ServerAddress newPrimary) {
225220 if (!serverTuple .description .getAddress ().equals (newPrimary ) && serverTuple .description .isPrimary ()) {
226221 LOGGER .info (format ("Rediscovering type of existing primary %s" , serverTuple .description .getAddress ()));
227222 serverTuple .server .invalidate ();
228- serverTuple .description = getConnectingServerDescription (serverTuple .description .getAddress ());
229223 }
230224 }
231225 }
@@ -248,9 +242,24 @@ private List<ServerDescription> getNewServerDescriptionList() {
248242 }
249243
250244 private void ensureServers (final ServerDescription description ) {
251- addNewHosts (description .getHosts ());
252- addNewHosts (description .getPassives ());
253- removeExtras (description );
245+ if (description .isPrimary () || !hasPrimary ()) {
246+ addNewHosts (description .getHosts ());
247+ addNewHosts (description .getPassives ());
248+ addNewHosts (description .getArbiters ());
249+ }
250+
251+ if (description .isPrimary ()) {
252+ removeExtraHosts (description );
253+ }
254+ }
255+
256+ private boolean hasPrimary () {
257+ for (ServerTuple serverTuple : addressToServerTupleMap .values ()) {
258+ if (serverTuple .description .isPrimary ()) {
259+ return true ;
260+ }
261+ }
262+ return false ;
254263 }
255264
256265 private void addNewHosts (final Set <String > hosts ) {
@@ -263,7 +272,7 @@ private void addNewHosts(final Set<String> hosts) {
263272 }
264273 }
265274
266- private void removeExtras (final ServerDescription serverDescription ) {
275+ private void removeExtraHosts (final ServerDescription serverDescription ) {
267276 Set <ServerAddress > allServerAddresses = getAllServerAddresses (serverDescription );
268277 for (ServerTuple cur : addressToServerTupleMap .values ()) {
269278 if (!allServerAddresses .contains (cur .description .getAddress ())) {
0 commit comments