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)

Reply via email to