summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/recipes-devtools/opkg/opkg/0001-opkg_lock-retry-if-we-fail-to-get-lock.patch59
-rw-r--r--meta/recipes-devtools/opkg/opkg_0.6.3.bb1
2 files changed, 60 insertions, 0 deletions
diff --git a/meta/recipes-devtools/opkg/opkg/0001-opkg_lock-retry-if-we-fail-to-get-lock.patch b/meta/recipes-devtools/opkg/opkg/0001-opkg_lock-retry-if-we-fail-to-get-lock.patch
new file mode 100644
index 00000000000..863667fe400
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0001-opkg_lock-retry-if-we-fail-to-get-lock.patch
@@ -0,0 +1,59 @@
+From cdc7d347f41a7095ba0e29515951a1394c632479 Mon Sep 17 00:00:00 2001
+From: Tim Orling <tim.orling@konsulko.com>
+Date: Wed, 20 Mar 2024 23:00:31 -0700
+Subject: [opkg][PATCH] opkg_lock: retry if we fail to get lock
+To: opkg@lists.yoctoproject.org
+
+When systemd is enabled, we can get into a race condition
+between run-postinsts and systemctl restarting services.
+
+If we fail to create the lock file (or fd), then
+sleep 10 seconds and retry up to 5 times.
+
+[YOCTO #15428]
+
+Upstream-Status: Submitted [https://lists.yoctoproject.org/g/opkg/message/60]
+
+Signed-off-by: Tim Orling <tim.orling@konsulko.com>
+---
+ libopkg/opkg_conf.c | 22 ++++++++++++++++------
+ 1 file changed, 16 insertions(+), 6 deletions(-)
+
+diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
+index 4dc777b..03bb40a 100644
+--- a/libopkg/opkg_conf.c
++++ b/libopkg/opkg_conf.c
+@@ -660,14 +660,24 @@ int opkg_lock()
+ return -1;
+ }
+
+- r = lockf(lock_fd, F_TLOCK, (off_t) 0);
++ int retry = 5;
++ do {
++ r = lockf(lock_fd, F_TLOCK, (off_t) 0);
++ if (r == -1) {
++ opkg_perror(INFO, "Could not lock %s, retry %d", opkg_config->lock_file, retry);
++ r = close(lock_fd);
++ if (r == -1)
++ opkg_perror(ERROR, "Couldn't close descriptor %d (%s)", lock_fd,
++ opkg_config->lock_file);
++ retry--;
++ sleep(10);
++ }
++ }
++ while (retry > 0 && r == -1);
++
+ if (r == -1) {
+ opkg_perror(ERROR, "Could not lock %s", opkg_config->lock_file);
+- r = close(lock_fd);
+- if (r == -1)
+- opkg_perror(ERROR, "Couldn't close descriptor %d (%s)", lock_fd,
+- opkg_config->lock_file);
+- lock_fd = -1;
++ lock_fd = -1;
+ return -1;
+ }
+
+--
+2.34.1
+
diff --git a/meta/recipes-devtools/opkg/opkg_0.6.3.bb b/meta/recipes-devtools/opkg/opkg_0.6.3.bb
index 9592ffc5d6d..b4c7c114bcb 100644
--- a/meta/recipes-devtools/opkg/opkg_0.6.3.bb
+++ b/meta/recipes-devtools/opkg/opkg_0.6.3.bb
@@ -16,6 +16,7 @@ SRC_URI = "http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz
file://opkg.conf \
file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
file://0001-libopkg-Use-libgen.h-to-provide-basename-API.patch \
+ file://0001-opkg_lock-retry-if-we-fail-to-get-lock.patch \
file://run-ptest \
"