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 <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexandru Damian authored and Richard Purdie committed 2015-02-24 23:35:45 +00:00
1 parent cb23e3043b
commit f120b7822e
2 files changed
+23 -19

No files matched your search

+2
View File
@@ -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', )
+21 -19
View File
@@ -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):