Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(290)

Unified Diff: remoting/host/linux/linux_me2me_host.py

Issue 1685793003: Add message from grandchild to parent to indicate successful host launch. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reinstate timeout and increase 120s to match heartbeat_sender.cc Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698