#!/usr/bin/env python3 import os import sys import time import signal import subprocess import re # check for the venv from lib import sanity_check sanity_check.check_venv(__file__) from typing import IO, Text # TODO: Convert this to use scripts/lib/queue_workers.py TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) successful_worker_launches = [ 'launching queue worker thread error_reports', 'launching queue worker thread user_presence', 'launching queue worker thread deferred_work', 'launching queue worker thread digest_emails', 'launching queue worker thread slow_queries', 'launching queue worker thread missedmessage_mobile_notifications', 'launching queue worker thread feedback_messages', 'launching queue worker thread signups', 'launching queue worker thread test', 'launching queue worker thread message_sender', 'launching queue worker thread missedmessage_emails', 'launching queue worker thread email_senders', 'launching queue worker thread missedmessage_email_senders', 'launching queue worker thread email_mirror', 'launching queue worker thread user_activity_interval', 'launching queue worker thread invites', 'launching queue worker thread user_activity' ] def check_worker_launch(logfile): # type: (IO[str]) -> Text def check(content): # type: (str) -> bool flag = True for entry in successful_worker_launches: flag = flag and entry in content return flag failed = True log_output = u'' print("Polling logfile", end='') # Attempt to poll the log file for 10 sec. to see if all worker threads are launched. for i in range(100): time.sleep(0.3) sys.stdout.write('.') sys.stdout.flush() logfile.seek(0) content = logfile.read() log_output = content if check(content): failed = False break sys.stdout.write('\n') if not failed: print('Worker threads launched successfully') return log_output else: print('Error in server startup. Dumping logs') print(log_output) sys.exit(1) if __name__ == '__main__': print('\nStarting Development Server') logfile = open('/tmp/run-dev-output', 'w+') args = ["{}/run-dev.py".format(TOOLS_DIR)] run_dev = subprocess.Popen(args, stdout=logfile, stderr=logfile) check_worker_launch(logfile) logfile.truncate(0) print("Attempting to modify a file") subprocess.call(['touch', 'zerver/lib/actions.py']) check_worker_launch(logfile) run_dev.send_signal(signal.SIGINT) run_dev.wait() logfile.close()