3e246da52c
The main issue here was that the old orphan test relied on deleting the block that contained the most recent update. In the new design this doesn't really work since updates get appended to metadata-pairs incrementally. This is fixed by instead using the truncate command on the appropriate block. We're now passing orphan tests.
121 lines
2.5 KiB
Bash
Executable File
121 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
set -eu
|
|
|
|
echo "=== Corrupt tests ==="
|
|
|
|
NAMEMULT=64
|
|
FILEMULT=1
|
|
|
|
lfs_mktree() {
|
|
tests/test.py ${1:-} << TEST
|
|
lfs_format(&lfs, &cfg) => 0;
|
|
|
|
lfs_mount(&lfs, &cfg) => 0;
|
|
for (int i = 1; i < 10; i++) {
|
|
for (int j = 0; j < $NAMEMULT; j++) {
|
|
buffer[j] = '0'+i;
|
|
}
|
|
buffer[$NAMEMULT] = '\0';
|
|
lfs_mkdir(&lfs, (char*)buffer) => 0;
|
|
|
|
buffer[$NAMEMULT] = '/';
|
|
for (int j = 0; j < $NAMEMULT; j++) {
|
|
buffer[j+$NAMEMULT+1] = '0'+i;
|
|
}
|
|
buffer[2*$NAMEMULT+1] = '\0';
|
|
lfs_file_open(&lfs, &file[0], (char*)buffer,
|
|
LFS_O_WRONLY | LFS_O_CREAT) => 0;
|
|
|
|
size = $NAMEMULT;
|
|
for (int j = 0; j < i*$FILEMULT; j++) {
|
|
lfs_file_write(&lfs, &file[0], buffer, size) => size;
|
|
}
|
|
|
|
lfs_file_close(&lfs, &file[0]) => 0;
|
|
}
|
|
lfs_unmount(&lfs) => 0;
|
|
TEST
|
|
}
|
|
|
|
lfs_chktree() {
|
|
tests/test.py ${1:-} << TEST
|
|
lfs_mount(&lfs, &cfg) => 0;
|
|
for (int i = 1; i < 10; i++) {
|
|
for (int j = 0; j < $NAMEMULT; j++) {
|
|
buffer[j] = '0'+i;
|
|
}
|
|
buffer[$NAMEMULT] = '\0';
|
|
lfs_stat(&lfs, (char*)buffer, &info) => 0;
|
|
info.type => LFS_TYPE_DIR;
|
|
|
|
buffer[$NAMEMULT] = '/';
|
|
for (int j = 0; j < $NAMEMULT; j++) {
|
|
buffer[j+$NAMEMULT+1] = '0'+i;
|
|
}
|
|
buffer[2*$NAMEMULT+1] = '\0';
|
|
lfs_file_open(&lfs, &file[0], (char*)buffer, LFS_O_RDONLY) => 0;
|
|
|
|
size = $NAMEMULT;
|
|
for (int j = 0; j < i*$FILEMULT; j++) {
|
|
lfs_file_read(&lfs, &file[0], rbuffer, size) => size;
|
|
memcmp(buffer, rbuffer, size) => 0;
|
|
}
|
|
|
|
lfs_file_close(&lfs, &file[0]) => 0;
|
|
}
|
|
lfs_unmount(&lfs) => 0;
|
|
TEST
|
|
}
|
|
|
|
echo "--- Sanity check ---"
|
|
rm -rf blocks
|
|
lfs_mktree
|
|
lfs_chktree
|
|
|
|
echo "--- Block corruption ---"
|
|
for i in {2..33}
|
|
do
|
|
rm -rf blocks
|
|
mkdir blocks
|
|
ln -s /dev/zero blocks/$(printf '%x' $i)
|
|
echo $i 1i
|
|
lfs_mktree
|
|
echo $i 2i
|
|
lfs_chktree
|
|
echo $i 3i
|
|
done
|
|
|
|
echo "--- Block persistance ---"
|
|
for i in {2..33}
|
|
do
|
|
rm -rf blocks
|
|
mkdir blocks
|
|
lfs_mktree
|
|
chmod a-w blocks/$(printf '%x' $i) || true
|
|
lfs_mktree
|
|
lfs_chktree
|
|
done
|
|
|
|
echo "--- Big region corruption ---"
|
|
rm -rf blocks
|
|
mkdir blocks
|
|
for i in {2..255}
|
|
do
|
|
ln -s /dev/zero blocks/$(printf '%x' $i)
|
|
done
|
|
lfs_mktree
|
|
lfs_chktree
|
|
|
|
echo "--- Alternating corruption ---"
|
|
rm -rf blocks
|
|
mkdir blocks
|
|
for i in {2..511..2}
|
|
do
|
|
ln -s /dev/zero blocks/$(printf '%x' $i)
|
|
done
|
|
lfs_mktree
|
|
lfs_chktree
|
|
|
|
echo "--- Results ---"
|
|
tests/stats.py
|