15
15
"""Represent a deployment of MongoDB servers."""
16
16
17
17
from random import sample
18
- from typing import Any , Callable , Dict , List , NamedTuple , Optional , Tuple
18
+ from typing import (
19
+ Any ,
20
+ Callable ,
21
+ Dict ,
22
+ List ,
23
+ Mapping ,
24
+ MutableMapping ,
25
+ NamedTuple ,
26
+ Optional ,
27
+ Tuple ,
28
+ cast ,
29
+ )
19
30
20
31
from bson .min_key import MinKey
21
32
from bson .objectid import ObjectId
@@ -99,7 +110,7 @@ def __init__(
99
110
s .logical_session_timeout_minutes for s in readable_servers
100
111
)
101
112
102
- def _init_incompatible_err (self ):
113
+ def _init_incompatible_err (self ) -> None :
103
114
"""Internal compatibility check for non-load balanced topologies."""
104
115
for s in self ._server_descriptions .values ():
105
116
if not s .is_server_type_known :
@@ -253,14 +264,16 @@ def heartbeat_frequency(self) -> int:
253
264
def srv_max_hosts (self ) -> int :
254
265
return self ._topology_settings ._srv_max_hosts
255
266
256
- def _apply_local_threshold (self , selection ) :
267
+ def _apply_local_threshold (self , selection : Optional [ Selection ]) -> List [ ServerDescription ] :
257
268
if not selection :
258
269
return []
259
270
# Round trip time in seconds.
260
- fastest = min (s .round_trip_time for s in selection .server_descriptions )
271
+ fastest = min (cast ( float , s .round_trip_time ) for s in selection .server_descriptions )
261
272
threshold = self ._topology_settings .local_threshold_ms / 1000.0
262
273
return [
263
- s for s in selection .server_descriptions if (s .round_trip_time - fastest ) <= threshold
274
+ s
275
+ for s in selection .server_descriptions
276
+ if (cast (float , s .round_trip_time ) - fastest ) <= threshold
264
277
]
265
278
266
279
def apply_selector (
@@ -344,7 +357,7 @@ def has_writable_server(self) -> bool:
344
357
"""
345
358
return self .has_readable_server (ReadPreference .PRIMARY )
346
359
347
- def __repr__ (self ):
360
+ def __repr__ (self ) -> str :
348
361
# Sort the servers by address.
349
362
servers = sorted (self ._server_descriptions .values (), key = lambda sd : sd .address )
350
363
return "<{} id: {}, topology_type: {}, servers: {!r}>" .format (
@@ -472,7 +485,9 @@ def updated_topology_description(
472
485
)
473
486
474
487
475
- def _updated_topology_description_srv_polling (topology_description , seedlist ):
488
+ def _updated_topology_description_srv_polling (
489
+ topology_description : TopologyDescription , seedlist : List [Tuple [str , Any ]]
490
+ ) -> TopologyDescription :
476
491
"""Return an updated copy of a TopologyDescription.
477
492
478
493
:Parameters:
@@ -515,8 +530,12 @@ def _updated_topology_description_srv_polling(topology_description, seedlist):
515
530
516
531
517
532
def _update_rs_from_primary (
518
- sds , replica_set_name , server_description , max_set_version , max_election_id
519
- ):
533
+ sds : MutableMapping [_Address , ServerDescription ],
534
+ replica_set_name : Optional [str ],
535
+ server_description : ServerDescription ,
536
+ max_set_version : Optional [int ],
537
+ max_election_id : Optional [ObjectId ],
538
+ ) -> Tuple [int , Optional [str ], Optional [int ], Optional [ObjectId ]]:
520
539
"""Update topology description from a primary's hello response.
521
540
522
541
Pass in a dict of ServerDescriptions, current replica set name, the
@@ -536,8 +555,8 @@ def _update_rs_from_primary(
536
555
return _check_has_primary (sds ), replica_set_name , max_set_version , max_election_id
537
556
538
557
if server_description .max_wire_version is None or server_description .max_wire_version < 17 :
539
- new_election_tuple = server_description .set_version , server_description .election_id
540
- max_election_tuple = max_set_version , max_election_id
558
+ new_election_tuple : Tuple = ( server_description .set_version , server_description .election_id )
559
+ max_election_tuple : Tuple = ( max_set_version , max_election_id )
541
560
if None not in new_election_tuple :
542
561
if None not in max_election_tuple and new_election_tuple < max_election_tuple :
543
562
# Stale primary, set to type Unknown.
@@ -589,7 +608,11 @@ def _update_rs_from_primary(
589
608
return (_check_has_primary (sds ), replica_set_name , max_set_version , max_election_id )
590
609
591
610
592
- def _update_rs_with_primary_from_member (sds , replica_set_name , server_description ):
611
+ def _update_rs_with_primary_from_member (
612
+ sds : MutableMapping [_Address , ServerDescription ],
613
+ replica_set_name : Optional [str ],
614
+ server_description : ServerDescription ,
615
+ ) -> int :
593
616
"""RS with known primary. Process a response from a non-primary.
594
617
595
618
Pass in a dict of ServerDescriptions, current replica set name, and the
@@ -608,7 +631,11 @@ def _update_rs_with_primary_from_member(sds, replica_set_name, server_descriptio
608
631
return _check_has_primary (sds )
609
632
610
633
611
- def _update_rs_no_primary_from_member (sds , replica_set_name , server_description ):
634
+ def _update_rs_no_primary_from_member (
635
+ sds : MutableMapping [_Address , ServerDescription ],
636
+ replica_set_name : Optional [str ],
637
+ server_description : ServerDescription ,
638
+ ) -> Tuple [int , Optional [str ]]:
612
639
"""RS without known primary. Update from a non-primary's response.
613
640
614
641
Pass in a dict of ServerDescriptions, current replica set name, and the
@@ -636,7 +663,7 @@ def _update_rs_no_primary_from_member(sds, replica_set_name, server_description)
636
663
return topology_type , replica_set_name
637
664
638
665
639
- def _check_has_primary (sds ) :
666
+ def _check_has_primary (sds : Mapping [ _Address , ServerDescription ]) -> int :
640
667
"""Current topology type is ReplicaSetWithPrimary. Is primary still known?
641
668
642
669
Pass in a dict of ServerDescriptions.
0 commit comments