[PD] Fix ZMQ stale socket reconnection in PD disaggregation (#27796)
Signed-off-by: Shangming Cai <csmthu@gmail.com> Co-authored-by: Abatom <abzhonghua@gmail.com>
This commit is contained in:
@@ -710,6 +710,15 @@ class CommonKVManager(BaseKVManager):
|
|||||||
keys_to_remove = [
|
keys_to_remove = [
|
||||||
k for k in self.connection_pool if k.startswith(failed_bootstrap_addr)
|
k for k in self.connection_pool if k.startswith(failed_bootstrap_addr)
|
||||||
]
|
]
|
||||||
|
# Collect TCP endpoints from cached bootstrap_infos before deletion
|
||||||
|
stale_endpoints = set()
|
||||||
|
for k in keys_to_remove:
|
||||||
|
for info in self.connection_pool[k]:
|
||||||
|
ip = info.get("rank_ip")
|
||||||
|
port = info.get("rank_port")
|
||||||
|
if ip and port:
|
||||||
|
na = NetworkAddress(ip, int(port))
|
||||||
|
stale_endpoints.add(na.to_tcp())
|
||||||
for k in keys_to_remove:
|
for k in keys_to_remove:
|
||||||
del self.connection_pool[k]
|
del self.connection_pool[k]
|
||||||
self.prefill_info_table.pop(failed_bootstrap_addr, None)
|
self.prefill_info_table.pop(failed_bootstrap_addr, None)
|
||||||
@@ -719,6 +728,9 @@ class CommonKVManager(BaseKVManager):
|
|||||||
)
|
)
|
||||||
self.addr_to_rooms_tracker.pop(failed_bootstrap_addr, None)
|
self.addr_to_rooms_tracker.pop(failed_bootstrap_addr, None)
|
||||||
|
|
||||||
|
for endpoint in stale_endpoints:
|
||||||
|
CommonKVReceiver.disconnect_endpoint(endpoint)
|
||||||
|
|
||||||
affected_rooms = []
|
affected_rooms = []
|
||||||
for room in possible_affected_rooms:
|
for room in possible_affected_rooms:
|
||||||
if (
|
if (
|
||||||
@@ -1082,6 +1094,19 @@ class CommonKVReceiver(BaseKVReceiver):
|
|||||||
cls._socket_locks[endpoint] = threading.Lock()
|
cls._socket_locks[endpoint] = threading.Lock()
|
||||||
return cls._socket_cache[endpoint], cls._socket_locks[endpoint]
|
return cls._socket_cache[endpoint], cls._socket_locks[endpoint]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def disconnect_endpoint(cls, endpoint: str):
|
||||||
|
with cls._global_lock:
|
||||||
|
sock = cls._socket_cache.pop(endpoint, None)
|
||||||
|
lock = cls._socket_locks.pop(endpoint, None)
|
||||||
|
if sock:
|
||||||
|
if lock:
|
||||||
|
with lock:
|
||||||
|
sock.close()
|
||||||
|
else:
|
||||||
|
sock.close()
|
||||||
|
logger.debug(f"Disconnected stale ZMQ PUSH socket (receiver): {endpoint}")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _connect_to_bootstrap_server(cls, bootstrap_info: dict):
|
def _connect_to_bootstrap_server(cls, bootstrap_info: dict):
|
||||||
ip_address = bootstrap_info["rank_ip"]
|
ip_address = bootstrap_info["rank_ip"]
|
||||||
|
|||||||
@@ -1651,37 +1651,6 @@ class MooncakeKVManager(CommonKVManager):
|
|||||||
):
|
):
|
||||||
self._run_one_probe_pass()
|
self._run_one_probe_pass()
|
||||||
|
|
||||||
def _handle_node_failure(self, failed_bootstrap_addr):
|
|
||||||
with self.connection_lock:
|
|
||||||
keys_to_remove = [
|
|
||||||
k for k in self.connection_pool if k.startswith(failed_bootstrap_addr)
|
|
||||||
]
|
|
||||||
for k in keys_to_remove:
|
|
||||||
del self.connection_pool[k]
|
|
||||||
|
|
||||||
possible_affected_rooms = self.addr_to_rooms_tracker.get(
|
|
||||||
failed_bootstrap_addr, []
|
|
||||||
)
|
|
||||||
self.prefill_info_table.pop(failed_bootstrap_addr, None)
|
|
||||||
self.addr_to_rooms_tracker.pop(failed_bootstrap_addr, None)
|
|
||||||
|
|
||||||
# Report the requests associated with the failed bootstrap addr and mark their status as KVPoll.Failed
|
|
||||||
affected_rooms = []
|
|
||||||
for room in possible_affected_rooms:
|
|
||||||
if (
|
|
||||||
room in self.request_status
|
|
||||||
and self.check_status(room) != KVPoll.Success
|
|
||||||
):
|
|
||||||
self.record_failure(
|
|
||||||
room,
|
|
||||||
f"Losing connection with prefill instance (bootstrap_addr: {failed_bootstrap_addr})",
|
|
||||||
)
|
|
||||||
self.update_status(room, KVPoll.Failed)
|
|
||||||
affected_rooms.append(room)
|
|
||||||
logger.error(
|
|
||||||
f"Losing connection with prefill instance (bootstrap_addr: {failed_bootstrap_addr}), {len(affected_rooms)} requests affected"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class MooncakeKVSender(CommonKVSender):
|
class MooncakeKVSender(CommonKVSender):
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user