schedule fsck replications for the future.
[MogileFS-Server.git] / t / mogstored-shutdown.t
blob6556ba5f3f03cd42e7f29d25b3a06481ccb64e09
1 # -*-perl-*-
3 use strict;
4 use warnings;
5 use Test::More;
6 use FindBin qw($Bin);
7 use IO::Socket::INET;
9 use MogileFS::Test;
11 unless ((`netstat -nap --inet` || "") =~ m!PID/Program!) {
12     plan skip_all => "netstat output not how expected; skipping test.\n";
13     exit 0;
16 plan tests => 4;
18 my $TEST_IP = '127.0.1.1';
20 my $rv;
22 use File::Temp;
23 my $dir = File::Temp::tempdir( CLEANUP => 1 );
24 my $ms = eval { create_mogstored($TEST_IP, $dir, "--daemonize") };
25 unless (ok($ms, "started daemonized mogstored")) {
26     # Must wait a moment on startup
27     select undef, undef, undef, 0.5;
28     # Now safe
29     my $exist = eval { exist_pid() };
30     warn "exist = $exist\n";
31     if ($exist) {
32         warn "killing existing test mogstored pid of $exist\n";
33         kill 9, $exist;
34     }
35     die "wasn't able to start up.";
38 # what's its pid?
39 my $real_pid = exist_pid();
41 warn "real_pid = $real_pid\n";
42 #scalar <STDIN>;
44 my $sock = try(5, 0.5, sub { IO::Socket::INET->new(PeerAddr => "$TEST_IP:7501",
45                                                    Timeout  => 3) });
46 ok($sock, "got mgmt connection") or die;
49 print $sock "shutdown\n";
51 my $rin = '';
52 vec($rin,fileno($sock),1) = 1;
53 my $rout;
54 my $n = select($rout=$rin,undef,undef,2);
55 is($n, 1, "mgmt port readable");
57 unless ($n == 1) {
58     kill 9, $real_pid;
59     die "killed pid of $real_pid\n";
62 my $tries = 0;
63 my $alive;
64 while ($tries++ < 10 && ($alive = kill(0, $real_pid))) {
65     select undef, undef, undef, 0.4;
67 ok(!$alive, "gone");
70 # dies when not able to find
71 sub exist_pid {
72     my $netstat = `netstat -nap --inet`;
73     my $ip = $TEST_IP;
74     $ip =~ s/\./\\./g;
75     unless ($netstat =~ m!${ip}:750[10].+LISTEN\s+(\d+)/!) {
76         die "Couldn't find pid of daemonized process.\n";
77     }
78     return $1;
81 sub try {
82     my ($tries, $delay, $code) = @_;
83     my $try = 0;
84     while ($try++ < $tries) {
85         my $ret = $code->();
86         return $ret if $ret;
87         select undef, undef, undef, $delay;
88     }
89     return undef;