From 0fd7daa7f991f997b8969d9fbd70468077c7c3eb Mon Sep 17 00:00:00 2001 From: Pete V Date: Wed, 5 Mar 2008 12:15:28 -0800 Subject: [PATCH] work in progress, process bucket numbering ourselves in perl --- src/crush/crushmap.pl | 72 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/src/crush/crushmap.pl b/src/crush/crushmap.pl index 60e69c92cf6c4..2d38af3dc8907 100755 --- a/src/crush/crushmap.pl +++ b/src/crush/crushmap.pl @@ -9,6 +9,13 @@ tie my %conf, "Tie::DxHash"; my $wrap = new CrushWrapper::CrushWrapper; +my $alg_types = { + uniform => 1, + list => 2, + tree => 3, + straw => 4 +}; + $wrap->create(); %conf = Config::General::ParseConfig( -ConfigFile => "sample.txt", -Tie => "Tie::DxHash" ); @@ -19,42 +26,85 @@ my @ritems; #@nums = (1, -4, 11, 17, 1, -92, -15, 48); #print "length: " . scalar(@nums) ."\n"; +# find lowest id number used +sub get_lowest { + my $item = shift; + return unless ref $item; + + my $lowest = 0; + + if (ref $item eq 'HASH') { + $lowest = $item->{'id'} if $lowest > $item->{'id'}; + foreach my $key (keys %{$item}) { + #next if grep { $key eq $_ } qw(type rule); + + my $sublowest = get_lowest($item->{$key}); + $lowest = $sublowest if $lowest > $sublowest; + } + } elsif (ref $item eq 'ARRAY') { + foreach my $element (@{$item}) { + my $sublowest = get_lowest($element); + $lowest = $sublowest if $lowest > $sublowest; + } + } + + return $lowest; +} + +my $lowest = get_lowest($arr); +#print "lowest is $lowest\n"; + foreach my $type (keys %{$arr->{'type'}}) { $wrap->set_type_name($arr->{'type'}->{$type}->{'id'},$type); - print $wrap->get_type_name($arr->{'type'}->{$type}->{'id'}) ."\n"; + #print $wrap->get_type_name($arr->{'type'}->{$type}->{'id'}) ."\n"; } -#first argument must be zero for auto bucket_id +# first argument must be zero for auto bucket_id my $i=0; foreach my $osd (keys %{$arr->{'osd'}}) { # bucket_id, alg, type, size, items, weights - $ritems[$i] = $wrap->add_bucket(0,4,0,0,[],[]); + my $bucket_id = $osd->{'id'}; + $bucket_id = --$lowest if !$bucket_id; + + $ritems[$i] = $wrap->add_bucket($bucket_id, $alg_types->{'straw'}, 0, 0, [], []); $wrap->set_item_name($ritems[$i], $osd); - print "bucket_id: $ritems[$i]\n"; - print $wrap->get_item_name($ritems[$i]) ."\n"; + #print "bucket_id: $ritems[$i]\n"; + #print $wrap->get_item_name($ritems[$i]) ."\n"; $i++; } foreach my $type (keys %{$arr->{'type'}}) { next if ($type eq 'osd'); + print "doing type $type\n"; foreach my $bucket (keys %{$arr->{$type}}) { - print "bucket: $bucket\n"; - #check for algorithm type + #print "bucket: $bucket\n"; + # check for algorithm type my @item_ids; foreach my $item (keys %{$arr->{$type}->{'item'}}) { push @item_ids, $wrap->get_item_id($item); } - $ritems[$i] = $wrap->add_bucket(0,4,0,scalar(@item_ids),\@item_ids,[]); + my $bucket_id = $arr->{$type}->{$bucket}->{'id'}; + $bucket_id = --$lowest if !$bucket_id; + + + + + my $alg = $alg_types->{$arr->{$type}->{$bucket}->{'alg'}}; + $alg = $alg_types->{'straw'} if !$alg; + + print "alg is: $alg\n"; + + $ritems[$i] = $wrap->add_bucket($bucket_id, $alg, 0, scalar(@item_ids), \@item_ids, []); $wrap->set_item_name($ritems[$i],$bucket); - print $wrap->get_item_name($ritems[$i]) ."\n"; + #print $wrap->get_item_name($ritems[$i]) ."\n"; $i++; } } -print Dumper @ritems; -print Dumper $arr; +#print Dumper @ritems; +#print Dumper $arr; -- 2.39.5