Changeset 18

Show
Ignore:
Timestamp:
08/25/09 21:25:23 (5 years ago)
Author:
jesus
Message:

make it work on Solaris and fix up to more recent schema from Robert

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/bin/corneactl

    r9 r18  
    1 #!/usr/bin/perl 
     1#!/usr/bin/env perl 
    22use strict; 
    33 
     
    1111use Carp; 
    1212use Cornea::Config; 
     13use Socket; 
    1314use Switch; 
    1415 
     
    2425  } 
    2526  case 'update-node' { 
     27    my $ip = Cornea::Utils::my_ip(); 
    2628    my $fqdn = shift; 
    2729    my $location = shift; 
     30    if(defined $fqdn) { 
     31      # Adding a dot forces it to resolve outside search domains 
     32      my @addr = gethostbyname("$fqdn."); 
     33      die "fqdn '$fqdn' does not map to $ip\n" 
     34        unless eval { $ip eq inet_ntoa($addr[4]); }; 
     35    } 
    2836    my $rt = Cornea::RecallTable->new(); 
    2937    my ($total, $used) = Cornea::Utils::fsinfo($conf->get('Storage::base')."/."); 
     
    3240      if ($min =~ /^(\d+)\s*([GBKMT])/i); 
    3341    my $state = (($total - $used) < $min) ? 'closed' : 'open'; 
    34     $rt->updateNode($fqdn, { state => $state, 
    35                              total_storage => $total, 
    36                              used_storage => $used, 
    37                              location => $location, 
    38                            } ); 
     42    $rt->updateNode($ip, { fqdn => $fqdn, 
     43                           state => $state, 
     44                           total_storage => $total, 
     45                           used_storage => $used, 
     46                           location => $location, 
     47                         } ); 
    3948  } 
    4049  else { 
  • trunk/etc/cornea.conf

    r6 r18  
    1 DB::dsn = [ dsn1 dsn2 ] 
     1DB::dsn = [ dbi:Pg:dbname=cornea;host=cornea-db1 dbi:Pg:dbname=cornea;host=cornea-db2 ] 
    22DB::user = cornea 
    3 DB::pass = nsdfkjnwr 
     3DB::pass = cornea 
    44 
    55Storage::path = /c 
  • trunk/perl/lib/Cornea/RecallTable.pm

    r9 r18  
    4343  my $tried = 0; 
    4444  die 'bad parameters' unless UNIVERSAL::ISA($snl, 'Cornea::StorageNodeList'); 
    45  again: 
    46   eval { 
    47     my $sth = $self->{dbh}->prepare("select storeAsset(?,?,?,?)"); 
    48     $sth->execute($serviceId, $assetId, $repId, $snl); 
     45  my $snl_arr = '{' . join(',', map { $_->storeagenodeid() } 
     46                                    ($snl->items())) . '}';  
     47 again: 
     48  eval { 
     49    my $sth = $self->{dbh}->prepare("select make_asset(?,?,?,?::int[])"); 
     50    $sth->execute($serviceId, $assetId, $repId, $snl_arr); 
    4951    $sth->finish(); 
    5052  }; 
     
    5961  my $self = shift; 
    6062  my ($serviceId, $assetId, $repId) = @_; 
    61   my $sth = $self->{dbh}->prepare("select findAsset(?,?,?)"); 
     63  my $sth = $self->{dbh}->prepare("select get_asset_location(?,?,?)"); 
    6264  my $tried = 0; 
    6365  my $C; 
     
    8688  eval { 
    8789    $snl = Cornea::StorageNodeList->new(); 
    88     my $sth = $self->{dbh}->prepare("select * from getCorneaNodes(?)"); 
     90    my $sth = $self->{dbh}->prepare("select * from get_storage_nodes_by_state(?)"); 
    8991    $sth->execute($type); 
    9092    while(my $row = $sth->fetchrow_hashref()) { 
     
    100102} 
    101103 
     104sub _2pc_add_storage { 
     105  my $ip = shift; 
     106  my $attr = shift; 
     107  my $storage_node_id; 
     108  my $config = Cornea::Config->new(); 
     109  my $dsns = $config->get_list("DB::dsn"); 
     110  my @dbh = map { 
     111    my $dbh = DBI->connect($_, 
     112                 $config->get("DB::user"), 
     113                 $config->get("DB::pass"), 
     114                 { PrintError => 0, RaiseError => 1, AutoCommit => 1 } 
     115                ); 
     116    $dbh->begin_work(); 
     117    $dbh; 
     118  } @$dsns; 
     119  eval { 
     120    foreach (@dbh) { 
     121      eval { 
     122        my $sth = $_->prepare("select set_storage_node(?,?,?,?,?,?,?)"); 
     123        $sth->execute($attr->{state}, 
     124                      $attr->{total_storage}, $attr->{used_storage}, 
     125                      $attr->{location}, $attr->{fqdn}, $ip, $storage_node_id); 
     126        my ($returned_storade_node_id) = $sth->fetchrow(); 
     127        $storage_node_id ||= $returned_storade_node_id; 
     128        $sth->finish(); 
     129        die "Storage node trickery! (this should never happen).\n" 
     130          if($storage_node_id != $returned_storade_node_id); 
     131      }; 
     132      if ($@) { 
     133        die "location must be specified for first-time update\n" 
     134          if $@ =~ /null value in column "location"/; 
     135        die $@ if $@; 
     136      } 
     137    } 
     138    foreach (@dbh) { $_->do("prepare transaction 'cornea_node'"); } 
     139    foreach (@dbh) { $_->do("commit prepared 'cornea_node'"); } 
     140  }; 
     141  if ($@) { 
     142    my $real_error = $@; 
     143    $storage_node_id = undef; 
     144    eval { foreach (@dbh) { $_->do("rollback prepared 'cornea_node'"); } }; 
     145    die $real_error; 
     146  } 
     147  foreach (@dbh) { $_->disconnect; } 
     148  die $@ unless($storage_node_id); 
     149  return $storage_node_id; 
     150} 
    102151sub updateNode { 
    103152  my $self = shift; 
    104   my $fqdn = shift; 
     153  my $ip = shift; 
    105154  my $attr = shift; 
     155  my $config = Cornea::Config->new(); 
    106156  die "bad state" 
    107157    unless $attr->{state} =~ /^(?:open|closed|offline|decommissioned)$/; 
     
    112162    unless !defined($attr->{location}) or 
    113163           $attr->{location} =~ /^[^\/]+(?:\/[^\/]+){4}$/; 
    114  
    115   my $tried = 0; 
    116  again: 
    117   eval { 
    118     my $sth = $self->{dbh}->prepare("select storeCorneaNode(?,?,?,?,?)"); 
    119     $sth->execute($attr->{state}, 
    120                   $attr->{total_storage}, $attr->{used_storage}, 
    121                   $attr->{location}, $fqdn); 
    122     $sth->finish(); 
    123   }; 
    124   if ($@) { 
    125     die "location must be specified for first-time update\n" 
    126       if $@ =~ /null value in column "location"/; 
    127     unless ($tried++) { $self->__reconnect();  goto again; } 
    128     die $@ if $@; 
     164  die "fqdn must not be blank" 
     165    unless !defined($attr->{fqdn}) or length($attr->{fqdn}); 
     166 
     167  if(defined($attr->{location}) || defined($attr->{fqdn})) { 
     168    return return _2pc_add_storage($ip, $attr); 
     169  } 
     170  my $dsns = $config->get_list("DB::dsn"); 
     171  foreach (@$dsns) { 
     172    my $dbh = DBI->connect($_, 
     173                 $config->get("DB::user"), 
     174                 $config->get("DB::pass"), 
     175                 { PrintError => 0, RaiseError => 1, AutoCommit => 1 } 
     176                ); 
     177    my $tried = 0; 
     178   again: 
     179    eval { 
     180      my $sth = $self->{dbh}->prepare("select set_storage_node(?,?,?,?,?,?,?)"); 
     181      $sth->execute($attr->{state}, 
     182                    $attr->{total_storage}, $attr->{used_storage}, 
     183                    $attr->{location}, $attr->{fqdn}, $ip, undef); 
     184      $sth->finish(); 
     185    }; 
     186    if ($@) { 
     187      unless ($tried++) { $self->__reconnect();  goto again; } 
     188      print STDERR $@; 
     189    } 
    129190  } 
    130191  return 0; 
     
    138199 again: 
    139200  eval { 
    140     my $sth = $self->{dbh}->prepare("select * from getRepInfo(?,?)"); 
     201    my $sth = $self->{dbh}->prepare("select * from get_representation(?,?)"); 
    141202    $sth->execute($serviceId, $repId); 
    142203    $row = $sth->fetchrow_hashref(); 
     
    158219  eval { 
    159220    @deps = (); 
    160     my $sth = $self->{dbh}->prepare("select * from getRepInfoDependents(?,?)"); 
     221    my $sth = $self->{dbh}->prepare("select * from get_representation_dependents(?,?)"); 
    161222    $sth->execute($serviceId, $repId); 
    162223    while(my $row = $sth->fetchrow_hashref()) { 
  • trunk/perl/lib/Cornea/Utils.pm

    r9 r18  
    33use strict; 
    44use Carp; 
     5use Socket; 
    56use Switch; 
     7use POSIX qw/uname/; 
    68require "sys/syscall.ph"; 
     9 
     10sub my_ip { 
     11    my @uname = POSIX::uname(); 
     12    my @addr = gethostbyname($uname[1]); 
     13    my $name = gethostbyaddr($addr[4], AF_INET); 
     14    die unless ($name eq $uname[1]); 
     15    return inet_ntoa($addr[4]); 
     16} 
    717 
    818sub shuffle { 
     
    5666      my $bavail = unpack64(substr($buf, 24, 8)); 
    5767      my $files = unpack64(substr($buf, 32, 8)); 
    58       my $ffree = unpack64(substr($buf, 80, 8)); 
     68      my $ffree = unpack64(substr($buf, 40, 8)); 
    5969      my $bfactor = $bsize / 1024; 
     70      return int($blocks * $bfactor), int(($blocks - $bavail) * $bfactor); 
     71    } 
     72    case 'solaris' { 
     73      my $buf = '\0' x 4096; 
     74      syscall(&SYS_statvfs, $path, $buf) == 0 or die "$!"; 
     75      my $fbasetype = unpack "Z16", substr($buf, 72, 16); 
     76      die "Unsupported fs '$fbasetype' on solaris\n" 
     77        unless ($fbasetype eq 'zfs'); 
     78      my $bsize = unpack64(substr($buf, 0, 8)); 
     79      my $frsize = unpack64(substr($buf, 8, 8)); 
     80      my $blocks = unpack64(substr($buf, 16, 8)); 
     81      my $bfree = unpack64(substr($buf, 24, 8)); 
     82      my $bavail = unpack64(substr($buf, 32, 8)); 
     83      my $files = unpack64(substr($buf, 40, 8)); 
     84      my $ffree = unpack64(substr($buf, 48, 8)); 
     85      my $favail = unpack64(substr($buf, 56, 8)); 
     86      my $fsid = unpack64(substr($buf, 64, 8)); 
     87      my $bfactor = $frsize / 1024; 
    6088      return int($blocks * $bfactor), int(($blocks - $bavail) * $bfactor); 
    6189    }