From f120b7822ea09fd234a51000c979ad97c9f26722 Mon Sep 17 00:00:00 2001 From: Alexandru Damian Date: Tue, 24 Feb 2015 17:20:58 +0000 Subject: bitbake: toastergui: performance improvements in task details page This patch brings better forward and reverse dependency computing in tasks page (offloading python code to the database), as well as replacing the recursive depth-first covered-by tree search with breadth-first search. (Bitbake rev: bc76da054570ae385c87d14c9f2337368e8311f3) Signed-off-by: Richard Purdie --- bitbake/lib/toaster/orm/models.py | 2 ++ bitbake/lib/toaster/toastergui/views.py | 40 +++++++++++++++++---------------- 2 files changed, 23 insertions(+), 19 deletions(-) (limited to 'bitbake/lib/toaster') diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py index 9d4f4c94c1..15481e5a58 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py @@ -393,6 +393,8 @@ class Task(models.Model): outcome_text = property(get_outcome_text) sstate_text = property(get_sstate_text) + def __unicode__(self): + return "%d %s:%s" % (self.id, self.recipe.name, self.task_name) class Meta: ordering = ('order', 'recipe' ,) unique_together = ('build', 'recipe', 'task_name', ) diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 4960ba0e40..aabc3d0cd8 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py @@ -352,15 +352,17 @@ def builddashboard( request, build_id ): return render( request, template, context ) -def generateCoveredList( task ): - revList = _find_task_revdep( task ); - list = { }; - for t in revList: - if ( t.outcome == Task.OUTCOME_COVERED ): - list.update( generateCoveredList( t )); - else: - list[ t.task_name ] = t; - return( list ); + +def generateCoveredList2( revlist = [] ): + covered_list = [ x for x in revlist if x.outcome == Task.OUTCOME_COVERED ] + while len(covered_list): + revlist = [ x for x in revlist if x.outcome != Task.OUTCOME_COVERED ] + + newlist = _find_task_revdep_list(covered_list) + + revlist = list(set(revlist + newlist)) + covered_list = [ x for x in revlist if x.outcome == Task.OUTCOME_COVERED ] + return revlist def task( request, build_id, task_id ): template = "task.html" @@ -376,9 +378,10 @@ def task( request, build_id, task_id ): key=lambda t:'%s_%s %s'%( t.recipe.name, t.recipe.version, t.task_name )) coveredBy = ''; if ( task.outcome == Task.OUTCOME_COVERED ): - dict = generateCoveredList( task ) +# _list = generateCoveredList( task ) + _list = generateCoveredList2( _find_task_revdep( task ) ) coveredBy = [ ] - for name, t in dict.items( ): + for t in _list: coveredBy.append( t ) log_head = '' log_body = '' @@ -737,18 +740,17 @@ def dirinfo(request, build_id, target_id, file_path=None): return render(request, template, context) def _find_task_dep(task): - tp = [] - for p in Task_Dependency.objects.filter(task=task): - if (p.depends_on.order > 0) and (p.depends_on.outcome != Task.OUTCOME_NA): - tp.append(p.depends_on); - return tp + return map(lambda x: x.depends_on, Task_Dependency.objects.filter(task=task).filter(depends_on__order__gt = 0).exclude(depends_on__outcome = Task.OUTCOME_NA).select_related("depends_on")) def _find_task_revdep(task): tp = [] - for p in Task_Dependency.objects.filter(depends_on=task): - if (p.task.order > 0) and (p.task.outcome != Task.OUTCOME_NA): - tp.append(p.task); + tp = map(lambda t: t.task, Task_Dependency.objects.filter(depends_on=task).filter(task__order__gt=0).exclude(task__outcome = Task.OUTCOME_NA).select_related("task", "task__recipe", "task__build")) + return tp + +def _find_task_revdep_list(tasklist): + tp = [] + tp = map(lambda t: t.task, Task_Dependency.objects.filter(depends_on__in=tasklist).filter(task__order__gt=0).exclude(task__outcome = Task.OUTCOME_NA).select_related("task", "task__recipe", "task__build")) return tp def _find_task_provider(task): -- cgit v1.2.3-54-g00ecf