async def run(self): sock = socket.socket() if SOCKET_REUSE_PORT_ENABLED: set_socket_reuse_port(sock) try: sock.bind((self.host, self.port)) except OSError: # The OS failed to bind a socket to the given host and port. raise ValueError( f"""Failed to bind Ray Serve HTTP proxy to '{self.host}:{self.port}'. Please make sure your http-host and http-port are specified correctly.""") # Note(simon): we have to use lower level uvicorn Config and Server # class because we want to run the server as a coroutine. The only # alternative is to call uvicorn.run which is blocking. config = uvicorn.Config( self.wrapped_app, host=self.host, port=self.port, root_path=self.root_path, lifespan="off", access_log=False, ) server = uvicorn.Server(config=config) # TODO(edoakes): we need to override install_signal_handlers here # because the existing implementation fails if it isn't running in # the main thread and uvicorn doesn't expose a way to configure it. server.install_signal_handlers = lambda: None self.setup_complete.set() await server.serve(sockets=[sock])
def test_set_socket_reuse_port(): sock = socket.socket() if hasattr(socket, "SO_REUSEPORT"): # If the flag exists, we should be able to to use it assert set_socket_reuse_port(sock) elif sys.platform == "linux": # If the flag doesn't exist, but we are only mordern version # of linux, we should be able to force set this flag. assert set_socket_reuse_port(sock) else: # Otherwise, it should graceful fail without exception. assert not set_socket_reuse_port(sock)
def _reuse_port_is_available(): sock = socket.socket() return set_socket_reuse_port(sock)