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/toastergui/views.py | 40 +++++++++++++++++---------------- 1 file changed, 21 insertions(+), 19 deletions(-) (limited to 'bitbake/lib/toaster/toastergui/views.py') 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