--- loncom/lonnet/perl/lonnet.pm 2011/08/01 22:13:49 1.1123 +++ loncom/lonnet/perl/lonnet.pm 2011/08/09 00:54:48 1.1127 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.1123 2011/08/01 22:13:49 raeburn Exp $ +# $Id: lonnet.pm,v 1.1127 2011/08/09 00:54:48 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -308,40 +308,48 @@ sub get_server_homeID { sub get_remote_globals { my ($lonhost,$whathash,$ignore_cache) = @_; - my (%returnhash,%whatneeded); - if (ref($whathash) eq 'ARRAY') { + my ($result,%returnhash,%whatneeded); + if (ref($whathash) eq 'HASH') { foreach my $what (sort(keys(%{$whathash}))) { - my $type = $whathash->{$what}; my $hashid = $lonhost.'-'.$what; - my ($result,$cached); + my ($response,$cached); unless ($ignore_cache) { - ($result,$cached)=&is_cached_new('lonnetglobal',$hashid); - $returnhash{$what} = $result; + ($response,$cached)=&is_cached_new('lonnetglobal',$hashid); } if (defined($cached)) { - $returnhash{$what} = $result; + $returnhash{$what} = $response; } else { - $whatneeded{$what} = $type; + $whatneeded{$what} = 1; } } - if (keys(%whatneeded) > 0) { + if (keys(%whatneeded) == 0) { + $result = 'ok'; + } else { my $requested = &freeze_escape(\%whatneeded); my $rep=&reply('readlonnetglobal:'.$requested,$lonhost); - unless (($rep=~/^refused/) || ($rep=~/^rejected/) || ($rep eq 'con_lost')) { + if (($rep=~/^(refused|rejected|error)/) || ($rep eq 'con_lost') || + ($rep eq 'unknown_cmd')) { + $result = $rep; + } else { + $result = 'ok'; my @pairs=split(/\&/,$rep); - if ($rep !~ /^error/) { - foreach my $item (@pairs) { - my ($key,$value)=split(/=/,$item,2); - my $what = &unescape($key); - my $hashid = $lonhost.'-'.$what; - $returnhash{$what}=&thaw_unescape($value); - &do_cache_new('lonnetglobal',$hashid,$returnhash{$what},600); - } + foreach my $item (@pairs) { + my ($key,$value)=split(/=/,$item,2); + my $what = &unescape($key); + my $hashid = $lonhost.'-'.$what; + $returnhash{$what}=&thaw_unescape($value); + &do_cache_new('lonnetglobal',$hashid,$returnhash{$what},600); } } } } - return %returnhash; + return ($result,\%returnhash); +} + +sub remote_devalidate_cache { + my ($lonhost,$name,$id) = @_; + my $response = &reply('devalidatecache',&escape($name).':'.&escape($id),$lonhost); + return $response; } # -------------------------------------------------- Non-critical communication @@ -1134,43 +1142,80 @@ sub spare_can_host { sub this_host_spares { my ($dom) = @_; - my $cachetime = 60*60*24; + my ($dom_in_use,$lonhost_in_use,$result); my @hosts = ¤t_machine_ids(); foreach my $lonhost (@hosts) { if (&host_domain($lonhost) eq $dom) { - my ($result,$cached)=&is_cached_new('spares',$dom); - if (defined($cached)) { - return $result; - } else { - my %domconfig = - &Apache::lonnet::get_dom('configuration',['usersessions'],$dom); - if (ref($domconfig{'usersessions'}) eq 'HASH') { - if (ref($domconfig{'usersessions'}{'spares'}) eq 'HASH') { - if (ref($domconfig{'usersessions'}{'spares'}{$lonhost}) eq 'HASH') { - return &do_cache_new('spares',$dom,$domconfig{'usersessions'}{'spares'}{$lonhost},$cachetime); - } - } - } - } + $dom_in_use = $dom; + $lonhost_in_use = $lonhost; last; } } - my $serverhomedom = &host_domain($perlvar{'lonHostID'}); - my ($result,$cached)=&is_cached_new('spares',$serverhomedom); + if ($dom_in_use ne '') { + $result = &spares_for_offload($dom_in_use,$lonhost_in_use); + } + if (ref($result) ne 'HASH') { + $lonhost_in_use = $perlvar{'lonHostID'}; + $dom_in_use = &host_domain($lonhost_in_use); + $result = &spares_for_offload($dom_in_use,$lonhost_in_use); + if (ref($result) ne 'HASH') { + $result = \%spareid; + } + } + return $result; +} + +sub spares_for_offload { + my ($dom_in_use,$lonhost_in_use) = @_; + my ($result,$cached)=&is_cached_new('spares',$dom_in_use); if (defined($cached)) { return $result; } else { - my %homedomconfig = - &Apache::lonnet::get_dom('configuration',['usersessions'],$serverhomedom); - if (ref($homedomconfig{'usersessions'}) eq 'HASH') { - if (ref($homedomconfig{'usersessions'}{'spares'}) eq 'HASH') { - if (ref($homedomconfig{'usersessions'}{'spares'}{$perlvar{'lonHostID'}}) eq 'HASH') { - return &do_cache_new('spares',$serverhomedom,$homedomconfig{'usersessions'}{'spares'}{$perlvar{'lonHostID'}},$cachetime); + my $cachetime = 60*60*24; + my %domconfig = + &Apache::lonnet::get_dom('configuration',['usersessions'],$dom_in_use); + if (ref($domconfig{'usersessions'}) eq 'HASH') { + if (ref($domconfig{'usersessions'}{'spares'}) eq 'HASH') { + if (ref($domconfig{'usersessions'}{'spares'}{$lonhost_in_use}) eq 'HASH') { + return &do_cache_new('spares',$dom_in_use,$domconfig{'usersessions'}{'spares'}{$lonhost_in_use},$cachetime); } } } } - return \%spareid; + return; +} + +sub internet_dom_servers { + my ($dom) = @_; + my (%uniqservers,%servers); + my $primaryserver = &hostname(&domain($dom,'primary')); + my @machinedoms = &machine_domains($primaryserver); + foreach my $mdom (@machinedoms) { + my %currservers = %servers; + my %server = &get_servers($mdom); + %servers = (%currservers,%server); + } + my %by_hostname; + foreach my $id (keys(%servers)) { + push(@{$by_hostname{$servers{$id}}},$id); + } + foreach my $hostname (sort(keys(%by_hostname))) { + if (@{$by_hostname{$hostname}} > 1) { + my $match = 0; + foreach my $id (@{$by_hostname{$hostname}}) { + if (&host_domain($id) eq $dom) { + $uniqservers{$id} = $hostname; + $match = 1; + } + } + unless ($match) { + $uniqservers{$by_hostname{$hostname}[0]} = $hostname; + } + } else { + $uniqservers{$by_hostname{$hostname}[0]} = $hostname; + } + } + return %uniqservers; } # ---------------------- Find the homebase for a user from domain's lib servers