Changeset 39926 for trunk/Nebulous-Server
- Timestamp:
- Jan 6, 2017, 11:30:10 AM (10 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
- 1 copied
-
. (modified) (1 prop)
-
Nebulous-Server/Build.PL (modified) (1 diff)
-
Nebulous-Server/bin/neb-aliasadd (copied) (copied from branches/czw_branch/20160809/Nebulous-Server/bin/neb-aliasadd )
-
Nebulous-Server/bin/neb-cabadd (modified) (5 diffs)
-
Nebulous-Server/lib/Nebulous/Server.pm (modified) (7 diffs)
-
Nebulous-Server/lib/Nebulous/Server/SQL.pm (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property svn:mergeinfo
set to
/branches/czw_branch/20160809 merged eligible
-
Property svn:mergeinfo
set to
-
trunk/Nebulous-Server/Build.PL
r39663 r39926 48 48 bin/neb-voladd 49 49 bin/neb-voladm 50 bin/neb-aliasadd 50 51 bin/neb-insedit 51 52 bin/neb-host -
trunk/Nebulous-Server/bin/neb-cabadd
r26292 r39926 19 19 use Pod::Usage qw( pod2usage ); 20 20 21 my ($db, $dbhost, $dbuser, $dbpass, $cname, $location );21 my ($db, $dbhost, $dbuser, $dbpass, $cname, $location, $site_id, $update, $cab_id); 22 22 23 23 $db = $ENV{'NEB_DB'} unless $db; … … 33 33 'cname|n=s' => \$cname, 34 34 'location|l=s' => \$location, 35 'site_id|s=s' => \$site_id, 36 'cab_id=s' => \$cab_id, 37 'update|u' => \$update, 35 38 ) || pod2usage( 2 ); 36 39 37 40 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 38 pod2usage( -msg => "Required options: --db --user --pass --cname ", -exitval => 2 )39 unless $db && $dbuser && $dbpass && $cname ;41 pod2usage( -msg => "Required options: --db --user --pass --cname --site_id", -exitval => 2 ) 42 unless $db && $dbuser && $dbpass && $cname && $site_id; 40 43 41 44 my $dbh = DBI->connect( … … 52 55 my $sql = Nebulous::Server::SQL->new(); 53 56 54 print "Adding cabinet..."; 55 56 my $query = $dbh->prepare( $sql->new_cabinet ); 57 $query->execute( $cname, $location); 58 59 print " OK\n"; 60 57 if (defined($update)) { 58 unless ($cname && $location && $site_id && $cab_id) { 59 pod2usage( -msg => "Required options for update: --db --user --pass --cname --site_id --location --cab_id", -exitval => 2 ); 60 } 61 print "Updating cabinet..."; 62 my $query = $dbh->prepare( $sql->update_cabinet ); 63 # Check query: 64 # UPDATE cabinet SET 65 # location = ?, 66 # name = ?, 67 # site_id = ? 68 # WHERE cab_id = ? 69 70 $query->execute( $location, $cname, $site_id, $cab_id ); 71 72 print "OK\n"; 73 74 } 75 else { 76 print "Adding cabinet..."; 77 78 my $query = $dbh->prepare( $sql->new_cabinet ); 79 $query->execute( $cname, $location, $site_id); 80 81 print " OK\n"; 82 } 61 83 __END__ 62 84 … … 69 91 =head1 SYNOPSIS 70 92 71 neb-cabadd --cname <cabinet name> --location <cabinet location> 93 neb-cabadd --cname <cabinet name> --location <cabinet location> --site_id <site_id> 72 94 [--db <database>] [--user <username>] [--pass <password>] [--host <hostname] 73 95 … … 89 111 90 112 Description of the location of the cabinet. 113 114 =item * --site_id <site_id> 115 116 Numerical value of the location's site. Default = 0. 91 117 92 118 =item * --db|-d <database> -
trunk/Nebulous-Server/lib/Nebulous/Server.pm
r31370 r39926 1753 1753 } 1754 1754 1755 sub find_instances 1755 sub find_instances_old 1756 1756 { 1757 1757 my $self = shift; … … 1820 1820 # ext_id, name, available 1821 1821 my $rows = $query->execute($key->path, $vol_name, 1); 1822 unless ($rows > 0) { 1823 $query->finish; 1824 die("no instances on storage volume or volume is not avaiable for key: $key volume: $vol_name"); 1825 } 1826 } else { 1827 $query = $db->prepare_cached( $sql->get_object_instances ); 1828 my $rows; 1829 # ext_id, available 1830 if (defined($find_invalid)) { 1831 $rows = $query->execute($key->path, 0); 1832 } 1833 else { 1834 $rows = $query->execute($key->path, 1); 1835 } 1836 unless ($rows > 0) { 1837 $query->finish; 1838 die("no instances available for key: $key"); 1839 } 1840 } 1841 1842 while (my $row = $query->fetchrow_hashref) { 1843 my $instance = $row->{ 'uri' }; 1844 push @locations, $instance if $instance; 1845 } 1846 }; 1847 if ($@) { 1848 $db->rollback; 1849 # handle soft volumes 1850 if (defined $vol_name and not defined $key->hard_volume) { 1851 $log->debug("retrying with 'any' volume"); 1852 return $self->find_instances($key->path, 'any'); 1853 } 1854 $log->logdie("database error: $@"); 1855 } 1856 1857 # XXX remove this? 1858 $log->logdie("no instances found") unless (scalar @locations); 1859 1860 $log->debug("found: @locations"); 1861 1862 $log->debug("leaving"); 1863 1864 return \@locations; 1865 } 1866 1867 #sub find_instances_by_proximity 1868 sub find_instances 1869 { 1870 my $self = shift; 1871 1872 my $log = $self->log; 1873 $log->debug("entered - @_"); 1874 1875 my ($key, $vol_name, $find_invalid) = validate_pos(@_, 1876 { 1877 type => SCALAR, 1878 callbacks => { 1879 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 1880 }, 1881 }, 1882 { 1883 type => SCALAR|UNDEF, 1884 # callbacks => { 1885 # # check that the volume name requested is valid 1886 # 'is valid volume name' => sub { 1887 # return 1 if not defined $_[0]; 1888 # $self->_is_valid_volume_name($_[0]) 1889 # }, 1890 # }, 1891 optional => 1, 1892 }, 1893 { 1894 # find_invalid 1895 type => SCALAR|UNDEF, 1896 optional => 1, 1897 }, 1898 ); 1899 1900 my $sql = $self->sql; 1901 1902 # unless ($key) { 1903 # $log->warn("key was undefined after validate_pos(), trying again..."); 1904 # return $self->find_instances(@_); 1905 # } 1906 1907 # vol_name overrides the key implied volume 1908 my ($h_vol_id, $h_cab_id, $h_site_id); 1909 eval { 1910 $key = parse_neb_key($key, $vol_name); 1911 }; 1912 $log->logdie("$@") if $@; 1913 $vol_name = $key->volume; 1914 1915 my $db = $self->db($key); 1916 1917 # Convert possible alias to real volume. 1918 if (defined $vol_name) { 1919 my ($tmp_vol_id, $tmp_name, $tmp_host, $tmp_path); 1920 eval { 1921 my $query = $db->prepare_cached( $sql->get_volume_by_alias ); 1922 $query->execute( $vol_name ); 1923 ($tmp_vol_id, $tmp_name, $tmp_host, $tmp_path) = $query->fetchrow_array; 1924 $query->finish; 1925 }; 1926 $log->logdie("$@") if $@; 1927 # $log->warn("CZW: find_instance: deref alias: $vol_name => $tmp_vol_id $tmp_name $tmp_host $tmp_path (key vol: $key" . $key->volume . ")"); 1928 if (defined $tmp_vol_id and defined $tmp_name and defined $tmp_host and defined $tmp_path) { 1929 if ($tmp_name ne $vol_name) { 1930 $vol_name = $tmp_name; 1931 # $key->volume = $vol_name; 1932 } 1933 } 1934 1935 1936 } 1937 1938 # the key's volume can't be validiated on input for this method so we have 1939 # to check it after parsing the key 1940 if (defined $vol_name 1941 and not $self->_is_valid_volume_name($key, $vol_name)) { 1942 if ($key->hard_volume) { 1943 $log->logdie("$vol_name is not a valid volume name"); 1944 } else { 1945 $log->warn( "$vol_name is not a known volume name" ); 1946 $vol_name = undef; 1947 } 1948 } 1949 1950 # Get the host volume information encoded in the vol_name. 1951 # I am unhappy that we have three different if(defined($vol_name)) entries, but I don't see a better way. 1952 # my ($h_vol_id, $h_cab_id, $h_site_id); 1953 if (defined $vol_name) { 1954 eval { 1955 my $query = $db->prepare_cached( $sql->get_site_info_by_name ); 1956 $query->execute( $vol_name ); 1957 ($h_vol_id, $h_cab_id, $h_site_id) = $query->fetchrow_array; 1958 $query->finish; 1959 }; 1960 $log->logdie("$@") if $@; 1961 1962 unless(defined $h_vol_id and defined $h_cab_id and defined $h_site_id) { 1963 $vol_name = undef; 1964 } 1965 } 1966 1967 my @locations; 1968 eval { 1969 my $query; 1970 if ($vol_name && $h_vol_id && $h_cab_id && $h_site_id) { 1971 $query = $db->prepare_cached( $sql->get_object_instances_by_proximity ); 1972 # ext_id, name, available 1973 # 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); 1822 1975 unless ($rows > 0) { 1823 1976 $query->finish; … … 2341 2494 my $db = $self->db($key); 2342 2495 2343 my ($vol_id, $vol_host, $vol_path, $xattr, $forbidden_cabinet );2496 my ($vol_id, $vol_host, $vol_path, $xattr, $forbidden_cabinet, $forbidden_site); 2344 2497 eval { 2345 2498 my $rows; … … 2352 2505 } 2353 2506 if ($rows == 1) { 2354 ($forbidden_cabinet ) = $query->fetchrow_array;2507 ($forbidden_cabinet, $forbidden_site) = $query->fetchrow_array; 2355 2508 unless (defined($forbidden_cabinet)) { 2356 2509 $forbidden_cabinet = 0; 2510 } 2511 unless (defined($forbidden_site)) { 2512 $forbidden_site = 0; 2357 2513 } 2358 2514 $query->finish; … … 2360 2516 else { 2361 2517 $forbidden_cabinet = 0; 2518 $forbidden_site = 0; 2362 2519 $query->finish; 2363 2520 } … … 2366 2523 $query = $db->prepare_cached( $sql->get_replication_volume_for_ext_id ); 2367 2524 # ext_id, %free, avaiable, allocate 2368 $rows = $query->execute($key->path, $max_used_space, 1, 1, $forbidden_cabinet, $ topfew_count);2525 $rows = $query->execute($key->path, $max_used_space, 1, 1, $forbidden_cabinet, $forbidden_site, $topfew_count); 2369 2526 # XXX destinguish between non-existant and unaviable 2370 2527 unless ($rows > 0) { 2371 2528 $query->finish; 2372 die("can't find a suitable storage volume to replicate $key to"); 2529 # CZW: 2016-08-23 This wasn't right. If we don't get an entry, we may have been too strict. 2530 # I'm not fully convinced this is complete, as we may want to back out the cabinet criterion as well. 2531 # In any case, I don't think we're generally in the situation where replication can't find a host. 2532 $rows = $query->execute($key->path, $max_used_space, 1, 1, $forbidden_cabinet, 0, $topfew_count); 2533 unless ($rows > 0) { 2534 die("can't find a suitable storage volume to replicate $key to"); 2535 } 2373 2536 } 2374 2537 # when matching by name we shouldn't ever match more than once … … 2490 2653 $log->logdie("database error: $@") if $@; 2491 2654 2655 # $log->warn("CZW: $vol_id $vol_path for >>$vol_name<<"); 2492 2656 if (defined $vol_id and defined $vol_path) { 2493 2657 $log->debug( "found volume name $vol_name" ); 2494 2658 $log->debug( "leaving" ); 2659 # $log->warn("CZW: $vol_id $vol_path for >>$vol_name<<"); 2495 2660 return 1; 2496 2661 } -
trunk/Nebulous-Server/lib/Nebulous/Server/SQL.pm
r34764 r39926 250 250 AND mountedvol.available = ? 251 251 }, 252 get_object_instances_by_proximity => qq{ 253 SELECT 254 storage_object.so_id, 255 uri, 256 mountedvol.available, 257 vol_id, 258 cab_id, 259 (ABS(vol_id - ?) + 20 * ABS(cab_id - ?) + 100 * ABS(site_id - ?)) AS vol_idx 260 FROM storage_object 261 JOIN instance 262 USING (so_id) 263 JOIN mountedvol 264 USING(vol_id) 265 JOIN volume 266 USING(vol_id) 267 JOIN cabinet 268 USING(cab_id) 269 WHERE ext_id = ? 270 AND mountedvol.available = ? 271 ORDER BY vol_idx ASC 272 }, 252 273 get_object_instances_by_vol_name => qq{ 253 274 SELECT … … 301 322 get_cabinets_for_ext_id => qq{ 302 323 SELECT DISTINCT 303 cab_id324 volume.cab_id, site_id 304 325 FROM instance 305 JOIN volume ON instance.vol_id = volume.vol_id 326 JOIN volume ON (instance.vol_id = volume.vol_id) 327 JOIN cabinet ON (volume.cab_id = cabinet.cab_id) 306 328 JOIN storage_object USING(so_id) 307 329 WHERE ext_id = ? … … 317 339 FROM mountedvol AS m 318 340 JOIN volume AS v USING(vol_id) 341 JOIN cabinet AS c USING(cab_id) 319 342 LEFT JOIN ( 320 343 SELECT … … 336 359 AND m.available = ? 337 360 AND m.allocate = ? 338 AND m.xattr = 0361 -- AND m.xattr = 0 339 362 AND ( (v.cab_id IS NULL) || 340 363 (v.cab_id != ?) ) 364 AND ( (c.site_id IS NULL) || 365 (c.site_id != ?) ) 341 366 ORDER BY free DESC 342 367 LIMIT ?) as topfew … … 366 391 }, 367 392 new_cabinet => qq{ 368 INSERT INTO cabinet (name, location, cab_id) 369 VALUES (?, ?, NULL) 393 INSERT INTO cabinet (name, location, site_id, cab_id) 394 VALUES (?, ?, ?, NULL) 395 }, 396 update_cabinet => qq{ 397 UPDATE cabinet SET 398 location = ?, 399 name = ?, 400 site_id = ? 401 WHERE cab_id = ? 370 402 }, 371 403 new_volume => qq{ 372 404 INSERT INTO volume (name, host, path, allocate, available, xattr, mountpoint, cab_id, note) 373 405 VALUES (?, ?, ?, TRUE, TRUE, FALSE, ?, NULL, ?) 406 }, 407 new_alias => qq{ 408 INSERT INTO aliasvol (alias_id, alias, name, vol_id) 409 VALUES (NULL, ?, ?, ?) 410 }, 411 update_alias => qq{ 412 UPDATE alias SET 413 vol_id = ?, 414 name = ? 415 WHERE alias_id = ? 416 AND alias = ? 374 417 }, 375 418 get_volume_by_name => qq{ … … 377 420 FROM volume 378 421 WHERE name = ? 422 }, 423 get_volume_by_alias => qq{ 424 SELECT vol_id, name, host, path 425 FROM aliasvol 426 JOIN volume USING(vol_id,name) 427 WHERE alias = ? 428 }, 429 get_site_info_by_name => qq{ 430 SELECT vol_id, cab_id, site_id 431 FROM volume 432 JOIN cabinet USING(cab_id) 433 WHERE volume.name = ? 379 434 }, 380 435 get_volumes => qq{ … … 676 731 cab_id INT NOT NULL AUTO_INCREMENT, 677 732 name VARCHAR(255) NOT NULL, 733 site_id INT NOT NULL DEFAULT 0, 678 734 location VARCHAR(255), 679 735 PRIMARY KEY(cab_id), 680 736 UNIQUE KEY(name), 737 KEY (site_id), 681 738 KEY (location) 682 739 ) ENGINE=innodb DEFAULT CHARSET=latin1; … … 735 792 ### 736 793 794 CREATE TABLE aliasvol ( 795 alias_id INT NOT NULL AUTO_INCREMENT, 796 alias VARCHAR(255) NOT NULL, 797 name VARCHAR(255) NOT NULL, 798 vol_id INT NOT NULL, 799 PRIMARY KEY(alias_id), 800 KEY(alias), 801 KEY(name), 802 FOREIGN KEY(vol_id) REFERENCES volume(vol_id) 803 ) ENGINE=innodb DEFAULT CHARSET=latin1; 804 805 ### 806 737 807 CREATE TABLE instance ( 738 808 ins_id BIGINT NOT NULL AUTO_INCREMENT,
Note:
See TracChangeset
for help on using the changeset viewer.
