X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d6f163ed99c6ae234c551bb3ecd23c7af8610c8f..e94f86dc97746ef21c641aadb56112481d1e66f5:/services/nodemanager/arvnodeman/daemon.py diff --git a/services/nodemanager/arvnodeman/daemon.py b/services/nodemanager/arvnodeman/daemon.py index 64bb177de5..243d3bfaa4 100644 --- a/services/nodemanager/arvnodeman/daemon.py +++ b/services/nodemanager/arvnodeman/daemon.py @@ -222,39 +222,44 @@ class NodeManagerDaemonActor(actor_class): up += sum(1 for i in (self.booted, self.cloud_nodes.nodes) for c in i.itervalues() - if size is None or (c.cloud_node.size and c.cloud_node.size.id == size.id)) + if size is None or c.cloud_node.size.id == size.id) return up def _total_price(self): cost = 0 - cost += sum(c.cloud_size.get().price + cost += sum(self.server_calculator.find_size(c.cloud_size.get().id).price for c in self.booting.itervalues()) - cost += sum(c.cloud_node.size.price + cost += sum(self.server_calculator.find_size(c.cloud_node.size.id).price for i in (self.booted, self.cloud_nodes.nodes) - for c in i.itervalues() - if c.cloud_node.size) + for c in i.itervalues()) return cost def _nodes_busy(self, size): return sum(1 for busy in pykka.get_all(rec.actor.in_state('busy') for rec in self.cloud_nodes.nodes.itervalues() - if (rec.cloud_node.size and rec.cloud_node.size.id == size.id)) + if rec.cloud_node.size.id == size.id) if busy) def _nodes_missing(self, size): return sum(1 for arv_node in pykka.get_all(rec.actor.arvados_node for rec in self.cloud_nodes.nodes.itervalues() - if rec.cloud_node.size and rec.cloud_node.size.id == size.id and rec.actor.cloud_node.get().id not in self.shutdowns) + if rec.cloud_node.size.id == size.id and rec.actor.cloud_node.get().id not in self.shutdowns) if arv_node and cnode.arvados_node_missing(arv_node, self.node_stale_after)) def _size_wishlist(self, size): return sum(1 for c in self.last_wishlist if c.id == size.id) def _size_shutdowns(self, size): - return sum(1 for c in self.shutdowns.itervalues() - if c.cloud_node.get().size.id == size.id) + sh = 0 + for c in self.shutdowns.itervalues(): + try: + if c.cloud_node.get().size.id == size.id: + sh += 1 + except pykka.ActorDeadError: + pass + return sh def _nodes_wanted(self, size): total_up_count = self._nodes_up(None) @@ -271,6 +276,8 @@ class NodeManagerDaemonActor(actor_class): self._nodes_busy(size) + self._nodes_missing(size)) + self._logger.debug("%s: idle nodes %i, wishlist size %i", size.name, up_count, self._size_wishlist(size)) + wanted = self._size_wishlist(size) - up_count if wanted > 0 and self.max_total_price and ((total_price + (size.price*wanted)) > self.max_total_price): can_boot = int((self.max_total_price - total_price) / size.price) @@ -290,8 +297,7 @@ class NodeManagerDaemonActor(actor_class): def update_server_wishlist(self, wishlist): self._update_poll_time('server_wishlist') self.last_wishlist = wishlist - for sz in reversed(self.server_calculator.cloud_sizes): - size = sz.real + for size in reversed(self.server_calculator.cloud_sizes): nodes_wanted = self._nodes_wanted(size) if nodes_wanted > 0: self._later.start_node(size)