From 2ba155068952ad69d89a8d40c93ea9339c8d4e94 Mon Sep 17 00:00:00 2001 From: Matthew Wardrop Date: Wed, 12 Dec 2018 15:41:18 -0800 Subject: [PATCH] Fix gunicorn deployments that fail to start indexing due to multiple application instances being created. (#473) --- knowledge_repo/app/app.py | 1 + knowledge_repo/app/deploy/common.py | 6 +++++- knowledge_repo/app/deploy/gunicorn.py | 6 +----- knowledge_repo/app/index.py | 2 ++ 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/knowledge_repo/app/app.py b/knowledge_repo/app/app.py index b26ac42c6..1740cb836 100644 --- a/knowledge_repo/app/app.py +++ b/knowledge_repo/app/app.py @@ -47,6 +47,7 @@ def __init__(self, repo, db_uri=None, debug=None, config=None, **kwargs): # Add unique identifier for this application isinstance self.uuid = str(uuid.uuid4()) if 'KNOWLEDGE_REPO_MASTER_UUID' not in os.environ: + logger.info("Set KNOWLEDGE_REPO_MASTER_UUID to '{}'.".format(self.uuid)) os.environ['KNOWLEDGE_REPO_MASTER_UUID'] = self.uuid # Preload default configuration diff --git a/knowledge_repo/app/deploy/common.py b/knowledge_repo/app/deploy/common.py index 5ce394890..631157e74 100644 --- a/knowledge_repo/app/deploy/common.py +++ b/knowledge_repo/app/deploy/common.py @@ -75,7 +75,11 @@ def builder_func(self): @property def app(self): - return self.builder_func() + try: + self.__app + except AttributeError: + self.__app = self.builder_func() + return self.__app def write_temp_files(self): import tempfile diff --git a/knowledge_repo/app/deploy/gunicorn.py b/knowledge_repo/app/deploy/gunicorn.py index 47dc9a0ee..540b218ac 100644 --- a/knowledge_repo/app/deploy/gunicorn.py +++ b/knowledge_repo/app/deploy/gunicorn.py @@ -41,10 +41,6 @@ def load_config(self): self.cfg.set(key, value) def load(self): - return self.builder_func() - - def run(self): if not self.app.check_thread_support(): raise RuntimeError("Database configuration is not suitable for deployment (not thread-safe).") - self.app.start_indexing() - return BaseApplication.run(self) + return self.app.start_indexing() diff --git a/knowledge_repo/app/index.py b/knowledge_repo/app/index.py index 8be2dfe92..5c36f1648 100644 --- a/knowledge_repo/app/index.py +++ b/knowledge_repo/app/index.py @@ -28,6 +28,8 @@ def set_up_indexing_timers(app): logger.info("Not spawning index-sync timers for non-master application instance: {}".format(app.uuid)) return + logger.info("Spawning index-sync timers for master application instance: {}".format(app.uuid)) + def index_watchdog(app): while True: if not hasattr(app, 'sync_thread') or not app.sync_thread.is_alive():