Skip to content

Commit

Permalink
#1123 move socket cleanup code to the server, fixes dangling sockets …
Browse files Browse the repository at this point in the history
…on exit caused by r22665

git-svn-id: https://xpra.org/svn/Xpra/trunk@22674 3bb7dfac-3a0b-4e04-842a-767bc560f471
  • Loading branch information
totaam committed May 9, 2019
1 parent ec68f1c commit a7980dd
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 19 deletions.
15 changes: 7 additions & 8 deletions src/xpra/scripts/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,8 @@ def add_mdns(mdns_recs, socktype, host_str, port):

def create_sockets(opts, error_cb):
from xpra.server.socket_util import (
parse_bind_ip, parse_bind_vsock, get_network_logger, setup_tcp_socket, setup_udp_socket, setup_vsock_socket,
parse_bind_ip, parse_bind_vsock, get_network_logger,
setup_tcp_socket, setup_udp_socket, setup_vsock_socket, setup_sd_listen_socket,
)
log = get_network_logger()

Expand Down Expand Up @@ -493,13 +494,13 @@ def add_udp_socket(socktype, host_str, iport):
if POSIX:
try:
from xpra.platform.xposix.sd_listen import get_sd_listen_sockets
except ImportError:
pass
except ImportError as e:
log("no systemd socket activation: %s", e)
else:
sd_sockets = get_sd_listen_sockets()
log("systemd sockets: %s", sd_sockets)
for stype, socket, addr in sd_sockets:
sockets.append((stype, socket, addr))
sockets.append(setup_sd_listen_socket(stype, socket, addr))
log("%s : %s", (stype, [addr]), socket)
if stype=="tcp":
host, iport = addr
Expand Down Expand Up @@ -961,10 +962,8 @@ def noerr(fn, *args):
ssh_port = get_ssh_port()
ssh_access = ssh_port>0 and opts.ssh.lower().strip() not in FALSE_OPTIONS
for socktype, socket, sockpath, cleanup_socket in local_sockets:
#ie: ("unix-domain", sock, sockpath), cleanup_socket
sockets.append((socktype, socket, sockpath))
sockets.append((socktype, socket, sockpath, cleanup_socket))
netlog("%s %s : %s", socktype, sockpath, socket)
add_cleanup(cleanup_socket)
if opts.mdns and ssh_access:
netlog("ssh %s:%s : %s", "", ssh_port, socket)
add_mdns(mdns_recs, "ssh", "", ssh_port)
Expand Down Expand Up @@ -1010,6 +1009,7 @@ def noerr(fn, *args):
app.init_virtual_devices(devices)

try:
app.init_sockets(sockets)
app._ssl_wrap_socket = wrap_socket_fn
app.init_dbus(dbus_pid, dbus_env)
if xvfb_pid or clobber:
Expand Down Expand Up @@ -1053,7 +1053,6 @@ def noerr(fn, *args):
del opts

log("%s(%s)", app.init_sockets, sockets)
app.init_sockets(sockets)
log("%s(%s)", app.init_when_ready, _when_ready)
app.init_when_ready(_when_ready)

Expand Down
2 changes: 1 addition & 1 deletion src/xpra/server/mixins/fileprint_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def threaded_setup(self):

def init_sockets(self, sockets):
#verify we have a local socket for printing:
unixsockets = [info for socktype, _, info in sockets if socktype=="unix-domain"]
unixsockets = [info for socktype, _, info, _ in sockets if socktype=="unix-domain"]
printlog("local unix domain sockets we can use for printing: %s", unixsockets)
if not unixsockets and self.file_transfer.printing:
if not WIN32:
Expand Down
22 changes: 18 additions & 4 deletions src/xpra/server/server_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ def server_ready(self):
return True

def server_init(self):
pass
self.start_listen_sockets()

def setup(self):
self.init_packet_handlers()
Expand Down Expand Up @@ -397,6 +397,7 @@ def cleanup(self):
self.cleanup_protocols(protocols, reason, True)
self._potential_protocols = []
self.cleanup_udp_listeners()
self.cleanup_sockets()
self.cleanup_dbus_server()
if not self._upgrading:
self.stop_dbus_server()
Expand All @@ -406,6 +407,17 @@ def do_cleanup(self):
sleep(0.1)


def cleanup_sockets(self):
si = self._socket_info
self._socket_info = ()
for socktype, _, info, cleanup in si:
log("cleanup_sockets() calling %s for %s %s", cleanup, socktype, info)
try:
cleanup()
except Exception:
log("cleanup error on %s", cleanup, exc_info=True)


######################################################################
# dbus:
def init_dbus(self, dbus_pid, dbus_env):
Expand Down Expand Up @@ -676,9 +688,11 @@ def print_screen_info(self):
# sockets / connections / packets:
def init_sockets(self, sockets):
self._socket_info = sockets

def start_listen_sockets(self):
### All right, we're ready to accept customers:
for socktype, sock, info in sockets:
netlog("init_sockets(%s) will add %s socket %s (%s)", sockets, socktype, sock, info)
for socktype, sock, info, _ in self._socket_info:
netlog("init_sockets(%s) will add %s socket %s (%s)", self._socket_info, socktype, sock, info)
self.socket_info[sock] = info
self.idle_add(self.add_listen_socket, socktype, sock)
if socktype=="unix-domain" and info:
Expand Down Expand Up @@ -1909,7 +1923,7 @@ def get_packet_handlers_info(self):

def get_socket_info(self):
si = {}
for socktype, _, info in self._socket_info:
for socktype, _, info, _ in self._socket_info:
if info:
si.setdefault(socktype, {}).setdefault("listeners", []).append(info)
for socktype, auth_classes in self.auth_classes.items():
Expand Down
19 changes: 13 additions & 6 deletions src/xpra/server/socket_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,12 +128,11 @@ def cleanup_tcp_socket():
tcp_socket.close()
except (OSError, IOError):
pass
add_cleanup(cleanup_tcp_socket)
if iport==0:
iport = tcp_socket.getsockname()[1]
log.info("allocated %s port %i on %s", socktype, iport, host)
log("%s: %s:%s : %s", socktype, host, iport, socket)
return socktype, tcp_socket, (host, iport)
return socktype, tcp_socket, (host, iport), cleanup_tcp_socket

def create_udp_socket(host, iport):
if host.find(":")<0:
Expand All @@ -160,12 +159,11 @@ def cleanup_udp_socket():
udp_socket.close()
except (OSError, IOError):
pass
add_cleanup(cleanup_udp_socket)
if iport==0:
iport = udp_socket.getsockname()[1]
log.info("allocated UDP port %i for %s", iport, host)
log("%s: %s:%s : %s", socktype, host, iport, socket)
return socktype, udp_socket, (host, iport)
return socktype, udp_socket, (host, iport), cleanup_udp_socket


def parse_bind_ip(bind_ip, default_port=DEFAULT_PORT):
Expand Down Expand Up @@ -203,8 +201,7 @@ def cleanup_vsock_socket():
vsock_socket.close()
except (OSError, IOError):
pass
add_cleanup(cleanup_vsock_socket)
return "vsock", vsock_socket, (cid, iport)
return "vsock", vsock_socket, (cid, iport), cleanup_vsock_socket

def parse_bind_vsock(bind_vsock):
vsock_sockets = set()
Expand All @@ -214,6 +211,16 @@ def parse_bind_vsock(bind_vsock):
vsock_sockets.add(parse_vsock(spec))
return vsock_sockets

def setup_sd_listen_socket(stype, sock, addr):
log = get_network_logger()
def cleanup_sd_listen_socket():
log.info("closing sd listen socket %s", addr)
try:
sock.close()
except (OSError, IOError):
pass
return stype, sock, addr, cleanup_sd_listen_socket


def normalize_local_display_name(local_display_name):
pos = local_display_name.find(":")
Expand Down
1 change: 1 addition & 0 deletions src/xpra/x11/x11_server_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ def server_init(self):
if server_features.windows:
from xpra.x11.x11_window_filters import init_x11_window_filters
init_x11_window_filters()
super(X11ServerCore, self).server_init()

def do_init(self, opts):
self.randr = opts.resize_display
Expand Down

0 comments on commit a7980dd

Please sign in to comment.