From 563ed5a92a535f7afe32153f37c69e9470b5b4d1 Mon Sep 17 00:00:00 2001 From: jbjohnso Date: Thu, 1 Nov 2012 18:13:28 +0000 Subject: [PATCH] Change cache versioning strategy, track the oem byte from fru locator records git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@14204 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/ipmi.pm | 32 +++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index f20119b4d..872c3a5b4 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -19,7 +19,7 @@ use xCAT::IPMI; my %needbladeinv; use POSIX qw(ceil floor); -use Storable qw(store_fd retrieve_fd thaw freeze); +use Storable qw(nstore_fd retrieve_fd thaw freeze); use xCAT::Utils; use xCAT::TableUtils; use xCAT::ServiceNodeUtils; @@ -31,7 +31,7 @@ use HTTP::Request::Common; my $iem_support; my $vpdhash; my %allerrornodes=(); -my $immdetected=0; +my $global_sessdata; eval { require IBM::EnergyManager; @@ -94,7 +94,7 @@ my $cache_dir = "/var/cache/xcat"; use xCAT::data::ibmleds; use xCAT::data::ipmigenericevents; use xCAT::data::ipmisensorevents; -my $cache_version = 3; +my $cache_version = 4; my %sdr_caches; #store sdr cachecs in memory indexed such that identical nodes do not hit the disk multiple times #my $status_noop="XXXno-opXXX"; @@ -329,6 +329,7 @@ struct SDR => { led_id => '$', fru_type => '$', fru_subtype => '$', + fru_oem => '$', }; struct FRU => { @@ -356,6 +357,7 @@ sub decode_fru_locator { #Handle fru locator records $sdr->id_string(pack("C*",@locator[17..17+$idlen-1])); $sdr->fru_type($locator[11]); $sdr->fru_subtype($locator[12]); + $sdr->fru_oem($locator[15]); return $sdr; } @@ -2360,9 +2362,9 @@ sub add_fruhash { $fruhash = decode_spd(@{$sessdata->{currfrudata}}); } else { my $err; - $immdetected=$sessdata->{isanimm}; #pass by global, evil, but practical this time + $global_sessdata=$sessdata; #pass by global, evil, but practical this time ($err,$fruhash) = parsefru($sessdata->{currfrudata}); - $immdetected=0; #revert state of global + $global_sessdata=undef; #revert state of global if ($err) { my $fru = FRU->new(); if ($sessdata->{currfrutype} and $sessdata->{currfrutype} eq 'dimm') { @@ -2685,7 +2687,7 @@ sub parseboard { $idx+=$currsize; ($currsize,$currdata,$encode)=extractfield(\@area,$idx); } - if ($immdetected) { #we can understand more specifically some of the extra fields... + if ($global_sessdata->{isanimm}) { #we can understand more specifically some of the extra fields... $boardinf{frunum}=$boardinf{extra}->[0]->{value}; $boardinf{revision}=$boardinf{extra}->[4]->{value}; #time to process the mac field... @@ -4904,17 +4906,17 @@ sub initsdr_withrepinfo { my $fw_rev2=$sessdata->{firmware_rev2}; #TODO: beware of dynamic SDR contents - my $cache_file = "$cache_dir/sdr_$mfg_id.$prod_id.$device_id.$dev_rev.$fw_rev1.$fw_rev2.$cache_version"; + my $cache_file = "$cache_dir/sdr_$mfg_id.$prod_id.$device_id.$dev_rev.$fw_rev1.$fw_rev2"; $sessdata->{sdrcache_file} = $cache_file; if($enable_cache eq "yes") { - if ($sdr_caches{"$mfg_id.$prod_id.$device_id.$dev_rev.$fw_rev1.$fw_rev2.$cache_version"}) { - $sessdata->{sdr_hash} = $sdr_caches{"$mfg_id.$prod_id.$device_id.$dev_rev.$fw_rev1.$fw_rev2.$cache_version"}; + if ($sdr_caches{"$mfg_id.$prod_id.$device_id.$dev_rev.$fw_rev1.$fw_rev2"}) { + $sessdata->{sdr_hash} = $sdr_caches{"$mfg_id.$prod_id.$device_id.$dev_rev.$fw_rev1.$fw_rev2"}; on_bmc_connect("SUCCESS",$sessdata); #retry bmc_connect since sdr_cache is validated return; #don't proceed to slow load } else { my $rc = loadsdrcache($sessdata,$cache_file); if($rc == 0) { - $sdr_caches{"$mfg_id.$prod_id.$device_id.$dev_rev.$fw_rev1.$fw_rev2.$cache_version"} = $sessdata->{sdr_hash}; + $sdr_caches{"$mfg_id.$prod_id.$device_id.$dev_rev.$fw_rev1.$fw_rev2"} = $sessdata->{sdr_hash}; on_bmc_connect("SUCCESS",$sessdata); #retry bmc_connect since sdr_cache is validated return; #don't proceed to slow load } @@ -5008,7 +5010,7 @@ sub start_sdr_record { return; } - $sessdata->{sdr_data} = [0,0,0,$sdr_ver,$sdr_type,$sessdata->{curr_sdr_len}]; + $sessdata->{sdr_data} = [0,0,0,$sdr_ver,$sdr_type,$sessdata->{curr_sdr_len}]; #seems that an extra zero is prepended to allow other code to do 1 based counting out of laziness to match our index to the spec indicated index $sessdata->{sdr_offset} = 5; my $offset=5; #why duplicate? to make for shorter typing my $numbytes = 22; @@ -5572,9 +5574,12 @@ sub storsdrcache { flock($fh,LOCK_EX) || return(1); + my $hdr; + $hdr->{xcat_sdrcacheversion} = $cache_version; + nstore_fd($hdr,$fh); foreach $key (keys %{$sessdata->{sdr_hash}}) { my $r = $sessdata->{sdr_hash}->{$key}; - store_fd($r,$fh); + nstore_fd($r,$fh); } close($fh); @@ -5592,6 +5597,9 @@ sub loadsdrcache { if(!open($fh,"<$file")) { return(1); } + $r = retrieve_fd($fh); + unless ($r) { close($fh); return 1; } + unless ($r->{xcat_sdrcacheversion} and $r->{xcat_sdrcacheversion} == $cache_version) { close($fh); return 1; } #version mismatch flock($fh,LOCK_SH) || return(1);