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