releng/13 release/13.0.0 : odd/incorrect diff result over nfs (in a zfs file systems context)
Mark Millard
marklmi at yahoo.com
Sun May 23 19:20:57 UTC 2021
On 2021-May-23, at 01:27, Mark Millard <marklmi at yahoo.com> wrote:
> On 2021-May-23, at 00:44, Mark Millard <marklmi at yahoo.com> wrote:
>
>> On 2021-May-21, at 17:56, Rick Macklem <rmacklem at uoguelph.ca> wrote:
>>
>>> Mark Millard wrote:
>>> [stuff snipped]
>>>> Well, why is it that ls -R, find, and diff -r all get file
>>>> name problems via genet0 but diff -r gets no problems
>>>> comparing the content of files that it does match up (the
>>>> vast majority)? Any clue how could the problems possibly
>>>> be unique to the handling of file names/paths? Does it
>>>> suggest anything else to look into for getting some more
>>>> potentially useful evidence?
>>> Well, all I can do is describe the most common TSO related
>>> failure:
>>> - When a read RPC reply (including NFS/RPC/TCP/IP headers)
>>> is slightly less than 64K bytes (many TSO implementations are
>>> limited to 64K or 32 discontiguous segments, think 32 2K
>>> mbuf clusters), the driver decides it is ok, but when the MAC
>>> header is added it exceeds what the hardware can handle correctly...
>>> --> This will happen when reading a regular file that is slightly less
>>> than a multiple of 64K in size.
>>> or
>>> --> This will happen when reading just about any large directory,
>>> since the directory reply for a 64K request is converted to Sun XDR
>>> format and clipped at the last full directory entry that will fit within 64K.
>>> For ports, where most files are small, I think you can tell which is more
>>> likely to happen.
>>> --> If TSO is disabled, I have no idea how this might matter, but??
>>>
>>>> I'll note that netstat -I ue0 -d and netstat -I genet0 -d
>>>> do not report changes in Ierrs or Idrop in a before vs.
>>>> after failures comparison. (There may be better figures
>>>> to look at for all I know.)
>>>>
>>>> I tried "ifconfig genet0 -rxcsum -rxcsum -rxcsum6 -txcsum6"
>>>> and got no obvious change in behavior.
>>> All we know is that the data is getting corrupted somehow.
>>>
>>> NFS traffic looks very different than typical TCP traffic. It is
>>> mostly small messages travelling in both directions concurrently,
>>> with some large messages thrown in the mix.
>>> All I'm saying is that, testing a net interface with something like
>>> bulk data transfer in one direction doesn't verify it works for NFS
>>> traffic.
>>>
>>> Also, the large RPC messages are a chain of about 33 mbufs of
>>> various lengths, including a mix of partial clusters and regular
>>> data mbufs, whereas a bulk send on a socket will typically
>>> result in an mbuf chain of a lot of full 2K clusters.
>>> --> As such, NFS can be good at tickling subtle bugs it the
>>> net driver related to mbuf handling.
>>>
>>> rick
>>>
>>>>> W.r.t. reverting r367492...the patch to replace r367492 was just
>>>>> committed to "main" by rscheff@ with a two week MFC, so it
>>>>> should be in stable/13 soon. Not sure if an errata can be done
>>>>> for it for releng13.0?
>>>>
>>>> That update is reported to be causing "rack" related panics:
>>>>
>>>> https://lists.freebsd.org/pipermail/dev-commits-src-main/2021-May/004440.html
>>>>
>>>> reports (via links):
>>>>
>>>> panic: _mtx_lock_sleep: recursed on non-recursive mutex so_snd @ /syzkaller/managers/i386/kernel/sys/modules/tcp/rack/../../../netinet/tcp_stacks/rack.c:10632
>>>>
>>>> Still, I have a non-debug update to main building and will
>>>> likely do a debug build as well. llvm is rebuilding, so
>>>> the builds will take a notable time.
>>
>> I got the following built and installed on the two
>> machines:
>>
>> # uname -apKU
>> FreeBSD CA72_16Gp_ZFS 14.0-CURRENT FreeBSD 14.0-CURRENT #1 main-n246854-03b0505b8fe8-dirty: Sat May 22 16:25:04 PDT 2021 root at CA72_16Gp_ZFS:/usr/obj/BUILDs/main-CA72-dbg-clang/usr/main-src/arm64.aarch64/sys/GENERIC-DBG-CA72 arm64 aarch64 1400013 1400013
>>
>> # uname -apKU
>> FreeBSD CA72_4c8G_ZFS 14.0-CURRENT FreeBSD 14.0-CURRENT #1 main-n246854-03b0505b8fe8-dirty: Sat May 22 16:25:04 PDT 2021 root at CA72_16Gp_ZFS:/usr/obj/BUILDs/main-CA72-dbg-clang/usr/main-src/arm64.aarch64/sys/GENERIC-DBG-CA72 arm64 aarch64 1400013 1400013
>>
>> Note that both are booted with debug builds of main.
>>
>> Using the context with the alternate EtherNet device that has not
>> had an associated diff -r, find, pr ls -R failure yet
>> yet got a panic that looks likely to be unrelated:
>>
>> # mount -onoatime 192.168.1.187:/usr/ports/ /mnt/
>> # diff -r /usr/ports/ /mnt/ | more
>> nvme0: cpl does not map to outstanding cmd
>> cdw0:00000000 sqhd:0020 sqid:0003 cid:007e p:1 sc:00 sct:0 m:0 dnr:0
>> panic: received completion for unknown cmd
>> cpuid = 3
>> time = 1621743752
>> KDB: stack backtrace:
>> db_trace_self() at db_trace_self
>> db_trace_self_wrapper() at db_trace_self_wrapper+0x30
>> vpanic() at vpanic+0x188
>> panic() at panic+0x44
>> nvme_qpair_process_completions() at nvme_qpair_process_completions+0x1fc
>> nvme_timeout() at nvme_timeout+0x3c
>> softclock_call_cc() at softclock_call_cc+0x124
>> softclock() at softclock+0x60
>> ithread_loop() at ithread_loop+0x2a8
>> fork_exit() at fork_exit+0x74
>> fork_trampoline() at fork_trampoline+0x14
>> KDB: enter: panic
>> [ thread pid 12 tid 100028 ]
>> Stopped at kdb_enter+0x48: undefined f904411f
>> db>
>>
>> Based on the "nvme" references, I expect this is tied to
>> handling the Optane 480 GiByte that is in the PCIe slot
>> and is the boot/only media for the machine doing the diff.
>>
>> "db> dump" seems to have worked.
>>
>> After reboot, zpool scrub found no errors.
>>
>> So, trying again . . .
>>
>> I got some "Expensive timeout(9) function" notices:
>>
>> Expensive timeout(9) function: 0xffff000000717b64(0) 1.210285924 s
>> Expensive timeout(9) function: 0xffff000000717b64(0) 4.001010935 s
>>
>> 0xffff000000717b64 looks to be uma_timeout:
>>
>> ffff000000717b60 <uma_startup3+0x118> b ffff000000717b3c <uma_startup3+0xf4>
>> ffff000000717b64 <uma_timeout> stp x29, x30, [sp, #-32]!
>> ffff000000717b68 <uma_timeout+0x4> stp x20, x19, [sp, #16]
>> . . .
>>
>> . . . Hmm. The debug kernel test context seems to take a
>> very long time. It has not failed so far but is still
>> going.
>>
>> So I stopped it and switch to testing with the genet0 device
>> that was involved for the earlier failures. . . .
>>
>> It did not fail. Nor did the debug kernel report anything
>> beyond:
>>
>> if_delmulti_locked: detaching ifnet instance 0xffffa00000fc8000
>> if_delmulti_locked: detaching ifnet instance 0xffffa00000fc8000
>> Expensive timeout(9) function: 0xffff00000050c088(0) 6.318652023 s
>>
>> on one machine and:
>>
>> if_delmulti_locked: detaching ifnet instance 0xffffa0000b56b800
>>
>> on the other.
>>
>> So I may reboot into the also-updated non-debug builds on both
>> machines and try in that context.
>>
>
> The non-debug build pair of machines got the problem:
>
> # diff -r /usr/ports/ /mnt/ | more
> Only in /mnt/devel/electron12/files:
> Only in /usr/ports/devel/electron12/files: patch-chrome_browser_media_webrtc_webrtc__logging__controller.cc
> Only in /usr/ports/devel/electron12/files: patch-components_previews_core_previews__features.cc
> Only in /mnt/devel/electron12/files: <A0><CE><C8>֏<DC>ܦ2<B2><E2><AA>^H
> Only in /mnt/www/chromium/files: patch-chrome_browser_chrome__browser
> Only in /usr/ports/www/chromium/files: patch-chrome_browser_chrome__browser__main__posix.cc
>
> I'll note that it turns out that the debug build had more
> than is typical enabled: DIAGNOSTICS, BUF_TRACKING, and
> FULL_BUF_TRACKING were also enabled. I'd forgotten that
> I'd previously had a reason to add those to what my debug
> builds included (for a prior problem investigation). I'd
> not done debug builds in some time.
Without DIAGNOSTIC, BUF_TRACKING, and FULL_BUF_TRACKING
(so based on a more normal debug build on both sides),
the diff -r progressed at a more normal, sustained rate.
Yet . . .
# mount -onoatime 192.168.1.170:/usr/ports/ /mnt/
# diff -r /usr/ports/ /mnt/ | more
#
In other words: no failure from the debug build.
Also no reports of anything by the debug kernel.
Multiple attempts (including some with reboots
between): same results.
So, it appears that only non-debug builds are
broken, for whatever reason.
For reference:
# uname -apKU
FreeBSD CA72_4c8G_ZFS 14.0-CURRENT FreeBSD 14.0-CURRENT #2 main-n246854-03b0505b8fe8-dirty: Sun May 23 05:57:01 PDT 2021 root at CA72_16Gp_ZFS:/usr/obj/BUILDs/main-CA72-dbg-clang/usr/main-src/arm64.aarch64/sys/GENERIC-DBG-CA72 arm64 aarch64 1400013 1400013
===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)
More information about the freebsd-stable
mailing list