commit
bc072c78f6
2 changed files with 102 additions and 0 deletions
@ -0,0 +1,49 @@ |
|||
#!/usr/bin/perl |
|||
|
|||
use strict; |
|||
use File::Sync qw(fsync); |
|||
use Fcntl qw(:DEFAULT O_ASYNC O_DIRECT); |
|||
|
|||
my $device = $ARGV[0]; |
|||
my $logfn = $ARGV[1]; |
|||
if (!$logfn) |
|||
{ |
|||
print "USAGE: perl r20.pl DEVICE LOGFILE\n"; |
|||
exit; |
|||
} |
|||
|
|||
my $last = {}; |
|||
my $logfd; |
|||
open $logfd, $logfn or die $!; |
|||
my $i = 0; |
|||
while (my $s = <$logfd>) |
|||
{ |
|||
$s =~ s/[\x0d\x0a]+$//; |
|||
my ($pos, $hex) = split / /, $s, 2; |
|||
$last->{$pos} = $i++; |
|||
} |
|||
|
|||
my $fd; |
|||
sysopen $fd, $device, O_RDONLY or die $!; |
|||
my $buffer = " " x 4096; |
|||
my $fact; |
|||
$i = 0; |
|||
seek $logfd, 0, 0 or die $!; |
|||
while (my $s = <$logfd>) |
|||
{ |
|||
$s =~ s/[\x0d\x0a]+$//; |
|||
my ($pos, $hex) = split / /, $s, 2; |
|||
next if $last->{$pos} != $i; # only check last overwrite |
|||
$hex = pack("H*", $hex); |
|||
substr($buffer, 0, 4096, ($hex x 512)); |
|||
sysseek($fd, $pos*4096, 0) or die $!; |
|||
sysread($fd, $fact, 4096) or die $!; |
|||
if ($fact ne $buffer) |
|||
{ |
|||
print "Mismatch at offset $pos*4096 (line $i): ".unpack("H*", substr($fact, 0, 8))." vs ".unpack("H*", $hex)."\n"; |
|||
} |
|||
$i++; |
|||
} |
|||
close $fd; |
|||
|
|||
close $logfd; |
@ -0,0 +1,53 @@ |
|||
#!/usr/bin/perl |
|||
# Idea: |
|||
# - run `nc -l 6777 > logfile.txt` on your machine |
|||
# - run `perl check-fsync-write.pl` on tested machine |
|||
# - pull power plug out from tested machine (do not press RESET! pull the plug out!) |
|||
# - power it back on |
|||
# - copy logfile.txt to tested machine |
|||
# - run `perl check-fsync-read.pl /dev/sdX logfile.txt` and check the output |
|||
|
|||
use strict; |
|||
use Socket qw(PF_INET SOCK_STREAM pack_sockaddr_in inet_aton); |
|||
use File::Sync qw(fsync); |
|||
use Fcntl qw(:DEFAULT O_ASYNC O_DIRECT); |
|||
|
|||
# Parameters |
|||
my $diskpath = "/dev/sdf"; # device |
|||
my $disksize = 499896320/8; # (device size / 4096) |
|||
my $ip = '172.29.1.109'; # logger machine IP |
|||
my $port = 6777; # logger machine port |
|||
|
|||
# Code |
|||
my $bufsize = 4096; |
|||
my $align = 512; |
|||
my $buffer = ' ' x ($align+$bufsize); |
|||
my $off = unpack("J", pack "p", $buffer) % $align; |
|||
$off = $align - $off if $off; |
|||
|
|||
my $socket; |
|||
socket $socket, PF_INET, SOCK_STREAM, 0 or die $!; |
|||
connect $socket, pack_sockaddr_in($port, inet_aton($ip)) or die $!; |
|||
|
|||
my $randfd; |
|||
open $randfd, "/dev/urandom" or die $!; |
|||
|
|||
my $fd; |
|||
sysopen $fd, $diskpath, O_WRONLY|O_DIRECT, 0666 or die $!; |
|||
while (1) |
|||
{ |
|||
my $pos; |
|||
my $number; |
|||
read $randfd, $pos, 4 or die $!; |
|||
read $randfd, $number, 8 or die $!; |
|||
substr($buffer, $off, 4096, $number x 512); |
|||
$pos = int(1.0 * ($disksize-1) * (unpack("V", $pos) & 0x7fffffff) / 0x7fffffff); |
|||
sysseek($fd, $pos*4096, 0) or die $!; |
|||
syswrite($fd, $buffer, 4096, $off) or die $!; |
|||
fsync($fd); |
|||
my $s = "$pos ".unpack("H*", $number)."\x0d\x0a"; |
|||
syswrite($socket, $s, length $s) or die $!; |
|||
} |
|||
close $fd; |
|||
|
|||
close $randfd; |
Loading…
Reference in new issue