Changeset 20965 for trunk/Nebulous-Server/lib/Nebulous/Server.pm
- Timestamp:
- Dec 12, 2008, 11:13:41 AM (18 years ago)
- File:
-
- 1 edited
-
trunk/Nebulous-Server/lib/Nebulous/Server.pm (modified) (40 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Nebulous-Server/lib/Nebulous/Server.pm
r20091 r20965 1 1 # Copyright (c) 2004-2008 Joshua Hoblitt 2 2 # 3 # $Id: Server.pm,v 1.9 3 2008-10-13 20:41:17jhoblitt Exp $3 # $Id: Server.pm,v 1.94 2008-12-12 21:13:41 jhoblitt 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 39 40 40 # log4perl is not avaliable until we call init() … … 51 51 $self->config($config); 52 52 53 # ask for the db handle as a means of validating the database parameters54 $self->db;55 56 53 $log->debug( "leaving" ); 57 54 … … 62 59 sub db 63 60 { 64 my $self = shift; 65 66 if (@_) { 67 $self->{db} = $_[0]; 68 return $self; 69 } 61 my ($self, $key) = @_; 70 62 71 63 my $log = $self->log; … … 73 65 my $config = $self->config; 74 66 67 my $db_index = 0; 68 if (defined $key) { 69 # hash the key to select the correct database instance 70 $db_index = unpack("%20h", sha1_hex("$key")) % $config->n_db; 71 } 72 73 # lookup to see if we have a stored dbh for this database 74 my $dbh = $self->{dbs}[$db_index]; 75 75 # if the dbh is still alive, return it 76 if (defined $ self->{db} and $self->{db}->ping) {76 if (defined $dbh and $dbh->ping) { 77 77 $log->debug("db handle is still alive"); 78 return $ self->{db};78 return $dbh; 79 79 } 80 80 # otherwise create a new connection 81 81 $log->debug("db handle is dead/unopened"); 82 83 # lookup database info 84 my $db_config = $config->db($db_index); 85 die "can't find database configuration info for database # $db_index" 86 unless $db_config; 82 87 83 88 # if we're running under mod_perl & Apache::DBI is loaded we want to … … 86 91 # processes and the database might have gone away on us. Apache::DBI will 87 92 # 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, 93 eval { 94 $dbh = DBI->connect_cached( 95 $db_config->dsn, 96 $db_config->dbuser, 97 $db_config->dbpasswd, 94 98 { 95 99 RaiseError => 1, … … 99 103 ); 100 104 101 $db ->do( $sql->set_transaction_model );102 $log->debug( "connected to database: ", sub { $db ->data_sources; } );103 $db ->commit;105 $dbh->do( $sql->set_transaction_model ); 106 $log->debug( "connected to database: ", sub { $dbh->data_sources; } ); 107 $dbh->commit; 104 108 $log->debug("commit"); 105 109 }; 106 110 if ( $@ ) { 107 $db ->rollback if $db;111 $dbh->rollback if $dbh; 108 112 $log->debug("rollback"); 109 113 $log->logdie( "database error: $@" ); 110 114 } 111 115 112 $self->{db } = $db;113 114 return $db ;116 $self->{dbs}[$db_index] = $dbh; 117 118 return $dbh; 115 119 } 116 120 … … 139 143 my $log = $self->log; 140 144 my $sql = $self->sql; 141 my $db = $self->db;145 my $db = $self->db($key); 142 146 143 147 $log->debug( "entered - @_" ); … … 150 154 # to check it after parsing the key 151 155 if (defined $vol_name 152 and not $self->_is_valid_volume_name($key ->volume)) {156 and not $self->_is_valid_volume_name($key, $key->volume)) { 153 157 if ($key->soft_volume) { 154 158 $log->warn( "$vol_name is not a known volume name" ); … … 160 164 161 165 my ($vol_id, $vol_host, $vol_path, $vol_xattr) 162 = $self->_get_storage_volume($ vol_name, $key->soft_volume);166 = $self->_get_storage_volume($key, $vol_name, $key->soft_volume); 163 167 164 168 my $uri; … … 261 265 my $log = $self->log; 262 266 my $sql = $self->sql; 263 my $db = $self->db;267 my $db = $self->db($key); 264 268 265 269 $log->debug("entered - @_"); … … 296 300 297 301 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 } 302 # sub swap_objects 303 # { 304 # my $self = shift; 305 # 306 # my ($key1, $key2) = validate_pos(@_, 307 # { 308 # type => SCALAR, 309 # callbacks => { 310 # 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 311 # }, 312 # }, 313 # { 314 # type => SCALAR, 315 # callbacks => { 316 # 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 317 # }, 318 # }, 319 # ); 320 # 321 # my $log = $self->log; 322 # my $sql = $self->sql; 323 # my $dbh1 = $self->db($key1); 324 # my $dbh2 = $self->db($key2); 325 # 326 # $log->debug("entered - @_"); 327 # 328 # # ignore volumes 329 # $key1 = parse_neb_key($key1); 330 # $key2 = parse_neb_key($key2); 331 # 332 # # order of operations for the swap with a single db is: 333 # # key1 -> key1.swap 334 # # key2 -> key1 335 # # key1.swap -> key2 336 # 337 # # XXX this cmp will only work if ->db() returns the same exact (cached) dbh 338 # if ($dbh1 == $dbh2) { 339 # my $dbh = $dbh1; 340 # eval { 341 # { 342 # # key1 -> key1.swap 343 # my $query = $dbh->prepare_cached($sql->rename_object); 344 # # this SQL statment takes the new key name as the first param 345 # my $rows = $query->execute($key1->path . ".swap", $key1->path); 346 # 347 # # if we affected more then one row something very bad has happened. 348 # unless ($rows == 1) { 349 # $query->finish; 350 # $log->logdie("affected row count is $rows instead of 1"); 351 # } 352 # } 353 # 354 # { 355 # # key2 -> key1 356 # my $query = $dbh->prepare_cached($sql->rename_object); 357 # # this SQL statment takes the new key name as the first param 358 # my $rows = $query->execute($key1->path, $key2->path); 359 # 360 # # if we affected more then one row something very bad has happened. 361 # unless ($rows == 1) { 362 # $query->finish; 363 # $log->logdie("affected row count is $rows instead of 1"); 364 # } 365 # } 366 # 367 # { 368 # # key1.swap -> key2 369 # my $query = $dbh->prepare_cached($sql->rename_object); 370 # # this SQL statment takes the new key name as the first param 371 # my $rows = $query->execute($key2->path, $key1->path . ".swap"); 372 # 373 # # if we affected more then one row something very bad has happened. 374 # unless ($rows == 1) { 375 # $query->finish; 376 # $log->logdie("affected row count is $rows instead of 1"); 377 # } 378 # } 379 # 380 # $dbn->commit; 381 # $log->debug("commit"); 382 # }; 383 # if ($@) { 384 # $dbh->rollback; 385 # $log->debug("rollback"); 386 # $log->logdie("database error: $@"); 387 # } 388 # } 389 # 390 # # order of operations for the swap between two dbs is: 391 # # key1 start transaction 392 # # key1 -> read all instances 393 # # key1 -> remove all instances 394 # # key2 start transaction 395 # # key2 -> read all instances 396 # # key2 -> remove all instances 397 # # key1 -> insert key 2 instances 398 # # key2 -> insert key 1 instances 399 # # key1,2 commit 400 # 401 # eval { 402 # { 403 # # key1 -> read all instances 404 # my $query = $dbh->prepare_cached($sql->rename_object); 405 # # this SQL statment takes the new key name as the first param 406 # my $rows = $query->execute($key1->path . ".swap", $key1->path); 407 # 408 # # if we affected more then one row something very bad has happened. 409 # unless ($rows == 1) { 410 # $query->finish; 411 # $log->logdie("affected row count is $rows instead of 1"); 412 # } 413 # } 414 # 415 # { 416 # # key2 -> key1 417 # my $query = $db->prepare_cached($sql->rename_object); 418 # # this SQL statment takes the new key name as the first param 419 # my $rows = $query->execute($key1->path, $key2->path); 420 # 421 # # if we affected more then one row something very bad has happened. 422 # unless ($rows == 1) { 423 # $query->finish; 424 # $log->logdie("affected row count is $rows instead of 1"); 425 # } 426 # } 427 # 428 # { 429 # # key1.swap -> key2 430 # my $query = $db->prepare_cached($sql->rename_object); 431 # # this SQL statment takes the new key name as the first param 432 # my $rows = $query->execute($key2->path, $key1->path . ".swap"); 433 # 434 # # if we affected more then one row something very bad has happened. 435 # unless ($rows == 1) { 436 # $query->finish; 437 # $log->logdie("affected row count is $rows instead of 1"); 438 # } 439 # } 440 # 441 # $db->commit; 442 # $log->debug("commit"); 443 # }; 444 # if ($@) { 445 # $db->rollback; 446 # $log->debug("rollback"); 447 # $log->logdie("database error: $@"); 448 # } 449 # 450 # 451 # $log->debug("leaving"); 452 # 453 # return 1; 454 # } 385 455 386 456 … … 420 490 my $log = $self->log; 421 491 my $sql = $self->sql; 422 my $db = $self->db;492 my $db = $self->db($key); 423 493 424 494 $log->debug("entered - @_"); … … 429 499 430 500 if (defined $vol_name 431 and not $self->_is_valid_volume_name($key ->volume)) {501 and not $self->_is_valid_volume_name($key, $key->volume)) { 432 502 if ($key->soft_volume) { 433 503 $log->warn( "$vol_name is not a known volume name" ); … … 441 511 if (defined $vol_name) { 442 512 ($vol_id, $vol_host, $vol_path, $vol_xattr) 443 = $self->_get_storage_volume($ vol_name);513 = $self->_get_storage_volume($key, $vol_name); 444 514 } else { 445 515 ($vol_id, $vol_host, $vol_path, $vol_xattr) … … 534 604 my $log = $self->log; 535 605 my $sql = $self->sql; 536 my $db = $self->db;606 my $db = $self->db($key); 537 607 538 608 $log->debug( "entered - @_" ); … … 637 707 my $log = $self->log; 638 708 my $sql = $self->sql; 639 my $db = $self->db;709 my $db = $self->db($key); 640 710 641 711 $log->debug( "entered - @_" ); … … 749 819 my $log = $self->log; 750 820 my $sql = $self->sql; 751 my $db = $self->db;821 my $db = $self->db($key); 752 822 753 823 $log->debug("entered - @_"); … … 816 886 my $log = $self->log; 817 887 my $sql = $self->sql; 818 my $db = $self->db;888 my $db = $self->db($key); 819 889 820 890 $log->debug("entered - @_"); … … 869 939 my $log = $self->log; 870 940 my $sql = $self->sql; 871 my $db = $self->db;941 my $db = $self->db($key); 872 942 873 943 $log->debug("entered - @_"); … … 912 982 my $log = $self->log; 913 983 my $sql = $self->sql; 914 my $db = $self->db;984 my $db = $self->db($key); 915 985 916 986 $log->debug("entered - @_"); … … 947 1017 sub find_objects 948 1018 { 949 my $self = shift; 950 951 my ( $pattern ) = validate_pos( @_, 1019 # XXX: this will only search one db 1020 1021 my $self = shift; 1022 1023 my ($pattern) = validate_pos( @_, 952 1024 { 953 1025 type => SCALAR, … … 958 1030 my $log = $self->log; 959 1031 my $sql = $self->sql; 960 my $db = $self->db;1032 my $db = $self->db; 961 1033 962 1034 $log->debug( "entered - @_" ); … … 1016 1088 my $log = $self->log; 1017 1089 my $sql = $self->sql; 1018 my $db = $self->db;1090 my $db = $self->db($key); 1019 1091 1020 1092 $log->debug("entered - @_"); … … 1027 1099 # to check it after parsing the key 1028 1100 if (defined $vol_name 1029 and not $self->_is_valid_volume_name($key ->volume)) {1101 and not $self->_is_valid_volume_name($key, $key->volume)) { 1030 1102 if ($key->soft_volume) { 1031 1103 $log->warn( "$vol_name is not a known volume name" ); … … 1087 1159 my $self = shift; 1088 1160 1089 my ( $uri ) = validate_pos( @_, 1161 my ($key, $uri) = validate_pos( @_, 1162 { 1163 type => SCALAR, 1164 callbacks => { 1165 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 1166 }, 1167 }, 1090 1168 { 1091 1169 type => SCALAR|SCALARREF, … … 1095 1173 my $log = $self->log; 1096 1174 my $sql = $self->sql; 1097 my $db = $self->db;1175 my $db = $self->db($key); 1098 1176 1099 1177 $log->debug( "entered - @_" ); … … 1182 1260 my $log = $self->log; 1183 1261 my $sql = $self->sql; 1184 my $db = $self->db;1262 my $db = $self->db($key); 1185 1263 1186 1264 $log->debug("entered - @_"); … … 1211 1289 sub mounts 1212 1290 { 1291 # XXX: this will only pull the mounts from one db 1213 1292 my $self = shift; 1214 1293 … … 1217 1296 my $log = $self->log; 1218 1297 my $sql = $self->sql; 1219 my $db = $self->db;1298 my $db = $self->db; 1220 1299 1221 1300 $log->debug("entered - @_"); … … 1246 1325 my $self = shift; 1247 1326 1248 my $log = $self->log; 1249 my $sql = $self->sql; 1250 my $db = $self->db; 1327 my ($key, $name, $soft_volume) = @_; 1328 1329 my $log = $self->log; 1330 my $sql = $self->sql; 1331 my $db = $self->db($key); 1251 1332 1252 1333 no warnings qw( uninitialized ); 1253 1334 $log->debug( "entered - @_" ); 1254 1335 use warnings; 1255 1256 my ($name, $soft_volume) = @_;1257 1336 1258 1337 my ($vol_id, $vol_host, $vol_path, $xattr); … … 1271 1350 # find it, fall back to any volume 1272 1351 if ($soft_volume) { 1273 ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume ;1352 ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume($key); 1274 1353 return; # this just returns out of the eval not from the subroutine 1275 1354 } … … 1311 1390 my $self = shift; 1312 1391 1313 my $log = $self->log; 1314 my $sql = $self->sql; 1315 my $db =$self->db; 1392 my $key = shift; 1393 1394 my $log = $self->log; 1395 my $sql = $self->sql; 1396 my $db = $self->db($key); 1316 1397 1317 1398 no warnings qw( uninitialized ); … … 1319 1400 use warnings; 1320 1401 1321 my $key = shift;1322 1402 1323 1403 $key = parse_neb_key($key); … … 1361 1441 my $log = $self->log; 1362 1442 my $sql = $self->sql; 1363 my $db = $self->db;1443 my $db = $self->db($key); 1364 1444 1365 1445 $key = parse_neb_key($key); … … 1388 1468 sub _is_valid_volume_name 1389 1469 { 1390 my ($self, $ vol_name) = @_;1391 1392 my $log = $self->log; 1393 my $sql = $self->sql; 1394 my $db = $self->db;1470 my ($self, $key, $vol_name) = @_; 1471 1472 my $log = $self->log; 1473 my $sql = $self->sql; 1474 my $db = $self->db($key); 1395 1475 1396 1476 my $volume_info = parse_neb_volume($vol_name); … … 1429 1509 my $log = $self->log; 1430 1510 my $sql = $self->sql; 1431 my $db = $self->db ;1511 my $db = $self->db($key); 1432 1512 1433 1513 my $uri; … … 1558 1638 my $log = $self->log; 1559 1639 my $sql = $self->sql; 1560 my $db =$self->db;1640 # my $db = $self->db; 1561 1641 1562 1642 $log->debug( "entered" ); 1563 1643 1564 $self->db->disconnect;1565 1566 $log->debug( "disconnected from database: ", sub { $db->data_sources; } );1644 # $self->db->disconnect; 1645 1646 # $log->debug( "disconnected from database: ", sub { $db->data_sources; } ); 1567 1647 1568 1648 $log->debug( "leaving" );
Note:
See TracChangeset
for help on using the changeset viewer.
