summaryrefslogtreecommitdiff
path: root/examples/main.sh
blob: 082576a433e0ff96e48b79cde38456522db1c70b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
readonly image=../scratch/dump-zero.img

######################################################################

set -e

run-btrfs-rec() {
	local tgt=$1; shift
	local log=${tgt%.*}.log
	if test -s "$tgt"; then
		return
	fi
	{
		set -x;
		command time --verbose \
			./bin/btrfs-rec \
			--pv="$image" \
			--profile.cpu="${tgt%.*}.cpu.pprof" \
			--profile.allocs="${tgt%.*}.allocs.pprof" \
			"$@"
	} >"$tgt" 2> >(tee >&2 "$log")
}

set -x
make build
gendir="${image%.img}.gen"
mkdir -p "$gendir"
export GOMEMLIMIT="$(awk '/^MemTotal:/{ print $2 "KiB" }' </proc/meminfo)"
{ set +x; } &>/dev/null

######################################################################

# 0: initial scan ##########################################

run-btrfs-rec $gendir/0.scandevices.json \
    inspect rebuild-mappings scan
run-btrfs-rec $gendir/0.nodes.json \
    inspect rebuild-mappings list-nodes $gendir/0.scandevices.json

# 1-2: rebuild chunk/dev-ext/blockgroup trees ##############

run-btrfs-rec $gendir/1.mappings.json \
    inspect rebuild-mappings process $gendir/0.scandevices.json

# 1.mappings.log says:
#
#     detailed report:
#     ... unmapped physical region: dev=1 beg=0x0000000000000000 end=0x0000000000100000 (size=0x0000000000100000)
#     ... unmapped physical region: dev=1 beg=0x0000000000500000 end=0x0000000001500000 (size=0x0000000001000000)
#     ... unmapped physical region: dev=1 beg=0x0000003b9e650000 end=0x0000003b9e656000 (size=0x0000000000006000)
#     ... umapped summed logical region:  beg=0x0000000000d00000 end=0x0000000001500000 (size=0x0000000000800000)
#     ... umapped block group:            beg=0x0000000000500000 end=0x0000000000d00000 (size=0x0000000000800000) flags=METADATA|single
#     ... umapped block group:            beg=0x0000000000d00000 end=0x0000000001500000 (size=0x0000000000800000) flags=DATA|single
#
# Those 2 block groups clearly both slot in to that 2nd physical
# region (which is roughly beg=5MB end=22MB).  Since that whole
# region's data was lost (roughly the 1st 100MB was lost), it doesn't
# matter which order we put the 2 block groups in within that physical
# region.  So just put them in laddr order.
#
# And then run that through `rebuild-mappings process` again to fill in the
# flags and normalize it.
run-btrfs-rec $gendir/2.mappings.json \
    --mappings=<(sed <$gendir/1.mappings.json \
      -e '2a{"LAddr":5242880,"PAddr":{"Dev":1,"Addr":5242880},"Size":1},' \
      -e '2a{"LAddr":13631488,"PAddr":{"Dev":1,"Addr":13631488},"Size":1},') \
    inspect rebuild-mappings process $gendir/0.scandevices.json

# 3: rebuild other trees ###################################

run-btrfs-rec $gendir/3.trees.json \
    --mappings=$gendir/2.mappings.json \
    --node-list=$gendir/0.nodes.json \
    inspect rebuild-trees

# 4: dump data from the FS #################################

run-btrfs-rec $gendir/4.ls-files.txt \
    --mappings=$gendir/2.mappings.json \
    --node-list=$gendir/0.nodes.json \
    --trees=$gendir/3.trees.json \
    inspect ls-files

run-btrfs-rec $gendir/4.ls-trees.txt \
    --mappings=$gendir/2.mappings.json \
    --node-list=$gendir/0.nodes.json \
    --trees=$gendir/3.trees.json \
    inspect ls-trees