Changeset 39662 for branches/czw_branch/20160809/Nebulous-Server
- Timestamp:
- Aug 30, 2016, 1:38:49 PM (10 years ago)
- Location:
- branches/czw_branch/20160809/Nebulous-Server
- Files:
-
- 1 added
- 3 edited
-
bin/neb-aliasadd (added)
-
bin/neb-cabadd (modified) (5 diffs)
-
lib/Nebulous/Server.pm (modified) (5 diffs)
-
lib/Nebulous/Server/SQL.pm (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/czw_branch/20160809/Nebulous-Server/bin/neb-cabadd
r26292 r39662 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); 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 'update|u' => \$update, 35 37 ) || pod2usage( 2 ); 36 38 37 39 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 ;40 pod2usage( -msg => "Required options: --db --user --pass --cname --site_id", -exitval => 2 ) 41 unless $db && $dbuser && $dbpass && $cname && $site_id; 40 42 41 43 my $dbh = DBI->connect( … … 52 54 my $sql = Nebulous::Server::SQL->new(); 53 55 54 print "Adding cabinet..."; 55 56 my $query = $dbh->prepare( $sql->new_cabinet ); 57 $query->execute( $cname, $location); 58 59 print " OK\n"; 60 56 if (defined($update)) { 57 unless ($cname && $location && $site_id) { 58 pod2usage( -msg => "Required options for update: --db --user --pass --cname --site_id --location", -exitval => 2 ); 59 } 60 print "Updating cabinet..."; 61 my $query = $dbh->prepare( $sql->update_cabinet ); 62 # Check query: 63 # UPDATE cabinet SET 64 # location = ?, 65 # name = ?, 66 # site_id = ? 67 # WHERE cab_id = ? 68 69 $query->execute( $location, $cname, $site_id, $cab_id ); 70 71 print "OK\n"; 72 73 } 74 else { 75 print "Adding cabinet..."; 76 77 my $query = $dbh->prepare( $sql->new_cabinet ); 78 $query->execute( $cname, $location, $site_id); 79 80 print " OK\n"; 81 } 61 82 __END__ 62 83 … … 69 90 =head1 SYNOPSIS 70 91 71 neb-cabadd --cname <cabinet name> --location <cabinet location> 92 neb-cabadd --cname <cabinet name> --location <cabinet location> --site_id <site_id> 72 93 [--db <database>] [--user <username>] [--pass <password>] [--host <hostname] 73 94 … … 89 110 90 111 Description of the location of the cabinet. 112 113 =item * --site_id <site_id> 114 115 Numerical value of the location's site. Default = 0. 91 116 92 117 =item * --db|-d <database> -
branches/czw_branch/20160809/Nebulous-Server/lib/Nebulous/Server.pm
r31370 r39662 1865 1865 } 1866 1866 1867 sub find_instances_by_proximity 1868 { 1869 my $self = shift; 1870 1871 my $log = $self->log; 1872 $log->debug("entered - @_"); 1873 1874 my ($key, $vol_name, $find_invalid) = validate_pos(@_, 1875 { 1876 type => SCALAR, 1877 callbacks => { 1878 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 1879 }, 1880 }, 1881 { 1882 type => SCALAR|UNDEF, 1883 # callbacks => { 1884 # # check that the volume name requested is valid 1885 # 'is valid volume name' => sub { 1886 # return 1 if not defined $_[0]; 1887 # $self->_is_valid_volume_name($_[0]) 1888 # }, 1889 # }, 1890 optional => 1, 1891 }, 1892 { 1893 # find_invalid 1894 type => SCALAR|UNDEF, 1895 optional => 1, 1896 }, 1897 ); 1898 1899 my $sql = $self->sql; 1900 1901 # unless ($key) { 1902 # $log->warn("key was undefined after validate_pos(), trying again..."); 1903 # return $self->find_instances(@_); 1904 # } 1905 1906 # vol_name overrides the key implied volume 1907 my ($h_vol_id, $h_cab_id, $h_site_id); 1908 eval { 1909 $key = parse_neb_key($key, $vol_name); 1910 }; 1911 $log->logdie("$@") if $@; 1912 $vol_name = $key->volume; 1913 1914 my $db = $self->db($key); 1915 1916 # Convert possible alias to real volume. 1917 if (defined $vol_name) { 1918 my ($tmp_vol_id, $tmp_name, $tmp_host, $tmp_path); 1919 eval { 1920 my $query = $db->prepare_cached( $sql->get_volume_by_alias ); 1921 $query->execute( $vol_name ); 1922 ($tmp_vol_id, $tmp_name, $tmp_host, $tmp_path) = $query->fetchrow_array; 1923 $query->finish; 1924 }; 1925 $log->logdie("$@") if $@; 1926 1927 if (defined $tmp_vol_id and defined $tmp_name and defined $tmp_host and defined $tmp_path) { 1928 if ($tmp_name ne $vol_name) { 1929 $vol_name = $tmp_name; 1930 } 1931 } 1932 } 1933 1934 # the key's volume can't be validiated on input for this method so we have 1935 # to check it after parsing the key 1936 if (defined $vol_name 1937 and not $self->_is_valid_volume_name($key, $key->volume)) { 1938 if ($key->hard_volume) { 1939 $log->logdie("$vol_name is not a valid volume name"); 1940 } else { 1941 $log->warn( "$vol_name is not a known volume name" ); 1942 $vol_name = undef; 1943 } 1944 } 1945 1946 # Get the host volume information encoded in the vol_name. 1947 # I am unhappy that we have three different if(defined($vol_name)) entries, but I don't see a better way. 1948 my ($h_vol_id, $h_cab_id, $h_site_id); 1949 if (defined $vol_name) { 1950 eval { 1951 my $query = $db->prepare_cached( $sql->get_site_info_by_name ); 1952 $query->execute( $vol_name ); 1953 ($h_vol_id, $h_cab_id, $h_site_id) = $query->fetchrow_array; 1954 $query->finish; 1955 }; 1956 $log->logdie("$@") if $@; 1957 1958 unless(defined $h_vol_id and defined $h_cab_id and defined $h_site_id) { 1959 $vol_name = undef; 1960 } 1961 } 1962 1963 my @locations; 1964 eval { 1965 my $query; 1966 if ($vol_name && $h_vol_id && $h_cab_id && $h_site_id) { 1967 $query = $db->prepare_cached( $sql->get_object_instances_by_proximity ); 1968 # ext_id, name, available 1969 # host_vol_id host_cab_id host_site_id ext_id available 1970 my $rows = $query->execute($h_vol_id, $h_cab_id, $h_site_id, $key->path, 1); 1971 unless ($rows > 0) { 1972 $query->finish; 1973 die("no instances on storage volume or volume is not avaiable for key: $key volume: $vol_name"); 1974 } 1975 } else { 1976 $query = $db->prepare_cached( $sql->get_object_instances ); 1977 my $rows; 1978 # ext_id, available 1979 if (defined($find_invalid)) { 1980 $rows = $query->execute($key->path, 0); 1981 } 1982 else { 1983 $rows = $query->execute($key->path, 1); 1984 } 1985 unless ($rows > 0) { 1986 $query->finish; 1987 die("no instances available for key: $key"); 1988 } 1989 } 1990 1991 while (my $row = $query->fetchrow_hashref) { 1992 my $instance = $row->{ 'uri' }; 1993 push @locations, $instance if $instance; 1994 } 1995 }; 1996 if ($@) { 1997 $db->rollback; 1998 # handle soft volumes 1999 if (defined $vol_name and not defined $key->hard_volume) { 2000 $log->debug("retrying with 'any' volume"); 2001 return $self->find_instances($key->path, 'any'); 2002 } 2003 $log->logdie("database error: $@"); 2004 } 2005 2006 # XXX remove this? 2007 $log->logdie("no instances found") unless (scalar @locations); 2008 2009 $log->debug("found: @locations"); 2010 2011 $log->debug("leaving"); 2012 2013 return \@locations; 2014 } 2015 1867 2016 sub find_instances_for_cull 1868 2017 { … … 2341 2490 my $db = $self->db($key); 2342 2491 2343 my ($vol_id, $vol_host, $vol_path, $xattr, $forbidden_cabinet );2492 my ($vol_id, $vol_host, $vol_path, $xattr, $forbidden_cabinet, $forbidden_site); 2344 2493 eval { 2345 2494 my $rows; … … 2352 2501 } 2353 2502 if ($rows == 1) { 2354 ($forbidden_cabinet ) = $query->fetchrow_array;2503 ($forbidden_cabinet, $forbidden_site) = $query->fetchrow_array; 2355 2504 unless (defined($forbidden_cabinet)) { 2356 2505 $forbidden_cabinet = 0; 2506 } 2507 unless (defined($forbidden_site)) { 2508 $forbidden_site = 0; 2357 2509 } 2358 2510 $query->finish; … … 2360 2512 else { 2361 2513 $forbidden_cabinet = 0; 2514 $forbidden_site = 0; 2362 2515 $query->finish; 2363 2516 } … … 2366 2519 $query = $db->prepare_cached( $sql->get_replication_volume_for_ext_id ); 2367 2520 # ext_id, %free, avaiable, allocate 2368 $rows = $query->execute($key->path, $max_used_space, 1, 1, $forbidden_cabinet, $ topfew_count);2521 $rows = $query->execute($key->path, $max_used_space, 1, 1, $forbidden_cabinet, $forbidden_site, $topfew_count); 2369 2522 # XXX destinguish between non-existant and unaviable 2370 2523 unless ($rows > 0) { 2371 2524 $query->finish; 2372 die("can't find a suitable storage volume to replicate $key to"); 2525 # CZW: 2016-08-23 This wasn't right. If we don't get an entry, we may have been too strict. 2526 # I'm not fully convinced this is complete, as we may want to back out the cabinet criterion as well. 2527 # In any case, I don't think we're generally in the situation where replication can't find a host. 2528 $rows = $query->execute($key->path, $max_used_space, 1, 1, $forbidden_cabinet, 0, $topfew_count); 2529 unless ($rows > 0) { 2530 die("can't find a suitable storage volume to replicate $key to"); 2531 } 2373 2532 } 2374 2533 # when matching by name we shouldn't ever match more than once -
branches/czw_branch/20160809/Nebulous-Server/lib/Nebulous/Server/SQL.pm
r34764 r39662 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_id 324 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{ … … 373 405 VALUES (?, ?, ?, TRUE, TRUE, FALSE, ?, NULL, ?) 374 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 = ? 417 }, 375 418 get_volume_by_name => qq{ 376 419 SELECT vol_id, name, host, path 420 FROM volume 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 377 431 FROM volume 378 432 WHERE name = ? … … 676 730 cab_id INT NOT NULL AUTO_INCREMENT, 677 731 name VARCHAR(255) NOT NULL, 732 site_id INT NOT NULL DEFAULT 0, 678 733 location VARCHAR(255), 679 734 PRIMARY KEY(cab_id), 680 735 UNIQUE KEY(name), 736 KEY (site_id), 681 737 KEY (location) 682 738 ) ENGINE=innodb DEFAULT CHARSET=latin1; … … 735 791 ### 736 792 793 CREATE TABLE aliasvol ( 794 alias_id INT NOT NULL AUTO_INCREMENT, 795 alias VARCHAR(255) NOT NULL, 796 name VARCHAR(255) NOT NULL, 797 vol_id INT NOT NULL, 798 PRIMARY KEY(alias_id), 799 KEY(alias), 800 KEY(name), 801 FOREIGN KEY(vol_id) REFERENCES volume(vol_id) 802 ) ENGINE=innodb DEFAULT CHARSET=latin1; 803 804 ### 805 737 806 CREATE TABLE instance ( 738 807 ins_id BIGINT NOT NULL AUTO_INCREMENT,
Note:
See TracChangeset
for help on using the changeset viewer.
