<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">&lt;<a href="mailto:marius.avram@intel.com" target="_blank">marius.avram@intel.com</a>&gt;</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 &lt;<a href="mailto:marius.avram@intel.com">marius.avram@intel.com</a>&gt;<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(&quot;FILE&quot;, True)<br>
         self.taskname = self._task<br>
         self.logfile = logfile<br>
+        self.time = time.time()<br>
         event.Event.__init__(self)<br>
         self._message = &quot;recipe %s: task %s: %s&quot; % (d.getVar(&quot;PF&quot;, 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 &#39;start_time&#39; in task_information.keys():<br>
-            duration = datetime.datetime.now() - task_information[&#39;start_time&#39;]<br>
-            task_object.elapsed_time = duration.total_seconds()<br>
+        # mark down duration if we have an end time<br>
+        if &#39;end_time&#39; in task_information.keys():<br>
+            task_object.elapsed_time = task_information[&#39;end_time&#39;] - task_information[&#39;start_time&#39;]<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[&#39;outcome&#39;] = Task.OUTCOME_NA<br>
<br>
+        self.internal_state[identifier] = {}<br>
+        if isinstance(event, bb.build.TaskStarted):<br>
+            self.internal_state[identifier][&#39;start_time&#39;] = event.time<br>
+<br>
         if isinstance(event, bb.runqueue.runQueueTaskSkipped):<br>
             task_information[&#39;task_executed&#39;] = False<br>
             if event.reason == &quot;covered&quot;:<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] = {&#39;start_time&#39;: 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[&#39;script_type&#39;] = Task.CODING_SHELL<br>
<br>
+        if isinstance(event, bb.build.TaskSucceeded):<br>
+            task_information[&#39;start_time&#39;] = self.internal_state[identifier][&#39;start_time&#39;]<br>
+            task_information[&#39;end_time&#39;] = event.time<br>
+<br>
         if isinstance(event, (bb.runqueue.runQueueTaskCompleted, bb.runqueue.sceneQueueTaskCompleted)):<br>
             task_information[&#39;outcome&#39;] = 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>