ZFS v28 zfs recv leaves filesystems with wrong names
James R. Van Artsdalen
james-freebsd-fs2 at jrv.org
Wed Oct 6 08:39:40 UTC 2010
James R. Van Artsdalen wrote:
> I get the following assertion with "zfs recv":
>
> bigback:/root# zfs send -R -I @syssnap-1249124822.2009-08-01.06:07:02.213-30-6 bigtex at syssnap-1254395222.2009-10-01.06:07:02.274-39-4 | ssh kraken zfs recv -dvF bigz
> Assertion failed: (!clp->cl_alldependents), file /usr/src/cddl/lib/libzfs/../../../cddl/contrib/opensolaris/lib/libzfs/common/libzfs_changelist.c, line 470.
I found a simple reproducible test case. The assertion is correct
because an earlier "zfs recv" left the datasets with the wrong names.
This test case leaves the pool in the wrong state, which causes a later
"zfs recv" to assert/fail (the assertion isn't induced by this script
since that's not where the bug is).
kraken:/root# uname -a
FreeBSD kraken.housenet.jrv 9.0-CURRENT FreeBSD 9.0-CURRENT #3 r212080M:
Fri Sep 3 15:43:23 CDT 2010
root at kraken.housenet.jrv:/usr/obj/usr/src/sys/BIGTEX amd64
kraken:/root# cat zt
zpool create rec1 da3
zpool create rec2 da4
zfs create rec1/a
zfs create rec1/a/b
zfs snapshot -r rec1 at s1
zfs send -R rec1 at s1 | zfs recv -dvuF rec2
zfs rename rec1/a/b rec1/c
zfs destroy -r rec1/a
zfs create rec1/a
zfs rename rec1/c rec1/a/b # if the rename target is anything other than
rec1/a/b the "zfs recv" result is right
zfs snapshot -r rec1 at s2
zfs send -R -I @s1 rec1 at s2 | zfs recv -dvuF rec2
kraken:/root# sh -x zt
+ zpool create rec1 da3
+ zpool create rec2 da4
+ zfs create rec1/a
+ zfs create rec1/a/b
+ zfs snapshot -r rec1 at s1
+ zfs send -R rec1 at s1
+ zfs recv -dvuF rec2
receiving full stream of rec1 at s1 into rec2 at s1
received 47.4KB stream in 2 seconds (23.7KB/sec)
receiving full stream of rec1/a at s1 into rec2/a at s1
received 47.9KB stream in 1 seconds (47.9KB/sec)
receiving full stream of rec1/a/b at s1 into rec2/a/b at s1
received 46.3KB stream in 1 seconds (46.3KB/sec)
+ zfs rename rec1/a/b rec1/c
+ zfs destroy -r rec1/a
+ zfs create rec1/a
+ zfs rename rec1/c rec1/a/b
+ zfs snapshot -r rec1 at s2
+ zfs send -R -I @s1 rec1 at s2
+ zfs recv -dvuF rec2
attempting destroy rec2/a at s1
success
attempting destroy rec2/a
failed - trying rename rec2/a to rec2/recv-2176-1
local fs rec2/a/b new parent not found
cannot open 'rec2/a/b': dataset does not exist
another pass:
attempting destroy rec2/recv-2176-1
failed (0)
receiving incremental stream of rec1 at s2 into rec2 at s2
received 10.8KB stream in 2 seconds (5.41KB/sec)
receiving full stream of rec1/a at s2 into rec2/a at s2
received 47.9KB stream in 1 seconds (47.9KB/sec)
receiving incremental stream of rec1/a/b at s2 into rec2/recv-2176-1/b at s2
received 312B stream in 2 seconds (156B/sec)
local fs rec2/a does not have fromsnap (s1 in stream); must have been
deleted locally; ignoring
attempting destroy rec2/recv-2176-1
failed (0)
kraken:/root# zfs list | grep rec1
rec1 238K
1.78T 32K /rec1
rec1/a 63K
1.78T 32K /rec1/a
rec1/a/b 31K
1.78T 31K /rec1/a/b
kraken:/root# zfs list | grep rec2
rec2 293K
1.78T 32K /rec2
rec2/a 32K
1.78T 32K /rec2/a
rec2/recv-2176-1 64K
1.78T 32K /rec2/recv-2176-1
rec2/recv-2176-1/b 32K
1.78T 31K /rec2/recv-2176-1/b
kraken:/root#
More information about the freebsd-fs
mailing list