Checking in changes prior to tagging of version 2.66.
[MogileFS-Server.git] / lib / MogileFS / DeviceState.pm
blob6ac6add7a5efd2f67630dfbdb9f5f689d634c682
1 package MogileFS::DeviceState;
2 use strict;
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
10 my $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 }),
36 # returns undef if unknown state
37 sub of_string {
38 my ($class, $state) = @_;
39 return $state ? $singleton->{$state} : undef;
42 sub should_drain { $_[0]->{drain} }
43 sub can_delete_from { $_[0]->{write} }
44 sub can_read_from { $_[0]->{read} }
45 sub should_get_new_files { $_[0]->{new_files} }
46 sub should_get_repl_files { $_[0]->{new_files} }
47 sub should_have_files { ! ($_[0]->{drain} || $_[0]->{dead}) }
48 sub should_monitor { $_[0]->{monitor} }
50 # named inconveniently so it's not taken to mean equalling string
51 # "dead"
52 sub is_perm_dead { $_[0]->{dead} }
54 sub should_wake_reaper { $_[0]->{dead} }
56 sub should_fsck_search_on {
57 my $ds = shift;
58 return $ds->can_read_from || $ds->should_have_files;