diff options
Diffstat (limited to 'bitbake/lib/bb/ui/buildinfohelper.py')
| -rw-r--r-- | bitbake/lib/bb/ui/buildinfohelper.py | 72 |
1 files changed, 33 insertions, 39 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py index 81abede803..7fedb76911 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py | |||
| @@ -50,6 +50,7 @@ from bb.msg import BBLogFormatter as formatter | |||
| 50 | from django.db import models | 50 | from django.db import models |
| 51 | from pprint import pformat | 51 | from pprint import pformat |
| 52 | import logging | 52 | import logging |
| 53 | from datetime import datetime, timedelta | ||
| 53 | 54 | ||
| 54 | from django.db import transaction, connection | 55 | from django.db import transaction, connection |
| 55 | 56 | ||
| @@ -120,6 +121,12 @@ class ORMWrapper(object): | |||
| 120 | 121 | ||
| 121 | return vars(self)[dictname][key] | 122 | return vars(self)[dictname][key] |
| 122 | 123 | ||
| 124 | def _timestamp_to_datetime(self, secs): | ||
| 125 | """ | ||
| 126 | Convert timestamp in seconds to Python datetime | ||
| 127 | """ | ||
| 128 | return datetime(1970, 1, 1) + timedelta(seconds=secs) | ||
| 129 | |||
| 123 | # pylint: disable=no-self-use | 130 | # pylint: disable=no-self-use |
| 124 | # we disable detection of no self use in functions because the methods actually work on the object | 131 | # we disable detection of no self use in functions because the methods actually work on the object |
| 125 | # even if they don't touch self anywhere | 132 | # even if they don't touch self anywhere |
| @@ -223,6 +230,28 @@ class ORMWrapper(object): | |||
| 223 | target.license_manifest_path = license_manifest_path | 230 | target.license_manifest_path = license_manifest_path |
| 224 | target.save() | 231 | target.save() |
| 225 | 232 | ||
| 233 | def update_task_object(self, build, task_name, recipe_name, task_stats): | ||
| 234 | """ | ||
| 235 | Find the task for build which matches the recipe and task name | ||
| 236 | to be stored | ||
| 237 | """ | ||
| 238 | task_to_update = Task.objects.get( | ||
| 239 | build = build, | ||
| 240 | task_name = task_name, | ||
| 241 | recipe__name = recipe_name | ||
| 242 | ) | ||
| 243 | |||
| 244 | task_to_update.started = self._timestamp_to_datetime(task_stats['started']) | ||
| 245 | task_to_update.ended = self._timestamp_to_datetime(task_stats['ended']) | ||
| 246 | task_to_update.elapsed_time = (task_stats['ended'] - task_stats['started']) | ||
| 247 | task_to_update.cpu_time_user = task_stats['cpu_time_user'] | ||
| 248 | task_to_update.cpu_time_system = task_stats['cpu_time_system'] | ||
| 249 | task_to_update.disk_io_read = task_stats['disk_io_read'] | ||
| 250 | task_to_update.disk_io_write = task_stats['disk_io_write'] | ||
| 251 | task_to_update.disk_io = task_stats['disk_io_read'] + task_stats['disk_io_write'] | ||
| 252 | |||
| 253 | task_to_update.save() | ||
| 254 | |||
| 226 | def get_update_task_object(self, task_information, must_exist = False): | 255 | def get_update_task_object(self, task_information, must_exist = False): |
| 227 | assert 'build' in task_information | 256 | assert 'build' in task_information |
| 228 | assert 'recipe' in task_information | 257 | assert 'recipe' in task_information |
| @@ -259,14 +288,6 @@ class ORMWrapper(object): | |||
| 259 | task_object.sstate_result = Task.SSTATE_FAILED | 288 | task_object.sstate_result = Task.SSTATE_FAILED |
| 260 | object_changed = True | 289 | object_changed = True |
| 261 | 290 | ||
| 262 | # mark down duration if we have a start time and a current time | ||
| 263 | if 'start_time' in task_information.keys() and 'end_time' in task_information.keys(): | ||
| 264 | duration = task_information['end_time'] - task_information['start_time'] | ||
| 265 | task_object.elapsed_time = duration | ||
| 266 | object_changed = True | ||
| 267 | del task_information['start_time'] | ||
| 268 | del task_information['end_time'] | ||
| 269 | |||
| 270 | if object_changed: | 291 | if object_changed: |
| 271 | task_object.save() | 292 | task_object.save() |
| 272 | return task_object | 293 | return task_object |
| @@ -1091,31 +1112,11 @@ class BuildInfoHelper(object): | |||
| 1091 | 1112 | ||
| 1092 | 1113 | ||
| 1093 | def store_tasks_stats(self, event): | 1114 | def store_tasks_stats(self, event): |
| 1094 | for (taskfile, taskname, taskstats, recipename) in BuildInfoHelper._get_data_from_event(event): | 1115 | task_data = BuildInfoHelper._get_data_from_event(event) |
| 1095 | localfilepath = taskfile.split(":")[-1] | ||
| 1096 | assert localfilepath.startswith("/") | ||
| 1097 | 1116 | ||
| 1098 | recipe_information = self._get_recipe_information_from_taskfile(taskfile) | 1117 | for (task_file, task_name, task_stats, recipe_name) in task_data: |
| 1099 | try: | 1118 | build = self.internal_state['build'] |
| 1100 | if recipe_information['file_path'].startswith(recipe_information['layer_version'].local_path): | 1119 | self.orm_wrapper.update_task_object(build, task_name, recipe_name, task_stats) |
| 1101 | recipe_information['file_path'] = recipe_information['file_path'][len(recipe_information['layer_version'].local_path):].lstrip("/") | ||
| 1102 | |||
| 1103 | recipe_object = Recipe.objects.get(layer_version = recipe_information['layer_version'], | ||
| 1104 | file_path__endswith = recipe_information['file_path'], | ||
| 1105 | name = recipename) | ||
| 1106 | except Recipe.DoesNotExist: | ||
| 1107 | logger.error("Could not find recipe for recipe_information %s name %s" , pformat(recipe_information), recipename) | ||
| 1108 | raise | ||
| 1109 | |||
| 1110 | task_information = {} | ||
| 1111 | task_information['build'] = self.internal_state['build'] | ||
| 1112 | task_information['recipe'] = recipe_object | ||
| 1113 | task_information['task_name'] = taskname | ||
| 1114 | task_information['cpu_usage'] = taskstats['cpu_usage'] | ||
| 1115 | task_information['disk_io'] = taskstats['disk_io'] | ||
| 1116 | if 'elapsed_time' in taskstats: | ||
| 1117 | task_information['elapsed_time'] = taskstats['elapsed_time'] | ||
| 1118 | self.orm_wrapper.get_update_task_object(task_information) | ||
| 1119 | 1120 | ||
| 1120 | def update_and_store_task(self, event): | 1121 | def update_and_store_task(self, event): |
| 1121 | assert 'taskfile' in vars(event) | 1122 | assert 'taskfile' in vars(event) |
| @@ -1137,13 +1138,6 @@ class BuildInfoHelper(object): | |||
| 1137 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information, True) | 1138 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information, True) |
| 1138 | task_information = self._get_task_information(event,recipe) | 1139 | task_information = self._get_task_information(event,recipe) |
| 1139 | 1140 | ||
| 1140 | if 'time' in vars(event): | ||
| 1141 | if not 'start_time' in self.internal_state['taskdata'][identifier]: | ||
| 1142 | self.internal_state['taskdata'][identifier]['start_time'] = event.time | ||
| 1143 | else: | ||
| 1144 | task_information['end_time'] = event.time | ||
| 1145 | task_information['start_time'] = self.internal_state['taskdata'][identifier]['start_time'] | ||
| 1146 | |||
| 1147 | task_information['outcome'] = self.internal_state['taskdata'][identifier]['outcome'] | 1141 | task_information['outcome'] = self.internal_state['taskdata'][identifier]['outcome'] |
| 1148 | 1142 | ||
| 1149 | if 'logfile' in vars(event): | 1143 | if 'logfile' in vars(event): |
