Index: remoting/host/linux/linux_me2me_host.py |
diff --git a/remoting/host/linux/linux_me2me_host.py b/remoting/host/linux/linux_me2me_host.py |
index d2642ac52f7b6ce05d465a38341de9eecab77c67..9c80e789fea03b45f8023609b0e08d11677e9f38 100755 |
--- a/remoting/host/linux/linux_me2me_host.py |
+++ b/remoting/host/linux/linux_me2me_host.py |
@@ -512,7 +512,7 @@ class Desktop: |
self.host_ready = True |
if (ParentProcessLogger.instance() and |
False not in [desktop.host_ready for desktop in g_desktops]): |
- ParentProcessLogger.instance().release_parent() |
+ ParentProcessLogger.instance().release_parent(True) |
signal.signal(signal.SIGUSR1, sigusr1_handler) |
args.append("--signal-parent") |
@@ -682,29 +682,42 @@ class ParentProcessLogger(object): |
ParentProcessLogger.__instance = self |
def start_logging(self): |
- """Installs a logging handler that sends log entries to a pipe. |
+ """Installs a logging handler that sends log entries to a pipe, prefixed |
+ with the string 'MSG:'. This allows them to be distinguished by the parent |
+ process from commands sent over the same pipe. |
Must be called by the child process. |
""" |
self._read_file.close() |
self._logging_handler = logging.StreamHandler(self._write_file) |
+ self._logging_handler.setFormatter(logging.Formatter(fmt='MSG:%(message)s')) |
logging.getLogger().addHandler(self._logging_handler) |
- def release_parent(self): |
+ def release_parent(self, success): |
"""Uninstalls logging handler and closes the pipe, releasing the parent. |
Must be called by the child process. |
+ |
+ success: If true, write a "host ready" message to the parent process before |
+ closing the pipe. |
""" |
if self._logging_handler: |
logging.getLogger().removeHandler(self._logging_handler) |
self._logging_handler = None |
if not self._write_file.closed: |
+ if success: |
+ self._write_file.write("READY\n") |
+ self._write_file.flush() |
self._write_file.close() |
def wait_for_logs(self): |
"""Waits and prints log lines from the daemon until the pipe is closed. |
Must be called by the parent process. |
+ |
+ Returns: |
+ True if the host started and successfully registered with the directory; |
+ false otherwise. |
""" |
# If Ctrl-C is pressed, inform the user that the daemon is still running. |
# This signal will cause the read loop below to stop with an EINTR IOError. |
@@ -718,25 +731,35 @@ class ParentProcessLogger(object): |
# Install a fallback timeout to release the parent process, in case the |
# daemon never responds (e.g. host crash-looping, daemon killed). |
# This signal will cause the read loop below to stop with an EINTR IOError. |
+ # |
+ # The value of 120s is chosen to match the heartbeat retry timeout in |
+ # hearbeat_sender.cc. |
def sigalrm_handler(signum, frame): |
_ = signum, frame |
print("No response from daemon. It may have crashed, or may still be " |
"running in the background.", file=sys.stderr) |
signal.signal(signal.SIGALRM, sigalrm_handler) |
- signal.alarm(30) |
+ signal.alarm(120) |
self._write_file.close() |
# Print lines as they're logged to the pipe until EOF is reached or readline |
# is interrupted by one of the signal handlers above. |
+ host_ready = False |
try: |
for line in iter(self._read_file.readline, ''): |
- sys.stderr.write(line) |
+ if line[:4] == "MSG:": |
+ sys.stderr.write(line[4:]) |
+ elif line == "READY\n": |
+ host_ready = True |
+ else: |
+ sys.stderr.write("Unrecognized command: " + line) |
except IOError as e: |
if e.errno != errno.EINTR: |
raise |
print("Log file: %s" % os.environ[LOG_FILE_ENV_VAR], file=sys.stderr) |
+ return host_ready |
@staticmethod |
def instance(): |
@@ -795,8 +818,10 @@ def daemonize(): |
os._exit(0) # pylint: disable=W0212 |
else: |
# Parent process |
- parent_logger.wait_for_logs() |
- os._exit(0) # pylint: disable=W0212 |
+ if parent_logger.wait_for_logs(): |
+ os._exit(0) # pylint: disable=W0212 |
+ else: |
+ os._exit(1) # pylint: disable=W0212 |
logging.info("Daemon process started in the background, logging to '%s'" % |
os.environ[LOG_FILE_ENV_VAR]) |
@@ -842,7 +867,7 @@ def cleanup(): |
g_desktops = [] |
if ParentProcessLogger.instance(): |
- ParentProcessLogger.instance().release_parent() |
+ ParentProcessLogger.instance().release_parent(False) |
class SignalHandler: |
"""Reload the config file on SIGHUP. Since we pass the configuration to the |