Patch: Database errors when building Yocto-Yoe

"Sebert, Holger.ext" <[email protected]>
Newsgroups org.yoctoproject.lists.toaster
Message-ID <[email protected]>
Hi,

during a project build using Toaster and a MySQL database, there are some
database errors due to insufficient size of the data fields. This patch includes 
the necessary changes in the ORM, including proper migration methods.

The implementation follows the lines of

https://www.yoctoproject.org/pipermail/toaster/2018-October/005718.html

The offensive SQL errors and queries are as follows:

* `django.db.utils.DataError: (1264, "Out of range value for column 'disk_io' at row 1")`
```
UPDATE `orm_task`
SET `build_id` = 30,
	`order` = 1576,
	`task_executed` = 1,
	`outcome` = 0,
	`sstate_checksum` = 'e47a7bb240056b47b297eea760616408ab4daad32a05f3cf86973a4d3427f8e3',
	`path_to_sstate_obj` = '',
	`recipe_id` = 47597,
	`task_name` = 'do_unpack',
	`source_url` = '',
	`work_directory` = '',
	`script_type` = 2,
	`line_number` = 0,
	`started` = '2020-11-16 11:11:30.680000',
	`ended` = '2020-11-16 11:12:28.030000',
	`elapsed_time` = '57.35',
	`disk_io` = 2458021888,
	`disk_io_read` = 269443072,
	`disk_io_write` = 2188578816,
	`cpu_time_user` = '28.78',
	`cpu_time_system` = '12.24',
	`sstate_result` = 0,
	`message` = 'recipe mozjs-60.9.0-r0: task do_unpack: Succeeded',
	`logfile` = '/home/holger/data/Yocto/yocto-yoe-toaster/build/tmp/work/armv7at2hf-neon-ks-linux-gnueabi/mozjs/60.9.0-r0/temp/log.do_unpack.3422'
WHERE `orm_task`.`id` = 78884
```

* `django.db.utils.DataError: (1406, "Data too long for column 'file_name' at row 1")`
```
INSERT INTO `orm_targetkernelfile` (`target_id`, `file_name`, `file_size`)
VALUES (18, '/home/holger/data/Yocto/yocto-yoe-toaster/build/tmp/deploy/images/am335x-diva/zImage--5.4.40+git0+7f8dc0f36a-0a.2-am335x-diva-20201109102412.bin', 4628992)
```

* `django.db.utils.DataError: (1406, "Data too long for column 'license' at row 1")`
```
UPDATE `orm_package`
SET `build_id` = 26,
    `recipe_id` = 45765,
    `name` = 'qtbase',
    `installed_name` = 'qtbase',
    `version` = '5.14.1+gitAUTOINC+0ab53fbdda',
    `revision` = 'r0',
    `summary` = 'qtbase version 5.14.1+gitAUTOINC+0ab53fbdda-r0',
    `description` = 'qtbase version 5.14.1+gitAUTOINC+0ab53fbdda-r0.',
    `size` = 17123154,
    `installed_size` = 17123328,
    `section` = 'base',
    `license` = 'GFDL-1.3 & BSD & ( GPL-3.0 & The-Qt-Company-GPL-Exception-1.0 | The-Qt-Company-Commercial ) & ( GPL-2.0+ | LGPL-3.0 | The-Qt-Company-Commercial )'
WHERE `orm_package`.`id` = 18159"
```

Could you please review the patch? If it's o.k., I would prepare a pull-request and try to bring it
upstream.

Best,
Holger
fix-orm-database-model.patch (text/x-patch, 3.6 KB)
diff --git a/lib/toaster/orm/migrations/0020_use_bigint_for_diskio.py b/lib/toaster/orm/migrations/0020_use_bigint_for_diskio.py
new file mode 100644
index 00000000..b156d616
--- /dev/null
+++ b/lib/toaster/orm/migrations/0020_use_bigint_for_diskio.py
@@ -0,0 +1,25 @@
+from django.db import migrations, models
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('orm', '0019_django_2_2'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='task',
+            name='disk_io',
+            field=models.BigIntegerField(null=True),
+        ),
+        migrations.AlterField(
+            model_name='task',
+            name='disk_io_read',
+            field=models.BigIntegerField(null=True),
+        ),
+        migrations.AlterField(
+            model_name='task',
+            name='disk_io_write',
+            field=models.BigIntegerField(null=True),
+        ),
+    ]
diff --git a/lib/toaster/orm/migrations/0021_target_kernel_file_file_name.py b/lib/toaster/orm/migrations/0021_target_kernel_file_file_name.py
new file mode 100644
index 00000000..475193c2
--- /dev/null
+++ b/lib/toaster/orm/migrations/0021_target_kernel_file_file_name.py
@@ -0,0 +1,15 @@
+from django.db import migrations, models
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('orm', '0020_use_bigint_for_diskio'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='targetkernelfile',
+            name='file_name',
+            field=models.FilePathField(max_length=255),
+        ),
+    ]
diff --git a/lib/toaster/orm/migrations/0022_package_license.py b/lib/toaster/orm/migrations/0022_package_license.py
new file mode 100644
index 00000000..b1a3f4d1
--- /dev/null
+++ b/lib/toaster/orm/migrations/0022_package_license.py
@@ -0,0 +1,15 @@
+from django.db import migrations, models
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('orm', '0021_target_kernel_file_file_name'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='package',
+            name='license',
+            field=models.CharField(max_length=255, blank=True),
+        ),
+    ]
diff --git a/lib/toaster/orm/models.py b/lib/toaster/orm/models.py
index 7f7e922a..33c4282a 100644
--- a/lib/toaster/orm/models.py
+++ b/lib/toaster/orm/models.py
@@ -945,7 +945,7 @@ class Target(models.Model):
 # kernel artifacts for a target: bzImage and modules*
 class TargetKernelFile(models.Model):
     target = models.ForeignKey(Target, on_delete=models.CASCADE)
-    file_name = models.FilePathField()
+    file_name = models.FilePathField(max_length=255)
     file_size = models.IntegerField()
 
     @property
@@ -1123,9 +1123,9 @@ class Task(models.Model):
     elapsed_time = models.DecimalField(max_digits=8, decimal_places=2, null=True)
 
     # in bytes; note that disk_io is stored to enable sorting
-    disk_io = models.IntegerField(null=True)
-    disk_io_read = models.IntegerField(null=True)
-    disk_io_write = models.IntegerField(null=True)
+    disk_io = models.BigIntegerField(null=True)
+    disk_io_read = models.BigIntegerField(null=True)
+    disk_io_write = models.BigIntegerField(null=True)
 
     # in seconds
     cpu_time_user = models.DecimalField(max_digits=8, decimal_places=2, null=True)
@@ -1163,7 +1163,7 @@ class Package(models.Model):
     size = models.IntegerField(default=0)
     installed_size = models.IntegerField(default=0)
     section = models.CharField(max_length=80, blank=True)
-    license = models.CharField(max_length=80, blank=True)
+    license = models.CharField(max_length=255, blank=True)
 
     @property
     def is_locale_package(self):
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.