DragonFly commits List (threaded) for 2010-03
git: HAMMER VFS - Correct seriuos bug in hammer rebalancing code
Author: Matthew Dillon <email@example.com>
Date: Tue Mar 2 14:36:40 2010 -0800
HAMMER VFS - Correct seriuos bug in hammer rebalancing code
* Correct a serious bug in the hammer rebalancing code which can cause
incremental mirrors to lose track of records, resulting in missing records
on the slave (missing files, missing directory entries, or files
which improperly contain data holes).
The rebalancing code needs to update the mirror_tid chain when moving
elements from one node to another. It updated the parent node but failed
to update the internal element linkage pointing to the child.
This can cause incremental mirroring operations to fail to copy some B-Tree
* Correct a possible issue between the rebalancing code and B-Tree
iterations during mirror-write operations.
When the rebalancer moves an element from one child node to another and
a cursor exists which is pointing at the parent internal node, the
cursor will now be mispositioned because elements which were to the
right of the cursor are now to the left of the cursor.
Adjust hammer_cursor_moved_element() to properly move the cursor and
print a debug message to the console so the code path can be tested.
* These bugs are serious but also very rare. There is a good chance that
your slaves are just fine, but we recommend validating their contents
* PROCEDURE FOR FIXING BROKEN SLAVES: With a little help from the sysop
these problems are self-correcting with the new kernel code in place.
First make sure both the master and slave are running a kernel with
the mirroring fix.
Second, verify the slave matches the master (taking into account
changes being made to live files). Probably the easiest way to do
this is as follows (make sure you push into the softlink, not cpdup
the softlink itself):
cpdup -v -V /pfs/master/. /pfs/slave/.
This should get you a list of missing files and directories. For
each missing file or directory do a chmod, chown, or chflags on the
master, then change it back. This will propagate the updated inode
to the slave So for example:
chflags nodump file
chflags dump file
If file data is corrupt on the mirroring slave you need to recopy the
file on the master, which can be done with dd conv=notrunc:
dd if=file of=file bs=32k conv=notrunc
These actions will cause the master to re-mirror the related files and
data to the slave.
Reported-by: Stathis Kamperis <firstname.lastname@example.org>
Summary of changes:
sys/vfs/hammer/hammer.h | 5 ++-
sys/vfs/hammer/hammer_cursor.c | 52 +++++++++++++++++++++++++++++++++---
sys/vfs/hammer/hammer_mirror.c | 12 +++++---
sys/vfs/hammer/hammer_rebalance.c | 52 +++++++++++++++++++++++-------------
4 files changed, 90 insertions(+), 31 deletions(-)
DragonFly BSD source repository