<div dir="ltr">Please hold merging this patch.<div><br></div><div>I have discovered a unrelated problem processing bb.build.Task* events which will affect how this patch is structured.</div><div><br></div><div>Alex</div></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Feb 19, 2014 at 9:52 AM, Marius Avram <span dir="ltr"><<a href="mailto:marius.avram@intel.com" target="_blank">marius.avram@intel.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The BuildInfoHelper class was measuring separately the time for a build.<br>
This was causing many difference in the time measured by buildstats class and<br>
the time measured here. The main problem is toaster does database operations<br>
which delay the arrival of events.<br>
<br>
The simplest solution, which is implemented in this fix, is to keep the time<br>
of creation for every BaseTask and calculate the duration by making a<br>
difference between the creation time of TaskSucceeded and TaskStarted.<br>
<br>
[YOCTO #5727]<br>
<br>
Signed-off-by: Marius Avram <<a href="mailto:marius.avram@intel.com">marius.avram@intel.com</a>><br>
---<br>
bitbake/lib/bb/build.py | 2 ++<br>
bitbake/lib/bb/ui/buildinfohelper.py | 17 +++++++++++------<br>
bitbake/lib/bb/ui/toasterui.py | 6 +++++-<br>
3 files changed, 18 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py<br>
index 50a28dc..03e7996 100644<br>
--- a/bitbake/lib/bb/build.py<br>
+++ b/bitbake/lib/bb/build.py<br>
@@ -30,6 +30,7 @@ import sys<br>
import logging<br>
import shlex<br>
import glob<br>
+import time<br>
import bb<br>
import bb.msg<br>
import bb.process<br>
@@ -75,6 +76,7 @@ class TaskBase(event.Event):<br>
self.taskfile = d.getVar("FILE", True)<br>
self.taskname = self._task<br>
self.logfile = logfile<br>
+ self.time = time.time()<br>
event.Event.__init__(self)<br>
self._message = "recipe %s: task %s: %s" % (d.getVar("PF", True), t, self.getDisplayName())<br>
<br>
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py<br>
index da777f1..093d685 100644<br>
--- a/bitbake/lib/bb/ui/buildinfohelper.py<br>
+++ b/bitbake/lib/bb/ui/buildinfohelper.py<br>
@@ -102,10 +102,9 @@ class ORMWrapper(object):<br>
elif outcome_task_setscene == Task.OUTCOME_FAILED:<br>
task_object.sstate_result = Task.SSTATE_FAILED<br>
<br>
- # mark down duration if we have a start time<br>
- if 'start_time' in task_information.keys():<br>
- duration = datetime.datetime.now() - task_information['start_time']<br>
- task_object.elapsed_time = duration.total_seconds()<br>
+ # mark down duration if we have an end time<br>
+ if 'end_time' in task_information.keys():<br>
+ task_object.elapsed_time = task_information['end_time'] - task_information['start_time']<br>
<br>
task_object.save()<br>
return task_object<br>
@@ -448,6 +447,10 @@ class BuildInfoHelper(object):<br>
task_information = self._get_task_information(event, recipe)<br>
task_information['outcome'] = Task.OUTCOME_NA<br>
<br>
+ self.internal_state[identifier] = {}<br>
+ if isinstance(event, bb.build.TaskStarted):<br>
+ self.internal_state[identifier]['start_time'] = event.time<br>
+<br>
if isinstance(event, bb.runqueue.runQueueTaskSkipped):<br>
task_information['task_executed'] = False<br>
if event.reason == "covered":<br>
@@ -468,8 +471,6 @@ class BuildInfoHelper(object):<br>
<br>
task_obj = self.orm_wrapper.get_update_task_object(task_information)<br>
<br>
- self.internal_state[identifier] = {'start_time': datetime.datetime.now()}<br>
-<br>
<br>
def store_tasks_stats(self, event):<br>
for (taskfile, taskname, taskstats) in event.data:<br>
@@ -507,6 +508,10 @@ class BuildInfoHelper(object):<br>
else:<br>
task_information['script_type'] = Task.CODING_SHELL<br>
<br>
+ if isinstance(event, bb.build.TaskSucceeded):<br>
+ task_information['start_time'] = self.internal_state[identifier]['start_time']<br>
+ task_information['end_time'] = event.time<br>
+<br>
if isinstance(event, (bb.runqueue.runQueueTaskCompleted, bb.runqueue.sceneQueueTaskCompleted)):<br>
task_information['outcome'] = Task.OUTCOME_SUCCESS<br>
del self.internal_state[identifier]<br>
diff --git a/bitbake/lib/bb/ui/toasterui.py b/bitbake/lib/bb/ui/toasterui.py<br>
index e469d93..58abfd3 100644<br>
--- a/bitbake/lib/bb/ui/toasterui.py<br>
+++ b/bitbake/lib/bb/ui/toasterui.py<br>
@@ -109,7 +109,11 @@ def main(server, eventHandler, params ):<br>
if isinstance(event, bb.event.BuildStarted):<br>
buildinfohelper.store_started_build(event)<br>
<br>
- if isinstance(event, (bb.build.TaskStarted, bb.build.TaskSucceeded, bb.build.TaskFailedSilent)):<br>
+ if isinstance(event, bb.build.TaskStarted):<br>
+ buildinfohelper.store_started_task(event)<br>
+ continue<br>
+<br>
+ if isinstance(event, (bb.build.TaskSucceeded, bb.build.TaskFailedSilent)):<br>
buildinfohelper.update_and_store_task(event)<br>
continue<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
1.7.9.5<br>
<br>
_______________________________________________<br>
bitbake-devel mailing list<br>
<a href="mailto:bitbake-devel@lists.openembedded.org">bitbake-devel@lists.openembedded.org</a><br>
<a href="http://lists.openembedded.org/mailman/listinfo/bitbake-devel" target="_blank">http://lists.openembedded.org/mailman/listinfo/bitbake-devel</a><br>
</font></span></blockquote></div><br></div>