Checking in changes prior to tagging of version 2.50.
[MogileFS-Server.git] / t / 10-weighting.t
blob5f7c41f576f7dda98dc7e2d2a94d4963e0c05d9d
1 # -*-perl-*-
3 use strict;
4 use warnings;
5 use Test::More;
6 use FindBin qw($Bin);
7 use Time::HiRes qw(sleep);
9 use MogileFS::Server;
11 BEGIN {
12     $ENV{TESTING} = 1;
13     $ENV{T_FAKE_IO_DEV1} = 95; # Simulating high device load (should get fewer requests).
14     $ENV{T_FAKE_IO_DEV2} = 5;  # Simulating low device load (should get more requests).
17 use MogileFS::Test;
18 find_mogclient_or_skip();
20 # create temp mysql db,
21 # use mogadm to init it,
22 # mogstored on temp dir,
23 # register mogstored temp dir,
24 # mogilefsd startup,
25 # add file,
26 # etc
28 my $sto = eval { temp_store(); };
29 if ($sto) {
30     plan tests => 17;
31 } else {
32     plan skip_all => "Can't create temporary test database: $@";
33     exit 0;
36 my $dbh = $sto->dbh;
37 my $rv;
39 use File::Temp;
40 my %mogroot;
41 $mogroot{1} = File::Temp::tempdir( CLEANUP => 1 );
42 $mogroot{2} = File::Temp::tempdir( CLEANUP => 1 );
43 my $dev2host = { 1 => 1, 2 => 2, };
44 foreach (sort { $a <=> $b } keys %$dev2host) {
45     my $root = $mogroot{$dev2host->{$_}};
46     mkdir("$root/dev$_") or die "Failed to create dev$_ dir: $!";
49 my $ms1 = create_mogstored("127.0.1.1", $mogroot{1});
50 ok($ms1, "got mogstored1");
51 my $ms2 = create_mogstored("127.0.1.2", $mogroot{2});
52 ok($ms1, "got mogstored2");
54 while (! -e "$mogroot{1}/dev1/usage" &&
55        ! -e "$mogroot{2}/dev2/usage") {
56     print "Waiting on usage...\n";
57     sleep(.25);
60 my $tmptrack = create_temp_tracker($sto);
61 ok($tmptrack);
63 my $mogc = MogileFS::Client->new(
64                                  domain => "testdom",
65                                  hosts  => [ "127.0.0.1:7001" ],
66                                  );
67 my $be = $mogc->{backend}; # gross, reaching inside of MogileFS::Client
69 # test some basic commands to backend
70 ok($tmptrack->mogadm("domain", "add", "testdom"), "created test domain");
71 ok($tmptrack->mogadm("class", "add", "testdom", "2copies", "--mindevcount=2"), "created 2copies class in testdom");
73 ok($tmptrack->mogadm("host", "add", "hostA", "--ip=127.0.1.1", "--status=alive"), "created hostA");
74 ok($tmptrack->mogadm("host", "add", "hostB", "--ip=127.0.1.2", "--status=alive"), "created hostB");
76 ok($tmptrack->mogadm("device", "add", "hostA", 1), "created dev1 on hostA");
77 ok($tmptrack->mogadm("device", "add", "hostB", 2), "created dev2 on hostB");
79 # wait for monitor
81     my $was = $be->{timeout};  # can't use local on phash :(
82     $be->{timeout} = 10;
83     ok($be->do_request("do_monitor_round", {}), "waited for monitor")
84         or die "Failed to wait for monitor";
85     ok($be->do_request("do_monitor_round", {}), "waited for monitor")
86         or die "Failed to wait for monitor";
87     $be->{timeout} = $was;
90 # create one sample file
91 my $fh = $mogc->new_file("file1", "2copies");
92 ok($fh, "got filehandle");
93 unless ($fh) {
94     die "Error: " . $mogc->errstr;
97 my $data = "My test file.\n" x 1024;
98 print $fh $data;
99 ok(close($fh), "closed file");
101 # wait for it to replicate
102 my $tries = 1;
103 my @urls;
104 while ($tries++ < 40 && (@urls = $mogc->get_paths("file1")) < 2) {
105     sleep .25;
107 is(scalar @urls, 2, "replicated to 2 paths");
108 my $to_repl_rows = $dbh->selectrow_array("SELECT COUNT(*) FROM file_to_replicate");
109 is($to_repl_rows, 0, "no more files to replicate");
111 my %stats;
112 for (1..100) {
113     @urls = $mogc->get_paths("file1");
114     my ($devno) = $urls[0] =~ m!/dev(\d+)/!;
115     $stats{$devno}++;
118 ok($stats{1} < 15, "Device 1 should get roughly 5% of traffic, got: $stats{1}");
119 ok($stats{2} > 80, "Device 2 should get roughly 95% of traffic, got: $stats{2}");