Changeset 13310
- Timestamp:
- May 8, 2007, 2:27:03 PM (19 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
-
Nebulous-Server/lib/Nebulous/Server.pm (modified) (8 diffs)
-
Nebulous/lib/Nebulous/Server.pm (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Nebulous-Server/lib/Nebulous/Server.pm
r13309 r13310 1 1 # Copyright (c) 2004 Joshua Hoblitt 2 2 # 3 # $Id: Server.pm,v 1.4 3 2007-05-08 23:47:03 jhoblitt Exp $3 # $Id: Server.pm,v 1.44 2007-05-09 00:27:03 jhoblitt Exp $ 4 4 5 5 package Nebulous::Server; … … 133 133 } 134 134 135 135 136 sub create_object 136 137 { … … 281 282 } 282 283 284 283 285 sub replicate_object 284 286 { … … 308 310 $log->debug("entered - @_"); 309 311 310 my $ins_id;312 my ($uri, $vol_id); 311 313 eval { 312 314 my $so_id; … … 331 333 } 332 334 335 my $ins_id; 333 336 { 334 337 my $query = $db->prepare_cached( $sql->last_insert_id ); … … 340 343 $query->finish; 341 344 } 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 356 351 ($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 365 353 { 366 354 my $query = $db->prepare_cached( $sql->update_instance_uri ); … … 375 363 $db->rollback; 376 364 $log->debug("rollback"); 377 $log->logdie(" databaseerror: $@");365 $log->logdie("error: $@"); 378 366 } 379 367 … … 414 402 415 403 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 } 447 426 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; 514 470 } 515 471 -
trunk/Nebulous/lib/Nebulous/Server.pm
r13309 r13310 1 1 # Copyright (c) 2004 Joshua Hoblitt 2 2 # 3 # $Id: Server.pm,v 1.4 3 2007-05-08 23:47:03 jhoblitt Exp $3 # $Id: Server.pm,v 1.44 2007-05-09 00:27:03 jhoblitt Exp $ 4 4 5 5 package Nebulous::Server; … … 133 133 } 134 134 135 135 136 sub create_object 136 137 { … … 281 282 } 282 283 284 283 285 sub replicate_object 284 286 { … … 308 310 $log->debug("entered - @_"); 309 311 310 my $ins_id;312 my ($uri, $vol_id); 311 313 eval { 312 314 my $so_id; … … 331 333 } 332 334 335 my $ins_id; 333 336 { 334 337 my $query = $db->prepare_cached( $sql->last_insert_id ); … … 340 343 $query->finish; 341 344 } 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 356 351 ($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 365 353 { 366 354 my $query = $db->prepare_cached( $sql->update_instance_uri ); … … 375 363 $db->rollback; 376 364 $log->debug("rollback"); 377 $log->logdie(" databaseerror: $@");365 $log->logdie("error: $@"); 378 366 } 379 367 … … 414 402 415 403 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 } 447 426 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; 514 470 } 515 471
Note:
See TracChangeset
for help on using the changeset viewer.
