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