Changeset 20990 for trunk/Nebulous-Server/lib/Nebulous/Server.pm
- Timestamp:
- Dec 14, 2008, 12:54:25 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/Nebulous-Server/lib/Nebulous/Server.pm (modified) (39 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Nebulous-Server/lib/Nebulous/Server.pm
r20972 r20990 1 1 # Copyright (c) 2004-2008 Joshua Hoblitt 2 2 # 3 # $Id: Server.pm,v 1.9 5 2008-12-13 00:41:15 jhoblittExp $3 # $Id: Server.pm,v 1.96 2008-12-14 22:54:25 eugene Exp $ 4 4 5 5 package Nebulous::Server; … … 9 9 no warnings qw( uninitialized ); 10 10 11 our $VERSION = '0.1 6';11 our $VERSION = '0.15'; 12 12 13 13 use base qw( Class::Accessor::Fast ); … … 19 19 use File::Spec; 20 20 use Log::Log4perl; 21 use Nebulous::Keys qw( parse_neb_key parse_neb_volume );22 21 use Nebulous::Server::Config; 23 22 use Nebulous::Server::Log; 24 23 use Nebulous::Server::SQL; 24 use Nebulous::Keys qw( parse_neb_key parse_neb_volume ); 25 25 use Params::Validate qw( validate_pos SCALAR SCALARREF UNDEF ); 26 26 use URI::file; … … 36 36 37 37 # let Nebulous::Server::Config validate our params 38 my $config = Nebulous::Server::Config->new( @_ ); 39 40 return $class->new_from_config($config); 41 } 42 43 44 sub new_from_config 45 { 46 my ($class, $config) = @_; 38 my $config = Nebulous::Server::Config->init( @_ ); 47 39 48 40 # log4perl is not avaliable until we call init() … … 59 51 $self->config($config); 60 52 53 # ask for the db handle as a means of validating the database parameters 54 $self->db; 55 61 56 $log->debug( "leaving" ); 62 57 63 58 return $self; 64 59 } 65 60 61 66 62 sub db 67 63 { 68 my ($self, $key) = @_; 64 my $self = shift; 65 66 if (@_) { 67 $self->{db} = $_[0]; 68 return $self; 69 } 69 70 70 71 my $log = $self->log; … … 72 73 my $config = $self->config; 73 74 74 my $db_index = 0;75 if (defined $key) {76 # hash the key to select the correct database instance77 # only use the first 8 hex chars... have to be careful to avoid an int78 # overflow here79 $db_index = unpack("h8", sha1_hex("$key")) % $config->n_db;80 }81 82 # lookup to see if we have a stored dbh for this database83 my $dbh = $self->{dbs}[$db_index];84 75 # if the dbh is still alive, return it 85 if (defined $ dbh and $dbh->ping) {76 if (defined $self->{db} and $self->{db}->ping) { 86 77 $log->debug("db handle is still alive"); 87 return $ dbh;78 return $self->{db}; 88 79 } 89 80 # otherwise create a new connection 90 81 $log->debug("db handle is dead/unopened"); 91 92 # lookup database info93 my $db_config = $config->db($db_index);94 die "can't find database configuration info for database # $db_index"95 unless $db_config;96 82 97 83 # if we're running under mod_perl & Apache::DBI is loaded we want to … … 100 86 # processes and the database might have gone away on us. Apache::DBI will 101 87 # take care of getting a valid dbh back. 102 eval { 103 $dbh = DBI->connect_cached( 104 $db_config->dsn, 105 $db_config->dbuser, 106 $db_config->dbpasswd, 88 my $db; 89 eval { 90 $db = DBI->connect_cached( 91 $config->dsn, 92 $config->dbuser, 93 $config->dbpasswd, 107 94 { 108 95 RaiseError => 1, … … 112 99 ); 113 100 114 $db h->do( $sql->set_transaction_model );115 $log->debug( "connected to database: ", sub { $db h->data_sources; } );116 $db h->commit;101 $db->do( $sql->set_transaction_model ); 102 $log->debug( "connected to database: ", sub { $db->data_sources; } ); 103 $db->commit; 117 104 $log->debug("commit"); 118 105 }; 119 106 if ( $@ ) { 120 $db h->rollback if $dbh;107 $db->rollback if $db; 121 108 $log->debug("rollback"); 122 109 $log->logdie( "database error: $@" ); 123 110 } 124 111 125 $self->{db s}[$db_index] = $dbh;126 127 return $db h;112 $self->{db} = $db; 113 114 return $db; 128 115 } 129 116 … … 152 139 my $log = $self->log; 153 140 my $sql = $self->sql; 154 my $db = $self->db($key);141 my $db =$self->db; 155 142 156 143 $log->debug( "entered - @_" ); … … 163 150 # to check it after parsing the key 164 151 if (defined $vol_name 165 and not $self->_is_valid_volume_name($key , $key->volume)) {152 and not $self->_is_valid_volume_name($key->volume)) { 166 153 if ($key->soft_volume) { 167 154 $log->warn( "$vol_name is not a known volume name" ); … … 173 160 174 161 my ($vol_id, $vol_host, $vol_path, $vol_xattr) 175 = $self->_get_storage_volume($ key, $vol_name, $key->soft_volume);162 = $self->_get_storage_volume($vol_name, $key->soft_volume); 176 163 177 164 my $uri; … … 274 261 my $log = $self->log; 275 262 my $sql = $self->sql; 276 my $db = $self->db($key);263 my $db =$self->db; 277 264 278 265 $log->debug("entered - @_"); … … 309 296 310 297 311 # sub swap_objects 312 # { 313 # my $self = shift; 314 # 315 # my ($key1, $key2) = validate_pos(@_, 316 # { 317 # type => SCALAR, 318 # callbacks => { 319 # 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 320 # }, 321 # }, 322 # { 323 # type => SCALAR, 324 # callbacks => { 325 # 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 326 # }, 327 # }, 328 # ); 329 # 330 # my $log = $self->log; 331 # my $sql = $self->sql; 332 # my $dbh1 = $self->db($key1); 333 # my $dbh2 = $self->db($key2); 334 # 335 # $log->debug("entered - @_"); 336 # 337 # # ignore volumes 338 # $key1 = parse_neb_key($key1); 339 # $key2 = parse_neb_key($key2); 340 # 341 # # order of operations for the swap with a single db is: 342 # # key1 -> key1.swap 343 # # key2 -> key1 344 # # key1.swap -> key2 345 # 346 # # XXX this cmp will only work if ->db() returns the same exact (cached) dbh 347 # if ($dbh1 == $dbh2) { 348 # my $dbh = $dbh1; 349 # eval { 350 # { 351 # # key1 -> key1.swap 352 # my $query = $dbh->prepare_cached($sql->rename_object); 353 # # this SQL statment takes the new key name as the first param 354 # my $rows = $query->execute($key1->path . ".swap", $key1->path); 355 # 356 # # if we affected more then one row something very bad has happened. 357 # unless ($rows == 1) { 358 # $query->finish; 359 # $log->logdie("affected row count is $rows instead of 1"); 360 # } 361 # } 362 # 363 # { 364 # # key2 -> key1 365 # my $query = $dbh->prepare_cached($sql->rename_object); 366 # # this SQL statment takes the new key name as the first param 367 # my $rows = $query->execute($key1->path, $key2->path); 368 # 369 # # if we affected more then one row something very bad has happened. 370 # unless ($rows == 1) { 371 # $query->finish; 372 # $log->logdie("affected row count is $rows instead of 1"); 373 # } 374 # } 375 # 376 # { 377 # # key1.swap -> key2 378 # my $query = $dbh->prepare_cached($sql->rename_object); 379 # # this SQL statment takes the new key name as the first param 380 # my $rows = $query->execute($key2->path, $key1->path . ".swap"); 381 # 382 # # if we affected more then one row something very bad has happened. 383 # unless ($rows == 1) { 384 # $query->finish; 385 # $log->logdie("affected row count is $rows instead of 1"); 386 # } 387 # } 388 # 389 # $dbn->commit; 390 # $log->debug("commit"); 391 # }; 392 # if ($@) { 393 # $dbh->rollback; 394 # $log->debug("rollback"); 395 # $log->logdie("database error: $@"); 396 # } 397 # } 398 # 399 # # order of operations for the swap between two dbs is: 400 # # key1 start transaction 401 # # key1 -> read all instances 402 # # key1 -> remove all instances 403 # # key2 start transaction 404 # # key2 -> read all instances 405 # # key2 -> remove all instances 406 # # key1 -> insert key 2 instances 407 # # key2 -> insert key 1 instances 408 # # key1,2 commit 409 # 410 # eval { 411 # { 412 # # key1 -> read all instances 413 # my $query = $dbh->prepare_cached($sql->rename_object); 414 # # this SQL statment takes the new key name as the first param 415 # my $rows = $query->execute($key1->path . ".swap", $key1->path); 416 # 417 # # if we affected more then one row something very bad has happened. 418 # unless ($rows == 1) { 419 # $query->finish; 420 # $log->logdie("affected row count is $rows instead of 1"); 421 # } 422 # } 423 # 424 # { 425 # # key2 -> key1 426 # my $query = $db->prepare_cached($sql->rename_object); 427 # # this SQL statment takes the new key name as the first param 428 # my $rows = $query->execute($key1->path, $key2->path); 429 # 430 # # if we affected more then one row something very bad has happened. 431 # unless ($rows == 1) { 432 # $query->finish; 433 # $log->logdie("affected row count is $rows instead of 1"); 434 # } 435 # } 436 # 437 # { 438 # # key1.swap -> key2 439 # my $query = $db->prepare_cached($sql->rename_object); 440 # # this SQL statment takes the new key name as the first param 441 # my $rows = $query->execute($key2->path, $key1->path . ".swap"); 442 # 443 # # if we affected more then one row something very bad has happened. 444 # unless ($rows == 1) { 445 # $query->finish; 446 # $log->logdie("affected row count is $rows instead of 1"); 447 # } 448 # } 449 # 450 # $db->commit; 451 # $log->debug("commit"); 452 # }; 453 # if ($@) { 454 # $db->rollback; 455 # $log->debug("rollback"); 456 # $log->logdie("database error: $@"); 457 # } 458 # 459 # 460 # $log->debug("leaving"); 461 # 462 # return 1; 463 # } 298 sub swap_objects 299 { 300 my $self = shift; 301 302 my ($key1, $key2) = validate_pos(@_, 303 { 304 type => SCALAR, 305 callbacks => { 306 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 307 }, 308 }, 309 { 310 type => SCALAR, 311 callbacks => { 312 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 313 }, 314 }, 315 ); 316 317 my $log = $self->log; 318 my $sql = $self->sql; 319 my $db =$self->db; 320 321 $log->debug("entered - @_"); 322 323 # ignore volumes 324 $key1 = parse_neb_key($key1); 325 $key2 = parse_neb_key($key2); 326 327 # order of operations for the swap: 328 # key1 -> key1.swap 329 # key2 -> key1 330 # key1.swap -> key2 331 332 eval { 333 { 334 # key1 -> key1.swap 335 my $query = $db->prepare_cached($sql->rename_object); 336 # this SQL statment takes the new key name as the first param 337 my $rows = $query->execute($key1->path . ".swap", $key1->path); 338 339 # if we affected more then one row something very bad has happened. 340 unless ($rows == 1) { 341 $query->finish; 342 $log->logdie("affected row count is $rows instead of 1"); 343 } 344 } 345 346 { 347 # key2 -> key1 348 my $query = $db->prepare_cached($sql->rename_object); 349 # this SQL statment takes the new key name as the first param 350 my $rows = $query->execute($key1->path, $key2->path); 351 352 # if we affected more then one row something very bad has happened. 353 unless ($rows == 1) { 354 $query->finish; 355 $log->logdie("affected row count is $rows instead of 1"); 356 } 357 } 358 359 { 360 # key1.swap -> key2 361 my $query = $db->prepare_cached($sql->rename_object); 362 # this SQL statment takes the new key name as the first param 363 my $rows = $query->execute($key2->path, $key1->path . ".swap"); 364 365 # if we affected more then one row something very bad has happened. 366 unless ($rows == 1) { 367 $query->finish; 368 $log->logdie("affected row count is $rows instead of 1"); 369 } 370 } 371 372 $db->commit; 373 $log->debug("commit"); 374 }; 375 if ($@) { 376 $db->rollback; 377 $log->debug("rollback"); 378 $log->logdie("database error: $@"); 379 } 380 381 $log->debug("leaving"); 382 383 return 1; 384 } 464 385 465 386 … … 499 420 my $log = $self->log; 500 421 my $sql = $self->sql; 501 my $db = $self->db($key);422 my $db =$self->db; 502 423 503 424 $log->debug("entered - @_"); … … 508 429 509 430 if (defined $vol_name 510 and not $self->_is_valid_volume_name($key , $key->volume)) {431 and not $self->_is_valid_volume_name($key->volume)) { 511 432 if ($key->soft_volume) { 512 433 $log->warn( "$vol_name is not a known volume name" ); … … 520 441 if (defined $vol_name) { 521 442 ($vol_id, $vol_host, $vol_path, $vol_xattr) 522 = $self->_get_storage_volume($ key, $vol_name);443 = $self->_get_storage_volume($vol_name); 523 444 } else { 524 445 ($vol_id, $vol_host, $vol_path, $vol_xattr) … … 613 534 my $log = $self->log; 614 535 my $sql = $self->sql; 615 my $db = $self->db($key);536 my $db =$self->db; 616 537 617 538 $log->debug( "entered - @_" ); … … 716 637 my $log = $self->log; 717 638 my $sql = $self->sql; 718 my $db = $self->db($key);639 my $db =$self->db; 719 640 720 641 $log->debug( "entered - @_" ); … … 828 749 my $log = $self->log; 829 750 my $sql = $self->sql; 830 my $db = $self->db($key);751 my $db =$self->db; 831 752 832 753 $log->debug("entered - @_"); … … 895 816 my $log = $self->log; 896 817 my $sql = $self->sql; 897 my $db = $self->db($key);818 my $db =$self->db; 898 819 899 820 $log->debug("entered - @_"); … … 948 869 my $log = $self->log; 949 870 my $sql = $self->sql; 950 my $db = $self->db($key);871 my $db =$self->db; 951 872 952 873 $log->debug("entered - @_"); … … 991 912 my $log = $self->log; 992 913 my $sql = $self->sql; 993 my $db = $self->db($key);914 my $db =$self->db; 994 915 995 916 $log->debug("entered - @_"); … … 1026 947 sub find_objects 1027 948 { 1028 # XXX: this will only search one db 1029 1030 my $self = shift; 1031 1032 my ($pattern) = validate_pos( @_, 949 my $self = shift; 950 951 my ( $pattern ) = validate_pos( @_, 1033 952 { 1034 953 type => SCALAR, … … 1039 958 my $log = $self->log; 1040 959 my $sql = $self->sql; 1041 my $db = $self->db;960 my $db =$self->db; 1042 961 1043 962 $log->debug( "entered - @_" ); … … 1097 1016 my $log = $self->log; 1098 1017 my $sql = $self->sql; 1099 my $db = $self->db($key);1018 my $db =$self->db; 1100 1019 1101 1020 $log->debug("entered - @_"); … … 1108 1027 # to check it after parsing the key 1109 1028 if (defined $vol_name 1110 and not $self->_is_valid_volume_name($key , $key->volume)) {1029 and not $self->_is_valid_volume_name($key->volume)) { 1111 1030 if ($key->soft_volume) { 1112 1031 $log->warn( "$vol_name is not a known volume name" ); … … 1168 1087 my $self = shift; 1169 1088 1170 my ($key, $uri) = validate_pos( @_, 1171 { 1172 type => SCALAR, 1173 callbacks => { 1174 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 1175 }, 1176 }, 1089 my ( $uri ) = validate_pos( @_, 1177 1090 { 1178 1091 type => SCALAR|SCALARREF, … … 1182 1095 my $log = $self->log; 1183 1096 my $sql = $self->sql; 1184 my $db = $self->db($key);1097 my $db =$self->db; 1185 1098 1186 1099 $log->debug( "entered - @_" ); … … 1269 1182 my $log = $self->log; 1270 1183 my $sql = $self->sql; 1271 my $db = $self->db($key);1184 my $db =$self->db; 1272 1185 1273 1186 $log->debug("entered - @_"); … … 1298 1211 sub mounts 1299 1212 { 1300 # XXX: this will only pull the mounts from one db1301 1213 my $self = shift; 1302 1214 … … 1305 1217 my $log = $self->log; 1306 1218 my $sql = $self->sql; 1307 my $db = $self->db;1219 my $db =$self->db; 1308 1220 1309 1221 $log->debug("entered - @_"); … … 1334 1246 my $self = shift; 1335 1247 1336 my ($key, $name, $soft_volume) = @_; 1337 1338 my $log = $self->log; 1339 my $sql = $self->sql; 1340 my $db = $self->db($key); 1248 my $log = $self->log; 1249 my $sql = $self->sql; 1250 my $db = $self->db; 1341 1251 1342 1252 no warnings qw( uninitialized ); 1343 1253 $log->debug( "entered - @_" ); 1344 1254 use warnings; 1255 1256 my ($name, $soft_volume) = @_; 1345 1257 1346 1258 my ($vol_id, $vol_host, $vol_path, $xattr); … … 1359 1271 # find it, fall back to any volume 1360 1272 if ($soft_volume) { 1361 ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume ($key);1273 ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume; 1362 1274 return; # this just returns out of the eval not from the subroutine 1363 1275 } … … 1399 1311 my $self = shift; 1400 1312 1401 my $key = shift; 1402 1403 my $log = $self->log; 1404 my $sql = $self->sql; 1405 my $db = $self->db($key); 1313 my $log = $self->log; 1314 my $sql = $self->sql; 1315 my $db =$self->db; 1406 1316 1407 1317 no warnings qw( uninitialized ); … … 1409 1319 use warnings; 1410 1320 1321 my $key = shift; 1411 1322 1412 1323 $key = parse_neb_key($key); … … 1450 1361 my $log = $self->log; 1451 1362 my $sql = $self->sql; 1452 my $db = $self->db($key);1363 my $db =$self->db; 1453 1364 1454 1365 $key = parse_neb_key($key); … … 1477 1388 sub _is_valid_volume_name 1478 1389 { 1479 my ($self, $ key, $vol_name) = @_;1480 1481 my $log = $self->log; 1482 my $sql = $self->sql; 1483 my $db = $self->db($key);1390 my ($self, $vol_name) = @_; 1391 1392 my $log = $self->log; 1393 my $sql = $self->sql; 1394 my $db =$self->db; 1484 1395 1485 1396 my $volume_info = parse_neb_volume($vol_name); … … 1518 1429 my $log = $self->log; 1519 1430 my $sql = $self->sql; 1520 my $db = $self->db ($key);1431 my $db = $self->db; 1521 1432 1522 1433 my $uri; … … 1647 1558 my $log = $self->log; 1648 1559 my $sql = $self->sql; 1649 # my $db =$self->db;1560 my $db =$self->db; 1650 1561 1651 1562 $log->debug( "entered" ); 1652 1563 1653 #$self->db->disconnect;1654 1655 #$log->debug( "disconnected from database: ", sub { $db->data_sources; } );1564 $self->db->disconnect; 1565 1566 $log->debug( "disconnected from database: ", sub { $db->data_sources; } ); 1656 1567 1657 1568 $log->debug( "leaving" );
Note:
See TracChangeset
for help on using the changeset viewer.
