Commit a138ab3c authored by Mike Hibler's avatar Mike Hibler

A skeleton for the eventual blockstore consistency checker.

Right now it is just full of comments about what should be checked.
parent 14256de0
#!/usr/bin/perl -w
#
# Copyright (c) 2013 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
# This file is part of the Emulab network testbed software.
#
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
#
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this file. If not, see <http://www.gnu.org/licenses/>.
#
# }}}
#
use strict;
use English;
use Getopt::Std;
use Date::Parse;
#
# Perform a consistency check of blockstore state.
#
sub usage()
{
print STDERR "Usage: bscheck [-d]\n";
print STDERR " -h This message\n";
print STDERR " -d Print additional debug info\n";
exit(-1);
}
my $optlist = "dh";
my $debug = 0;
# Protos
sub fatal($);
#
# Configure variables
#
my $TB = "@prefix@";
my $BSCONTROL = "$TB/sbin/bscontrol";
#
# Testbed Support libraries
#
use lib "@prefix@/lib";
use libdb;
use Blockstore;
use Lease;
use Project;
use User;
#
# Turn off line buffering on output
#
$| = 1;
#
# Untaint the path
#
$ENV{'PATH'} = "/bin:/sbin:/usr/bin:";
#
# Parse command arguments. Once we return from getopts, all that should be
# left are the required arguments.
#
my %options = ();
if (! getopts($optlist, \%options)) {
usage();
}
if (defined($options{h})) {
usage();
}
if (defined($options{d})) {
$debug++;
}
if (!TBAdmin()) {
fatal("Only admins can check the blockstores.");
}
#
# First check the database state.
#
# Blockstore_trees:
#
# Make sure all blockstore_trees entries have blockstores entries.
# They should exist and have roles based on hints:
# SE: role=element
# CS: role=compound
# PS: role=partition
# Make sure the aggidx is correct for hints SE, CS, PS:
# SE: should reference a blockstore with role=compound
# CS: should be zero
# PS: should reference an exported compound or element
# Make sure the sizes are correct:
# CS: total_size should be <= to combined sizes of associated SEs
# CS: total_size should be >= to combined sizes of associated PSs
# Blockstores:
#
# Check for unrepresented relationships:
# all role=compound entries should have a blockstore_trees entry
# all role=partition entries should have a blockstore_trees entry
# it is NOT necessary for role=element entries to have b_t entries
# Partition elements should have project_leases entries
# lease_idx is encoded in the bs_id
# Each type used should have at least one attribute in b_t_attributes
# All exported blockstores should have an entry in blockstore_state
# remaining_capacity should be <= total_size
# node_id and bs_id should match
# Blockstore_attributes:
#
# All entries should have corresponding blockstores entries
# Blockstore_type_attributes:
#
# Nothing
# Blockstore_state:
#
# All entries should have an exported blockstores entry
# Reserved_blockstores:
#
# Should have corresponding blockstores and virt_blockstores entries
# Experiment should be swapped in
# Leases:
#
#
# Then the storage server state. Get all pool and volume info from
# servers.
#
# Servers:
#
# All servers identified in the DB should be accessible
# All servers should have exported blockstores
# those blockstores should have type attributes that are class=SAN
# Pools:
#
# All non-persistent blockstores should have a bs_id that matches a pool
# Available space should be <= size
# Size of pool should be >= combined size of allocated non-persist BSes
# Volumes:
#
# Should have corresponding blockstores
exit(0);
sub fatal($)
{
my ($mesg) = $_[0];
if (defined($lease) && $lease->GotLock()) {
$lease->Unlock();
}
die("*** $0:\n".
" $mesg\n");
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment