5 FIRST_DAMAGE
="first-damage.py"
7 METADATA_POOL
=cephfs_meta
12 printf '%s: [--fs=<fs_name>] [--metadata-pool=<pool>] [--first-damage=</path/to/first-damage.py>]\n'
18 ceph config
set mds mds_bal_fragment_dirs
0
20 DIR_INODE
=$
(stat
-c '%i' dir
)
23 touch -- $
(printf 'dir/\xff')
39 # unlink then create, HEAD not snapped
42 BIG_DIR_INODE
=$
(stat
-c '%i' big
)
43 for i
in `seq 1 15000`; do
44 touch $
(printf 'big/%08d' $i)
49 ceph tell mds.
"$FS":0 flush journal
53 local IS
=$
(printf '%llx.%08llx' "$DIR_INODE" 0)
54 local LS
=$
(ceph tell mds.
"$FS":0 dump snaps | jq .last_created
)
56 local T
=$
(mktemp
-p /tmp
)
58 # nuke snap 1 version of "a"
59 rados
--pool="$METADATA_POOL" getomapval
"$IS" a_$
(printf %x $
((LS-4
))) "$T"
60 printf '\xff\xff\xff\xf0' |
dd of
="$T" count
=4 bs
=1 conv
=notrunc
,nocreat
61 rados
--pool="$METADATA_POOL" setomapval
"$IS" a_$
(printf %x $
((LS-4
))) --input-file="$T"
63 # nuke snap 4 version of "a"
64 rados
--pool="$METADATA_POOL" getomapval
"$IS" a_$
(printf %x $
((LS-1
))) "$T"
65 printf '\xff\xff\xff\xff' |
dd of
="$T" count
=4 bs
=1 conv
=notrunc
,nocreat
66 rados
--pool="$METADATA_POOL" setomapval
"$IS" a_$
(printf %x $
((LS-1
))) --input-file="$T"
69 rados
--pool="$METADATA_POOL" getomapval
"$IS" a_head
"$T"
70 printf '\xfe\xff\xff\xff' |
dd of
="$T" count
=4 bs
=1 conv
=notrunc
,nocreat
71 rados
--pool="$METADATA_POOL" setomapval
"$IS" a_head
--input-file="$T"
73 # screw up HEAD on what dentry in big
74 IS
=$
(printf '%llx.%08llx' "$BIG_DIR_INODE" 0)
75 rados
--pool="$METADATA_POOL" getomapval
"$IS" 00009999_head
"$T"
76 printf '\xfe\xff\xff\xff' |
dd of
="$T" count
=4 bs
=1 conv
=notrunc
,nocreat
77 rados
--pool="$METADATA_POOL" setomapval
"$IS" 00009999_head
--input-file="$T"
86 cephfs-journal-tool
--rank="$FS":0 event recover_dentries summary
87 cephfs-journal-tool
--rank="$FS":0 journal
reset
88 "$PYTHON" $FIRST_DAMAGE --debug /tmp
/debug1
--memo /tmp
/memo1
"$METADATA_POOL"
89 "$PYTHON" $FIRST_DAMAGE --debug /tmp
/debug2
--memo /tmp
/memo2
--repair-nosnap "$METADATA_POOL"
90 "$PYTHON" $FIRST_DAMAGE --debug /tmp
/debug3
--memo /tmp
/memo3
--remove "$METADATA_POOL"
91 ceph fs
set "$FS" joinable true
97 for i
in `seq 1 5`; do
98 stat dir
/.snap
/$i ||
exit 2
100 stat dir
/.snap
/2/a ||
exit 3
101 stat dir
/.snap
/5/a ||
exit 4
102 if stat dir
/.snap
/1/a
; then
106 if stat dir
/.snap
/3/a
; then
107 echo should not ever exist
110 if stat dir
/.snap
/4/a
; then
123 sudo
--preserve-env=CEPH_CONF bin
/mount.ceph
:/ "$MOUNT" -o name
=admin
,noshare
128 eval set -- $
(getopt
--name "$0" --options '' --longoptions 'help,fs:,metadata-pool:,first-damage:,mount:,python:' -- "$@")
130 while [ "$#" -gt 0 ]; do
173 sudo umount
-f "$MOUNT"
175 # flush dentries/inodes to omap
182 sleep 5 # for mds to join
191 sudo umount
-f "$MOUNT"