* [PATCH 0/2] Prevent task dependency calculation going into an infinite loop
@ 2016-07-29 11:29 Elliot Smith
2016-07-29 11:29 ` [PATCH 1/2] toaster-tests: add test for showing self-dependent task Elliot Smith
2016-07-29 11:29 ` [PATCH 2/2] toaster: prevent infinite loop when finding task dependencies Elliot Smith
0 siblings, 2 replies; 3+ messages in thread
From: Elliot Smith @ 2016-07-29 11:29 UTC (permalink / raw)
To: toaster
Where a task is "covered" by itself, Toaster is unable to display the task,
as the code causes a non-terminating loop (see the commit logs for an explanation).
Add a condition to prevent this, and a test to make sure we don't reintroduce it
later.
Related bug:
https://bugzilla.yoctoproject.org/show_bug.cgi?id=9952
The following changes since commit 1826de5234aadb9aa51c83f86471cdd7e88b48cf
(toaster-next):
toaster: loadconf Partially add back some of the layerSource parsing (2016-07-21 11:23:00 +0100)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib elliot/toaster/9952-covered_tasks_no_show
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=elliot/toaster/9952-covered_tasks_no_show
Elliot Smith (2):
toaster-tests: add test for showing self-dependent task
toaster: prevent infinite loop when finding task dependencies
.../lib/toaster/tests/browser/test_task_page.py | 76 ++++++++++++++++++++++
bitbake/lib/toaster/toastergui/views.py | 10 +++
2 files changed, 86 insertions(+)
create mode 100644 bitbake/lib/toaster/tests/browser/test_task_page.py
--
2.7.4
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] toaster-tests: add test for showing self-dependent task
2016-07-29 11:29 [PATCH 0/2] Prevent task dependency calculation going into an infinite loop Elliot Smith
@ 2016-07-29 11:29 ` Elliot Smith
2016-07-29 11:29 ` [PATCH 2/2] toaster: prevent infinite loop when finding task dependencies Elliot Smith
1 sibling, 0 replies; 3+ messages in thread
From: Elliot Smith @ 2016-07-29 11:29 UTC (permalink / raw)
To: toaster
Toaster occasionally records a task which depends on itself.
Add a test which checks that a task which depends on itself
can be displayed in the task page.
[YOCTO #9952]
Signed-off-by: Elliot Smith <elliot.smith@intel.com>
---
.../lib/toaster/tests/browser/test_task_page.py | 76 ++++++++++++++++++++++
1 file changed, 76 insertions(+)
create mode 100644 bitbake/lib/toaster/tests/browser/test_task_page.py
diff --git a/bitbake/lib/toaster/tests/browser/test_task_page.py b/bitbake/lib/toaster/tests/browser/test_task_page.py
new file mode 100644
index 0000000..690d116
--- /dev/null
+++ b/bitbake/lib/toaster/tests/browser/test_task_page.py
@@ -0,0 +1,76 @@
+#! /usr/bin/env python
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# BitBake Toaster Implementation
+#
+# Copyright (C) 2013-2016 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from django.core.urlresolvers import reverse
+from django.utils import timezone
+from tests.browser.selenium_helpers import SeleniumTestCase
+from orm.models import Project, Build, Layer, Layer_Version, Recipe, Target
+from orm.models import Task, Task_Dependency
+
+class TestTaskPage(SeleniumTestCase):
+ """ Test page which shows an individual task """
+ RECIPE_NAME = 'bar'
+ RECIPE_VERSION = '0.1'
+ TASK_NAME = 'do_da_doo_ron_ron'
+
+ def setUp(self):
+ now = timezone.now()
+
+ project = Project.objects.get_or_create_default_project()
+
+ self.build = Build.objects.create(project=project, started_on=now,
+ completed_on=now)
+
+ Target.objects.create(target='foo', build=self.build)
+
+ layer = Layer.objects.create()
+
+ layer_version = Layer_Version.objects.create(layer=layer)
+
+ recipe = Recipe.objects.create(name=TestTaskPage.RECIPE_NAME,
+ layer_version=layer_version, version=TestTaskPage.RECIPE_VERSION)
+
+ self.task = Task.objects.create(build=self.build, recipe=recipe,
+ order=1, outcome=Task.OUTCOME_COVERED, task_executed=False,
+ task_name=TestTaskPage.TASK_NAME)
+
+ def test_covered_task(self):
+ """
+ Check that covered tasks are displayed for tasks which have
+ dependencies on themselves
+ """
+
+ # the infinite loop which of bug 9952 was down to tasks which
+ # depend on themselves, so add self-dependent tasks to replicate the
+ # situation which caused the infinite loop (now fixed)
+ Task_Dependency.objects.create(task=self.task, depends_on=self.task)
+
+ url = reverse('task', args=(self.build.id, self.task.id,))
+ self.get(url)
+
+ # check that we see the task name
+ self.wait_until_visible('.page-header h1')
+
+ heading = self.find('.page-header h1')
+ expected_heading = '%s_%s %s' % (TestTaskPage.RECIPE_NAME,
+ TestTaskPage.RECIPE_VERSION, TestTaskPage.TASK_NAME)
+ self.assertEqual(heading.text, expected_heading,
+ 'Heading should show recipe name, version and task')
--
2.7.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] toaster: prevent infinite loop when finding task dependencies
2016-07-29 11:29 [PATCH 0/2] Prevent task dependency calculation going into an infinite loop Elliot Smith
2016-07-29 11:29 ` [PATCH 1/2] toaster-tests: add test for showing self-dependent task Elliot Smith
@ 2016-07-29 11:29 ` Elliot Smith
1 sibling, 0 replies; 3+ messages in thread
From: Elliot Smith @ 2016-07-29 11:29 UTC (permalink / raw)
To: toaster
Toaster occasionally records a task which depends on itself.
This causes a problem when trying to display that task if it
is "covered" by itself, as the code does the following: for
task A, find a task B which covers A; then, recursively
find the task which covers B etc. If B == A, this loop becomes
infinite and never terminates.
To prevent this, add the condition that, when finding a task B
which covers A, don't allow B == A.
[YOCTO #9952]
Signed-off-by: Elliot Smith <elliot.smith@intel.com>
---
bitbake/lib/toaster/toastergui/views.py | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index a40ceef..3411806 100755
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -822,11 +822,21 @@ def _find_task_dep(task_object):
def _find_task_revdep(task_object):
tdeps = Task_Dependency.objects.filter(depends_on=task_object).filter(task__order__gt=0)
tdeps = tdeps.exclude(task__outcome = Task.OUTCOME_NA).select_related("task", "task__recipe", "task__build")
+
+ # exclude self-dependencies to prevent infinite dependency loop
+ # in generateCoveredList2()
+ tdeps = tdeps.exclude(task=task_object)
+
return [tdep.task for tdep in tdeps]
def _find_task_revdep_list(tasklist):
tdeps = Task_Dependency.objects.filter(depends_on__in=tasklist).filter(task__order__gt=0)
tdeps = tdeps.exclude(task__outcome=Task.OUTCOME_NA).select_related("task", "task__recipe", "task__build")
+
+ # exclude self-dependencies to prevent infinite dependency loop
+ # in generateCoveredList2()
+ tdeps = tdeps.exclude(task=F('depends_on'))
+
return [tdep.task for tdep in tdeps]
def _find_task_provider(task_object):
--
2.7.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-07-29 11:37 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-07-29 11:29 [PATCH 0/2] Prevent task dependency calculation going into an infinite loop Elliot Smith
2016-07-29 11:29 ` [PATCH 1/2] toaster-tests: add test for showing self-dependent task Elliot Smith
2016-07-29 11:29 ` [PATCH 2/2] toaster: prevent infinite loop when finding task dependencies Elliot Smith
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.