1runOn:
2    -
3        minServerVersion: "4.0"
4        topology: ["single", "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: "Aggregate succeeds on first attempt"
20        operations:
21            - &retryable_operation_succeeds
22                <<: &retryable_operation
23                    name: aggregate
24                    object: collection
25                    arguments:
26                        pipeline:
27                            - $match: {_id: {$gt: 1}}
28                            - $sort: {x: 1}
29                result:
30                    - {_id: 2, x: 22}
31                    - {_id: 3, x: 33}
32        expectations:
33            - &retryable_command_started_event
34                command_started_event:
35                    command:
36                        aggregate: *collection_name
37                        pipeline: [{$match: {_id: {$gt: 1}}}, {$sort: {x: 1}}]
38                    database_name: *database_name
39    -
40        description: "Aggregate succeeds on second attempt"
41        failPoint: &failCommand_failPoint
42            configureFailPoint: failCommand
43            mode: { times: 1 }
44            data:
45                failCommands: [aggregate]
46                closeConnection: true
47        operations: [*retryable_operation_succeeds]
48        expectations:
49             - *retryable_command_started_event
50             - *retryable_command_started_event
51    -
52        description: "Aggregate fails on first attempt"
53        clientOptions:
54            retryReads: false
55        failPoint: *failCommand_failPoint
56        operations:
57            - &retryable_operation_fails
58                <<: *retryable_operation
59                error: true
60        expectations:
61             - *retryable_command_started_event
62    -
63        description: "Aggregate fails on second attempt"
64        failPoint:
65            <<: *failCommand_failPoint
66            mode: { times: 2 }
67        operations: [*retryable_operation_fails]
68        expectations:
69             - *retryable_command_started_event
70             - *retryable_command_started_event
71    -
72        description: "Aggregate with $out does not retry"
73        failPoint: *failCommand_failPoint
74        operations:
75            -   <<: *retryable_operation_fails
76                arguments:
77                    pipeline:
78                        - $match: {_id: {$gt: 1}}
79                        - $sort: {x: 1}
80                        - $out: "output-collection"
81        expectations:
82             -  command_started_event:
83                    command:
84                      aggregate: *collection_name
85                      pipeline: [{$match: {_id: {$gt: 1}}}, {$sort: {x: 1}}, {$out: 'output-collection'}]
86                    command_name: aggregate
87                    database_name: *database_name