def server_description_changed
unless update_server_descriptions
return
end
case topology
when Topology::Single
when Topology::Unknown
if updated_desc.standalone?
update_unknown_with_standalone
elsif updated_desc.mongos?
@topology = Topology::Sharded.new(topology.options, topology.monitoring, self)
elsif updated_desc.primary?
@topology = Topology::ReplicaSetWithPrimary.new(
topology.options.merge(replica_set_name: updated_desc.replica_set_name),
topology.monitoring, self)
update_rs_from_primary
elsif updated_desc.secondary? || updated_desc.arbiter? || updated_desc.other?
@topology = Topology::ReplicaSetNoPrimary.new(
topology.options.merge(replica_set_name: updated_desc.replica_set_name),
topology.monitoring, self)
update_rs_without_primary
end
when Topology::Sharded
unless updated_desc.unknown? || updated_desc.mongos?
remove
end
when Topology::ReplicaSetWithPrimary
if updated_desc.standalone? || updated_desc.mongos?
remove
check_if_has_primary
elsif updated_desc.primary?
update_rs_from_primary
elsif updated_desc.secondary? || updated_desc.arbiter? || updated_desc.other?
update_rs_with_primary_from_member
else
check_if_has_primary
end
when Topology::ReplicaSetNoPrimary
if updated_desc.standalone? || updated_desc.mongos?
remove
elsif updated_desc.primary?
@topology = Topology::ReplicaSetWithPrimary.new(
topology.options,
topology.monitoring, self)
update_rs_from_primary
elsif updated_desc.secondary? || updated_desc.arbiter? || updated_desc.other?
update_rs_without_primary
end
else
raise ArgumentError, "Unknown topology #{topology.class}"
end
commit_changes
end