Package: grml2usb
Version: 0.18.3
Severity: normal
Tags: patch

grml2usb autopkgtest frequently fail in Ubuntu's CI. For example:
  
https://objectstorage.prodstack4-5.canonical.com/v1/AUTH_77e2ada1e7a84929a74ba3b87153c0ac/autopkgtest-hirsute/hirsute/amd64/g/grml2usb/20201116_194744_cbe0f@/log.gz

An excerpt showing the error:
2020-11-17 14:14:49,362 Installing default MBR
2020-11-17 14:14:49,363 executing: dd if='/dev/loop0' of='/tmp/tmpa2umy9df' bs=5
12 count=1
2020-11-17 14:14:49,381 executing: dd if=/usr/share/grml2usb/mbr/mbrldr of=/tmp/
tmpa2umy9df bs=439 count=1 conv=notrunc
2020-11-17 14:14:49,385 executing: dd if='/tmp/tmpa2umy9df' of='/dev/loop0' bs=5
12 count=1 conv=notrunc
2020-11-17 14:14:49,401 executing: sync
2020-11-17 14:14:49,433 Probing device via 'blockdev --rereadpt /dev/loop0'
blockdev: ioctl error on BLKRRPART: Device or resource busy
2020-11-17 14:14:49,452 Execution failed: ("Couldn't execute blockdev on '%s' (i
nstall util-linux?)", '/dev/loop0')

I am able to reproduce this on an OpenStack instance with a failure rate of
33% (36 failures, 110 passes). My theory is that the sync is not sufficient,
and that we really need to do a targeted fsync of the file. With the
attached patch, I've yet to see a failure in 42 iterations.

-- System Information:
Debian Release: bullseye/sid
  APT prefers unstable-debug
  APT policy: (500, 'unstable-debug'), (500, 'unstable'), (1, 
'experimental-debug'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.9.0-1-amd64 (SMP w/4 CPU threads)
Kernel taint flags: TAINT_FIRMWARE_WORKAROUND
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages grml2usb depends on:
ii  grub2-common    2.04-10
ii  kmod            27+20200310-2
ii  mtools          4.0.25-1
ii  python3         3.8.6-1
ii  python3-parted  3.11.6-0.1+b1
ii  rsync           3.2.3-2
ii  syslinux        3:6.04~git20190206.bf6db5b4+dfsg1-3

Versions of packages grml2usb recommends:
ii  genisoimage     9:1.1.11-3.1
ii  isolinux        3:6.04~git20190206.bf6db5b4+dfsg1-3
ii  syslinux        3:6.04~git20190206.bf6db5b4+dfsg1-3
ii  syslinux-utils  3:6.04~git20190206.bf6db5b4+dfsg1-3
ii  xorriso         1.5.2-1

grml2usb suggests no packages.

-- no debconf information
diff -urp grml2usb-0.18.3.orig/grml2usb grml2usb-0.18.3/grml2usb
--- grml2usb-0.18.3.orig/grml2usb       2020-06-23 10:48:42.000000000 +0000
+++ grml2usb-0.18.3/grml2usb    2020-11-17 18:49:10.884080710 +0000
@@ -856,7 +852,9 @@ def install_mbr(mbrtemplate, device, par
     set_rw(device)
 
     logging.debug(
-        "executing: dd if='%s' of='%s' bs=512 count=1 conv=notrunc", 
tmpf.name, device
+        "executing: dd if='%s' of='%s' bs=512 count=1 conv=notrunc,fsync",
+        tmpf.name,
+        device,
     )
     proc = subprocess.Popen(
         [
@@ -865,7 +863,7 @@ def install_mbr(mbrtemplate, device, par
             "of=%s" % device,
             "bs=512",
             "count=1",
-            "conv=notrunc",
+            "conv=notrunc,fsync",
         ],
         stderr=open(os.devnull, "r+"),
     )
@@ -874,11 +872,6 @@ def install_mbr(mbrtemplate, device, par
         raise Exception("error executing dd (third run)")
     del tmpf
 
-    # make sure we sync filesystems before returning
-    logging.debug("executing: sync")
-    proc = subprocess.Popen(["sync"])
-    proc.wait()
-
     logging.debug("Probing device via 'blockdev --rereadpt %s'", device)
     proc = subprocess.Popen(["blockdev", "--rereadpt", device])
     proc.wait()

Reply via email to