This is an automated email from the ASF dual-hosted git repository.
junrushao pushed a commit to branch unity
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/unity by this push:
new c07f67ceda [RPC] Disable socket SO_REUSEADDR for Windows (#15188)
c07f67ceda is described below
commit c07f67ceda1223fa5647e83e910bc51e8b68798f
Author: jzm-intel <[email protected]>
AuthorDate: Sat Jul 1 06:59:38 2023 +0800
[RPC] Disable socket SO_REUSEADDR for Windows (#15188)
This PR fix a RPC issue on Windows by disabling socket SO_REUSEADDR flag.
This flag works as expected on POSIX platforms, but will cause
indeterminated behaviors on Windows sockets.
Reference:
https://learn.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse#using-so_reuseaddr
---
python/tvm/exec/microtvm_debug_shell.py | 8 +++++++-
python/tvm/rpc/server.py | 8 +++++++-
python/tvm/rpc/tracker.py | 8 +++++++-
3 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/python/tvm/exec/microtvm_debug_shell.py
b/python/tvm/exec/microtvm_debug_shell.py
index 576c07e7fe..ba0f8bca82 100644
--- a/python/tvm/exec/microtvm_debug_shell.py
+++ b/python/tvm/exec/microtvm_debug_shell.py
@@ -32,6 +32,7 @@ import argparse
import logging
import socket
import struct
+import sys
import tvm.micro.debugger as _ # NOTE: imported to expose global PackedFuncs
over RPC.
@@ -130,7 +131,12 @@ def main():
importlib.import_module(args.impl, package)
sock = socket.socket(base.get_addr_family([args.host, args.port]),
socket.SOCK_STREAM)
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ # Never set socket SO_REUSEADDR on Windows. The SO_REUSEADDR flag allow
reusing the
+ # inactivate TIME_WATI state sockets on POSIX, but on Windows it will
allow two or more
+ # activate sockets to bind on the same address and port if they all set
SO_REUSEADDR,
+ # and result in indeterminate behavior.
+ if reuse_addr and sys.platform != "win32":
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((args.host, args.port))
sock.listen(1)
bind_addr, bind_port = sock.getsockname()
diff --git a/python/tvm/rpc/server.py b/python/tvm/rpc/server.py
index 5a2ad522eb..d2f0769acf 100644
--- a/python/tvm/rpc/server.py
+++ b/python/tvm/rpc/server.py
@@ -34,6 +34,7 @@ import threading
import multiprocessing
import time
import errno
+import sys
import tvm._ffi
from tvm._ffi.base import py_str
@@ -334,7 +335,12 @@ class PopenRPCServerState(object):
if not is_proxy:
sock = socket.socket(base.get_addr_family((host, port)),
socket.SOCK_STREAM)
- if reuse_addr:
+
+ # Never set socket SO_REUSEADDR on Windows. The SO_REUSEADDR flag
allow reusing the
+ # inactivate TIME_WATI state sockets on POSIX, but on Windows it
will allow two or more
+ # activate sockets to bind on the same address and port if they
all set SO_REUSEADDR,
+ # and result in indeterminate behavior.
+ if reuse_addr and sys.platform != "win32":
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if timeout is not None:
sock.settimeout(timeout)
diff --git a/python/tvm/rpc/tracker.py b/python/tvm/rpc/tracker.py
index 3c8dda55a6..cd32c4a822 100644
--- a/python/tvm/rpc/tracker.py
+++ b/python/tvm/rpc/tracker.py
@@ -49,6 +49,7 @@ import threading
import errno
import struct
import json
+import sys
from tvm.contrib.popen_pool import PopenWorker
try:
@@ -392,7 +393,12 @@ class PopenTrackerServerState(object):
logger.setLevel(logging.WARN)
sock = socket.socket(base.get_addr_family((host, port)),
socket.SOCK_STREAM)
- if reuse_addr:
+
+ # Never set socket SO_REUSEADDR on Windows. The SO_REUSEADDR flag
allow reusing the
+ # inactivate TIME_WATI state sockets on POSIX, but on Windows it will
allow two or more
+ # activate sockets to bind on the same address and port if they all
set SO_REUSEADDR,
+ # and result in indeterminate behavior.
+ if reuse_addr and sys.platform != "win32":
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if timeout is not None:
sock.settimeout(timeout)