mongo 2.16.0 → 2.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +1 -1
  4. data/lib/mongo/auth/aws/request.rb +0 -1
  5. data/lib/mongo/client.rb +4 -0
  6. data/lib/mongo/collection/view/aggregation.rb +62 -17
  7. data/lib/mongo/collection/view/builder/aggregation.rb +11 -13
  8. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  9. data/lib/mongo/collection/view/change_stream.rb +7 -3
  10. data/lib/mongo/collection/view/iterable.rb +2 -3
  11. data/lib/mongo/collection/view/map_reduce.rb +2 -0
  12. data/lib/mongo/collection/view/readable.rb +24 -1
  13. data/lib/mongo/collection/view/writable.rb +23 -0
  14. data/lib/mongo/collection.rb +21 -1
  15. data/lib/mongo/database/view.rb +4 -2
  16. data/lib/mongo/database.rb +6 -6
  17. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
  18. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
  19. data/lib/mongo/error.rb +2 -0
  20. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  21. data/lib/mongo/operation/find/builder/command.rb +1 -0
  22. data/lib/mongo/operation/result.rb +6 -0
  23. data/lib/mongo/operation/shared/executable.rb +4 -0
  24. data/lib/mongo/operation/shared/sessions_supported.rb +18 -2
  25. data/lib/mongo/operation/update/op_msg.rb +2 -1
  26. data/lib/mongo/server/description/features.rb +3 -1
  27. data/lib/mongo/server/push_monitor.rb +4 -1
  28. data/lib/mongo/server_selector/base.rb +26 -4
  29. data/lib/mongo/session.rb +19 -0
  30. data/lib/mongo/socket/ocsp_cache.rb +2 -3
  31. data/lib/mongo/socket.rb +1 -5
  32. data/lib/mongo/utils.rb +0 -6
  33. data/lib/mongo/version.rb +1 -1
  34. data/mongo.gemspec +1 -1
  35. data/spec/integration/read_preference_spec.rb +16 -12
  36. data/spec/mongo/collection/view/aggregation_spec.rb +71 -95
  37. data/spec/mongo/collection/view/change_stream_spec.rb +1 -1
  38. data/spec/mongo/collection/view/map_reduce_spec.rb +14 -1
  39. data/spec/mongo/operation/read_preference_op_msg_spec.rb +24 -1
  40. data/spec/mongo/server/monitor/connection_spec.rb +22 -0
  41. data/spec/mongo/server/push_monitor_spec.rb +101 -0
  42. data/spec/mongo/server_selector_spec.rb +136 -15
  43. data/spec/mongo/socket/ssl_spec.rb +26 -58
  44. data/spec/mongo/utils_spec.rb +0 -14
  45. data/spec/runners/crud/verifier.rb +1 -2
  46. data/spec/runners/unified/assertions.rb +3 -1
  47. data/spec/runners/unified/crud_operations.rb +77 -23
  48. data/spec/runners/unified/ddl_operations.rb +29 -1
  49. data/spec/runners/unified/entity_map.rb +3 -3
  50. data/spec/runners/unified/support_operations.rb +6 -1
  51. data/spec/runners/unified/test.rb +15 -3
  52. data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
  53. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
  54. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
  55. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +91 -0
  56. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +89 -0
  57. data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
  58. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +88 -0
  59. data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
  60. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
  61. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +103 -0
  62. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +98 -0
  63. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
  64. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  65. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  66. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  67. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
  68. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
  69. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
  70. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
  71. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
  72. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
  73. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
  74. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
  75. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
  76. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
  77. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
  78. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  79. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  80. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  81. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
  82. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  83. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
  84. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
  85. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  86. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
  87. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  88. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
  89. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
  90. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
  91. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
  92. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +69 -0
  93. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
  94. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
  95. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
  96. data/spec/spec_tests/sessions_unified_spec.rb +13 -0
  97. data.tar.gz.sig +0 -0
  98. metadata +1076 -1040
  99. metadata.gz.sig +2 -2
@@ -0,0 +1,482 @@
1
+ description: snapshot-sessions
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "5.0"
7
+ topologies: [replicaset, sharded-replicaset]
8
+
9
+ createEntities:
10
+ - client:
11
+ id: &client0 client0
12
+ observeEvents: [ commandStartedEvent]
13
+ ignoreCommandMonitoringEvents: [ findAndModify, insert, update ]
14
+ - database:
15
+ id: &database0 database0
16
+ client: *client0
17
+ databaseName: &database0Name database0
18
+ - collection:
19
+ id: &collection0 collection0
20
+ database: *database0
21
+ collectionName: &collection0Name collection0
22
+ collectionOptions:
23
+ writeConcern: { w: majority }
24
+ - session:
25
+ id: session0
26
+ client: client0
27
+ sessionOptions:
28
+ snapshot: true
29
+ - session:
30
+ id: session1
31
+ client: client0
32
+ sessionOptions:
33
+ snapshot: true
34
+
35
+ initialData:
36
+ - collectionName: *collection0Name
37
+ databaseName: *database0Name
38
+ documents:
39
+ - { _id: 1, x: 11 }
40
+ - { _id: 2, x: 11 }
41
+
42
+ tests:
43
+ - description: Find operation with snapshot
44
+ operations:
45
+ - name: find
46
+ object: collection0
47
+ arguments:
48
+ session: session0
49
+ filter: { _id: 1 }
50
+ expectResult:
51
+ - {_id: 1, x: 11}
52
+ - name: findOneAndUpdate
53
+ object: collection0
54
+ arguments:
55
+ filter: { _id: 1 }
56
+ update: { $inc: { x: 1 } }
57
+ returnDocument: After
58
+ expectResult: { _id: 1, x: 12 }
59
+ - name: find
60
+ object: collection0
61
+ arguments:
62
+ session: session1
63
+ filter: { _id: 1 }
64
+ expectResult:
65
+ - { _id: 1, x: 12 }
66
+ - name: findOneAndUpdate
67
+ object: collection0
68
+ arguments:
69
+ filter: { _id: 1 }
70
+ update: { $inc: { x: 1 } }
71
+ returnDocument: After
72
+ expectResult: { _id: 1, x: 13 }
73
+ - name: find
74
+ object: collection0
75
+ arguments:
76
+ filter: { _id: 1 }
77
+ expectResult:
78
+ - { _id: 1, x: 13 }
79
+ - name: find
80
+ object: collection0
81
+ arguments:
82
+ session: session0
83
+ filter: { _id: 1 }
84
+ expectResult:
85
+ - {_id: 1, x: 11}
86
+ - name: find
87
+ object: collection0
88
+ arguments:
89
+ session: session1
90
+ filter: { _id: 1 }
91
+ expectResult:
92
+ - {_id: 1, x: 12}
93
+ expectEvents:
94
+ - client: client0
95
+ events:
96
+ - commandStartedEvent:
97
+ command:
98
+ find: collection0
99
+ readConcern:
100
+ level: snapshot
101
+ atClusterTime:
102
+ "$$exists": false
103
+ - commandStartedEvent:
104
+ command:
105
+ find: collection0
106
+ readConcern:
107
+ level: snapshot
108
+ atClusterTime:
109
+ "$$exists": false
110
+ - commandStartedEvent:
111
+ command:
112
+ find: collection0
113
+ readConcern:
114
+ "$$exists": false
115
+ - commandStartedEvent:
116
+ command:
117
+ find: collection0
118
+ readConcern:
119
+ level: snapshot
120
+ atClusterTime:
121
+ "$$exists": true
122
+ - commandStartedEvent:
123
+ command:
124
+ find: collection0
125
+ readConcern:
126
+ level: snapshot
127
+ atClusterTime:
128
+ "$$exists": true
129
+
130
+ - description: Distinct operation with snapshot
131
+ operations:
132
+ - name: distinct
133
+ object: collection0
134
+ arguments:
135
+ fieldName: x
136
+ filter: {}
137
+ session: session0
138
+ expectResult:
139
+ - 11
140
+ - name: findOneAndUpdate
141
+ object: collection0
142
+ arguments:
143
+ filter: { _id: 2 }
144
+ update: { $inc: { x: 1 } }
145
+ returnDocument: After
146
+ expectResult: { _id: 2, x: 12 }
147
+ - name: distinct
148
+ object: collection0
149
+ arguments:
150
+ fieldName: x
151
+ filter: {}
152
+ session: session1
153
+ expectResult: [11, 12]
154
+ - name: findOneAndUpdate
155
+ object: collection0
156
+ arguments:
157
+ filter: { _id: 2 }
158
+ update: { $inc: { x: 1 } }
159
+ returnDocument: After
160
+ expectResult: { _id: 2, x: 13 }
161
+ - name: distinct
162
+ object: collection0
163
+ arguments:
164
+ fieldName: x
165
+ filter: {}
166
+ expectResult: [ 11, 13 ]
167
+ - name: distinct
168
+ object: collection0
169
+ arguments:
170
+ fieldName: x
171
+ filter: {}
172
+ session: session0
173
+ expectResult: [ 11 ]
174
+ - name: distinct
175
+ object: collection0
176
+ arguments:
177
+ fieldName: x
178
+ filter: {}
179
+ session: session1
180
+ expectResult: [ 11, 12 ]
181
+ expectEvents:
182
+ - client: client0
183
+ events:
184
+ - commandStartedEvent:
185
+ command:
186
+ distinct: collection0
187
+ readConcern:
188
+ level: snapshot
189
+ atClusterTime:
190
+ "$$exists": false
191
+ - commandStartedEvent:
192
+ command:
193
+ distinct: collection0
194
+ readConcern:
195
+ level: snapshot
196
+ atClusterTime:
197
+ "$$exists": false
198
+ - commandStartedEvent:
199
+ command:
200
+ distinct: collection0
201
+ readConcern:
202
+ "$$exists": false
203
+ - commandStartedEvent:
204
+ command:
205
+ distinct: collection0
206
+ readConcern:
207
+ level: snapshot
208
+ atClusterTime:
209
+ "$$exists": true
210
+ - commandStartedEvent:
211
+ command:
212
+ distinct: collection0
213
+ readConcern:
214
+ level: snapshot
215
+ atClusterTime:
216
+ "$$exists": true
217
+
218
+ - description: Aggregate operation with snapshot
219
+ operations:
220
+ - name: aggregate
221
+ object: collection0
222
+ arguments:
223
+ pipeline:
224
+ - "$match": { _id: 1 }
225
+ session: session0
226
+ expectResult:
227
+ - { _id: 1, x: 11 }
228
+ - name: findOneAndUpdate
229
+ object: collection0
230
+ arguments:
231
+ filter: { _id: 1 }
232
+ update: { $inc: { x: 1 } }
233
+ returnDocument: After
234
+ expectResult: { _id: 1, x: 12 }
235
+ - name: aggregate
236
+ object: collection0
237
+ arguments:
238
+ pipeline:
239
+ - "$match":
240
+ _id: 1
241
+ session: session1
242
+ expectResult:
243
+ - {_id: 1, x: 12}
244
+ - name: findOneAndUpdate
245
+ object: collection0
246
+ arguments:
247
+ filter: { _id: 1 }
248
+ update: { $inc: { x: 1 } }
249
+ returnDocument: After
250
+ expectResult: { _id: 1, x: 13 }
251
+ - name: aggregate
252
+ object: collection0
253
+ arguments:
254
+ pipeline:
255
+ - "$match": { _id: 1 }
256
+ expectResult:
257
+ - { _id: 1, x: 13 }
258
+ - name: aggregate
259
+ object: collection0
260
+ arguments:
261
+ pipeline:
262
+ - "$match":
263
+ _id: 1
264
+ session: session0
265
+ expectResult:
266
+ - { _id: 1, x: 11 }
267
+ - name: aggregate
268
+ object: collection0
269
+ arguments:
270
+ pipeline:
271
+ - "$match": { _id: 1 }
272
+ session: session1
273
+ expectResult:
274
+ - { _id: 1, x: 12 }
275
+ expectEvents:
276
+ - client: client0
277
+ events:
278
+ - commandStartedEvent:
279
+ command:
280
+ aggregate: collection0
281
+ readConcern:
282
+ level: snapshot
283
+ atClusterTime:
284
+ "$$exists": false
285
+ - commandStartedEvent:
286
+ command:
287
+ aggregate: collection0
288
+ readConcern:
289
+ level: snapshot
290
+ atClusterTime:
291
+ "$$exists": false
292
+ - commandStartedEvent:
293
+ command:
294
+ aggregate: collection0
295
+ readConcern:
296
+ "$$exists": false
297
+ - commandStartedEvent:
298
+ command:
299
+ aggregate: collection0
300
+ readConcern:
301
+ level: snapshot
302
+ atClusterTime:
303
+ "$$exists": true
304
+ - commandStartedEvent:
305
+ command:
306
+ aggregate: collection0
307
+ readConcern:
308
+ level: snapshot
309
+ atClusterTime:
310
+ "$$exists": true
311
+
312
+ - description: countDocuments operation with snapshot
313
+ operations:
314
+ - name: countDocuments
315
+ object: collection0
316
+ arguments:
317
+ filter: {}
318
+ session: session0
319
+ expectResult: 2
320
+ - name: countDocuments
321
+ object: collection0
322
+ arguments:
323
+ filter: {}
324
+ session: session0
325
+ expectResult: 2
326
+ expectEvents:
327
+ - client: client0
328
+ events:
329
+ - commandStartedEvent:
330
+ command:
331
+ aggregate: collection0
332
+ readConcern:
333
+ level: snapshot
334
+ atClusterTime:
335
+ "$$exists": false
336
+ - commandStartedEvent:
337
+ command:
338
+ aggregate: collection0
339
+ readConcern:
340
+ level: snapshot
341
+ atClusterTime:
342
+ "$$exists": true
343
+
344
+ - description: Mixed operation with snapshot
345
+ operations:
346
+ - name: find
347
+ object: collection0
348
+ arguments:
349
+ session: session0
350
+ filter: { _id: 1 }
351
+ expectResult:
352
+ - { _id: 1, x: 11 }
353
+ - name: findOneAndUpdate
354
+ object: collection0
355
+ arguments:
356
+ filter: { _id: 1 }
357
+ update: { $inc: { x: 1 } }
358
+ returnDocument: After
359
+ expectResult: { _id: 1, x: 12 }
360
+ - name: find
361
+ object: collection0
362
+ arguments:
363
+ filter: { _id: 1 }
364
+ expectResult:
365
+ - { _id: 1, x: 12 }
366
+ - name: aggregate
367
+ object: collection0
368
+ arguments:
369
+ pipeline:
370
+ - "$match":
371
+ _id: 1
372
+ session: session0
373
+ expectResult:
374
+ - { _id: 1, x: 11 }
375
+ - name: distinct
376
+ object: collection0
377
+ arguments:
378
+ fieldName: x
379
+ filter: {}
380
+ session: session0
381
+ expectResult: [ 11 ]
382
+ expectEvents:
383
+ - client: client0
384
+ events:
385
+ - commandStartedEvent:
386
+ command:
387
+ find: collection0
388
+ readConcern:
389
+ level: snapshot
390
+ atClusterTime:
391
+ "$$exists": false
392
+ - commandStartedEvent:
393
+ command:
394
+ find: collection0
395
+ readConcern:
396
+ "$$exists": false
397
+ - commandStartedEvent:
398
+ command:
399
+ aggregate: collection0
400
+ readConcern:
401
+ level: snapshot
402
+ atClusterTime:
403
+ "$$exists": true
404
+ - commandStartedEvent:
405
+ command:
406
+ distinct: collection0
407
+ readConcern:
408
+ level: snapshot
409
+ atClusterTime:
410
+ "$$exists": true
411
+
412
+ - description: Write commands with snapshot session do not affect snapshot reads
413
+ operations:
414
+ - name: find
415
+ object: collection0
416
+ arguments:
417
+ filter: {}
418
+ session: session0
419
+ - name: insertOne
420
+ object: collection0
421
+ arguments:
422
+ document:
423
+ _id: 22
424
+ x: 33
425
+ - name: updateOne
426
+ object: collection0
427
+ arguments:
428
+ filter: { _id: 1 }
429
+ update: { $inc: { x: 1 } }
430
+ - name: find
431
+ object: collection0
432
+ arguments:
433
+ filter: { _id: 1 }
434
+ session: session0
435
+ expectResult:
436
+ - {_id: 1, x: 11}
437
+ expectEvents:
438
+ - client: client0
439
+ events:
440
+ - commandStartedEvent:
441
+ command:
442
+ find: collection0
443
+ readConcern:
444
+ level: snapshot
445
+ atClusterTime:
446
+ "$$exists": false
447
+ - commandStartedEvent:
448
+ command:
449
+ find: collection0
450
+ readConcern:
451
+ level: snapshot
452
+ atClusterTime:
453
+ "$$exists": true
454
+
455
+ - description: First snapshot read does not send atClusterTime
456
+ operations:
457
+ - name: find
458
+ object: collection0
459
+ arguments:
460
+ filter: {}
461
+ session: session0
462
+ expectEvents:
463
+ - client: client0
464
+ events:
465
+ - commandStartedEvent:
466
+ command:
467
+ find: collection0
468
+ readConcern:
469
+ level: snapshot
470
+ atClusterTime:
471
+ "$$exists": false
472
+ commandName: find
473
+ databaseName: database0
474
+
475
+ - description: StartTransaction fails in snapshot session
476
+ operations:
477
+ - name: startTransaction
478
+ object: session0
479
+ expectError:
480
+ isError: true
481
+ isClientError: true
482
+ errorContains: Transactions are not supported in snapshot sessions
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ require 'runners/unified'
7
+
8
+ base = "#{CURRENT_PATH}/spec_tests/data/sessions_unified"
9
+ SESSIONS_UNIFIED_TESTS = Dir.glob("#{base}/**/*.yml").sort
10
+
11
+ describe 'Sessions unified spec tests' do
12
+ define_unified_spec_tests(base, SESSIONS_UNIFIED_TESTS)
13
+ end
data.tar.gz.sig CHANGED
Binary file