Changeset 41172 for trunk/Nebulous-Server
- Timestamp:
- Nov 27, 2019, 12:04:14 PM (7 years ago)
- Location:
- trunk/Nebulous-Server
- Files:
-
- 16 edited
- 3 copied
-
Build.PL (modified) (2 diffs)
-
MANIFEST (modified) (1 diff)
-
bin/neb-voladd (modified) (1 diff)
-
docs/apache2-mod_perl-startup.pl (modified) (1 diff)
-
docs/install.txt (modified) (1 diff)
-
lib/Nebulous/Server.pm (modified) (60 diffs)
-
lib/Nebulous/Server/SQL.pm (modified) (1 diff)
-
lib/Test/Nebulous.pm (modified) (6 diffs)
-
scripts/mkdirs.mana (copied) (copied from branches/eam_branches/ipp-20191011/Nebulous-Server/scripts/mkdirs.mana )
-
scripts/stest.sh (copied) (copied from branches/eam_branches/ipp-20191011/Nebulous-Server/scripts/stest.sh )
-
t/03_server_setup.t (modified) (1 diff)
-
t/04_server_create_object.t (modified) (5 diffs)
-
t/05_server_replicate_object.t (modified) (6 diffs)
-
t/08_server_find_instances.t (modified) (10 diffs)
-
t/11_server_is_valid_volume_name.t (modified) (2 diffs)
-
t/15_server_xattr.t (modified) (1 diff)
-
t/16_mounts.t (modified) (3 diffs)
-
t/18_server_chmod_object.t (modified) (3 diffs)
-
t/20_server_find_objects_wildcard.t (copied) (copied from branches/eam_branches/ipp-20191011/Nebulous-Server/t/20_server_find_objects_wildcard.t )
Legend:
- Unmodified
- Added
- Removed
-
trunk/Nebulous-Server/Build.PL
r39926 r41172 43 43 }, 44 44 script_files => [qw( 45 bin/neb-admin46 bin/neb-fsck47 45 bin/neb-cabadd 48 46 bin/neb-voladd … … 54 52 )], 55 53 )->create_build_script; 54 55 # these scripts are no longer installed (2019.10.31) 56 # bin/neb-admin 57 # bin/neb-fsck -
trunk/Nebulous-Server/MANIFEST
r32383 r41172 4 4 MANIFEST 5 5 README 6 bin/neb-admin7 bin/neb-fsck8 bin/neb-initdb9 6 bin/neb-voladd 10 7 bin/neb-cabadd -
trunk/Nebulous-Server/bin/neb-voladd
r28492 r41172 43 43 44 44 my $dbh = DBI->connect( 45 # if you want to work with the localhost database but get socket path errors, 46 # you should set the server host as 127.0.0.1 (not localhost) 47 48 # the following tells DBI to read the mysql/my.cnf files 49 # "DBI:mysql:database=$db:host=$dbhost:mysql_read_default_group=dbd_mysql", 50 45 51 "DBI:mysql:database=$db:host=$dbhost", 46 52 $dbuser, -
trunk/Nebulous-Server/docs/apache2-mod_perl-startup.pl
r23687 r41172 28 28 use Nebulous::Server; 29 29 30 my $dsn = 'DBI:mysql:database=nebulous:host= ipp019.ifa.hawaii.edu';30 my $dsn = 'DBI:mysql:database=nebulous:host=nebulous.ipp.ifa.hawaii.edu'; 31 31 my $dbuser = 'nebulous'; 32 my $dbpasswd = ' @neb@';32 my $dbpasswd = 'XXXX'; 33 33 34 34 #$Apache::DBI::DEBUG = 1; 35 35 #Apache::DBI->connect_on_init( $dsn, $dbuser, $dbpasswd ); 36 36 Apache::DBI->setPingTimeOut($dsn, 10); 37 Nebulous::Server::SOAP->new_on_init( 37 38 my $config = Nebulous::Server::Config->new( 39 trace => 'warn', 40 ); 41 $config->add_db( 42 dbindex => 0, 38 43 dsn => $dsn, 39 44 dbuser => $dbuser, 40 45 dbpasswd => $dbpasswd, 41 log_level => 'all', 42 ); 46 ); 47 48 Nebulous::Server::SOAP->new_on_init($config); 49 43 50 44 51 1; -
trunk/Nebulous-Server/docs/install.txt
r23687 r41172 55 55 export NEB_PASS=@neb@ 56 56 57 *** this is very dangerous and should only be run in test examples: 57 58 neb-initdb 58 59 59 neb-voladd --vhost ipp000 --vname ipp000.0 --uri file:///data/ipp000.0/nebulous 60 neb-voladd --vhost ipp001 --vname ipp000.1 --uri file:///data/ipp000.1/nebulous 61 neb-voladd --vhost ipp002 --vname ipp002.0 --uri file:///data/ipp002.0/nebulous 62 neb-voladd --vhost ipp003 --vname ipp003.0 --uri file:///data/ipp003.0/nebulous 63 neb-voladd --vhost ipp022 --vname ipp022.0 --uri file:///data/ipp022.0/nebulous 60 neb-voladd --vhost ipp000 --vname ipp000.0 --uri file:///data/ipp000.0/nebulous --mountpoint /data/ipp000.0/nebulous 61 neb-voladd --vhost ipp001 --vname ipp000.1 --uri file:///data/ipp000.1/nebulous --mountpoint /data/ipp000.1/nebulous 62 neb-voladd --vhost ipp002 --vname ipp002.0 --uri file:///data/ipp002.0/nebulous --mountpoint /data/ipp002.0/nebulous 63 neb-voladd --vhost ipp003 --vname ipp003.0 --uri file:///data/ipp003.0/nebulous --mountpoint /data/ipp003.0/nebulous 64 neb-voladd --vhost ipp022 --vname ipp022.0 --uri file:///data/ipp022.0/nebulous --mountpoint /data/ipp022.0/nebulous 64 65 65 66 # or in bulk: -
trunk/Nebulous-Server/lib/Nebulous/Server.pm
r39926 r41172 13 13 use base qw( Class::Accessor::Fast ); 14 14 15 use Carp; 16 15 17 use Cache::Memcached; 16 18 use DBI; 19 20 ## for gentoo: 17 21 use Digest::SHA1 qw( sha1_hex ); 22 23 ## for ubuntu: 24 # use Digest::SHA qw( sha1_hex ); 25 18 26 use Fcntl ':mode'; 19 27 use File::Basename qw( basename dirname fileparse ); … … 77 85 Cache::Memcached->new({ 78 86 servers => $config->memcached_servers, 79 })80 );87 }) 88 ); 81 89 # $self->cache->set("foo", "bar") or die "set failed"; 82 90 # $self->cache->get("foo") or die "get failed"; … … 215 223 } 216 224 225 my $get_storage_volume_calls = 0; 226 217 227 sub create_object 218 228 { … … 252 262 # the key's volume can't be validiated on input for this method so we have 253 263 # to check it after parsing the key 254 if (defined $vol_name 255 and not $self->_is_valid_volume_name($key, $key->volume)) { 264 if (defined $vol_name and not $self->_is_valid_volume_name($key, $key->volume)) { 256 265 unless ($key->hard_volume) { 257 266 $log->warn( "$vol_name is not a known volume name" ); … … 262 271 } 263 272 273 $get_storage_volume_calls = 0; 274 264 275 my ($vol_id, $vol_host, $vol_path, $vol_xattr) 265 276 = $self->_get_storage_volume($key, $vol_name, $key->hard_volume); … … 273 284 # create storage_object 274 285 my $query = $db->prepare_cached( $sql->new_object ); 275 $query->execute('NULL', $key->path, basename($key->path), $parent_id); 286 # bad syntax $query->execute('NULL', $key->path, basename($key->path), $parent_id); 287 $query->execute(0, $key->path, basename($key->path), $parent_id); 288 $query->finish; 276 289 } 277 290 … … 292 305 my $query = $db->prepare_cached( $sql->new_object_attr ); 293 306 $query->execute($so_id); 307 $query->finish; 294 308 } 295 309 … … 300 314 my $query = $db->prepare_cached( $sql->new_object_instance ); 301 315 $query->execute($vol_id); 316 $query->finish; 302 317 } 303 318 … … 327 342 # vol_id, uri, ins_id 328 343 $query->execute($vol_id, "$uri", $ins_id); 344 $query->finish; 329 345 } 330 346 … … 421 437 } 422 438 $query->finish; 439 $db->commit; 423 440 } 424 441 … … 441 458 my $query = $db->prepare_cached($sql->new_directory); 442 459 $query->execute($dir, $parent_id); 460 $query->finish; 461 $db->commit; 443 462 } 444 463 … … 452 471 ($parent_id) = $query->fetchrow_array; 453 472 $query->finish; 473 $db->commit; 454 474 } 455 475 die("failed to get LAST_INSERT_ID()") 456 476 unless $parent_id; 457 458 $db->commit;459 477 } 460 478 }; … … 712 730 { 713 731 type => SCALAR|UNDEF, 714 # callbacks => {715 # # check that the volume name requested is valid716 # 'is valid volume name' => sub {717 # return 1 if not defined $_[0];718 # $self->_is_valid_volume_name($_[0])719 # },720 # },721 732 optional => 1, 722 733 }, … … 726 737 727 738 # if a volume name is explicity specified then we should make the 728 # replication onto that volume (even if there is alread an instance on that739 # replication onto that volume (even if there is already an instance on that 729 740 # volume) if at all possible and throw an error if we can not. 741 730 742 # if a volume name IS NOT specified then we should make the replication 731 743 # onto any (hopefully the best) volume that DOES NOT already have an 732 # instance on it. If all av ilable volumealready have an instance on them744 # instance on it. If all available volumes already have an instance on them 733 745 # then we should throw an error 746 734 747 # volume names implied as part of the key are *IGNORED* as the source and 735 748 # *SHOULD NOT* be used as the destination either 736 749 737 750 eval { 738 $key = parse_neb_key($key); 751 # EAM 2019.10.31 : if I supply dest_vol_name here, then 752 # $key->volume will point at that volume and the section below 753 # will correctly be testing the validity of dest_vol_name 754 $key = parse_neb_key($key, $dest_vol_name); 739 755 }; 740 756 $log->logdie("$@") if $@; … … 742 758 my $db = $self->db($key); 743 759 760 ## Old comment: 744 761 # puke if the source volume is bogus, we may want to actually use this as 745 762 # the instance to be copied later 746 if (defined $key->volume 747 and not $self->_is_valid_volume_name($key, $key->volume)) { 763 764 # EAM 2019.10.31 : in the past, the key-implied volume was 765 # supplied here, which was inconsistent since above it says the 766 # key-implied volume is ignored. By supplying $dest_vol_name to 767 # parse_neb_key above, the key->volume now refers to the 768 # dest_volume 769 if (defined $key->volume and not $self->_is_valid_volume_name($key, $key->volume)) { 748 770 unless ($key->hard_volume) { 749 771 $log->warn($key->volume . " not a known volume name"); … … 752 774 } 753 775 } 754 # puke if the source volume is bogus, we may want to actually use this as 755 # the instance to be copied later 756 if (defined $dest_vol_name 757 and not $self->_is_valid_volume_name($key, $dest_vol_name)) { 758 $log->logdie($key->volume . " is not a valid volume name"); 759 } 760 776 777 # puke if the destination volume is bogus 778 ## XXX if I supply dest_vol_name to parse_neb_key above, this section below is redundant with the above 779 ## if (defined $dest_vol_name 780 ## and not $self->_is_valid_volume_name($key, $dest_vol_name)) { 781 ## $log->logdie($key->volume . " is not a valid volume name"); 782 ## } 783 784 $get_storage_volume_calls = 0; 785 761 786 my ($vol_id, $vol_host, $vol_path, $vol_xattr); 762 787 if (defined $dest_vol_name) { 788 # if we supplied dest_vol_name, then the call to parse_neb_key above 789 # will have set $key->volume to that value and hard_volume to match 763 790 ($vol_id, $vol_host, $vol_path, $vol_xattr) 764 = $self->_get_storage_volume($key, $ dest_vol_name);791 = $self->_get_storage_volume($key, $key->volume, $key->hard_volume); 765 792 } else { 766 793 ($vol_id, $vol_host, $vol_path, $vol_xattr) 767 794 = $self->_get_replication_volume($key); 768 795 } 796 797 # print "selected target: $vol_id, $vol_host\n"; 769 798 770 799 my $uri; … … 784 813 $so_id = $query->fetchrow_hashref->{ 'so_id' }; 785 814 $query->finish; 815 $db->commit; 786 816 } 787 817 … … 800 830 # time LAST_INSERT_ID() is invoked 801 831 $query->finish; 832 $db->commit; 802 833 } 803 834 … … 841 872 eval { 842 873 my $mode = $self->getxattr_object("$key", 'user.mode'); 843 if (defined $mode ) {844 $self->chmod_object("$key", $mode);874 if (defined $mode && $mode ne "") { 875 $self->chmod_object("$key", $mode); 845 876 } 846 877 }; … … 852 883 853 884 $log->debug("leaving"); 854 855 885 return "$uri"; 856 886 } … … 1323 1353 die( "xattr $key:$name does not exist" ); 1324 1354 } 1355 1325 1356 # if we go more then one row bad something very bad has happened. 1326 1357 unless ($rows == 1) { … … 1335 1366 $value = $row->{ 'value' }; 1336 1367 }; 1368 $db->commit; 1369 1337 1370 if ($@) { 1338 1371 if ($@ =~ /user\..*? does not exist/) { 1339 1372 # do not log xattr does not exist messages 1373 # NOTE: the client is using the reported message to interpret the errors 1340 1374 die $@; 1341 1375 } … … 1386 1420 }; 1387 1421 $log->logdie("database error: $@") if $@; 1422 $db->commit; 1388 1423 1389 1424 $log->debug("leaving"); … … 1442 1477 die( "affected row count is $rows instead of 1" ); 1443 1478 } 1444 1445 1479 $db->commit; 1446 1480 $log->debug("commit"); … … 1545 1579 $work_dir = $pattern; 1546 1580 $file_pattern = '%'; 1547 } 1548 else { 1581 } else { 1549 1582 my $dir_plain = dirname($pattern); 1550 1583 if ($dir_plain eq 'neb:') { … … 1575 1608 my $query = $db->prepare_cached( $sql->find_dir_by_parent_id . " AND dirname LIKE ? "); 1576 1609 $query->execute( $dir_id, $file_pattern ); 1610 $db->commit; 1577 1611 1578 1612 while ( my $row = $query->fetchrow_hashref ) { … … 1595 1629 my $query = $db->prepare_cached( $sql->find_object_by_dir_id . " AND ext_id_basename LIKE ? "); 1596 1630 $query->execute( $dir_id , $file_pattern); 1631 $db->commit; 1597 1632 1598 1633 while ( my $row = $query->fetchrow_hashref ) { … … 1624 1659 my $sql = $self->sql; 1625 1660 my $db = $self->_db_for_index($index); 1626 1627 1661 1628 1662 # first check to see if the key is an exact match … … 1645 1679 $log->logdie("database error: $@"); 1646 1680 } 1681 $db->commit; 1647 1682 1648 1683 if (scalar @keys) { … … 1678 1713 }; 1679 1714 $log->logdie("database error: $@") if $@; 1715 $db->commit; 1680 1716 1681 1717 # find files under dir … … 1692 1728 }; 1693 1729 $log->logdie("database error: $@") if $@; 1730 $db->commit; 1694 1731 1695 1732 $log->debug( "leaving" ); … … 1753 1790 } 1754 1791 1792 # sub find_instances 1755 1793 sub find_instances_old 1756 1794 { … … 1769 1807 { 1770 1808 type => SCALAR|UNDEF, 1771 # callbacks => {1772 # # check that the volume name requested is valid1773 # 'is valid volume name' => sub {1774 # return 1 if not defined $_[0];1775 # $self->_is_valid_volume_name($_[0])1776 # },1777 # },1778 1809 optional => 1, 1779 1810 }, … … 1787 1818 my $sql = $self->sql; 1788 1819 1789 # unless ($key) { 1790 # $log->warn("key was undefined after validate_pos(), trying again..."); 1791 # return $self->find_instances(@_); 1792 # } 1820 # default value for find_invalid is false 1821 if (not defined $find_invalid) { $find_invalid = 0; } 1793 1822 1794 1823 # vol_name overrides the key implied volume … … 1828 1857 my $rows; 1829 1858 # ext_id, available 1830 if (defined($find_invalid)) { 1859 if (defined($find_invalid) and $find_invalid) { 1860 # XXX returns instances which are NOT available 1831 1861 $rows = $query->execute($key->path, 0); 1832 1862 } … … 1865 1895 } 1866 1896 1867 # sub find_instances_by_proximity1897 # sub find_instances_by_proximity 1868 1898 sub find_instances 1869 1899 { … … 1882 1912 { 1883 1913 type => SCALAR|UNDEF, 1884 # callbacks => {1885 # # check that the volume name requested is valid1886 # 'is valid volume name' => sub {1887 # return 1 if not defined $_[0];1888 # $self->_is_valid_volume_name($_[0])1889 # },1890 # },1891 1914 optional => 1, 1892 1915 }, … … 1897 1920 }, 1898 1921 ); 1899 1900 1922 my $sql = $self->sql; 1901 1923 1902 # unless ($key) { 1903 # $log->warn("key was undefined after validate_pos(), trying again..."); 1904 # return $self->find_instances(@_); 1905 # } 1924 if (not defined $find_invalid) { $find_invalid = 0; } 1925 1926 if ($find_invalid eq "find them all") { 1927 $log->logdie("old neb-cull --one_only, neb-rm --invalid both disabled by new Server.pm"); 1928 } 1906 1929 1907 1930 # vol_name overrides the key implied volume … … 1932 1955 } 1933 1956 } 1934 1935 1936 1957 } 1937 1958 … … 1972 1993 # ext_id, name, available 1973 1994 # host_vol_id host_cab_id host_site_id ext_id available 1974 my $rows = $query->execute($h_vol_id, $h_cab_id, $h_site_id, $key->path, 1); 1995 1996 my $rows; 1997 if (defined($find_invalid) and $find_invalid) { 1998 # returns instances which are NOT available (volume not available) 1999 $rows = $query->execute($h_vol_id, $h_cab_id, $h_site_id, $key->path, 0); 2000 } else { 2001 $rows = $query->execute($h_vol_id, $h_cab_id, $h_site_id, $key->path, 1); 2002 } 1975 2003 unless ($rows > 0) { 1976 2004 $query->finish; 1977 die("no instances on storage volume or volume is not avai able for key: $key volume: $vol_name");2005 die("no instances on storage volume or volume is not available for key: $key volume: $vol_name"); 1978 2006 } 1979 2007 } else { 1980 2008 $query = $db->prepare_cached( $sql->get_object_instances ); 2009 # ext_id, available 2010 1981 2011 my $rows; 1982 # ext_id, available 1983 if (defined($find_invalid)) {2012 if (defined($find_invalid) and $find_invalid) { 2013 # returns instances which are NOT available (volume not available) 1984 2014 $rows = $query->execute($key->path, 0); 1985 } 1986 else { 2015 } else { 1987 2016 $rows = $query->execute($key->path, 1); 1988 2017 } … … 1992 2021 } 1993 2022 } 2023 $db->commit; 2024 ## if we do not call commit here, the transaction stays 2025 ## open blocking some operations below. 1994 2026 1995 2027 while (my $row = $query->fetchrow_hashref) { 1996 2028 my $instance = $row->{ 'uri' }; 1997 2029 push @locations, $instance if $instance; 2030 2031 # Carp::carp ("instance 2: $row->{ 'uri' }, $row->{ 'vol_id' }, $row->{ 'cab_id' }, $row->{ 'vol_idx' }\n"); 1998 2032 } 1999 2033 }; … … 2003 2037 if (defined $vol_name and not defined $key->hard_volume) { 2004 2038 $log->debug("retrying with 'any' volume"); 2005 return $self->find_instances($key->path, 'any' );2039 return $self->find_instances($key->path, 'any', $find_invalid); 2006 2040 } 2007 2041 $log->logdie("database error: $@"); … … 2018 2052 } 2019 2053 2054 # this method returns instances on the specified volume 2055 # or a list of all available instances 2056 # it does NOT choose instances based on proximity 2057 # and it does NOT return invalid instances 2020 2058 sub find_instances_for_cull 2021 2059 { … … 2061 2099 my $db = $self->db($key); 2062 2100 2101 ## XXX this method is missing the alias deference section (see find_instances) 2102 ## if aliases are intended to be compute nodes in the same cabinet / site as 2103 ## the storage nodes, then this is not needed. 2104 2063 2105 # the key's volume can't be validiated on input for this method so we have 2064 2106 # to check it after parsing the key … … 2082 2124 unless ($rows > 0) { 2083 2125 $query->finish; 2084 die("no instances on storage volume or volume is not avai able for key: $key volume: $vol_name");2126 die("no instances on storage volume or volume is not available for key: $key volume: $vol_name"); 2085 2127 } 2086 2128 } else { … … 2105 2147 $db->rollback; 2106 2148 # handle soft volumes 2107 if (defined $vol_name and not defined $key->hard_volume) { 2149 # we need to call find_intances_for_cull here so the returned structure 2150 # is the same (find_instances just returns an array of strings) 2151 if (defined $vol_name and not defined $key->hard_volume and ($vol_name ne "any")) { 2108 2152 $log->debug("retrying with 'any' volume"); 2109 return $self->find_instances ($key->path, 'any');2153 return $self->find_instances_for_cull($key->path, 'any'); 2110 2154 } 2111 2155 $log->logdie("database error: $@"); 2112 2156 } 2157 $db->commit; 2113 2158 2114 2159 # XXX remove this? … … 2222 2267 } 2223 2268 } 2224 2225 2269 $db->commit; 2226 2270 $log->debug("commit"); … … 2282 2326 $stat = $query->fetchrow_arrayref; 2283 2327 $query->finish; 2328 $db->commit; 2284 2329 }; 2285 2330 $log->logdie("database error: $@") if $@; … … 2318 2363 }; 2319 2364 $log->logdie("database error: $@") if $@; 2365 $db->commit; 2320 2366 2321 2367 $log->logdie("no mounted volumes found") unless (scalar @$stats); … … 2415 2461 my ($key, $name, $hard_volume) = @_; 2416 2462 2417 # $log->warn("_g_s_v: key:>$key< name:>$name< hard_vol:>$hard_volume<"); 2463 # track the number of calls to this function and 2464 # give up after 10 attempts 2465 $get_storage_volume_calls ++; 2466 2467 # $log->warn("_g_s_v: key:>$key< name:>$name< hard_vol:>$hard_volume<"); 2418 2468 my $sql = $self->sql; 2419 2469 my $db = $self->db($key); … … 2427 2477 # %free, name, avaiable, allocate 2428 2478 $rows = $query->execute($max_used_space, $name, 1, 1); 2429 # XXX d estinguish between non-existant and unavailable2479 # XXX distinguish between non-existant and unavailable 2430 2480 unless ($rows > 0) { 2431 2481 $query->finish; 2482 $db->commit; 2432 2483 2433 2484 # if a volume name was specified, and is soft, and we failed to … … 2442 2493 if ($rows > 1) { 2443 2494 $query->finish; 2495 $db->commit; 2444 2496 die("affected row count is $rows instead of 1"); 2445 2497 } … … 2449 2501 $rows = $query->execute($max_used_space, 1, 1, $topfew_count); 2450 2502 # $log->warn("Storage_volume: $rows $topfew_count"); 2451 # there has to be at least one storage volume2503 # there has to be at least one storage volume 2452 2504 unless ($rows > 0) { 2453 2505 $query->finish; 2454 die("no storage volume is available for key: $key volume: $name hard_volume: $hard_volume"); 2506 $db->commit; 2507 # prevent failure in the die due to undefined variables 2508 my $hard_volume_str = defined $hard_volume ? $hard_volume : "undefined"; 2509 my $name_str = defined $name ? $name : "undefined"; 2510 die("no storage volume is available for key: $key volume: $name_str hard_volume: $hard_volume_str"); 2455 2511 } 2456 2512 } … … 2465 2521 $log->error($@); 2466 2522 $log->debug("retrying..."); 2467 return $self->_get_storage_volume(@_); 2523 if ($get_storage_volume_calls < 10) { 2524 return $self->_get_storage_volume(@_); 2525 } 2526 # else 2527 $log->logdie("no available storage volume: $@"); 2468 2528 } 2469 2529 # else … … 2502 2562 unless ($rows > 0) { 2503 2563 $query->finish; 2504 die("Requested key $key does not exist ");2564 die("Requested key $key does not exist (or cabinet is undefined)"); 2505 2565 } 2506 2566 if ($rows == 1) { … … 2513 2573 } 2514 2574 $query->finish; 2515 } 2516 else { 2575 } else { 2576 # if instances are spread across multiple cabinets, allow the next instance to go anywhere 2577 # NOTE: this does not prevent the new instance from going to the same volume as one of the existing instances 2517 2578 $forbidden_cabinet = 0; 2518 2579 $forbidden_site = 0; 2519 2580 $query->finish; 2520 2581 } 2521 2582 $db->commit; 2522 2583 2523 2584 $query = $db->prepare_cached( $sql->get_replication_volume_for_ext_id ); 2524 # ext_id, %free, avaiable, allocate 2585 # ext_id, %free, available, allocate 2586 2525 2587 $rows = $query->execute($key->path, $max_used_space, 1, 1, $forbidden_cabinet, $forbidden_site, $topfew_count); 2526 # XXX d estinguish between non-existant and unaviable2588 # XXX distinguish between non-existant and unavailable 2527 2589 unless ($rows > 0) { 2528 2590 $query->finish; … … 2544 2606 ($vol_id, $vol_host, $vol_path, $xattr, $free) = $query->fetchrow_array; 2545 2607 $query->finish; 2608 $db->commit; 2546 2609 }; 2547 2610 $log->logdie("database error: $@") if $@; … … 2590 2653 ($ext_id) = $query->fetchrow_array; 2591 2654 $query->finish; 2655 $db->commit; 2656 ## if we do not call commit here, the transaction stays open blocking some operations below 2592 2657 }; 2593 2658 if ($@) { … … 2612 2677 } 2613 2678 2614 2679 # in the past, _is_valid_volume_name returned 'undef'. 2680 # now it either returns 1 (success) or 0 (failure) 2615 2681 sub _is_valid_volume_name 2616 2682 { … … 2650 2716 ($vol_id, $vol_path, $free) = $query->fetchrow_array; 2651 2717 $query->finish; 2718 $db->commit; 2652 2719 }; 2653 2720 $log->logdie("database error: $@") if $@; -
trunk/Nebulous-Server/lib/Nebulous/Server/SQL.pm
r39926 r41172 574 574 DROP TABLE IF EXISTS directory; 575 575 DROP TABLE IF EXISTS deleted; 576 DROP TABLE IF EXISTS cabinet; 577 DROP TABLE IF EXISTS aliasvol; 578 DROP TABLE IF EXISTS lost_instances; 576 579 SET FOREIGN_KEY_CHECKS=1 577 580 END -
trunk/Nebulous-Server/lib/Test/Nebulous.pm
r24540 r41172 19 19 our @EXPORT = qw( $NEB_DB $NEB_USER $NEB_PASS $NEB_MEMCACHED_SERVERS); 20 20 21 our $NEB_DB = $ENV{'NEB_DB'} || "DBI:mysql:database=test:host=localhost"; 22 our $NEB_USER = $ENV{'NEB_USER'} || "test"; 23 our $NEB_PASS = $ENV{'NEB_PASS'} || ''; 21 # require use of the test database server: 22 23 our $NEB_DB = "DBI:mysql:database=test:host=localhost:mysql_socket=/var/run/mysqld/mysqld.sock"; 24 our $NEB_USER = "test"; 25 our $NEB_PASS = ''; 24 26 our $NEB_MEMCACHED_SERVERS = ['127.0.0.1:11211']; 25 27 … … 35 37 my $dir6 = ""; 36 38 my $dir7 = ""; 39 my $dir8 = ""; 40 41 sub show_setup { 42 my $self = shift; 43 44 print "DB: $NEB_DB, USER: $NEB_USER, PASS: $NEB_PASS\n"; 45 } 46 37 47 38 48 sub setup { … … 49 59 $dir6 = tempdir( CLEANUP => 0 ); 50 60 $dir7 = tempdir( CLEANUP => 0 ); 61 $dir8 = tempdir( CLEANUP => 0 ); 51 62 52 63 foreach my $statement (@{ $sql->get_db_schema }) { … … 54 65 } 55 66 56 # node01/node02: allocate = TRUE 57 $dbh->do(qq{ INSERT INTO volume (vol_id, name, host, path, mountpoint, allocate, available) VALUES (1, 'node01', 'node01', ?, '/', TRUE, TRUE) }, undef, $dir1); 58 $dbh->do(qq{ INSERT INTO mountedvol SELECT *, 10e10, 10e7 FROM volume WHERE vol_id = ? }, undef, 1); 59 # $dbh->do(qq{ INSERT INTO mount VALUES (?, 10e10, 10e7) }, undef, $dir1); 67 # generate 2 cabinets so we can replicate to a valid location 68 $dbh->do(qq{ INSERT INTO cabinet (name, site_id, location) values ("cab01", 1, "main") }); 69 $dbh->do(qq{ INSERT INTO cabinet (name, site_id, location) values ("cab02", 1, "main") }); 70 $dbh->do(qq{ INSERT INTO cabinet (name, site_id, location) values ("cab03", 2, "back") }); 71 $dbh->do(qq{ INSERT INTO cabinet (name, site_id, location) values ("cab04", 2, "back") }); 60 72 61 $dbh->do(qq{ INSERT INTO volume (vol_id, name, host, path, mountpoint, allocate, available) VALUES (2, 'node02', 'node02', ?, '/', TRUE, TRUE) }, undef, $dir2);62 $dbh->do(qq{ INSERT INTO mountedvol SELECT *, 10e10, 10e8 FROM volume WHERE vol_id = ? }, undef, 2);63 # $dbh->do(qq{ INSERT INTO mount VALUES (?, 10e10, 10e8) }, undef, $dir2);73 # node01 : allocate = TRUE (cab01, site 1) 74 $dbh->do(qq{ INSERT INTO volume (vol_id, cab_id, name, host, path, mountpoint, allocate, available) VALUES (1, 1, 'node01', 'node01', ?, '/', TRUE, TRUE) }, undef, $dir1); 75 $dbh->do(qq{ INSERT INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, 10e10, 10e7, note FROM volume WHERE vol_id = ? }, undef, 1); 64 76 65 # node03: allocate = TRUE 66 $dbh->do(qq{ INSERT INTO volume (vol_id, name, host, path, mountpoint, allocate, available) VALUES (3, 'node03', 'node03', ?, '/', TRUE, TRUE) }, undef, $dir3); 67 $dbh->do(qq{ INSERT INTO mountedvol SELECT *, 10e10, 10e8 FROM volume WHERE vol_id = ? }, undef, 3); 68 # $dbh->do(qq{ INSERT INTO mount VALUES (?, 10e10, 10e8) }, undef, $dir3); 77 # node02 : allocate = TRUE (cab02, site 1) 78 $dbh->do(qq{ INSERT INTO volume (vol_id, cab_id, name, host, path, mountpoint, allocate, available) VALUES (2, 2, 'node02', 'node02', ?, '/', TRUE, TRUE) }, undef, $dir2); 79 $dbh->do(qq{ INSERT INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, 10e10, 10e8, note FROM volume WHERE vol_id = ? }, undef, 2); 80 81 # node03: allocate = TRUE (cab03, site 2) 82 $dbh->do(qq{ INSERT INTO volume (vol_id, cab_id, name, host, path, mountpoint, allocate, available) VALUES (3, 3, 'node03', 'node03', ?, '/', TRUE, TRUE) }, undef, $dir3); 83 $dbh->do(qq{ INSERT INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, 10e10, 10e8, note FROM volume WHERE vol_id = ? }, undef, 3); 69 84 70 85 # node04: allocate = FALSE, available = FALSE 71 $dbh->do(qq{ INSERT INTO volume (vol_id, name, host, path, mountpoint, allocate, available) VALUES (4, 'node04', 'node04', ?, '/', FALSE, FALSE) }, undef, $dir4); 72 $dbh->do(qq{ INSERT INTO mountedvol SELECT *, 10e10, 10e7 FROM volume WHERE vol_id = ? }, undef, 4); 73 # $dbh->do(qq{ INSERT INTO mount VALUES (?, 10e10, 10e7) }, undef, $dir4); 86 $dbh->do(qq{ INSERT INTO volume (vol_id, cab_id, name, host, path, mountpoint, allocate, available) VALUES (4, 1, 'node04', 'node04', ?, '/', FALSE, FALSE) }, undef, $dir4); 87 $dbh->do(qq{ INSERT INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, 10e10, 10e8, note FROM volume WHERE vol_id = ? }, undef, 4); 74 88 75 89 # node05: allocate = FALSE, available = TRUE 76 $dbh->do(qq{ INSERT INTO volume (vol_id, name, host, path, mountpoint, allocate, available) VALUES (5, 'node05', 'node05', ?, '/', FALSE, TRUE) }, undef, $dir5); 77 $dbh->do(qq{ INSERT INTO mountedvol SELECT *, 10e10, 10e7 FROM volume WHERE vol_id = ? }, undef, 5); 78 # $dbh->do(qq{ INSERT INTO mount VALUES (?, 10e10, 10e7) }, undef, $dir5); 90 $dbh->do(qq{ INSERT INTO volume (vol_id, cab_id, name, host, path, mountpoint, allocate, available) VALUES (5, 1, 'node05', 'node05', ?, '/', FALSE, TRUE) }, undef, $dir5); 91 $dbh->do(qq{ INSERT INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, 10e10, 10e8, note FROM volume WHERE vol_id = ? }, undef, 5); 79 92 80 93 # node06: allocate = TRUE, available = FALSE 81 $dbh->do(qq{ INSERT INTO volume (vol_id, name, host, path, mountpoint, allocate, available) VALUES (6, 'node06', 'node06', ?, '/', TRUE, FALSE) }, undef, $dir6); 82 $dbh->do(qq{ INSERT INTO mountedvol SELECT *, 10e10, 10e7 FROM volume WHERE vol_id = ? }, undef, 6); 83 # $dbh->do(qq{ INSERT INTO mount VALUES (?, 10e10, 10e7) }, undef, $dir6); 94 $dbh->do(qq{ INSERT INTO volume (vol_id, cab_id, name, host, path, mountpoint, allocate, available) VALUES (6, 1, 'node06', 'node06', ?, '/', TRUE, FALSE) }, undef, $dir6); 95 $dbh->do(qq{ INSERT INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, 10e10, 10e8, note FROM volume WHERE vol_id = ? }, undef, 6); 84 96 85 97 # node07: full 86 $dbh->do(qq{ INSERT INTO volume (vol_id, name, host, path, mountpoint, allocate, available) VALUES (7, 'node07', 'node07', ?, '/', TRUE, TRUE) }, undef, $dir7); 87 $dbh->do(qq{ INSERT INTO mountedvol SELECT *, 10e10, 10e10 FROM volume WHERE vol_id = ? }, undef, 7); 88 # $dbh->do(qq{ INSERT INTO mount VALUES (?, 10e10, 10e10) }, undef, $dir7); 98 $dbh->do(qq{ INSERT INTO volume (vol_id, cab_id, name, host, path, mountpoint, allocate, available) VALUES (7, 1, 'node07', 'node07', ?, '/', TRUE, TRUE) }, undef, $dir7); 99 $dbh->do(qq{ INSERT INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, 10e10, 10e10, note FROM volume WHERE vol_id = ? }, undef, 7); 100 101 # node08: allocate = TRUE, (cab04, site 2) 102 $dbh->do(qq{ INSERT INTO volume (vol_id, cab_id, name, host, path, mountpoint, allocate, available) VALUES (8, 4, 'node08', 'node08', ?, '/', TRUE, TRUE) }, undef, $dir8); 103 $dbh->do(qq{ INSERT INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, 10e10, 10e8, note FROM volume WHERE vol_id = ? }, undef, 8); 89 104 90 # $dbh->do(qq{ call getmountedvol() });105 # $dbh->do(qq{ call getmountedvol() }); 91 106 } 92 107 93 108 sub cleanup { 94 109 # memcached needs to be emptied between test runs 95 Cache::Memcached->new(servers => $NEB_MEMCACHED_SERVERS)->flush_all;110 Cache::Memcached->new(servers => $NEB_MEMCACHED_SERVERS)->flush_all; 96 111 # if flush_all() turns out to be useless as feared 97 112 # my $memd = Cache::Memcached->new(servers => $NEB_MEMCACHED_SERVERS); … … 106 121 # $query->finish; 107 122 123 108 124 foreach my $statement (@{ $sql->get_db_clear }) { 109 125 $dbh->do( $statement ); … … 118 134 rmtree([$dir6], 0, 1) if -e $dir6; 119 135 rmtree([$dir7], 0, 1) if -e $dir7; 136 rmtree([$dir8], 0, 1) if -e $dir8; 137 } 138 139 # function to change state of one node for tests: 140 sub switch_node_state { 141 my $self = shift; 142 143 $dbh->do(qq{ UPDATE volume set available = FALSE where name = 'node02'}); 144 $dbh->do(qq{ UPDATE mountedvol set available = FALSE where name = 'node02'}); 145 } 146 147 sub get_node_dirs { 148 my $self = shift; 149 150 return ($dir1, $dir2, $dir3, $dir4, $dir5, $dir6, $dir7, $dir8); 120 151 } 121 152 -
trunk/Nebulous-Server/t/03_server_setup.t
r24546 r41172 14 14 use Nebulous::Server; 15 15 use Test::Nebulous; 16 17 Test::Nebulous->show_setup; 18 die "test"; 16 19 17 20 Test::Nebulous->setup; -
trunk/Nebulous-Server/t/04_server_create_object.t
r24356 r41172 30 30 31 31 Test::Nebulous->setup; 32 33 32 { 34 33 # key … … 40 39 uri_scheme_ok($uri, 'file'); 41 40 42 SKIP: { 43 skip "requires xattr support", 1 unless $test_xattr; 44 is(getfattr($path, 'user.nebulous_key'), 'foo', 'user.nebulous_key xattr'); 45 } 46 } 47 48 Test::Nebulous->setup; 49 41 SKIP: { 42 skip "requires xattr support", 1 unless $test_xattr; 43 is(getfattr($path, 'user.nebulous_key'), 'foo', 'user.nebulous_key xattr'); 44 } 45 } 46 47 Test::Nebulous->setup; 50 48 { 51 49 # key … … 57 55 uri_scheme_ok($uri, 'file'); 58 56 59 SKIP: {60 skip "requires xattr support", 1 unless $test_xattr;61 is(getfattr($path, 'user.nebulous_key'), 'foo', 'user.nebulous_key xattr');62 }57 SKIP: { 58 skip "requires xattr support", 1 unless $test_xattr; 59 is(getfattr($path, 'user.nebulous_key'), 'foo', 'user.nebulous_key xattr'); 60 } 63 61 } 64 62 … … 528 526 $neb->create_object("foo", '~node07'); 529 527 }; 530 like($@, qr/node07 is not available/, "request volume thisis full");528 like($@, qr/node07 is not available/, "request volume which is full"); 531 529 532 530 Test::Nebulous->setup; … … 535 533 $neb->create_object("neb://~node07/foo"); 536 534 }; 537 like($@, qr/node07 is not available/, "request volume thisis full");535 like($@, qr/node07 is not available/, "request volume which is full"); 538 536 539 537 Test::Nebulous->setup; -
trunk/Nebulous-Server/t/05_server_replicate_object.t
r24995 r41172 8 8 use warnings FATAL => qw( all ); 9 9 10 use Test::More tests => 25;10 use Test::More tests => 43; 11 11 12 12 use lib qw( ./t ./lib ); … … 28 28 29 29 Test::Nebulous->setup; 30 31 30 { 32 31 # key … … 45 44 46 45 Test::Nebulous->setup; 47 48 46 { 49 47 # key, $volume … … 62 60 63 61 Test::Nebulous->setup; 64 65 62 { 66 63 # key, $volume is undef … … 79 76 80 77 Test::Nebulous->setup; 81 82 78 { 83 79 # key, $volume … … 147 143 } 148 144 145 # hard_volume tests: 146 147 # replication with hard_volume: 148 Test::Nebulous->setup; 149 { 150 my @nodedirs = Test::Nebulous->get_node_dirs(); 151 152 # checking on replicate_object: hard_volume as node target 153 my $uri1 = $neb->create_object("foo", "~node01"); 154 my $uri2 = $neb->replicate_object("foo", "~node02"); 155 156 my $locations = $neb->find_instances("foo"); 157 my $Nloc = @$locations; 158 159 is($Nloc, 2, "found 2 instances"); 160 161 my $loc1 = $locations->[0]; 162 my $loc2 = $locations->[1]; 163 164 like($loc1, qr/$nodedirs[0]/, "instance matches expected node"); 165 like($loc2, qr/$nodedirs[1]/, "instance matches expected node"); 166 } 167 168 # replication to unknown volume: should succeed 169 Test::Nebulous->setup; 170 { 171 my @nodedirs = Test::Nebulous->get_node_dirs(); 172 173 # checking on replicate_object, does this logic make sense? 174 my $uri1 = $neb->create_object("foo", "~node01"); 175 my $uri2 = $neb->replicate_object("foo", "dummy"); 176 177 my $locations = $neb->find_instances("foo"); 178 my $Nloc = @$locations; 179 180 is($Nloc, 2, "found 2 instances"); 181 182 my $loc1 = $locations->[0]; 183 my $loc2 = $locations->[1]; 184 185 like($loc1, qr/$nodedirs[0]/, "instance matches expected node"); 186 uri_scheme_ok($loc2, 'file'); 187 } 188 189 # replication to unknown volume with hard_volume: should fail 190 Test::Nebulous->setup; 191 eval { 192 my @nodedirs = Test::Nebulous->get_node_dirs(); 193 194 # checking on replicate_object, does this logic make sense? 195 my $uri1 = $neb->create_object("foo", "~node01"); 196 my $uri2 = $neb->replicate_object("foo", "~dummy"); 197 198 my $locations = $neb->find_instances("foo"); 199 }; 200 like($@, qr/is not a valid volume name/, "replicate to unknown node with hard_volume should fail"); 201 202 # replication to unavailable volume: should succeed 203 Test::Nebulous->setup; 204 { 205 my @nodedirs = Test::Nebulous->get_node_dirs(); 206 207 # checking on replicate_object, does this logic make sense? 208 my $uri1 = $neb->create_object("foo", "~node01"); 209 my $uri2 = $neb->replicate_object("foo", "node04"); 210 211 my $locations = $neb->find_instances("foo"); 212 my $Nloc = @$locations; 213 214 is($Nloc, 2, "found 2 instances"); 215 216 my $loc1 = $locations->[0]; 217 my $loc2 = $locations->[1]; 218 219 like($loc1, qr/$nodedirs[0]/, "instance matches expected node"); 220 uri_scheme_ok($loc2, 'file'); 221 } 222 223 # replication to unavailable volume with hard_volume: should fail 224 Test::Nebulous->setup; 225 eval { 226 my @nodedirs = Test::Nebulous->get_node_dirs(); 227 228 # checking on replicate_object, does this logic make sense? 229 my $uri1 = $neb->create_object("foo", "~node01"); 230 my $uri2 = $neb->replicate_object("foo", "~node04"); 231 232 my $locations = $neb->find_instances("foo"); 233 }; 234 like($@, qr/is not available/, "replicate to unknown node with hard_volume should fail"); 235 236 ### END hard_volume tests 237 238 ### location-aware tests (do we respect the cab_id / vol_id exclusions?) 239 240 # here are the volume definitions (Test/Nebulous.pm): 241 # name : vol_id : cab_id : site_id : xattr 242 # node01 : 1 : 1 : 1 : 0 243 # node02 : 2 : 2 : 1 : 0 244 # node03 : 3 : 3 : 2 : 0 245 # node04 : 4 : 1 : 1 : 0 246 # node05 : 5 : 1 : 1 : 0 247 # node06 : 6 : 1 : 1 : 0 248 # node07 : 7 : 1 : 1 : 0 249 # node08 : 8 : 4 : 2 : 0 250 251 # replication without volume 252 Test::Nebulous->setup; 253 { 254 my @nodedirs = Test::Nebulous->get_node_dirs(); 255 256 # checking on replicate_object: hard_volume as node target 257 my $uri1 = $neb->create_object("foo", "~node01"); 258 my $uri2 = $neb->replicate_object("foo"); 259 260 my $locations = $neb->find_instances("foo"); 261 my $Nloc = @$locations; 262 263 is($Nloc, 2, "found 2 instances"); 264 265 my $loc1 = $locations->[0]; 266 my $loc2 = $locations->[1]; 267 268 # if the volume is not explicitly specified, then the first copy 269 # should go to a different volume, cabinet, and site 270 # if first is one node01, replication should go to node03 or node08 271 # since those both have different site_id values 272 like($loc1, qr/$nodedirs[0]/, "instance matches expected node"); 273 274 my $isnode03 = $loc2 =~ m/$nodedirs[2]/; 275 my $isnode08 = $loc2 =~ m/$nodedirs[7]/; 276 ok($isnode03 || $isnode08, "instance matches expected node"); 277 } 278 279 # replication without volume 280 Test::Nebulous->setup; 281 { 282 my @nodedirs = Test::Nebulous->get_node_dirs(); 283 284 # checking on replicate_object, does this logic make sense? 285 my $uri1 = $neb->create_object("foo", "~node03"); 286 my $uri2 = $neb->replicate_object("foo"); 287 288 my $locations = $neb->find_instances("foo"); 289 my $Nloc = @$locations; 290 291 is($Nloc, 2, "found 2 instances"); 292 293 my $loc1 = $locations->[0]; 294 my $loc2 = $locations->[1]; 295 296 # if the volume is not explicitly specified, then the first copy 297 # should go to a different volume, cabinet, and site 298 # if first is one node03, replication should go to node01 or node02 299 # since those both have different site_id values 300 like($loc1, qr/$nodedirs[2]/, "instance matches expected node"); 301 302 my $isnode01 = $loc2 =~ m/$nodedirs[0]/; 303 my $isnode02 = $loc2 =~ m/$nodedirs[1]/; 304 ok($isnode01 || $isnode02, "instance matches expected node"); 305 } 306 149 307 Test::Nebulous->setup; 150 308 -
trunk/Nebulous-Server/t/08_server_find_instances.t
r24362 r41172 8 8 use warnings FATAL => qw( all ); 9 9 10 use Test::More tests => 19;10 use Test::More tests => 44; 11 11 12 12 use lib qw( ./t ./lib ); … … 22 22 ); 23 23 24 Test::Nebulous->setup; 25 24 # XXX previously, the logic was: if we request a hard volume location 25 # using ~node, then we would give an error if no data is available except on that node. 26 27 # the code has been modified so that the requested storage object is provided if possible, 28 # even if the apparently "hard" target did not exist. 29 30 Test::Nebulous->setup; 31 Test::Nebulous->cleanup; # make sure the database is reset before running any tests 32 33 # for (my $i = 0; $i < $Nloc; $i++) { 34 # my $loc = $locations->[$i]; 35 # print "location: $loc\n"; 36 #} 37 38 Test::Nebulous->setup; 26 39 { 27 40 # key … … 35 48 36 49 Test::Nebulous->setup; 37 38 50 { 39 51 # key … … 49 61 50 62 Test::Nebulous->setup; 51 52 63 { 53 64 # key, volume … … 61 72 62 73 Test::Nebulous->setup; 63 64 74 { 65 75 # key, volume … … 73 83 74 84 Test::Nebulous->setup; 75 76 85 { 77 86 # key, volume … … 85 94 86 95 Test::Nebulous->setup; 87 88 96 { 89 97 # key … … 98 106 } 99 107 100 # object exists but instance is on a different volume 101 Test::Nebulous->setup; 102 108 # request from a hard_volume returns an instance which is not on the hard volume if available 109 Test::Nebulous->setup; 103 110 eval { 104 111 # key, volume 105 112 my $uri = $neb->create_object('foo', '~node01'); 106 107 113 my $locations = $neb->find_instances('foo', '~node02'); 108 }; 109 like($@, qr/no instances on storage volume/, 'instances on a different volume'); 114 115 uri_scheme_ok($locations->[0], 'file'); 116 is($uri, $locations->[0], "URIs match"); 117 }; 118 is($@, "", "instance on different node (as hard_volume) returned"); 119 120 # request from a hard_volume returns an instance which is not on the hard volume if available 121 Test::Nebulous->setup; 122 eval { 123 # key, volume 124 my $uri = $neb->create_object('foo', '~node01'); 125 my $locations = $neb->find_instances('foo', '~node02'); 126 127 uri_scheme_ok($locations->[0], 'file'); 128 is($uri, $locations->[0], "URIs match"); 129 }; 130 is($@, "", "instance on different node (as hard_volume) returned"); 131 132 ### TESTS FOR INSTANCE ON INVALID NODE 133 diag ("TESTS FOR INSTANCE ON INVALID NODE"); 134 135 # request from a soft_volume for an instance which is on an invalid node (find_invalid = 1) [SOFT, 1] 136 Test::Nebulous->setup; 137 eval { 138 # key, volume 139 my $uri = $neb->create_object('foo', '~node02'); 140 Test::Nebulous->switch_node_state; 141 142 my $locations = $neb->find_instances('foo', 'node02', 1); 143 uri_scheme_ok($locations->[0], 'file'); 144 is($uri, $locations->[0], "URIs match"); 145 }; 146 is($@, "", "instance on invalid node (as soft_volume) returned with find_invalid = 1"); 147 148 # request from a soft_volume for an instance which is on an invalid node (find_invalid = 0) [SOFT, 0] 149 Test::Nebulous->setup; 150 eval { 151 # key, volume 152 my $uri = $neb->create_object('foo', '~node02'); 153 Test::Nebulous->switch_node_state; 154 155 my $locations = $neb->find_instances('foo', 'node02', 0); 156 }; 157 like($@, qr/database error/, "instance on invalid node (as soft_volume) not returned (find_invalid = 0)"); 158 159 # request from a hard_volume for an instance which is on an invalid node (find_instance not supplied) [SOFT, X] 160 Test::Nebulous->setup; 161 eval { 162 # key, volume 163 my $uri = $neb->create_object('foo', '~node02'); 164 Test::Nebulous->switch_node_state; 165 166 my $locations = $neb->find_instances('foo', 'node02'); 167 }; 168 like($@, qr/no instances available for key/, "instance on invalid node (as soft_volume) not returned (find_invalid not set)"); 169 170 # request from a hard_volume for an instance which is on an invalid node (find_invalid = 1) [HARD, 1] 171 Test::Nebulous->setup; 172 eval { 173 # key, volume 174 my $uri = $neb->create_object('foo', '~node02'); 175 Test::Nebulous->switch_node_state; 176 177 my $locations = $neb->find_instances('foo', '~node02', 1); 178 uri_scheme_ok($locations->[0], 'file'); 179 is($uri, $locations->[0], "URIs match"); 180 }; 181 is($@, "", "instance on invalid node (as hard_volume) returned with find_invalid = 1"); 182 183 # request from a hard_volume for an instance which is on an invalid node (find_invalid = 0) [HARD, 0] 184 Test::Nebulous->setup; 185 eval { 186 # key, volume 187 my $uri = $neb->create_object('foo', '~node02'); 188 Test::Nebulous->switch_node_state; 189 190 my $locations = $neb->find_instances('foo', '~node02', 0); 191 }; 192 like($@, qr/no instances on storage volume/, "instance on invalid node (as hard_volume) not returned (find_invalid = 0)"); 193 194 # request from a hard_volume for an instance which is on an invalid node [HARD, X] 195 Test::Nebulous->setup; 196 eval { 197 # key, volume 198 my $uri = $neb->create_object('foo', '~node02'); 199 Test::Nebulous->switch_node_state; 200 201 my $locations = $neb->find_instances('foo', '~node02'); 202 }; 203 like($@, qr/no instances on storage volume/, "instance on invalid node (as hard_volume) not returned (find_invalid not set)"); 204 205 #### TESTING the instance proximity analysis 206 Test::Nebulous->setup; 207 { 208 my @nodedirs = Test::Nebulous->get_node_dirs(); 209 210 # place 4 instances on specific nodes (hard targets works): 211 my $uri1 = $neb->create_object("foo", "~node01"); 212 my $uri2 = $neb->replicate_object("foo", "~node02"); 213 my $uri3 = $neb->replicate_object("foo", "~node03"); 214 my $uri4 = $neb->replicate_object("foo", "~node08"); 215 216 my $locations = $neb->find_instances("foo", "node01"); 217 my $Nloc = @$locations; 218 219 is($Nloc, 4, "found 4 instances"); 220 221 my $loc1 = $locations->[0]; 222 my $loc2 = $locations->[1]; 223 my $loc3 = $locations->[2]; 224 my $loc4 = $locations->[3]; 225 226 # choosing instance relative to node01 yields: 227 like($loc1, qr/$nodedirs[0]/, "node01 is closest to node01"); 228 like($loc2, qr/$nodedirs[1]/, "node02 is 2nd closest to node01"); 229 like($loc3, qr/$nodedirs[2]/, "node03 is 3rd closest to node01"); 230 like($loc4, qr/$nodedirs[7]/, "node08 is 4th closest to node01"); 231 } 232 233 #### TESTING the instance proximity analysis 234 Test::Nebulous->setup; 235 { 236 my @nodedirs = Test::Nebulous->get_node_dirs(); 237 238 # place 4 instances on specific nodes (hard targets works): 239 my $uri1 = $neb->create_object("foo", "~node01"); 240 my $uri2 = $neb->replicate_object("foo", "~node02"); 241 my $uri3 = $neb->replicate_object("foo", "~node03"); 242 my $uri4 = $neb->replicate_object("foo", "~node08"); 243 244 my $locations = $neb->find_instances("foo", "node03"); 245 my $Nloc = @$locations; 246 247 is($Nloc, 4, "found 4 instances"); 248 249 my $loc1 = $locations->[0]; # 250 my $loc2 = $locations->[1]; # 251 my $loc3 = $locations->[2]; # 252 my $loc4 = $locations->[3]; # 253 254 # choosing instance relative to node01 yields: 255 like($loc1, qr/$nodedirs[2]/, "node03 is closest to node03"); 256 like($loc2, qr/$nodedirs[7]/, "node08 is 2nd closest to node03"); 257 like($loc3, qr/$nodedirs[1]/, "node02 is 3rd closest to node03"); 258 like($loc4, qr/$nodedirs[0]/, "node08 is 4th closest to node03"); 259 } 260 261 ######## 110 262 111 263 Test::Nebulous->setup; … … 125 277 126 278 Test::Nebulous->setup; 127 128 eval { 129 $neb->find_instances();130 };131 like($@, qr/1 - 2 were expected/, "no params"); 279 eval { 280 my $locations = $neb->find_instances(); 281 }; 282 like($@, qr/1 - 3 were expected/, "no params"); 283 # note the new API expects 1-3 parameters 132 284 133 285 Test::Nebulous->setup; … … 135 287 eval { 136 288 $neb->create_object('foo'); 137 $neb->find_instances('foo', 'node01', 3); 138 }; 139 like($@, qr/1 - 2 were expected/, "too many params"); 289 $neb->find_instances('foo', 'node01', 3, 5); 290 }; 291 like($@, qr/1 - 3 were expected/, "too many params"); 292 # note the new API expects 1-3 parameters 140 293 141 294 Test::Nebulous->cleanup; -
trunk/Nebulous-Server/t/11_server_is_valid_volume_name.t
r24356 r41172 8 8 use warnings FATAL => qw( all ); 9 9 10 use Test::More tests => 3;10 use Test::More tests => 5; 11 11 12 12 use lib qw( ./t ./lib ); … … 31 31 Test::Nebulous->setup; 32 32 33 is($neb->_is_valid_volume_name('foo', 'node99'), undef, "invalid volume name"); 33 is($neb->_is_valid_volume_name('foo', 'node99'), 0, "invalid volume name"); 34 35 Test::Nebulous->setup; 36 37 # key does not need to exist (is hashed to select db server) 38 ok($neb->_is_valid_volume_name('bax', 'node01'), "valid volume name"); 39 40 Test::Nebulous->setup; 41 42 # 'any' should always be a valid name 43 ok($neb->_is_valid_volume_name('foo', 'any'), "valid volume name"); 34 44 35 45 Test::Nebulous->cleanup; -
trunk/Nebulous-Server/t/15_server_xattr.t
r24356 r41172 184 184 $neb->getxattr_object('foo', 'user.bar'); 185 185 }; 186 like($@, qr|xattr neb:///foo:user.bar does not exist|, 187 "get xattr from non-existant xattr key"); 186 like($@, qr|xattr neb:///foo:user.bar does not exist|, "get xattr from non-existant xattr key"); 188 187 189 188 Test::Nebulous->setup; -
trunk/Nebulous-Server/t/16_mounts.t
r24356 r41172 28 28 my $mounts = $neb->mounts(); 29 29 30 is(scalar @$mounts, 7, "number of rows");30 is(scalar @$mounts, 8, "number of rows"); 31 31 32 32 my %row; … … 35 35 = @{$mounts->[0]}; 36 36 37 is($row{total}, 100000000000 );38 is($row{used}, 100000000 );39 is($row{vol_id}, 1 );40 is($row{name}, "node01" );41 is($row{host}, "node01" );42 is($row{allocate}, 1 );43 is($row{available}, 1 );44 is($row{xattr}, 0 );37 is($row{total}, 100000000000, "total bytes"); 38 is($row{used}, 100000000, "used bytes"); 39 is($row{vol_id}, 1, "vol id"); 40 is($row{name}, "node01", "name"); 41 is($row{host}, "node01", "host"); 42 is($row{allocate}, 1, "is allocated"); 43 is($row{available}, 1, "is available"); 44 is($row{xattr}, 0, "has no xattr"); 45 45 46 46 # 2nd row … … 48 48 = @{$mounts->[1]}; 49 49 50 is($row{total}, 100000000000 );51 is($row{used}, 1000000000 );52 is($row{vol_id}, 2 );53 is($row{name}, "node02" );54 is($row{host}, "node02" );55 is($row{allocate}, 1 );56 is($row{available}, 1 );57 is($row{xattr}, 0 );50 is($row{total}, 100000000000, "total bytes"); 51 is($row{used}, 1000000000, "used bytes"); 52 is($row{vol_id}, 2, "vol id"); 53 is($row{name}, "node02", "name"); 54 is($row{host}, "node02", "host"); 55 is($row{allocate}, 1, "is allocated"); 56 is($row{available}, 1, "is available"); 57 is($row{xattr}, 0, "has no xattr"); 58 58 } 59 59 -
trunk/Nebulous-Server/t/18_server_chmod_object.t
r24356 r41172 38 38 is($mode, 0440, "returned mode"); 39 39 is($neb->getxattr_object($key, 'user.mode'), 0440, "xattr user.mode"); 40 41 # reset to 600 so the user can delete the file and /tmp entry 42 chmod(0600, $path); 40 43 } 41 44 … … 50 53 my $mode = $neb->chmod_object($key, 0440); 51 54 52 my $st1 = stat(URI->new($uri1)->path); 53 my $st2 = stat(URI->new($uri2)->path); 55 my $path1 = URI->new($uri1)->path; 56 my $path2 = URI->new($uri2)->path; 57 58 my $st1 = stat($path1); 59 my $st2 = stat($path2); 54 60 55 61 is($st1->mode &07777, 0440, "chmod() first instance"); … … 57 63 is($mode, 0440, "returned mode"); 58 64 is($neb->getxattr_object($key, 'user.mode'), 0440, "xattr user.mode"); 65 66 # reset to 600 so the user can delete the file and /tmp entry 67 chmod (0600, $path1); 68 chmod (0600, $path2); 59 69 } 60 70
Note:
See TracChangeset
for help on using the changeset viewer.
