[bitbake-devel] [PATCH 10/12] toastergui: performance improvements in task details page

Alex DAMIAN alexandru.damian at intel.com
Tue Feb 24 17:20:58 UTC 2015


From: Alexandru Damian <alexandru.damian at intel.com>

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.
---
 lib/toaster/orm/models.py       |  2 ++
 lib/toaster/toastergui/views.py | 40 +++++++++++++++++++++-------------------
 2 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/lib/toaster/orm/models.py b/lib/toaster/orm/models.py
index 9d4f4c9..15481e5 100644
--- a/lib/toaster/orm/models.py
+++ b/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/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py
index 4960ba0..aabc3d0 100755
--- a/lib/toaster/toastergui/views.py
+++ b/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):
-- 
1.9.1




More information about the bitbake-devel mailing list