Skip to content

Commit

Permalink
Fix route problem when both service listening 0.0.0.0:port calling ea…
Browse files Browse the repository at this point in the history
…ch other

Two services on different hosts both listen on 0.0.0.0:port,
xoscar.actor_ref(remote_addr:port) will return unexpected LocalActorRef.

log print in context.actor_ref(address=remote_addr:port)

    actor_ref ActorRef(uid=b'supervisor', address='remote_addr:port')
    _call remote_addr:port
    get client remote_addr:port
    got LocalActorRef(uid=None, address='0.0.0.0:port'), actor_weakref=<weakref at 0x75745bcdecf0; to 'CloudSupervisorActor' at 0x75745d3ed260>
    fix_all_zero_ip()
    got LocalActorRef(uid=None, address='remote_addr:port'), actor_weakref=<weakref at 0x75745bcdecf0; to 'CloudSupervisorActor' at 0x75745d3ed260>

using the returned LocalActorRef, method call intended for remote service actually sent to local service.

The solution is simple, during pool initialization, do not register_local_pool if address is all zero.
  • Loading branch information
frostyplanet committed Aug 20, 2024
1 parent 2cf2174 commit bb150cd
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
7 changes: 5 additions & 2 deletions python/xoscar/backends/pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
ServerClosed,
)
from ..metrics import init_metrics
from ..utils import implements, register_asyncio_task_timeout_detector
from ..utils import implements, is_zero_ip, register_asyncio_task_timeout_detector
from .allocate_strategy import AddressSpecified, allocated_type
from .communication import (
Channel,
Expand Down Expand Up @@ -164,7 +164,10 @@ def __init__(
):
# register local pool for local actor lookup.
# The pool is weakrefed, so we don't need to unregister it.
register_local_pool(external_address, self)
if not is_zero_ip(external_address):
# Only register_local_pool when we listen on non-zero ip (because all-zero ip is wildcard address),
# avoid mistaken with another remote service listen on non-zero ip with the same port.
register_local_pool(external_address, self)
self.process_index = process_index
self.label = label
self.external_address = external_address
Expand Down
4 changes: 4 additions & 0 deletions python/xoscar/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,10 @@ def is_v6_zero_ip(ip_port_addr: str) -> bool:
return True


def is_zero_ip(ip_port_addr: str) -> bool:
return is_v4_zero_ip(ip_port_addr) or is_v6_zero_ip(ip_port_addr)


def is_v6_ip(ip_port_addr: str) -> bool:
arr = ip_port_addr.split("://", 1)[-1].split(":")
return len(arr) > 1
Expand Down

0 comments on commit bb150cd

Please sign in to comment.