From 8339e389beca6d8f66b07f43724e7bc2628dc564 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 3 Nov 2016 10:15:07 +0100 Subject: [PATCH] Fix out-of-memory caused by loading ModuleBuild for every ComponentBuild row from database. Now we lazyload it. --- module_build_service/models.py | 4 +++- module_build_service/scheduler/main.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/module_build_service/models.py b/module_build_service/models.py index a42bacca..ad63e475 100644 --- a/module_build_service/models.py +++ b/module_build_service/models.py @@ -36,6 +36,8 @@ import modulemd as _modulemd from module_build_service import db, log import module_build_service.messaging +from sqlalchemy.orm import lazyload + # Just like koji.BUILD_STATES, except our own codes for modules. BUILD_STATES = { @@ -273,7 +275,7 @@ class ModuleBuild(RidaBase): tasks = dict() if self.id and self.state != 'init': - for build in ComponentBuild.query.filter_by(module_id=self.id).all(): + for build in ComponentBuild.query.filter_by(module_id=self.id).options(lazyload('module_build')).all(): tasks["%s/%s" % (build.format, build.package)] = "%s/%s" % (build.task_id, build.state) return tasks diff --git a/module_build_service/scheduler/main.py b/module_build_service/scheduler/main.py index cec78dc9..ef172477 100644 --- a/module_build_service/scheduler/main.py +++ b/module_build_service/scheduler/main.py @@ -46,6 +46,8 @@ import koji from module_build_service import conf, models, log +from sqlalchemy.orm import lazyload + class STOP_WORK(object): """ A sentinel value, indicating that work should be stopped. """ @@ -201,7 +203,7 @@ class Poller(threading.Thread): koji_session = ( module_build_service.builder.KojiModuleBuilder.get_session(conf, None)) log.info("Querying tasks for statuses:") - res = models.ComponentBuild.query.filter_by(state=koji.BUILD_STATES['BUILDING']).all() + res = models.ComponentBuild.query.filter_by(state=koji.BUILD_STATES['BUILDING']).options(lazyload('module_build')).all() log.info("Checking status for %d tasks." % len(res)) for component_build in res: @@ -222,6 +224,7 @@ class Poller(threading.Thread): msg = module_build_service.messaging.KojiBuildChange( msg_id='a faked internal message', build_id=component_build.task_id, + task_id=component_build.task_id, build_name=component_build.package, build_new_state=koji.BUILD_STATES['FAILED'], build_release=None,