Re: hierarchical, tree-like structure of snapshots
From: john terragon <hidden>
Date: 2021-01-01 04:55:26
Although I'm glad that a bug has been uncovered, maybe it's best if I stick with good old rsync for backups. It would be kind of ironic if the first data loss that I experienced in many years of btrfs use would be caused by an ancillary backup tool. On Thu, Dec 31, 2020 at 10:36 PM Zygo Blaxell [off-list ref] wrote:
On Thu, Dec 31, 2020 at 09:48:54PM +0100, john terragon wrote:quoted
On Thu, Dec 31, 2020 at 8:42 PM Andrei Borzenkov [off-list ref] wrote:quoted
quoted
How exactly you create subvolume with the same content? There are many possible interpretations.Zygo wrote that any subvol could be used with -p. So, out of curiosity, I did the following 1) btrfs sub create X 2) I unpacked some source (linux kernel) in X 3) btrfs sub create W 4) I unpacked the same source in W (so X and W have the same content but they are independent) 5) btrfs sub snap -r X X_RO 6) btrfs sub snap -r W W_RO 7) btrfs send W_RO | btrfs receive /mnt/btrfs2 8) btrfs send -p W_RO X_RO | btrfs receive /mnt/btrfs2 And this is the exact output of 8) At subvol X_RO At snapshot X_RO ERROR: chown o257-1648413-0 failed: No such file or directoryYeah, I only checked that send completed without error and produced a smaller stream. I just dumped the send metadata stream from the incremental snapshot now, and it's more or less garbage at the start: # btrfs sub create A # btrfs sub create B # date > A/date # date > B/date # mkdir A/t B/u # btrfs sub snap -r A A_RO # btrfs sub snap -r B B_RO # btrfs send A_RO | btrfs receive --dump At subvol A_RO subvol ./A_RO uuid=995adde4-00ac-5e49-8c6f-f01743def072 transid=7329268 chown ./A_RO/ gid=0 uid=0 chmod ./A_RO/ mode=755 utimes ./A_RO/ atime=2020-12-31T15:51:31-0500 mtime=2020-12-31T15:51:48-0500 ctime=2020-12-31T15:51:48-0500 mkfile ./A_RO/o257-7329268-0 rename ./A_RO/o257-7329268-0 dest=./A_RO/date utimes ./A_RO/ atime=2020-12-31T15:51:31-0500 mtime=2020-12-31T15:51:48-0500 ctime=2020-12-31T15:51:48-0500 write ./A_RO/date offset=0 len=29 chown ./A_RO/date gid=0 uid=0 chmod ./A_RO/date mode=644 utimes ./A_RO/date atime=2020-12-31T15:51:38-0500 mtime=2020-12-31T15:51:38-0500 ctime=2020-12-31T15:51:38-0500 mkdir ./A_RO/o258-7329268-0 rename ./A_RO/o258-7329268-0 dest=./A_RO/t utimes ./A_RO/ atime=2020-12-31T15:51:31-0500 mtime=2020-12-31T15:51:48-0500 ctime=2020-12-31T15:51:48-0500 chown ./A_RO/t gid=0 uid=0 chmod ./A_RO/t mode=755 utimes ./A_RO/t atime=2020-12-31T15:51:48-0500 mtime=2020-12-31T15:51:48-0500 ctime=2020-12-31T15:51:48-0500 # btrfs send B_RO -p A_RO | btrfs receive --dump At subvol B_RO snapshot ./B_RO uuid=4aa7db26-b219-694e-9b3c-f8f737a46bdb transid=7329268 parent_uuid=995adde4-00ac-5e49-8c6f-f01743def072 parent_transid=7329268 utimes ./B_RO/ atime=2020-12-31T15:51:33-0500 mtime=2020-12-31T15:51:52-0500 ctime=2020-12-31T15:51:52-0500 link ./B_RO/date dest=date unlink ./B_RO/date utimes ./B_RO/ atime=2020-12-31T15:51:33-0500 mtime=2020-12-31T15:51:52-0500 ctime=2020-12-31T15:51:52-0500 write ./B_RO/date offset=0 len=29 utimes ./B_RO/date atime=2020-12-31T15:51:41-0500 mtime=2020-12-31T15:51:41-0500 ctime=2020-12-31T15:51:41-0500 rename ./B_RO/t dest=./B_RO/u utimes ./B_RO/ atime=2020-12-31T15:51:33-0500 mtime=2020-12-31T15:51:52-0500 ctime=2020-12-31T15:51:52-0500 utimes ./B_RO/u atime=2020-12-31T15:51:52-0500 mtime=2020-12-31T15:51:52-0500 ctime=2020-12-31T15:51:52-0500 # btrfs send A_RO | btrfs receive -v /tmp/test At subvol A_RO At subvol A_RO receiving subvol A_RO uuid=995adde4-00ac-5e49-8c6f-f01743def072, stransid=7329268 write date - offset=0 length=29 BTRFS_IOC_SET_RECEIVED_SUBVOL uuid=995adde4-00ac-5e49-8c6f-f01743def072, stransid=7329268 # btrfs send B_RO -p A_RO | btrfs receive -v /tmp/test At subvol B_RO At snapshot B_RO receiving snapshot B_RO uuid=4aa7db26-b219-694e-9b3c-f8f737a46bdb, ctransid=7329268 parent_uuid=995adde4-00ac-5e49-8c6f-f01743def072, parent_ctransid=7329268 ERROR: link date -> date failed: File exists The btrfs_compare_trees function can handle arbitrary tree differences, but something happens in one of the support functions and we get a bogus link command. The rest of the stream is OK though: we fill in the contents of B_RO/date, rename A_RO/t to B_RO/u, and update all the timestamps. Oh well, I didn't say send didn't have any bugs. ;)