a | b | |
---|
| 0 | + | #!/bin/bash |
---|
| 0 | + | |
---|
| 0 | + | # Write a 4096 byte block of something |
---|
| 0 | + | block () |
---|
| 0 | + | { |
---|
| 0 | + | head -c 4096 /dev/zero | tr '\0' "\\$1"; |
---|
| 0 | + | } |
---|
| 0 | + | |
---|
| 0 | + | # Here is some test data with holes in it: |
---|
| 0 | + | for y in $(seq 0 2); do |
---|
| 0 | + | for x in 0 1; do |
---|
| 0 | + | block 0; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | block 21; |
---|
| 0 | + | done |
---|
| 0 | + | done > am |
---|
| 0 | + | sync |
---|
| 0 | + | |
---|
| 0 | + | echo "file size: $(du -h am)" |
---|
| 0 | + | |
---|
| 0 | + | echo "digests after file creation: $(sha1sum am)" |
---|
| 0 | + | sysctl -q vm.drop_caches=1 |
---|
| 0 | + | echo "digests after file creation 2: $(sha1sum am)" |
---|
| 0 | + | |
---|
| 0 | + | # Now replace those 101 distinct extents with 101 references to the first extent |
---|
| 0 | + | btrfs-extent-same 131072 $(for x in $(seq 0 2); do echo am $((x * 131072)); done) 2>&1 | tail -1 |
---|
| 0 | + | |
---|
| 0 | + | echo "digests after dedupe: $(sha1sum am)" |
---|
| 0 | + | sysctl -q vm.drop_caches=1 |
---|
| 0 | + | echo "digests after dedupe 2: $(sha1sum am)" |
---|
| 0 | + | |
---|
| 0 | + | # Punch holes into the extent refs |
---|
| 0 | + | fallocate -v -d am |
---|
| 0 | + | |
---|
| 0 | + | echo "digests after hole punching: $(sha1sum am)" |
---|
| 0 | + | sysctl -q vm.drop_caches=1 |
---|
| 0 | + | echo "digests after hole punching 2: $(sha1sum am)" |
---|
... | |
---|