| 59 | |
| 60 | |
| 61 | class Server: |
| 62 | def __init__( |
| 63 | self, |
| 64 | server_description: ServerDescription, |
| 65 | pool: Pool, |
| 66 | monitor: Monitor, |
| 67 | topology_id: Optional[ObjectId] = None, |
| 68 | listeners: Optional[_EventListeners] = None, |
| 69 | events: Optional[ReferenceType[Queue[Any]]] = None, |
| 70 | ) -> None: |
| 71 | """Represent one MongoDB server.""" |
| 72 | self._description = server_description |
| 73 | self._pool = pool |
| 74 | self._monitor = monitor |
| 75 | self._topology_id = topology_id |
| 76 | self._publish = listeners is not None and listeners.enabled_for_server |
| 77 | self._listener = listeners |
| 78 | self._events = None |
| 79 | if self._publish: |
| 80 | self._events = events() # type: ignore[misc] |
| 81 | |
| 82 | def open(self) -> None: |
| 83 | """Start monitoring, or restart after a fork. |
| 84 | |
| 85 | Multiple calls have no effect. |
| 86 | """ |
| 87 | if not self._pool.opts.load_balanced: |
| 88 | self._monitor.open() |
| 89 | |
| 90 | def reset(self, service_id: Optional[ObjectId] = None) -> None: |
| 91 | """Clear the connection pool.""" |
| 92 | self.pool.reset(service_id) |
| 93 | |
| 94 | def close(self) -> None: |
| 95 | """Clear the connection pool and stop the monitor. |
| 96 | |
| 97 | Reconnect with open(). |
| 98 | """ |
| 99 | if self._publish: |
| 100 | assert self._listener is not None |
| 101 | assert self._events is not None |
| 102 | self._events.put( |
| 103 | ( |
| 104 | self._listener.publish_server_closed, |
| 105 | (self._description.address, self._topology_id), |
| 106 | ) |
| 107 | ) |
| 108 | if _SDAM_LOGGER.isEnabledFor(logging.DEBUG): |
| 109 | _debug_log( |
| 110 | _SDAM_LOGGER, |
| 111 | message=_SDAMStatusMessage.STOP_SERVER, |
| 112 | topologyId=self._topology_id, |
| 113 | serverHost=self._description.address[0], |
| 114 | serverPort=self._description.address[1], |
| 115 | ) |
| 116 | |
| 117 | self._monitor.close() |
| 118 | self._pool.close() |
no outgoing calls