- Timestamp:
- Dec 14, 2008, 12:52:37 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/neb_distrib_20081210/Nebulous-Server/lib/Nebulous/Server.pm
r20091 r20989 1 1 # Copyright (c) 2004-2008 Joshua Hoblitt 2 2 # 3 # $Id: Server.pm,v 1.93 2008-10-13 20:41:17 jhoblittExp $3 # $Id: Server.pm,v 1.93.6.1 2008-12-14 22:52:37 eugene Exp $ 4 4 5 5 package Nebulous::Server; … … 9 9 no warnings qw( uninitialized ); 10 10 11 our $VERSION = '0.1 5';11 our $VERSION = '0.16'; 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 ); 21 22 use Nebulous::Server::Config; 22 23 use Nebulous::Server::Log; 23 24 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->init( @_ ); 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) = @_; 39 47 40 48 # log4perl is not avaliable until we call init() … … 51 59 $self->config($config); 52 60 53 # ask for the db handle as a means of validating the database parameters54 $self->db;55 56 61 $log->debug( "leaving" ); 57 62 58 63 return $self; 59 64 } 60 65 61 62 66 sub db 63 67 { 64 my $self = shift; 65 66 if (@_) { 67 $self->{db} = $_[0]; 68 return $self; 69 } 68 my ($self, $key) = @_; 70 69 71 70 my $log = $self->log; … … 73 72 my $config = $self->config; 74 73 74 my $db_index = 0; 75 if (defined $key) { 76 # hash the key to select the correct database instance 77 # only use the first 8 hex chars... have to be careful to avoid an int 78 # overflow here 79 $db_index = unpack("h8", sha1_hex("$key")) % $config->n_db; 80 } 81 82 # lookup to see if we have a stored dbh for this database 83 my $dbh = $self->{dbs}[$db_index]; 75 84 # if the dbh is still alive, return it 76 if (defined $ self->{db} and $self->{db}->ping) {85 if (defined $dbh and $dbh->ping) { 77 86 $log->debug("db handle is still alive"); 78 return $ self->{db};87 return $dbh; 79 88 } 80 89 # otherwise create a new connection 81 90 $log->debug("db handle is dead/unopened"); 91 92 # lookup database info 93 my $db_config = $config->db($db_index); 94 die "can't find database configuration info for database # $db_index" 95 unless $db_config; 82 96 83 97 # if we're running under mod_perl & Apache::DBI is loaded we want to … … 86 100 # processes and the database might have gone away on us. Apache::DBI will 87 101 # take care of getting a valid dbh back. 88 my $db; 89 eval { 90 $db = DBI->connect_cached( 91 $config->dsn, 92 $config->dbuser, 93 $config->dbpasswd, 102 eval { 103 $dbh = DBI->connect_cached( 104 $db_config->dsn, 105 $db_config->dbuser, 106 $db_config->dbpasswd, 94 107 { 95 108 RaiseError => 1, … … 99 112 ); 100 113 101 $db ->do( $sql->set_transaction_model );102 $log->debug( "connected to database: ", sub { $db ->data_sources; } );103 $db ->commit;114 $dbh->do( $sql->set_transaction_model ); 115 $log->debug( "connected to database: ", sub { $dbh->data_sources; } ); 116 $dbh->commit; 104 117 $log->debug("commit"); 105 118 }; 106 119 if ( $@ ) { 107 $db ->rollback if $db;120 $dbh->rollback if $dbh; 108 121 $log->debug("rollback"); 109 122 $log->logdie( "database error: $@" ); 110 123 } 111 124 112 $self->{db } = $db;113 114 return $db ;125 $self->{dbs}[$db_index] = $dbh; 126 127 return $dbh; 115 128 } 116 129 … … 139 152 my $log = $self->log; 140 153 my $sql = $self->sql; 141 my $db = $self->db;154 my $db = $self->db($key); 142 155 143 156 $log->debug( "entered - @_" ); … … 150 163 # to check it after parsing the key 151 164 if (defined $vol_name 152 and not $self->_is_valid_volume_name($key ->volume)) {165 and not $self->_is_valid_volume_name($key, $key->volume)) { 153 166 if ($key->soft_volume) { 154 167 $log->warn( "$vol_name is not a known volume name" ); … … 160 173 161 174 my ($vol_id, $vol_host, $vol_path, $vol_xattr) 162 = $self->_get_storage_volume($ vol_name, $key->soft_volume);175 = $self->_get_storage_volume($key, $vol_name, $key->soft_volume); 163 176 164 177 my $uri; … … 261 274 my $log = $self->log; 262 275 my $sql = $self->sql; 263 my $db = $self->db;276 my $db = $self->db($key); 264 277 265 278 $log->debug("entered - @_"); … … 296 309 297 310 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 } 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 # } 385 464 386 465 … … 420 499 my $log = $self->log; 421 500 my $sql = $self->sql; 422 my $db = $self->db;501 my $db = $self->db($key); 423 502 424 503 $log->debug("entered - @_"); … … 429 508 430 509 if (defined $vol_name 431 and not $self->_is_valid_volume_name($key ->volume)) {510 and not $self->_is_valid_volume_name($key, $key->volume)) { 432 511 if ($key->soft_volume) { 433 512 $log->warn( "$vol_name is not a known volume name" ); … … 441 520 if (defined $vol_name) { 442 521 ($vol_id, $vol_host, $vol_path, $vol_xattr) 443 = $self->_get_storage_volume($ vol_name);522 = $self->_get_storage_volume($key, $vol_name); 444 523 } else { 445 524 ($vol_id, $vol_host, $vol_path, $vol_xattr) … … 534 613 my $log = $self->log; 535 614 my $sql = $self->sql; 536 my $db = $self->db;615 my $db = $self->db($key); 537 616 538 617 $log->debug( "entered - @_" ); … … 637 716 my $log = $self->log; 638 717 my $sql = $self->sql; 639 my $db = $self->db;718 my $db = $self->db($key); 640 719 641 720 $log->debug( "entered - @_" ); … … 749 828 my $log = $self->log; 750 829 my $sql = $self->sql; 751 my $db = $self->db;830 my $db = $self->db($key); 752 831 753 832 $log->debug("entered - @_"); … … 816 895 my $log = $self->log; 817 896 my $sql = $self->sql; 818 my $db = $self->db;897 my $db = $self->db($key); 819 898 820 899 $log->debug("entered - @_"); … … 869 948 my $log = $self->log; 870 949 my $sql = $self->sql; 871 my $db = $self->db;950 my $db = $self->db($key); 872 951 873 952 $log->debug("entered - @_"); … … 912 991 my $log = $self->log; 913 992 my $sql = $self->sql; 914 my $db = $self->db;993 my $db = $self->db($key); 915 994 916 995 $log->debug("entered - @_"); … … 947 1026 sub find_objects 948 1027 { 949 my $self = shift; 950 951 my ( $pattern ) = validate_pos( @_, 1028 # XXX: this will only search one db 1029 1030 my $self = shift; 1031 1032 my ($pattern) = validate_pos( @_, 952 1033 { 953 1034 type => SCALAR, … … 958 1039 my $log = $self->log; 959 1040 my $sql = $self->sql; 960 my $db = $self->db;1041 my $db = $self->db; 961 1042 962 1043 $log->debug( "entered - @_" ); … … 1016 1097 my $log = $self->log; 1017 1098 my $sql = $self->sql; 1018 my $db = $self->db;1099 my $db = $self->db($key); 1019 1100 1020 1101 $log->debug("entered - @_"); … … 1027 1108 # to check it after parsing the key 1028 1109 if (defined $vol_name 1029 and not $self->_is_valid_volume_name($key ->volume)) {1110 and not $self->_is_valid_volume_name($key, $key->volume)) { 1030 1111 if ($key->soft_volume) { 1031 1112 $log->warn( "$vol_name is not a known volume name" ); … … 1087 1168 my $self = shift; 1088 1169 1089 my ( $uri ) = validate_pos( @_, 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 }, 1090 1177 { 1091 1178 type => SCALAR|SCALARREF, … … 1095 1182 my $log = $self->log; 1096 1183 my $sql = $self->sql; 1097 my $db = $self->db;1184 my $db = $self->db($key); 1098 1185 1099 1186 $log->debug( "entered - @_" ); … … 1182 1269 my $log = $self->log; 1183 1270 my $sql = $self->sql; 1184 my $db = $self->db;1271 my $db = $self->db($key); 1185 1272 1186 1273 $log->debug("entered - @_"); … … 1211 1298 sub mounts 1212 1299 { 1300 # XXX: this will only pull the mounts from one db 1213 1301 my $self = shift; 1214 1302 … … 1217 1305 my $log = $self->log; 1218 1306 my $sql = $self->sql; 1219 my $db = $self->db;1307 my $db = $self->db; 1220 1308 1221 1309 $log->debug("entered - @_"); … … 1246 1334 my $self = shift; 1247 1335 1248 my $log = $self->log; 1249 my $sql = $self->sql; 1250 my $db = $self->db; 1336 my ($key, $name, $soft_volume) = @_; 1337 1338 my $log = $self->log; 1339 my $sql = $self->sql; 1340 my $db = $self->db($key); 1251 1341 1252 1342 no warnings qw( uninitialized ); 1253 1343 $log->debug( "entered - @_" ); 1254 1344 use warnings; 1255 1256 my ($name, $soft_volume) = @_;1257 1345 1258 1346 my ($vol_id, $vol_host, $vol_path, $xattr); … … 1271 1359 # find it, fall back to any volume 1272 1360 if ($soft_volume) { 1273 ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume ;1361 ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume($key); 1274 1362 return; # this just returns out of the eval not from the subroutine 1275 1363 } … … 1311 1399 my $self = shift; 1312 1400 1313 my $log = $self->log; 1314 my $sql = $self->sql; 1315 my $db =$self->db; 1401 my $key = shift; 1402 1403 my $log = $self->log; 1404 my $sql = $self->sql; 1405 my $db = $self->db($key); 1316 1406 1317 1407 no warnings qw( uninitialized ); … … 1319 1409 use warnings; 1320 1410 1321 my $key = shift;1322 1411 1323 1412 $key = parse_neb_key($key); … … 1361 1450 my $log = $self->log; 1362 1451 my $sql = $self->sql; 1363 my $db = $self->db;1452 my $db = $self->db($key); 1364 1453 1365 1454 $key = parse_neb_key($key); … … 1388 1477 sub _is_valid_volume_name 1389 1478 { 1390 my ($self, $ vol_name) = @_;1391 1392 my $log = $self->log; 1393 my $sql = $self->sql; 1394 my $db = $self->db;1479 my ($self, $key, $vol_name) = @_; 1480 1481 my $log = $self->log; 1482 my $sql = $self->sql; 1483 my $db = $self->db($key); 1395 1484 1396 1485 my $volume_info = parse_neb_volume($vol_name); … … 1429 1518 my $log = $self->log; 1430 1519 my $sql = $self->sql; 1431 my $db = $self->db ;1520 my $db = $self->db($key); 1432 1521 1433 1522 my $uri; … … 1558 1647 my $log = $self->log; 1559 1648 my $sql = $self->sql; 1560 my $db =$self->db;1649 # my $db = $self->db; 1561 1650 1562 1651 $log->debug( "entered" ); 1563 1652 1564 $self->db->disconnect;1565 1566 $log->debug( "disconnected from database: ", sub { $db->data_sources; } );1653 # $self->db->disconnect; 1654 1655 # $log->debug( "disconnected from database: ", sub { $db->data_sources; } ); 1567 1656 1568 1657 $log->debug( "leaving" );
Note:
See TracChangeset
for help on using the changeset viewer.
