IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 13173 for trunk/Nebulous/lib


Ignore:
Timestamp:
May 2, 2007, 3:44:24 PM (19 years ago)
Author:
jhoblitt
Message:

better paramter checking
overhaul instance table
add ->_is_valid_object_key() method
change ->find_instances() to check it's params and only return instances on mounted & available volumes

Location:
trunk/Nebulous/lib/Nebulous
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Nebulous/lib/Nebulous/Server.pm

    r13131 r13173  
    11# Copyright (c) 2004  Joshua Hoblitt
    22#
    3 # $Id: Server.pm,v 1.31 2007-05-02 20:53:42 jhoblitt Exp $
     3# $Id: Server.pm,v 1.32 2007-05-03 01:44:23 jhoblitt Exp $
    44
    55package Nebulous::Server;
     
    283283    my $self = shift;
    284284
    285     my ($key, $volume) = validate_pos(@_,
    286         {
    287             type        => SCALAR,
    288         },
    289         {
    290             type        => SCALAR,
     285    my ($key, $vol_name) = validate_pos(@_,
     286        {
     287            type        => SCALAR,
     288            callbacks   => {
     289                'is valid object key' => sub { $self->_is_valid_object_key($_[0]) },
     290            },
     291        },
     292        {
     293            type        => SCALAR,
     294            callbacks   => {
     295                # check that the volume name requested is valid
     296                'is valid volume name' => sub { $self->_is_valid_volume_name($_[0]) },
     297            },
    291298            optional    => 1,
    292299        },
     
    301308    my ($vol_id, $vol_path);
    302309    eval {
    303         ($vol_id, $vol_path) = $self->_get_storage_volume($volume);
     310        ($vol_id, $vol_path) = $self->_get_storage_volume($vol_name);
    304311    };
    305312    if ($@) {
     
    312319        {
    313320            my $query = $db->prepare_cached( $sql->get_object_instances );
    314             my $rows = $query->execute( $key );
     321            my $rows = $query->execute($key, 1);
    315322
    316323            unless ( $rows > 0 ) {
     
    866873    my $self = shift;
    867874
    868     my ( $key, $volume ) = validate_pos( @_,
    869         {
    870             type        => SCALAR,
    871         },
    872         {
    873             type        => SCALAR,
     875    my ($key, $vol_name) = validate_pos(@_,
     876        {
     877            type        => SCALAR,
     878            callbacks   => {
     879                'is valid object key' => sub { $self->_is_valid_object_key($_[0]) },
     880            },
     881        },
     882        {
     883            type        => SCALAR,
     884            callbacks   => {
     885                # check that the volume name requested is valid
     886                'is valid volume name' => sub { $self->_is_valid_volume_name($_[0]) },
     887            },
    874888            optional    => 1,
    875889        },
     
    880894    my $db  =$self->db;
    881895
    882     $log->debug( "entered - @_" );
    883 
    884     # TODO restrict search to a volume
     896    $log->debug("entered - @_");
    885897
    886898    my $query;
    887 
    888     eval {
    889         $query = $db->prepare_cached( $sql->get_object_instances );
    890         $query->execute( $key );
    891     };
    892     $log->logdie( "database error: $@" ) if $@;
     899    eval {
     900        {
     901            # ask the db to generate the table of mounted Nebulous volume
     902            my $query = $db->prepare_cached("call getmountedvol()");
     903            $query->execute();
     904        }
     905
     906        if ($vol_name) {
     907            $query = $db->prepare_cached( $sql->get_object_instances_by_vol_name );
     908            # ext_id, name, available
     909            my $rows = $query->execute($key, $vol_name, 1);
     910            unless ($rows > 0) {
     911                $query->finish;
     912                $log->logdie("no instances on storage volume: $vol_name or volume is not available");
     913            }
     914        } else {
     915            $query = $db->prepare_cached( $sql->get_object_instances );
     916            # ext_id, available
     917            my $rows = $query->execute($key, 1);
     918            unless ($rows > 0) {
     919                $query->finish;
     920                $log->logdie("no instances available");
     921            }
     922        }
     923    };
     924    $log->logdie("database error: $@") if $@;
    893925
    894926    my @locations;
    895927
    896     while ( my $row = $query->fetchrow_hashref ) {
     928    while (my $row = $query->fetchrow_hashref) {
    897929        my $instance = $row->{ 'uri' };
    898930        push @locations, $instance if $instance;
    899931    }
    900932
    901     $log->logdie( "no instances found" ) unless ( scalar @locations );
    902 
    903     $log->debug( "leaving" );
     933    # XXX remove this?
     934    $log->logdie("no instances found") unless (scalar @locations);
     935
     936    $log->debug("leaving");
    904937
    905938    return \@locations;
     
    10891122}
    10901123
     1124sub _is_valid_object_key  {
     1125    my ($self, $key) = @_;
     1126
     1127    my $log = $self->log;
     1128    my $sql = $self->sql;
     1129    my $db  =$self->db;
     1130
     1131    my $ext_id;
     1132    eval {
     1133        my $query = $db->prepare_cached( $sql->get_object );
     1134        $query->execute($key);
     1135        ($ext_id) = $query->fetchrow_array;
     1136        $query->finish;
     1137    };
     1138    if ($@) {
     1139        $db->rollback;
     1140        $log->logdie( "database error: $@" );
     1141    }
     1142
     1143    if (defined $ext_id) {
     1144        return 1;
     1145    }
     1146
     1147    return;
     1148}
     1149
    10911150sub _is_valid_volume_name  {
    10921151    my ($self, $vol_name) = @_;
  • trunk/Nebulous/lib/Nebulous/Server/SQL.pm

    r13131 r13173  
    11# Copyright (c) 2004  Joshua Hoblitt
    22#
    3 # $Id: SQL.pm,v 1.33 2007-05-02 20:53:42 jhoblitt Exp $
     3# $Id: SQL.pm,v 1.34 2007-05-03 01:44:24 jhoblitt Exp $
    44
    55package Nebulous::Server::SQL;
     
    144144        WHERE so_id = ?
    145145    },
    146     get_object_instances        => qq{
    147         SELECT storage_object.so_id,
    148             uri, assigned_location
    149         FROM storage_object
    150         LEFT JOIN instance
    151         USING (so_id)
    152         WHERE ext_id = ?
     146    get_object_instances    => qq{
     147        SELECT
     148            storage_object.so_id,
     149            uri,
     150            assigned_vol_id
     151        FROM storage_object
     152        JOIN instance
     153            USING (so_id)
     154        JOIN mountedvol
     155            USING(vol_id)
     156        WHERE ext_id = ?
     157            AND available = ?
     158    },
     159    get_object_instances_by_vol_name => qq{
     160        SELECT
     161            storage_object.so_id,
     162            uri,
     163            assigned_vol_id
     164        FROM storage_object
     165        JOIN instance
     166            USING (so_id)
     167        JOIN mountedvol
     168            USING(vol_id)
     169        WHERE ext_id = ?
     170            AND name = ?
     171            AND available = ?
    153172    },
    154173    get_storage_volume_byname   => qq{
     
    284303    uri VARCHAR(255) NOT NULL,
    285304    sha1sum CHAR(40) ASCII,
    286     assigned_location BOOL,
     305    assigned_vol_id INT,
    287306    epoch TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    288307    mtime TIMESTAMP,
Note: See TracChangeset for help on using the changeset viewer.