Skip to content

Commit

Permalink
RUST-1791 Publish an event changing topology state to unknown before …
Browse files Browse the repository at this point in the history
…closing (#1160)
  • Loading branch information
abr-egn authored Jun 28, 2024
1 parent f30c02b commit b781af2
Show file tree
Hide file tree
Showing 13 changed files with 668 additions and 9 deletions.
5 changes: 2 additions & 3 deletions src/sdam/topology.rs
Original file line number Diff line number Diff line change
Expand Up @@ -428,12 +428,11 @@ impl TopologyWorker {
while close_futures.next().await.is_some() {}

if let Some(emitter) = self.event_emitter {
if !self.topology_description.servers.is_empty()
&& self.options.load_balanced != Some(true)
{
if !self.topology_description.servers.is_empty() {
let previous_description = self.topology_description;
let mut new_description = previous_description.clone();
new_description.servers.clear();
new_description.topology_type = TopologyType::Unknown;

emitter
.emit(SdamEvent::TopologyDescriptionChanged(Box::new(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
{
"description": "loadbalanced-emit-topology-description-changed-before-close",
"schemaVersion": "1.20",
"runOnRequirements": [
{
"topologies": [
"load-balanced"
],
"minServerVersion": "4.4"
}
],
"tests": [
{
"description": "Topology lifecycle",
"operations": [
{
"name": "createEntities",
"object": "testRunner",
"arguments": {
"entities": [
{
"client": {
"id": "client",
"observeEvents": [
"topologyDescriptionChangedEvent",
"topologyOpeningEvent",
"topologyClosedEvent"
]
}
}
]
}
},
{
"name": "waitForEvent",
"object": "testRunner",
"arguments": {
"client": "client",
"event": {
"topologyDescriptionChangedEvent": {}
},
"count": 2
}
},
{
"name": "close",
"object": "client"
}
],
"expectEvents": [
{
"client": "client",
"eventType": "sdam",
"events": [
{
"topologyOpeningEvent": {}
},
{
"topologyDescriptionChangedEvent": {
"previousDescription": {
"type": "Unknown"
},
"newDescription": {}
}
},
{
"topologyDescriptionChangedEvent": {
"newDescription": {
"type": "LoadBalanced"
}
}
},
{
"topologyDescriptionChangedEvent": {
"newDescription": {
"type": "Unknown"
}
}
},
{
"topologyClosedEvent": {}
}
]
}
]
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
description: "loadbalanced-emit-topology-description-changed-before-close"

schemaVersion: "1.20"

runOnRequirements:
- topologies:
- load-balanced
minServerVersion: "4.4" # awaitable hello

tests:
- description: "Topology lifecycle"
operations:
- name: createEntities
object: testRunner
arguments:
entities:
- client:
id: &client client
observeEvents:
- topologyDescriptionChangedEvent
- topologyOpeningEvent
- topologyClosedEvent
# ensure the topology has been fully discovered before closing the client.
# expected events are initial server discovery and server connect event.
- name: waitForEvent
object: testRunner
arguments:
client: *client
event:
topologyDescriptionChangedEvent: {}
count: 2
- name: close
object: *client
expectEvents:
- client: *client
eventType: sdam
events:
- topologyOpeningEvent: {}
- topologyDescriptionChangedEvent: # unknown -> unknown w disconnected server
previousDescription:
type: "Unknown"
newDescription: {}
- topologyDescriptionChangedEvent: # unknown w disconnected server -> loadBalanced
newDescription:
type: "LoadBalanced"
- topologyDescriptionChangedEvent: # loadbalanced -> unknown
newDescription:
type: "Unknown"
- topologyClosedEvent: {}
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,22 @@
}
}
},
{
"level": "debug",
"component": "topology",
"data": {
"message": "Topology description changed",
"topologyId": {
"$$exists": true
},
"previousDescription": {
"$$exists": true
},
"newDescription": {
"$$exists": true
}
}
},
{
"level": "debug",
"component": "topology",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,15 @@ tests:
topologyId: { $$exists: true }
serverHost: { $$type: string }
serverPort: { $$type: [int, long] }
- level: debug
component: topology
data:
message: "Topology description changed"
topologyId: { $$exists: true }
previousDescription: { $$exists: true } # loadBalanced topology
newDescription: { $$exists: true } # unknown topology
- level: debug
component: topology
data:
message: "Stopped topology monitoring"
topologyId: { $$exists: true }
topologyId: { $$exists: true }
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
{
"description": "replicaset-emit-topology-description-changed-before-close",
"schemaVersion": "1.20",
"runOnRequirements": [
{
"topologies": [
"replicaset"
],
"minServerVersion": "4.4"
}
],
"tests": [
{
"description": "Topology lifecycle",
"operations": [
{
"name": "createEntities",
"object": "testRunner",
"arguments": {
"entities": [
{
"client": {
"id": "client",
"observeEvents": [
"topologyDescriptionChangedEvent",
"topologyOpeningEvent",
"topologyClosedEvent"
]
}
}
]
}
},
{
"name": "waitForEvent",
"object": "testRunner",
"arguments": {
"client": "client",
"event": {
"topologyDescriptionChangedEvent": {}
},
"count": 4
}
},
{
"name": "close",
"object": "client"
}
],
"expectEvents": [
{
"client": "client",
"eventType": "sdam",
"ignoreExtraEvents": false,
"events": [
{
"topologyOpeningEvent": {}
},
{
"topologyDescriptionChangedEvent": {}
},
{
"topologyDescriptionChangedEvent": {}
},
{
"topologyDescriptionChangedEvent": {}
},
{
"topologyDescriptionChangedEvent": {}
},
{
"topologyDescriptionChangedEvent": {
"previousDescription": {
"type": "ReplicaSetWithPrimary"
},
"newDescription": {
"type": "Unknown"
}
}
},
{
"topologyClosedEvent": {}
}
]
}
]
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
description: "replicaset-emit-topology-description-changed-before-close"

schemaVersion: "1.20"

runOnRequirements:
- topologies:
- replicaset
minServerVersion: "4.4" # awaitable hello

tests:
- description: "Topology lifecycle"
operations:
- name: createEntities
object: testRunner
arguments:
entities:
- client:
id: &client client
observeEvents:
- topologyDescriptionChangedEvent
- topologyOpeningEvent
- topologyClosedEvent
# ensure the topology has been fully discovered before closing the client.
# expected events are initial server discovery and 3 server connect events.
- name: waitForEvent
object: testRunner
arguments:
client: *client
event:
topologyDescriptionChangedEvent: {}
count: 4
- name: close
object: *client
expectEvents:
- client: *client
eventType: sdam
ignoreExtraEvents: false
events:
- topologyOpeningEvent: {}
- topologyDescriptionChangedEvent: {} # unknown -> replset no primary
- topologyDescriptionChangedEvent: {} # server connected
- topologyDescriptionChangedEvent: {} # server connected
- topologyDescriptionChangedEvent: {} # server connected
- topologyDescriptionChangedEvent: # replicaset -> unknown
previousDescription:
type: "ReplicaSetWithPrimary"
newDescription:
type: "Unknown"
- topologyClosedEvent: {}
Loading

0 comments on commit b781af2

Please sign in to comment.