41
41
OperationFailure ,
42
42
ServerSelectionTimeoutError ,
43
43
WriteError )
44
+ from pymongo .ismaster import IsMaster
44
45
from pymongo .monitor import SrvMonitor
45
46
from pymongo .monotonic import time as _time
46
47
from pymongo .server import Server
@@ -140,7 +141,8 @@ def target():
140
141
executor .open ()
141
142
142
143
self ._srv_monitor = None
143
- if self ._settings .fqdn is not None :
144
+ if (self ._settings .fqdn is not None and
145
+ not self ._settings .load_balanced ):
144
146
self ._srv_monitor = SrvMonitor (self , self ._settings )
145
147
146
148
def open (self ):
@@ -486,29 +488,38 @@ def pop_all_sessions(self):
486
488
with self ._lock :
487
489
return self ._session_pool .pop_all ()
488
490
489
- def get_server_session (self ):
490
- """Start or resume a server session, or raise ConfigurationError."""
491
- with self ._lock :
492
- session_timeout = self ._description .logical_session_timeout_minutes
493
- if session_timeout is None :
494
- # Maybe we need an initial scan? Can raise ServerSelectionError.
495
- if self ._description .topology_type == TOPOLOGY_TYPE .Single :
496
- if not self ._description .has_known_servers :
497
- self ._select_servers_loop (
498
- any_server_selector ,
499
- self ._settings .server_selection_timeout ,
500
- None )
501
- elif not self ._description .readable_servers :
491
+ def _check_session_support (self ):
492
+ """Internal check for session support on non-load balanced clusters."""
493
+ session_timeout = self ._description .logical_session_timeout_minutes
494
+ if session_timeout is None :
495
+ # Maybe we need an initial scan? Can raise ServerSelectionError.
496
+ if self ._description .topology_type == TOPOLOGY_TYPE .Single :
497
+ if not self ._description .has_known_servers :
502
498
self ._select_servers_loop (
503
- readable_server_selector ,
499
+ any_server_selector ,
504
500
self ._settings .server_selection_timeout ,
505
501
None )
502
+ elif not self ._description .readable_servers :
503
+ self ._select_servers_loop (
504
+ readable_server_selector ,
505
+ self ._settings .server_selection_timeout ,
506
+ None )
506
507
507
508
session_timeout = self ._description .logical_session_timeout_minutes
508
509
if session_timeout is None :
509
510
raise ConfigurationError (
510
511
"Sessions are not supported by this MongoDB deployment" )
512
+ return session_timeout
511
513
514
+ def get_server_session (self ):
515
+ """Start or resume a server session, or raise ConfigurationError."""
516
+ with self ._lock :
517
+ # Sessions are always supported in load balanced mode.
518
+ if not self ._settings .load_balanced :
519
+ session_timeout = self ._check_session_support ()
520
+ else :
521
+ # Sessions never time out in load balanced mode.
522
+ session_timeout = float ('inf' )
512
523
return self ._session_pool .get_server_session (session_timeout )
513
524
514
525
def return_server_session (self , server_session , lock ):
@@ -548,6 +559,12 @@ def _ensure_opened(self):
548
559
SRV_POLLING_TOPOLOGIES ):
549
560
self ._srv_monitor .open ()
550
561
562
+ if self ._settings .load_balanced :
563
+ # Emit initial SDAM events for load balancer mode.
564
+ self ._process_change (ServerDescription (
565
+ self ._seed_addresses [0 ],
566
+ IsMaster ({'ok' : 1 , 'serviceId' : self ._topology_id })))
567
+
551
568
# Ensure that the monitors are open.
552
569
for server in itervalues (self ._servers ):
553
570
server .open ()
@@ -601,15 +618,17 @@ def _handle_error(self, address, err_ctx):
601
618
err_code = error .details .get ('code' , - 1 )
602
619
is_shutting_down = err_code in helpers ._SHUTDOWN_CODES
603
620
# Mark server Unknown, clear the pool, and request check.
604
- self ._process_change (ServerDescription (address , error = error ))
621
+ if not self ._settings .load_balanced :
622
+ self ._process_change (ServerDescription (address , error = error ))
605
623
if is_shutting_down or (err_ctx .max_wire_version <= 7 ):
606
624
# Clear the pool.
607
625
server .reset ()
608
626
server .request_check ()
609
627
elif issubclass (exc_type , ConnectionFailure ):
610
628
# "Client MUST replace the server's description with type Unknown
611
629
# ... MUST NOT request an immediate check of the server."
612
- self ._process_change (ServerDescription (address , error = error ))
630
+ if not self ._settings .load_balanced :
631
+ self ._process_change (ServerDescription (address , error = error ))
613
632
# Clear the pool.
614
633
server .reset ()
615
634
# "When a client marks a server Unknown from `Network error when
@@ -620,7 +639,9 @@ def _handle_error(self, address, err_ctx):
620
639
# Do not request an immediate check since the server is likely
621
640
# shutting down.
622
641
if error .code in helpers ._NOT_MASTER_CODES :
623
- self ._process_change (ServerDescription (address , error = error ))
642
+ if not self ._settings .load_balanced :
643
+ self ._process_change (
644
+ ServerDescription (address , error = error ))
624
645
# Clear the pool.
625
646
server .reset ()
626
647
0 commit comments