1runOn:
2    -
3        minServerVersion: "4.0"
4        topology: ["replicaset"]
5    -
6        minServerVersion: "4.1.7"
7        topology: ["sharded"]
8
9database_name: &database_name "retryable-reads-tests"
10collection_name: &collection_name "coll"
11
12data:
13    - {_id: 1, x: 11}
14    - {_id: 2, x: 22}
15    - {_id: 3, x: 33}
16
17tests:
18    -
19        description: "client.watch succeeds after InterruptedAtShutdown"
20        failPoint: &failCommand_failPoint
21            configureFailPoint: failCommand
22            mode: { times: 1 }
23            data: { failCommands: [aggregate], errorCode: 11600 }
24        operations:
25            - &retryable_operation
26                name: watch
27                object: client
28        expectations:
29            - &retryable_command_started_event
30                command_started_event:
31                    command:
32                        aggregate: 1
33                        cursor: {}
34                        pipeline: [ { $changeStream: { fullDocument: "default", allChangesForCluster: true } } ]
35                    database_name: admin
36            - *retryable_command_started_event
37    -
38        description: "client.watch succeeds after InterruptedDueToReplStateChange"
39        failPoint:
40            <<: *failCommand_failPoint
41            data: { failCommands: [aggregate], errorCode: 11602 }
42        operations: [*retryable_operation]
43        expectations:
44             - *retryable_command_started_event
45             - *retryable_command_started_event
46    -
47        description: "client.watch succeeds after NotMaster"
48        failPoint:
49            <<: *failCommand_failPoint
50            data: { failCommands: [aggregate], errorCode: 10107 }
51        operations: [*retryable_operation]
52        expectations:
53             - *retryable_command_started_event
54             - *retryable_command_started_event
55    -
56        description: "client.watch succeeds after NotMasterNoSlaveOk"
57        failPoint:
58            <<: *failCommand_failPoint
59            data: { failCommands: [aggregate], errorCode: 13435 }
60        operations: [*retryable_operation]
61        expectations:
62             - *retryable_command_started_event
63             - *retryable_command_started_event
64    -
65        description: "client.watch succeeds after NotMasterOrSecondary"
66        failPoint:
67            <<: *failCommand_failPoint
68            data: { failCommands: [aggregate], errorCode: 13436 }
69        operations: [*retryable_operation]
70        expectations:
71             - *retryable_command_started_event
72             - *retryable_command_started_event
73    -
74        description: "client.watch succeeds after PrimarySteppedDown"
75        failPoint:
76            <<: *failCommand_failPoint
77            data: { failCommands: [aggregate], errorCode: 189 }
78        operations: [*retryable_operation]
79        expectations:
80             - *retryable_command_started_event
81             - *retryable_command_started_event
82    -
83        description: "client.watch succeeds after ShutdownInProgress"
84        failPoint:
85            <<: *failCommand_failPoint
86            data: { failCommands: [aggregate], errorCode: 91 }
87        operations: [*retryable_operation]
88        expectations:
89             - *retryable_command_started_event
90             - *retryable_command_started_event
91    -
92        description: "client.watch succeeds after HostNotFound"
93        failPoint:
94            <<: *failCommand_failPoint
95            data: { failCommands: [aggregate], errorCode: 7 }
96        operations: [*retryable_operation]
97        expectations:
98             - *retryable_command_started_event
99             - *retryable_command_started_event
100    -
101        description: "client.watch succeeds after HostUnreachable"
102        failPoint:
103            <<: *failCommand_failPoint
104            data: { failCommands: [aggregate], errorCode: 6 }
105        operations: [*retryable_operation]
106        expectations:
107             - *retryable_command_started_event
108             - *retryable_command_started_event
109    -
110        description: "client.watch succeeds after NetworkTimeout"
111        failPoint:
112            <<: *failCommand_failPoint
113            data: { failCommands: [aggregate], errorCode: 89 }
114        operations: [*retryable_operation]
115        expectations:
116             - *retryable_command_started_event
117             - *retryable_command_started_event
118    -
119        description: "client.watch succeeds after SocketException"
120        failPoint:
121            <<: *failCommand_failPoint
122            data: { failCommands: [aggregate], errorCode: 9001 }
123        operations: [*retryable_operation]
124        expectations:
125             - *retryable_command_started_event
126             - *retryable_command_started_event
127    -
128        description: "client.watch fails after two NotMaster errors"
129        failPoint:
130            <<: *failCommand_failPoint
131            mode: { times: 2 }
132            data: { failCommands: [aggregate], errorCode: 10107 }
133        operations:
134            - &retryable_operation_fails
135                <<: *retryable_operation
136                error: true
137        expectations:
138             - *retryable_command_started_event
139             - *retryable_command_started_event
140    -
141        description: "client.watch fails after NotMaster when retryReads is false"
142        clientOptions:
143            retryReads: false
144        failPoint:
145            <<: *failCommand_failPoint
146            data: { failCommands: [aggregate], errorCode: 10107 }
147        operations: [*retryable_operation_fails]
148        expectations:
149             - *retryable_command_started_event
150