sbin/hammer: Add quick mode for hammer recover
commite819b271a95d8f4c7c8d587e56992c11a745946d
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Thu, 8 Dec 2016 10:05:42 +0000 (8 19:05 +0900)
committerTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Thu, 8 Dec 2016 18:07:20 +0000 (9 03:07 +0900)
tree9cfa9ce95ab42df8f6c90f215c4533943ba0e905
parentce410fe94002a7a37da2058da6ca42213517fd63
sbin/hammer: Add quick mode for hammer recover

Since hammer recover command tries to recover filesystem data
based on assumption on ondisk data bytes that look like B-Tree
nodes/elms, the command can tell the recovery process is done
once scanning offset gets to the point where there is no more
big-blocks for B-Tree zone, without scanning through the whole
address space of all volumes (provided B-Tree zone is alive).

By specifying quick option after the target directory option,
this command makes use of B-Tree big-block info prefetched before
recovery process, and stops recovery once all B-Tree big-blocks
are scanned. As shown in below example, this makes recovery
much faster by cutting unnecessary I/Os.

The drawback is that quick mode is based on assumption that
B-Tree zone isn't corrupted. If B-Tree zone is somehow corrupted,
prefetched info is incomplete or totally wrong, so one needs
to linearly scan the whole address space of all volumes to
check every possible B-Tree nodes/elms without using quick mode
which is what's been done by default.

-- example of default and quick mode
 # newfs_hammer -L TEST /dev/da1 > /dev/null
 # mount_hammer /dev/da1 /HAMMER
 # cd /HAMMER
 # git clone /usr/local/src/dragonfly > /dev/null 2>&1
 # cd
 # umount /HAMMER

 # time hammer -f /dev/da1 recover /tmp/a > /dev/null
 hammer -f /dev/da1 recover /tmp/a > /dev/null  309.51s user 122.96s system 21% cpu 33:50.17 total
 # cd /tmp/a/PFS00000/dragonfly/sys/vfs/hammer
 # make > /dev/null 2>&1; echo $?
 0
 # file hammer.ko
 hammer.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

 # time hammer -f /dev/da1 recover /tmp/b quick > /dev/null
 hammer -f /dev/da1 recover /tmp/b quick > /dev/null  0.41s user 3.41s system 14% cpu 26.652 total
 # cd /tmp/b/PFS00000/dragonfly/sys/vfs/hammer
 # make > /dev/null 2>&1; echo $?
 0
 # file hammer.ko
 hammer.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
sbin/hammer/cmd_recover.c
sbin/hammer/hammer.8
sbin/hammer/hammer.c
sbin/hammer/hammer.h