Subversion Repositories havirt

Rev

Rev 42 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 42 Rev 44
Line 29... Line 29...
29
# Added a lot of 'verbose' print lines, and modified for new flag structure
29
# Added a lot of 'verbose' print lines, and modified for new flag structure
30
#
30
#
31
# v1.3.0 20250511 RWR
31
# v1.3.0 20250511 RWR
32
# Added balance function. If called, will attempt to balance a cluster so that the variance is lower than balance_max_variance 
32
# Added balance function. If called, will attempt to balance a cluster so that the variance is lower than balance_max_variance 
33
# (new entry in config file). --dryrun will simply display the commands sent, and --nodryrun will execute them.
33
# (new entry in config file). --dryrun will simply display the commands sent, and --nodryrun will execute them.
-
 
34
#
-
 
35
# v1.3.0 20250514 RWR
-
 
36
# Modified so it will not issue error codes if we have done iterations but not perfectly in balance. Also, added message
-
 
37
# 'already in balance' if it is as good as we can get it.
-
 
38
# 
34
 
39
 
35
 
40
 
36
 
41
 
37
package cluster;
42
package cluster;
38
 
43
 
Line 40... Line 45...
40
use strict;  
45
use strict;  
41
 
46
 
42
# define the version number
47
# define the version number
43
# see https://metacpan.org/pod/release/JPEACOCK/version-0.97/lib/version.pod
48
# see https://metacpan.org/pod/release/JPEACOCK/version-0.97/lib/version.pod
44
use version;
49
use version;
45
our $VERSION = version->declare("1.3.0");
50
our $VERSION = version->declare("1.3.1");
46
 
51
 
47
 
52
 
48
use Data::Dumper;
53
use Data::Dumper;
49
 
54
 
50
use Exporter;
55
use Exporter;
Line 351... Line 356...
351
}
356
}
352
 
357
 
353
# simulates performing migrations. Simply moves entries from $from to $to in $main::statusDB->{'nodePopulation'}
358
# simulates performing migrations. Simply moves entries from $from to $to in $main::statusDB->{'nodePopulation'}
354
sub doActions {
359
sub doActions {
355
   my $actions = shift;
360
   my $actions = shift;
356
   my $return;
361
   my $return = '';
357
   for ( my $i = 0; $i < @$actions; $i++ ) {
362
   for ( my $i = 0; $i < @$actions; $i++ ) {
358
      my ($domain, $source, $target, $size ) = split( "\t", $actions->[$i] );
363
      my ($domain, $source, $target, $size ) = split( "\t", $actions->[$i] );
359
      $return .= &main::migrate( $domain, $target, $source );
364
      $return .= &main::migrate( $domain, $target, $source );
360
      delete $main::statusDB->{'nodePopulation'}->{$source}->{'running'}->{$domain};
365
      delete $main::statusDB->{'nodePopulation'}->{$source}->{'running'}->{$domain};
361
      $main::statusDB->{'nodePopulation'}->{$target}->{'running'}->{$domain} = time;
366
      $main::statusDB->{'nodePopulation'}->{$target}->{'running'}->{$domain} = time;
Line 369... Line 374...
369
# of it (see https://en.wikipedia.org/wiki/Standard_deviation). If that is
374
# of it (see https://en.wikipedia.org/wiki/Standard_deviation). If that is
370
# over about a 10, we move things around, if possible, then check our variance
375
# over about a 10, we move things around, if possible, then check our variance
371
# again.
376
# again.
372
sub balance {
377
sub balance {
373
   &main::readDB();
378
   &main::readDB();
374
   my $return;
379
   my $return = '';
375
   # get the current cluster status
380
   # get the current cluster status
376
   my $cluster = &getClusterStats();
381
   my $cluster = &getClusterStats();
377
   #die Dumper( $cluster ) . "\n";
382
   #die Dumper( $cluster ) . "\n";
378
   # show user what it looks like at first
383
   # show user what it looks like at first
379
   print "=== Starting Status ===\n\n" . &showBalanceReport( $cluster) unless $main::config->{'flags'}->{'quiet'};
384
   print "=== Starting Status ===\n\n" . &showBalanceReport( $cluster) unless $main::config->{'flags'}->{'quiet'};
Line 382... Line 387...
382
   my $iterations = defined $main::config->{ 'balance_max_iterations'} && $main::config->{ 'balance_max_iterations'} ? $main::config->{ 'balance_max_iterations'} : 10;
387
   my $iterations = defined $main::config->{ 'balance_max_iterations'} && $main::config->{ 'balance_max_iterations'} ? $main::config->{ 'balance_max_iterations'} : 10;
383
   $main::config->{ 'balance_max_variance'} = 1.1 unless defined $main::config->{ 'balance_max_variance'};
388
   $main::config->{ 'balance_max_variance'} = 1.1 unless defined $main::config->{ 'balance_max_variance'};
384
   # continue until our variance is where we want it, or we have tried too many times.
389
   # continue until our variance is where we want it, or we have tried too many times.
385
   while ( $iterations-- && $cluster->{'cluster'}->{'variance'} > $main::config->{ 'balance_max_variance'} ) {
390
   while ( $iterations-- && $cluster->{'cluster'}->{'variance'} > $main::config->{ 'balance_max_variance'} ) {
386
      my $actions = &moveThings( $cluster );
391
      my $actions = &moveThings( $cluster );
387
      $return .= &doActions( $actions );
392
      if ( my $output = &doActions( $actions ) ) {
-
 
393
         $return .= $output;
-
 
394
      } else {
-
 
395
         last;
388
      
396
      }
389
      #print Dumper( $actions ) . "\n"; die;
397
      #print Dumper( $actions ) . "\n"; die;
390
      # rerun stats
398
      # rerun stats
391
      $cluster = &getClusterStats();
399
      $cluster = &getClusterStats();
392
      print &showBalanceReport( $cluster) if $main::config->{'flags'}->{'verbose'} > 1;
400
      print &showBalanceReport( $cluster) if $main::config->{'flags'}->{'verbose'} > 1;
393
   }
401
   }
394
   print "=== Ending Status ===\n\n" . &showBalanceReport( $cluster) unless $main::config->{'flags'}->{'quiet'};
402
   print "=== Ending Status ===\n\n" . &showBalanceReport( $cluster) unless $main::config->{'flags'}->{'quiet'};
395
   return $return;
403
   return $return ? $return : "Already Balanced: No actions to take\n";
396
} # balance
404
} # balance
397
 
405
 
398
# finds node which needs to lose ($from) and gain ($to) the most. Then, goes through $from and finds the largest
406
# finds node which needs to lose ($from) and gain ($to) the most. Then, goes through $from and finds the largest
399
# domain which will fit on $to until exhausted.
407
# domain which will fit on $to until exhausted.
400
# as each domain is found, appends to $actions (array pointer). The format of each entry is a tab separated
408
# as each domain is found, appends to $actions (array pointer). The format of each entry is a tab separated