mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-25 00:15:43 +00:00 
			
		
		
		
	-Fix sf bug 2845378, stale cache data being returned in noderange expansions
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4057 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -397,6 +397,7 @@ sub extnoderange { #An extended noderange function.  Needed as the more straight | ||||
|         $return->{intersectinggroups}=[sort keys %grouphash]; | ||||
|     } | ||||
|     $retaincache=0; | ||||
|     $nodelist->_clear_cache(); | ||||
|     undef ($nodelist); | ||||
|     @allnodeset=(); | ||||
|     return $return; | ||||
| @@ -523,6 +524,7 @@ sub noderange { | ||||
|         $recurselevel--; | ||||
|     } else { | ||||
|         unless ($retaincache) { | ||||
|             $nodelist->_clear_cache(); | ||||
|             undef $nodelist; | ||||
|             @allnodeset=(); | ||||
|         } | ||||
|   | ||||
| @@ -216,6 +216,8 @@ sub handle_dbc_request { | ||||
|          return $opentables{$tablename}->{$autocommit}->_set_use_cache(@args); | ||||
|     } elsif ($functionname eq '_build_cache') { | ||||
|          return $opentables{$tablename}->{$autocommit}->_build_cache(@args); | ||||
|     } elsif ($functionname eq '_clear_cache') { | ||||
|          return $opentables{$tablename}->{$autocommit}->_clear_cache(@args); | ||||
|     } else { | ||||
|         die "undefined function $functionname"; | ||||
|     } | ||||
| @@ -1367,16 +1369,32 @@ sub getNodesAttribs { | ||||
|         my @nodeentries=$self->getNodeAttribs($_,\@attribs); | ||||
|         $rethash->{$_} = \@nodeentries; #$self->getNodeAttribs($_,\@attribs); | ||||
|     } | ||||
|     $self->_clear_cache; | ||||
|     $self->{_use_cache} = 0; | ||||
|     $self->{nodelist}->_clear_cache; | ||||
|     $self->{nodelist}->{_use_cache} = 0; | ||||
|     return $rethash; | ||||
| } | ||||
|  | ||||
| sub _clear_cache { #PRIVATE FUNCTION TO EXPIRE CACHED DATA EXPLICITLY | ||||
|     #This is no longer sufficient to do at destructor time, as Table objects actually live an indeterminite amount of time now | ||||
|     my $self = shift; | ||||
|     if ($dbworkerpid) { | ||||
|         return dbc_call($self,'_clear_cache',$_); | ||||
|     } | ||||
|     $self->{_use_cache}=0; # Signal slow operation to any in-flight operations that may fail with empty cache | ||||
|     undef $self->{_tablecache}; | ||||
|     undef $self->{_nodecache}; | ||||
| } | ||||
|  | ||||
| sub _build_cache { #PRIVATE FUNCTION, PLEASE DON'T CALL DIRECTLY | ||||
|     my $self = shift; | ||||
|     if ($dbworkerpid) { | ||||
|         return dbc_call($self,'_build_cache',@_); | ||||
|     } | ||||
|     my $oldusecache = $self->{_use_cache}; #save previous 'use_cache' setting | ||||
|     $self->{_use_cache} = 0; #This function must disable cache  | ||||
|                             #to function | ||||
|     my $attriblist = shift; | ||||
|     unless (grep /^node$/,@$attriblist) { | ||||
|         push @$attriblist,'node'; | ||||
| @@ -1390,6 +1408,7 @@ sub _build_cache { #PRIVATE FUNCTION, PLEASE DON'T CALL DIRECTLY | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     $self->{_use_cache} = $oldusecache; #Restore setting to previous value | ||||
|     $self->{_cachestamp} = time; | ||||
| } | ||||
| #-------------------------------------------------------------------------- | ||||
|   | ||||
		Reference in New Issue
	
	Block a user