Skip to content

Commit a86c5a8

Browse files
author
Mich
committed
Reuse node ids
Squashed commit of the following: commit 21b0a49 Author: Mich <fmlheureux@datacratic.com> Date: Mon Jun 29 09:36:39 2015 -0400 Covers count = 0 case + test commit 1b62eda Author: Mich <fmlheureux@datacratic.com> Date: Mon Jun 29 09:31:50 2015 -0400 Rm debug print leftover commit eaba0c2 Author: Mich <fmlheureux@datacratic.com> Date: Fri Jun 26 16:29:26 2015 -0400 Reuse node ids
1 parent 54b895b commit a86c5a8

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

starcluster/cluster.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,20 +1213,29 @@ def create_nodes(self, aliases, image_id=None, instance_type=None,
12131213
log.info(str(resv), extra=dict(__raw__=True))
12141214
return resvs
12151215

1216-
def _get_next_node_num(self):
1216+
@classmethod
1217+
def get_free_ids_among_nodes(cls, count, nodes):
1218+
result = []
1219+
if count == 0:
1220+
return result
1221+
ids = [int(re.search('node(\d{3})', n.alias).group(1)) for n in nodes]
1222+
remaining = count
1223+
for i in xrange(1, 1000):
1224+
if i not in ids:
1225+
result.append(i)
1226+
remaining -= 1
1227+
if remaining == 0:
1228+
break
1229+
assert len(result) == count
1230+
return result
1231+
1232+
def _get_free_node_nums(self, count):
1233+
"""
1234+
Returns unused node ids
1235+
"""
12171236
nodes = self._nodes_in_states(['pending', 'running'])
12181237
nodes = filter(lambda x: not x.is_master(), nodes)
1219-
highest = 0
1220-
for n in nodes:
1221-
match = re.search('node(\d{3})', n.alias)
1222-
try:
1223-
_possible_highest = match.group(1)
1224-
except AttributeError:
1225-
continue
1226-
highest = max(int(_possible_highest), highest)
1227-
next = int(highest) + 1
1228-
log.debug("Highest node number is %d. choosing %d." % (highest, next))
1229-
return next
1238+
return self.get_free_ids_among_nodes(count, nodes)
12301239

12311240
def add_node(self, alias=None, no_create=False, image_id=None,
12321241
instance_type=None, zone=None, placement_group=None,
@@ -1256,8 +1265,7 @@ def add_nodes(self, num_nodes, aliases=None, image_id=None,
12561265
running_pending = self._nodes_in_states(['pending', 'running'])
12571266
aliases = aliases or []
12581267
if not aliases:
1259-
next_node_id = self._get_next_node_num()
1260-
for i in range(next_node_id, next_node_id + num_nodes):
1268+
for i in self._get_free_node_nums(num_nodes):
12611269
alias = self._make_alias(i)
12621270
aliases.append(alias)
12631271
assert len(aliases) == num_nodes
@@ -2098,7 +2106,8 @@ def _recover_duplicate_aliases(self):
20982106
if node.alias != alias:
20992107
continue
21002108
if node.private_ip_address != ip:
2101-
new_alias = self._make_alias(self._get_next_node_num())
2109+
new_alias = self._make_alias(
2110+
self._get_free_node_nums(1)[0])
21022111
log.info("Renaming {} from {} to {}"
21032112
.format(node, node.alias, new_alias))
21042113
node.rename(new_alias)

starcluster/tests/test_generic.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
from starcluster import tests
2222
from starcluster.node import Node
23+
from starcluster.cluster import Cluster
2324

2425

2526
class FooNode(Node):
@@ -51,3 +52,22 @@ def test_filter_etc_hosts_lines(self):
5152
assert len(rejected) == 2
5253
assert rejected[0] == lines[1]
5354
assert rejected[1] == lines[2]
55+
56+
def test_get_free_node_nums(self):
57+
res = Cluster.get_free_ids_among_nodes(0, [])
58+
assert res == []
59+
60+
node001 = FooNode("node001", "1.2.3.4")
61+
res = Cluster.get_free_ids_among_nodes(1, [node001])
62+
assert res == [2]
63+
64+
res = Cluster.get_free_ids_among_nodes(3, [node001])
65+
assert res == [2, 3, 4]
66+
67+
node003 = FooNode("node003", "1.2.3.4")
68+
node005 = FooNode("node005", "1.2.3.4")
69+
node006 = FooNode("node006", "1.2.3.4")
70+
node106 = FooNode("node106", "1.2.3.4")
71+
res = Cluster.get_free_ids_among_nodes(5, [node001, node003, node005,
72+
node006, node106])
73+
assert res == [2, 4, 7, 8, 9]

0 commit comments

Comments
 (0)