IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 13310


Ignore:
Timestamp:
May 8, 2007, 2:27:03 PM (19 years ago)
Author:
jhoblitt
Message:

refactor replicate_object() to use a single eval {} block

Location:
trunk
Files:
2 edited

Legend:

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

    r13309 r13310  
    11# Copyright (c) 2004  Joshua Hoblitt
    22#
    3 # $Id: Server.pm,v 1.43 2007-05-08 23:47:03 jhoblitt Exp $
     3# $Id: Server.pm,v 1.44 2007-05-09 00:27:03 jhoblitt Exp $
    44
    55package Nebulous::Server;
     
    133133}
    134134
     135
    135136sub create_object
    136137{
     
    281282}
    282283
     284
    283285sub replicate_object
    284286{
     
    308310    $log->debug("entered - @_");
    309311
    310     my $ins_id;
     312    my ($uri, $vol_id);
    311313    eval {
    312314        my $so_id;
     
    331333        }
    332334
     335        my $ins_id;
    333336        {
    334337            my $query = $db->prepare_cached( $sql->last_insert_id );
     
    340343            $query->finish;
    341344        }
    342     };
    343     if ($@) {
    344         $db->rollback;
    345         $log->debug("rollback");
    346         $log->logdie( "database error: $@" );
    347     }
    348 
    349     # Unfortunately, since we want to use the instance row's ID as part of the
    350     # actual on disk file name we can't try to create the file until after
    351     # we've create both a new storage_storage object and instance.
    352 
    353     # TODO add some stuff here to retry if unsucessful
    354     my ($uri, $vol_id);
    355     eval {
     345
     346        # Unfortunately, since we want to use the instance row's ID as part of
     347        # the actual on disk file name we can't try to create the file until
     348        # after we've create both a new storage_storage object and instance.
     349
     350        # TODO add some stuff here to retry if unsucessful
    356351        ($uri, $vol_id) = $self->_create_empty_instance_file($key, $ins_id, $vol_name);
    357     };
    358     if ($@) {
    359         $db->rollback;
    360         $log->debug("rollback");
    361         $log->logdie($@);
    362     }
    363 
    364     eval {
     352
    365353        {
    366354            my $query = $db->prepare_cached( $sql->update_instance_uri );
     
    375363        $db->rollback;
    376364        $log->debug("rollback");
    377         $log->logdie("database error: $@");
     365        $log->logdie("error: $@");
    378366    }
    379367
     
    414402
    415403    eval {
    416         # this will set update locks
    417         $query = $db->prepare_cached( $sql->get_object_locks );
    418         my $rows = $query->execute( $key );
    419         unless ( $rows == 1 ) {
    420             $log->logdie( "storage object does not exist" );
    421         }
    422 
    423         my $row = $query->fetchrow_hashref;
    424         $query->finish;
    425 
    426         $so_id      = $row->{ 'so_id' };
    427         $read_lock  = $row->{ 'read_lock' };
    428         $write_lock = $row->{ 'write_lock' };
    429     };
    430     if ( $@ ) {
    431         $query->finish;
    432         $db->rollback;
    433         $log->debug("rollback");
    434         $log->logdie( "database error: $@" );
    435     }
    436 
    437     if ( $type eq 'write' ) {
    438         # can't set a write lock twice and
    439         # can't set a write lock if there are read locks
    440         if ( $write_lock ) {
    441             eval { $db->rollback; };
    442             $log->debug("rollback");
    443             $log->logdie( "database error: $@" ) if $@;
    444 
    445             $log->logdie( "can not write lock twice" );
    446         }
     404        {
     405            # this will set update locks
     406            $query = $db->prepare_cached( $sql->get_object_locks );
     407            my $rows = $query->execute( $key );
     408            unless ( $rows == 1 ) {
     409                $log->logdie( "storage object does not exist" );
     410            }
     411
     412            my $row = $query->fetchrow_hashref;
     413            $query->finish;
     414
     415            $so_id      = $row->{ 'so_id' };
     416            $read_lock  = $row->{ 'read_lock' };
     417            $write_lock = $row->{ 'write_lock' };
     418        }
     419
     420        if ($type eq 'write') {
     421            # can't set a write lock twice and
     422            # can't set a write lock if there are read locks
     423            if ($write_lock) {
     424                $log->logdie("can not write lock twice");
     425            }
    447426           
    448         if ( $read_lock > 0 ) {
    449             eval { $db->rollback; };
    450             $log->debug("rollback");
    451             $log->logdie( "database error: $@" ) if $@;
    452 
    453             $log->logdie( "can not write lock after read lock" );
    454         }
    455 
    456         eval {
    457             my $query = $db->prepare_cached( $sql->set_write_lock );
    458             my $rows = $query->execute( $key );
    459        
    460             # if we affected more then one row something very bad has happened.
    461             unless ( $rows == 1 ) {
    462                 $log->logdie( "affected row count is $rows instead of 1" );
    463             }
    464 
    465             $db->commit;
    466             $log->debug("commit");
    467         };
    468         if ( $@ ) {
    469             $db->rollback;
    470             $log->debug("rollback");
    471             $log->logdie( "database error: $@" );
    472         }
    473 
    474         $log->debug( "leaving" );
    475 
    476         return 1;
    477     }
    478 
    479     if ( $type eq 'read' ) {
    480         # can't set a read lock if there's a write lock
    481         if ( $write_lock ) {
    482             eval { $db->rollback; };
    483             $log->debug("rollback");
    484             $log->logdie( "database error: $@" ) if $@;
    485 
    486             $log->logdie( "can not read lock after write lock" );
    487         }
    488 
    489         eval {
    490             my $query = $db->prepare_cached( $sql->increment_read_lock );
    491             my $rows = $query->execute( $key );
    492        
    493             # if we affected more then one row something very bad has happened.
    494             unless ( $rows == 1 ) {
    495                 $log->logdie( "affected row count is $rows instead of 1" );
    496             }
    497 
    498             $db->commit;
    499             $log->debug("commit");
    500         };
    501         if ( $@ ) {
    502             $db->rollback;
    503             $log->debug("rollback");
    504             $log->logdie( "database error: $@" );
    505         }
    506 
    507         $log->debug( "leaving" );
    508 
    509         return 1;
    510     }
    511 
    512     # never reached
    513     $log->logdie( "this should never happen" );
     427            if ($read_lock > 0) {
     428                $log->logdie("can not write lock after read lock");
     429            }
     430
     431            {
     432                my $query = $db->prepare_cached( $sql->set_write_lock );
     433                my $rows = $query->execute($key);
     434           
     435                # if we affected more then one row something very bad has happened.
     436                unless ($rows == 1) {
     437                    $log->logdie("affected row count is $rows instead of 1");
     438                }
     439
     440            }
     441        } elsif ($type eq 'read') {
     442            # can't set a read lock if there's a write lock
     443            if ($write_lock) {
     444                $log->logdie("can not read lock after write lock");
     445            }
     446
     447            {
     448                my $query = $db->prepare_cached( $sql->increment_read_lock );
     449                my $rows = $query->execute($key);
     450           
     451                # if we affected more then one row something very bad has happened.
     452                unless ($rows == 1) {
     453                    $log->logdie("affected row count is $rows instead of 1");
     454                }
     455            }
     456        }
     457
     458        $db->commit;
     459        $log->debug("commit");
     460    };
     461    if ($@) {
     462        $db->rollback;
     463        $log->debug("rollback");
     464        $log->logdie("error: $@");
     465    }
     466
     467    $log->debug("leaving");
     468
     469    return 1;
    514470}
    515471
  • trunk/Nebulous/lib/Nebulous/Server.pm

    r13309 r13310  
    11# Copyright (c) 2004  Joshua Hoblitt
    22#
    3 # $Id: Server.pm,v 1.43 2007-05-08 23:47:03 jhoblitt Exp $
     3# $Id: Server.pm,v 1.44 2007-05-09 00:27:03 jhoblitt Exp $
    44
    55package Nebulous::Server;
     
    133133}
    134134
     135
    135136sub create_object
    136137{
     
    281282}
    282283
     284
    283285sub replicate_object
    284286{
     
    308310    $log->debug("entered - @_");
    309311
    310     my $ins_id;
     312    my ($uri, $vol_id);
    311313    eval {
    312314        my $so_id;
     
    331333        }
    332334
     335        my $ins_id;
    333336        {
    334337            my $query = $db->prepare_cached( $sql->last_insert_id );
     
    340343            $query->finish;
    341344        }
    342     };
    343     if ($@) {
    344         $db->rollback;
    345         $log->debug("rollback");
    346         $log->logdie( "database error: $@" );
    347     }
    348 
    349     # Unfortunately, since we want to use the instance row's ID as part of the
    350     # actual on disk file name we can't try to create the file until after
    351     # we've create both a new storage_storage object and instance.
    352 
    353     # TODO add some stuff here to retry if unsucessful
    354     my ($uri, $vol_id);
    355     eval {
     345
     346        # Unfortunately, since we want to use the instance row's ID as part of
     347        # the actual on disk file name we can't try to create the file until
     348        # after we've create both a new storage_storage object and instance.
     349
     350        # TODO add some stuff here to retry if unsucessful
    356351        ($uri, $vol_id) = $self->_create_empty_instance_file($key, $ins_id, $vol_name);
    357     };
    358     if ($@) {
    359         $db->rollback;
    360         $log->debug("rollback");
    361         $log->logdie($@);
    362     }
    363 
    364     eval {
     352
    365353        {
    366354            my $query = $db->prepare_cached( $sql->update_instance_uri );
     
    375363        $db->rollback;
    376364        $log->debug("rollback");
    377         $log->logdie("database error: $@");
     365        $log->logdie("error: $@");
    378366    }
    379367
     
    414402
    415403    eval {
    416         # this will set update locks
    417         $query = $db->prepare_cached( $sql->get_object_locks );
    418         my $rows = $query->execute( $key );
    419         unless ( $rows == 1 ) {
    420             $log->logdie( "storage object does not exist" );
    421         }
    422 
    423         my $row = $query->fetchrow_hashref;
    424         $query->finish;
    425 
    426         $so_id      = $row->{ 'so_id' };
    427         $read_lock  = $row->{ 'read_lock' };
    428         $write_lock = $row->{ 'write_lock' };
    429     };
    430     if ( $@ ) {
    431         $query->finish;
    432         $db->rollback;
    433         $log->debug("rollback");
    434         $log->logdie( "database error: $@" );
    435     }
    436 
    437     if ( $type eq 'write' ) {
    438         # can't set a write lock twice and
    439         # can't set a write lock if there are read locks
    440         if ( $write_lock ) {
    441             eval { $db->rollback; };
    442             $log->debug("rollback");
    443             $log->logdie( "database error: $@" ) if $@;
    444 
    445             $log->logdie( "can not write lock twice" );
    446         }
     404        {
     405            # this will set update locks
     406            $query = $db->prepare_cached( $sql->get_object_locks );
     407            my $rows = $query->execute( $key );
     408            unless ( $rows == 1 ) {
     409                $log->logdie( "storage object does not exist" );
     410            }
     411
     412            my $row = $query->fetchrow_hashref;
     413            $query->finish;
     414
     415            $so_id      = $row->{ 'so_id' };
     416            $read_lock  = $row->{ 'read_lock' };
     417            $write_lock = $row->{ 'write_lock' };
     418        }
     419
     420        if ($type eq 'write') {
     421            # can't set a write lock twice and
     422            # can't set a write lock if there are read locks
     423            if ($write_lock) {
     424                $log->logdie("can not write lock twice");
     425            }
    447426           
    448         if ( $read_lock > 0 ) {
    449             eval { $db->rollback; };
    450             $log->debug("rollback");
    451             $log->logdie( "database error: $@" ) if $@;
    452 
    453             $log->logdie( "can not write lock after read lock" );
    454         }
    455 
    456         eval {
    457             my $query = $db->prepare_cached( $sql->set_write_lock );
    458             my $rows = $query->execute( $key );
    459        
    460             # if we affected more then one row something very bad has happened.
    461             unless ( $rows == 1 ) {
    462                 $log->logdie( "affected row count is $rows instead of 1" );
    463             }
    464 
    465             $db->commit;
    466             $log->debug("commit");
    467         };
    468         if ( $@ ) {
    469             $db->rollback;
    470             $log->debug("rollback");
    471             $log->logdie( "database error: $@" );
    472         }
    473 
    474         $log->debug( "leaving" );
    475 
    476         return 1;
    477     }
    478 
    479     if ( $type eq 'read' ) {
    480         # can't set a read lock if there's a write lock
    481         if ( $write_lock ) {
    482             eval { $db->rollback; };
    483             $log->debug("rollback");
    484             $log->logdie( "database error: $@" ) if $@;
    485 
    486             $log->logdie( "can not read lock after write lock" );
    487         }
    488 
    489         eval {
    490             my $query = $db->prepare_cached( $sql->increment_read_lock );
    491             my $rows = $query->execute( $key );
    492        
    493             # if we affected more then one row something very bad has happened.
    494             unless ( $rows == 1 ) {
    495                 $log->logdie( "affected row count is $rows instead of 1" );
    496             }
    497 
    498             $db->commit;
    499             $log->debug("commit");
    500         };
    501         if ( $@ ) {
    502             $db->rollback;
    503             $log->debug("rollback");
    504             $log->logdie( "database error: $@" );
    505         }
    506 
    507         $log->debug( "leaving" );
    508 
    509         return 1;
    510     }
    511 
    512     # never reached
    513     $log->logdie( "this should never happen" );
     427            if ($read_lock > 0) {
     428                $log->logdie("can not write lock after read lock");
     429            }
     430
     431            {
     432                my $query = $db->prepare_cached( $sql->set_write_lock );
     433                my $rows = $query->execute($key);
     434           
     435                # if we affected more then one row something very bad has happened.
     436                unless ($rows == 1) {
     437                    $log->logdie("affected row count is $rows instead of 1");
     438                }
     439
     440            }
     441        } elsif ($type eq 'read') {
     442            # can't set a read lock if there's a write lock
     443            if ($write_lock) {
     444                $log->logdie("can not read lock after write lock");
     445            }
     446
     447            {
     448                my $query = $db->prepare_cached( $sql->increment_read_lock );
     449                my $rows = $query->execute($key);
     450           
     451                # if we affected more then one row something very bad has happened.
     452                unless ($rows == 1) {
     453                    $log->logdie("affected row count is $rows instead of 1");
     454                }
     455            }
     456        }
     457
     458        $db->commit;
     459        $log->debug("commit");
     460    };
     461    if ($@) {
     462        $db->rollback;
     463        $log->debug("rollback");
     464        $log->logdie("error: $@");
     465    }
     466
     467    $log->debug("leaving");
     468
     469    return 1;
    514470}
    515471
Note: See TracChangeset for help on using the changeset viewer.