Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Feb 2025 18:24:09 -0800
From:      Mark Millard <marklmi@yahoo.com>
To:        Baptiste Daroussin <bapt@FreeBSD.org>, FreeBSD Current <freebsd-current@freebsd.org>, FreeBSD Mailing List <freebsd-ports@freebsd.org>
Cc:        Konstantin Belousov <kib@freebsd.org>
Subject:   Fairly Modern poudriere-devel on fairly modern main gets "mount_nullfs: /usr/local/poudriere/data/.m/NAME/ref/packages: Resource deadlock avoided" when operated in a chroot context.
Message-ID:  <EA28C450-9543-415E-91F9-76086401F1D6@yahoo.com>
References:  <EA28C450-9543-415E-91F9-76086401F1D6.ref@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
I use pkg and poudriere-devel in areas that  I've chroot'ed into. (This
may be unusual and so is noted just in case it turns out to be involved.
I've been doing that for years. Also, when I tried the same without =
being
chroot'd things behaved normally and worked fine.)

The context does use:

USE_TMPFS=3Dall
TMPFS_BLACKLIST=3D. . .
TMPFS_BLACKLIST_TMPDIR=3D${BASEFS}/data/cache/tmp


As of my attempt to update to modern pkg and poudrere after having =
update
the FreeBSD main vintage, all my attempts fail with the likes of:

[00:00:02] [01] [00:00:00] Builder starting
[00:00:02] [01] [00:00:00] Builder started
[00:00:02] [01] [00:00:00] Building   ports-mgmt/pkg | pkg-2.0.6
[00:00:39] [01] [00:00:37] Finished   ports-mgmt/pkg | pkg-2.0.6: =
Success ending TMPFS: 3.70 GiB
[00:00:39] [02] [00:00:00] Builder starting
[00:00:39] [01] [00:00:00] Building   misc/freebsd-release-manifests | =
freebsd-release-manifests-20250207
[00:00:40] [02] [00:00:01] Builder started
[00:00:40] [02] [00:00:00] Building   devel/bsddialog | bsddialog-1.0.1
[00:00:40] [01] [00:00:01] Finished   misc/freebsd-release-manifests | =
freebsd-release-manifests-20250207: Success ending TMPFS: 2.88 GiB
[00:00:42] [02] [00:00:02] Finished   devel/bsddialog | bsddialog-1.0.1: =
Success ending TMPFS: 2.89 GiB
[00:00:42] [01] [00:00:00] Building   ports-mgmt/portconfig | =
portconfig-0.6.1_1
[00:00:43] [01] [00:00:01] Finished   ports-mgmt/portconfig | =
portconfig-0.6.1_1: Success ending TMPFS: 2.88 GiB
[00:00:43] [01] [00:00:00] Building   ports-mgmt/poudriere-devel | =
poudriere-devel-3.4.99.20250209
[00:00:46] [01] [00:00:03] Finished   ports-mgmt/poudriere-devel | =
poudriere-devel-3.4.99.20250209: Success ending TMPFS: 2.96 GiB
[00:00:47] Stopping 5 builders
[00:00:47] Creating pkg repository
mount_nullfs: =
/usr/local/poudriere/data/.m/main-ZNV4-default/ref/packages: Resource =
deadlock avoided
[00:00:47] Error: =
/usr/local/share/poudriere/bulk.sh:mount_packages:7:Failed to mount the =
packages directory =20

It later reports:

[00:00:47] Unmounting file systems
Error: (50608) rm:rm:1: /usr/local/poudriere/data/.m/main-ZNV4-default: =
Device busy

After that the df -m output includes the likes of:

tmpfs                                              144265     0 144265   =
  0%    =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-ZNV4-default

which is the /usr/local/poudriere/data/.m/main-ZNV4-default involved.

I reduced the context down to having the chroot based on
just (showing df -m output from in the chroot session
after the failure, showing just what was put in the chroot
area, other than poudriere's run generates the tmpfs shown):

zoptb/DESTDIRs/main-ZNV4-chroot-ports-local        759185  9745 749439   =
  1%    /usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local
devfs                                                   0     0      0   =
  0%    /usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/dev
/usr/local/etc/poudriere.conf                      752193  2753 749439   =
  0%    =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/etc/poudriere.con=
f
tmpfs                                              148322     0 148322   =
  0%    =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default
/usr/obj/DESTDIRs/main-ZNV4-poud                   751882  2442 749439   =
  0%    =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/obj/DESTDIRs/main-ZNV4-=
poud
/usr/ports                                         759648 10208 749439   =
  1%    /usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/ports

Note the name main-mmjnk-default for this simpler context that is
otherwise similar.

So the rest is local to /usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local
instead of being mount points referencing places outside that.

I then added some echos into poudriere's common.sh and include/fs.sh and =
saw:

[00:00:02] Stopping 4 builders
About to: findmounts /usr/local/poudriere/data/.m/main-mmjnk-default/04 =
1
About to: findmounts /usr/local/poudriere/data/.m/main-mmjnk-default/02 =
1
About to: findmounts /usr/local/poudriere/data/.m/main-mmjnk-default/03 =
1
About to: findmounts /usr/local/poudriere/data/.m/main-mmjnk-default/01 =
1
findmounts result:
findmounts result:
findmounts result:
findmounts result: =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/var/db/ports =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/usr/tests =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/usr/src =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/usr/share =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/usr/ports =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/usr/lib32 =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/rescue =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/proc =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/packages =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/distfiles =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/dev/fd =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/dev =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/compat/linux/proc =
/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/usr/local/poudriere/data/.m=
/main-mmjnk-default/01/.p
[00:00:02] Creating pkg repository
About to: umountfs =
/usr/local/poudriere/data/.m/main-mmjnk-default/ref/packages
About to: findmounts =
/usr/local/poudriere/data/.m/main-mmjnk-default/ref/packages 0
findmounts result:
About to: /sbin/mount -t nullfs -o rw =
/usr/local/poudriere/data/packages/main-mmjnk-default/.building =
/usr/local/poudriere/data/.m/main-mmjnk-default/ref/packages
mount_nullfs: =
/usr/local/poudriere/data/.m/main-mmjnk-default/ref/packages: Resource =
deadlock avoided

I'll note that /usr/local/poudriere/data/.m/main-mmjnk-default in the
chroot area is reported to be tmpfs, like the mroe complicated
main-ZNV4-default example.

Nothing else in that area is listed as being tmpfs after the problem.


(That looks to me like it is possibly hitting a new system constraint,
appearently associated with at least chroot contexts.)

I'll note that the example happens to be based on a GPT partition with a
ZFS file system, in ase that somehow matters. (ZFS classically used just
for bectl usage, not other typical reasons.)


The jail creation had been via:

# poudriere jail -c -jmain-mmjnk -m null -M =
/usr/obj/DESTDIRs/main-ZNV4-poud -S /usr/main-src -v 15.0-CURRENT
[00:00:00] Recording filesystem state for clean... done
[00:00:00] Jail main-mmjnk 15.0-CURRENT amd64 is ready to be used

I'll note:

# poudriere ports -l
PORTSTREE METHOD TIMESTAMP           PATH
default   null   2021-04-18 02:05:47 /usr/ports

Entering the chroot had been via:

# chroot /usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/
#

The starting environment in the chroot had:

# pkg -v
1.21.3

# poudriere version
poudriere-git-3.4.99.20250115

from prior activity.


The content of:

/usr/obj/DESTDIRs/main-ZNV4-chroot-ports-local/

is a personal world build that was installed there. (The system boots
to an official PkgBase installed world.) So this is not just official
materials involved in the activity, unfortunately.

=3D=3D=3D
Mark Millard
marklmi at yahoo.com




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?EA28C450-9543-415E-91F9-76086401F1D6>