Browse Source

qmemman: change process model from forking to single process + sd_notify

Forking daemon after initializing hypervisor connection can cause
problems (and actually does in case of libvirt).
To notify systemd when daemon is ready use notify socket (previously it
was termination of parent process).
Marek Marczykowski 11 years ago
parent
commit
4a4fb5e243
2 changed files with 14 additions and 4 deletions
  1. 1 1
      linux/systemd/qubes-qmemman.service
  2. 13 3
      qmemman/qmemman_server.py

+ 1 - 1
linux/systemd/qubes-qmemman.service

@@ -3,7 +3,7 @@ Description=Qubes memory management daemon
 After=qubes-core.service
 
 [Service]
-Type=forking
+Type=notify
 ExecStart=/usr/lib/qubes/qmemman_daemon.py
 StandardOutput=syslog
 

+ 13 - 3
qmemman/qmemman_server.py

@@ -26,6 +26,7 @@ import time
 import xen.lowlevel.xs
 import sys
 import os
+import socket
 from qmemman import SystemState
 import qmemman_algo
 from ConfigParser import SafeConfigParser
@@ -172,6 +173,15 @@ class QMemmanServer:
         os.umask(0)
         server = SocketServer.UnixStreamServer(SOCK_PATH, QMemmanReqHandler)
         os.umask(077)
-        if os.fork() == 0:
-            thread.start_new_thread(start_server, tuple([server]))
-            XS_Watcher().watch_loop()
+        # notify systemd
+        nofity_socket = os.getenv('NOTIFY_SOCKET')
+        if nofity_socket:
+            s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
+            if nofity_socket.startswith('@'):
+                nofity_socket = '\0%s' % nofity_socket[1:]
+            s.connect(nofity_socket)
+            s.sendall("READY=1")
+            s.close()
+
+        thread.start_new_thread(start_server, tuple([server]))
+        XS_Watcher().watch_loop()