1package MogileFS::DeviceState;
2use strict;
3
4# properties are:
5#    read:  can it serve traffic?
6#    drain: should its file_on be drained?
7#    new_files: does it get new files
8#    write:  is it writable?  (for instance, for deletes)
9#    dead:  permanently dead, files lost, not coming back to service
10my $singleton = {
11    'alive' => bless({
12        read => 1,
13        write => 1,
14        monitor => 1,
15        new_files => 1,
16    }),
17    'dead' => bless({
18        # Note that 'dead' doesn't include 'drain', since that's
19        # handled (specially) by the reap job.
20        dead => 1,
21    }),
22    'down' => bless({
23    }),
24    'readonly' => bless({
25        read => 1,
26        monitor => 1,
27    }),
28    'drain' => bless({
29        read => 1,
30        write => 1,
31        drain => 1,
32        monitor => 1,
33    }),
34};
35
36# returns undef if unknown state
37sub of_string {
38    my ($class, $state) = @_;
39    return $state ? $singleton->{$state} : undef;
40}
41
42sub should_drain      { $_[0]->{drain}     }
43sub can_delete_from   { $_[0]->{write}     }
44sub can_read_from     { $_[0]->{read}      }
45sub should_get_new_files { $_[0]->{new_files} }
46sub should_get_repl_files { $_[0]->{new_files} }
47sub should_have_files { ! $_[0]->{dead} }
48sub should_monitor    { $_[0]->{monitor}   }
49
50# named inconveniently so it's not taken to mean equalling string
51# "dead"
52sub is_perm_dead      { $_[0]->{dead}   }
53
54sub should_wake_reaper { $_[0]->{dead}   }
55
56sub should_fsck_search_on {
57    my $ds = shift;
58    return $ds->can_read_from || $ds->should_have_files;
59}
60
611;
62
63