24
24
25
25
from bson .py3compat import MAXSIZE
26
26
from bson .son import SON
27
- from pymongo .errors import ConfigurationError
27
+ from pymongo .errors import ConfigurationError , OperationFailure
28
28
from pymongo .message import _maybe_add_read_preference
29
29
from pymongo .mongo_client import MongoClient
30
30
from pymongo .read_preferences import (ReadPreference , MovingAverage ,
@@ -446,6 +446,77 @@ def test_moving_average(self):
446
446
447
447
class TestMongosAndReadPreference (unittest .TestCase ):
448
448
449
+ def test_read_preference_document (self ):
450
+
451
+ pref = Primary ()
452
+ self .assertEqual (
453
+ pref .document ,
454
+ {'mode' : 'primary' })
455
+
456
+ pref = PrimaryPreferred ()
457
+ self .assertEqual (
458
+ pref .document ,
459
+ {'mode' : 'primaryPreferred' })
460
+ pref = PrimaryPreferred (tag_sets = [{'dc' : 'sf' }])
461
+ self .assertEqual (
462
+ pref .document ,
463
+ {'mode' : 'primaryPreferred' , 'tags' : [{'dc' : 'sf' }]})
464
+ pref = PrimaryPreferred (
465
+ tag_sets = [{'dc' : 'sf' }], max_staleness = 30 )
466
+ self .assertEqual (
467
+ pref .document ,
468
+ {'mode' : 'primaryPreferred' ,
469
+ 'tags' : [{'dc' : 'sf' }],
470
+ 'maxStalenessMS' : 30000 })
471
+
472
+ pref = Secondary ()
473
+ self .assertEqual (
474
+ pref .document ,
475
+ {'mode' : 'secondary' })
476
+ pref = Secondary (tag_sets = [{'dc' : 'sf' }])
477
+ self .assertEqual (
478
+ pref .document ,
479
+ {'mode' : 'secondary' , 'tags' : [{'dc' : 'sf' }]})
480
+ pref = Secondary (
481
+ tag_sets = [{'dc' : 'sf' }], max_staleness = 30 )
482
+ self .assertEqual (
483
+ pref .document ,
484
+ {'mode' : 'secondary' ,
485
+ 'tags' : [{'dc' : 'sf' }],
486
+ 'maxStalenessMS' : 30000 })
487
+
488
+ pref = SecondaryPreferred ()
489
+ self .assertEqual (
490
+ pref .document ,
491
+ {'mode' : 'secondaryPreferred' })
492
+ pref = SecondaryPreferred (tag_sets = [{'dc' : 'sf' }])
493
+ self .assertEqual (
494
+ pref .document ,
495
+ {'mode' : 'secondaryPreferred' , 'tags' : [{'dc' : 'sf' }]})
496
+ pref = SecondaryPreferred (
497
+ tag_sets = [{'dc' : 'sf' }], max_staleness = 30 )
498
+ self .assertEqual (
499
+ pref .document ,
500
+ {'mode' : 'secondaryPreferred' ,
501
+ 'tags' : [{'dc' : 'sf' }],
502
+ 'maxStalenessMS' : 30000 })
503
+
504
+ pref = Nearest ()
505
+ self .assertEqual (
506
+ pref .document ,
507
+ {'mode' : 'nearest' })
508
+ pref = Nearest (tag_sets = [{'dc' : 'sf' }])
509
+ self .assertEqual (
510
+ pref .document ,
511
+ {'mode' : 'nearest' , 'tags' : [{'dc' : 'sf' }]})
512
+ pref = Nearest (
513
+ tag_sets = [{'dc' : 'sf' }], max_staleness = 30 )
514
+ self .assertEqual (
515
+ pref .document ,
516
+ {'mode' : 'nearest' ,
517
+ 'tags' : [{'dc' : 'sf' }],
518
+ 'maxStalenessMS' : 30000 })
519
+
449
520
def test_maybe_add_read_preference (self ):
450
521
451
522
# Primary doesn't add $readPreference
@@ -470,12 +541,17 @@ def test_maybe_add_read_preference(self):
470
541
self .assertEqual (
471
542
out , SON ([("$query" , {}), ("$readPreference" , pref .document )]))
472
543
473
- # SecondaryPreferred without tag_sets doesn't add $readPreference
544
+ # SecondaryPreferred without tag_sets or max_staleness doesn't add
545
+ # $readPreference
474
546
pref = SecondaryPreferred ()
475
547
out = _maybe_add_read_preference ({}, pref )
476
548
self .assertEqual (out , {})
477
549
pref = SecondaryPreferred (tag_sets = [{'dc' : 'nyc' }])
478
550
out = _maybe_add_read_preference ({}, pref )
551
+ self .assertEqual (
552
+ out , SON ([("$query" , {}), ("$readPreference" , pref .document )]))
553
+ pref = SecondaryPreferred (max_staleness = 120 )
554
+ out = _maybe_add_read_preference ({}, pref )
479
555
self .assertEqual (
480
556
out , SON ([("$query" , {}), ("$readPreference" , pref .document )]))
481
557
@@ -533,6 +609,39 @@ def test_mongos(self):
533
609
self .assertEqual (first_id , results [- 1 ]["_id" ])
534
610
self .assertEqual (last_id , results [0 ]["_id" ])
535
611
612
+ @client_context .require_mongos
613
+ @client_context .require_version_min (3 , 3 , 12 )
614
+ def test_mongos_max_staleness (self ):
615
+ # Sanity check that we're sending maxStalenessMS
616
+ coll = client_context .client .pymongo_test .get_collection (
617
+ "test" , read_preference = SecondaryPreferred (max_staleness = 120 ))
618
+ # No error
619
+ coll .find_one ()
620
+
621
+ coll = client_context .client .pymongo_test .get_collection (
622
+ "test" , read_preference = SecondaryPreferred (max_staleness = 10 ))
623
+ try :
624
+ coll .find_one ()
625
+ except OperationFailure as exc :
626
+ self .assertEqual (160 , exc .code )
627
+ else :
628
+ self .fail ("mongos accepted invalid staleness" )
629
+
630
+ coll = single_client (
631
+ readPreference = 'secondaryPreferred' ,
632
+ maxStalenessMS = 120000 ).pymongo_test .test
633
+ # No error
634
+ coll .find_one ()
635
+
636
+ coll = single_client (
637
+ readPreference = 'secondaryPreferred' ,
638
+ maxStalenessMS = 10000 ).pymongo_test .test
639
+ try :
640
+ coll .find_one ()
641
+ except OperationFailure as exc :
642
+ self .assertEqual (160 , exc .code )
643
+ else :
644
+ self .fail ("mongos accepted invalid staleness" )
536
645
537
646
if __name__ == "__main__" :
538
647
unittest .main ()
0 commit comments