9 find_mogclient_or_skip();
12 my $sto = eval { temp_store(); };
14 plan skip_all => "Can't create temporary test database: $@";
20 $mogroot{1} = File::Temp::tempdir( CLEANUP => 1 );
21 $mogroot{2} = File::Temp::tempdir( CLEANUP => 1 );
22 my $dev2host = { 1 => 1, 2 => 2, };
23 foreach (sort { $a <=> $b } keys %$dev2host) {
24 my $root = $mogroot{$dev2host->{$_}};
25 mkdir("$root/dev$_") or die "Failed to create dev$_ dir: $!";
28 my $ms1 = create_mogstored("127.0.1.1", $mogroot{1});
29 ok($ms1, "got mogstored1");
30 my $ms2 = create_mogstored("127.0.1.2", $mogroot{2});
31 ok($ms1, "got mogstored2");
34 print "Waiting on usage...\n";
35 -e "$mogroot{1}/dev1/usage" && -e "$mogroot{2}/dev2/usage";
38 my $tmptrack = create_temp_tracker($sto);
41 my $admin = IO::Socket::INET->new(PeerAddr => '127.0.0.1:7001');
42 $admin or die "failed to create admin socket: $!";
43 my $moga = MogileFS::Admin->new(hosts => [ "127.0.0.1:7001" ]);
44 my $mogc = MogileFS::Client->new(
46 hosts => [ "127.0.0.1:7001" ],
48 my $be = $mogc->{backend}; # gross, reaching inside of MogileFS::Client
50 # test some basic commands to backend
51 ok($tmptrack->mogadm("domain", "add", "testdom"), "created test domain");
52 ok($tmptrack->mogadm("class", "add", "testdom", "changer", "--mindevcount=2", "--hashtype=MD5"), "created changer class in testdom with hashtype=MD5");
54 ok($tmptrack->mogadm("host", "add", "hostA", "--ip=127.0.1.1", "--status=alive"), "created hostA");
55 ok($tmptrack->mogadm("host", "add", "hostB", "--ip=127.0.1.2", "--status=alive"), "created hostB");
57 ok($tmptrack->mogadm("device", "add", "hostA", 1), "created dev1 on hostA");
58 ok($tmptrack->mogadm("device", "add", "hostB", 2), "created dev2 on hostB");
60 sub wait_for_monitor {
62 my $was = $be->{timeout}; # can't use local on phash :(
64 ok($be->do_request("clear_cache", {}), "waited for monitor")
65 or die "Failed to wait for monitor";
66 ok($be->do_request("clear_cache", {}), "waited for monitor")
67 or die "Failed to wait for monitor";
68 $be->{timeout} = $was;
73 syswrite($admin, "!want 0 replicate\r\n"); # disable replication
74 ok(<$admin> =~ /Now desiring/ && <$admin> eq ".\r\n", "disabling replicate");
79 syswrite($admin, "!jobs\r\n");
80 MogileFS::Util::wait_for_readability(fileno($admin), 10);
83 if ($line =~ /\Areplicate count (\d+)/) {
86 last if $line eq ".\r\n";
90 is($count, 0, "replicate count is zero");
93 wait_for_monitor($be);
94 stop_replicate($admin);
96 my ($req, $rv, %opts, @paths, @fsck_log);
97 my $ua = LWP::UserAgent->new;
100 use Digest::MD5 qw/md5_hex/;
104 %opts = ( domain => "testdom", class => "changer", key => $key );
105 $rv = $be->do_request("create_open", \%opts);
107 ok($rv && $rv->{path}, "create_open succeeded");
108 $req = HTTP::Request->new(PUT => $rv->{path});
109 $req->content("blah");
110 $rv = $ua->request($req);
111 ok($rv->is_success, "PUT successful");
113 $opts{domain} = "testdom";
114 $opts{checksum} = "MD5:".md5_hex('blah');
115 $opts{checksumverify} = 1;
116 $rv = $be->do_request("create_close", \%opts);
117 ok($rv, "checksum verified successfully");
118 ok($sto->get_checksum($opts{fid}), "checksum saved");
119 ok($mogc->file_info($key), "file_info($key) is sane");
122 # disable MD5 checksums in "changer" class
124 %opts = ( domain => "testdom", class => "changer",
125 hashtype => "NONE", mindevcount => 2);
126 ok($be->do_request("update_class", \%opts), "update class");
127 wait_for_monitor($be);
130 # replicate should work even if we have, but don't need a checksum anymore
132 syswrite($admin, "!want 1 replicate\n");
133 ok(<$admin> =~ /Now desiring/ && <$admin> eq ".\r\n", "enabled replicate");
135 # wait for replicate to recreate checksum
137 @paths = $mogc->get_paths($key);
140 is(scalar(@paths), 2, "replicated successfully");
141 stop_replicate($admin);
144 # switch to SHA-1 checksums in "changer" class
146 %opts = ( domain => "testdom", class => "changer",
147 hashtype => "SHA-1", mindevcount => 2);
148 ok($be->do_request("update_class", \%opts), "update class");
149 wait_for_monitor($be);
153 ok($tmptrack->mogadm("fsck", "stop"), "stop fsck");
154 ok($tmptrack->mogadm("fsck", "clearlog"), "clear fsck log");
155 ok($tmptrack->mogadm("fsck", "reset"), "reset fsck");
156 ok($tmptrack->mogadm("fsck", "start"), "started fsck");
158 try_for(30, sub { @fsck_log = $sto->fsck_log_rows; });
159 is($fsck_log[0]->{evcode}, "BALG", "bad checksum algorithm logged");