diff --git a/lib/Perlbal/Pool.pm b/lib/Perlbal/Pool.pm index a6d88a1..df634da 100644 --- a/lib/Perlbal/Pool.pm +++ b/lib/Perlbal/Pool.pm @@ -32,6 +32,7 @@ use fields ( 'nodefile.lastmod', # unix time nodefile was last modified 'nodefile.lastcheck', # unix time nodefile was last stated 'nodefile.checking', # boolean; if true AIO is stating the file for us + 'waiting_services', # a hash of services waiting for this pool ); sub new { @@ -49,6 +50,7 @@ sub new { $self->{nodefile} = undef; $self->{balance_method} = BM_RANDOM; + $self->{waiting_services} = {}; return $self; } @@ -214,6 +216,18 @@ sub add { $self->{node_used}->{"$ip:$port"} = 0; push @{$self->{nodes}}, [ $ip, $port ]; $self->{node_count} = scalar(@{$self->{nodes}}); + + if ($self->{waiting_services}) { + foreach my $service (values %{$self->{waiting_services}}) { + next unless $service; + delete $self->{waiting_services}->{$service->{name}}; + if ($service->{waiting_client_count} >0) { + Perlbal::log('info', "Pool $self->{name} was added much needed node. Now has " . $self->node_count . " nodes"); + $service->spawn_backends; + last; # We only have enough for one. + } + } + } } sub remove { diff --git a/lib/Perlbal/Service.pm b/lib/Perlbal/Service.pm index 3e87dd8..2e8457e 100644 --- a/lib/Perlbal/Service.pm +++ b/lib/Perlbal/Service.pm @@ -1442,6 +1442,14 @@ sub spawn_backends { # can't create more than this, assuming one pending connect per node my $max_creatable = $pool ? ($self->{pool}->node_count - $self->{pending_connect_count}) : 1; + + # If we cannot create any backends, register this service as waiting for nodes + if ($pool and $max_creatable <= 0 and $to_create > 0) { + $pool->{waiting_services}->{$self->{name}} = $self; + } else { + delete $pool->{waiting_services}->{$self->{name}}; + } + $to_create = $max_creatable if $to_create > $max_creatable; # cap number of attempted connects at once