package MogileFS::DeviceState;
use strict;

# properties are:
#    read:  can it serve traffic?
#    drain: should its file_on be drained?
#    new_files: does it get new files
#    write:  is it writable?  (for instance, for deletes)
#    dead:  permanently dead, files lost, not coming back to service
my $singleton = {
    'alive' => bless({
        read => 1,
        write => 1,
        monitor => 1,
        new_files => 1,
    }),
    'dead' => bless({
        # Note that 'dead' doesn't include 'drain', since that's
        # handled (specially) by the reap job.
        dead => 1,
    }),
    'down' => bless({
    }),
    'readonly' => bless({
        read => 1,
        monitor => 1,
    }),
    'drain' => bless({
        read => 1,
        write => 1,
        drain => 1,
        monitor => 1,
    }),
};

# returns undef if unknown state
sub of_string {
    my ($class, $state) = @_;
    return $state ? $singleton->{$state} : undef;
}

sub should_drain      { $_[0]->{drain}     }
sub can_delete_from   { $_[0]->{write}     }
sub can_read_from     { $_[0]->{read}      }
sub should_get_new_files { $_[0]->{new_files} }
sub should_get_repl_files { $_[0]->{new_files} }
sub should_have_files { ! ($_[0]->{drain} || $_[0]->{dead}) }
sub should_monitor    { $_[0]->{monitor}   }

# named inconveniently so it's not taken to mean equalling string
# "dead"
sub is_perm_dead      { $_[0]->{dead}   }

sub should_wake_reaper { $_[0]->{dead}   }

sub should_fsck_search_on {
    my $ds = shift;
    return $ds->can_read_from || $ds->should_have_files;
}

1;

