Committed by
Gerrit Code Review
ONOS-3453 Fixed an issue with a race condition in loading/installing apps from d…
…isk in multi-cluster environments. Fixed onos-gen-partitions. Change-Id: Iadbb86119477b52d29a80515fc42e3d90012a216
Showing
2 changed files
with
15 additions
and
6 deletions
... | @@ -237,12 +237,22 @@ public class ApplicationManager | ... | @@ -237,12 +237,22 @@ public class ApplicationManager |
237 | boolean changed = false; | 237 | boolean changed = false; |
238 | for (String name : app.features()) { | 238 | for (String name : app.features()) { |
239 | Feature feature = featuresService.getFeature(name); | 239 | Feature feature = featuresService.getFeature(name); |
240 | + | ||
241 | + // If we see an attempt at activation of a non-existent feature | ||
242 | + // attempt to install the app artifacts first and then retry. | ||
243 | + // This can be triggered by a race condition between different ONOS | ||
244 | + // instances "installing" the apps from disk at their own pace. | ||
245 | + // Perhaps there is a more elegant solution to be explored in the | ||
246 | + // future. | ||
247 | + if (feature == null) { | ||
248 | + installAppArtifacts(app); | ||
249 | + feature = featuresService.getFeature(name); | ||
250 | + } | ||
251 | + | ||
240 | if (feature != null && !featuresService.isInstalled(feature)) { | 252 | if (feature != null && !featuresService.isInstalled(feature)) { |
241 | featuresService.installFeature(name); | 253 | featuresService.installFeature(name); |
242 | changed = true; | 254 | changed = true; |
243 | - } else if (feature == null && !initializing) { | 255 | + } else if (feature == null) { |
244 | - // Suppress feature-not-found reporting during startup since these | ||
245 | - // can arise naturally from the staggered cluster install. | ||
246 | log.warn("Feature {} not found", name); | 256 | log.warn("Feature {} not found", name); |
247 | } | 257 | } |
248 | } | 258 | } | ... | ... |
... | @@ -11,8 +11,7 @@ from collections import deque, OrderedDict | ... | @@ -11,8 +11,7 @@ from collections import deque, OrderedDict |
11 | import re | 11 | import re |
12 | import json | 12 | import json |
13 | import sys | 13 | import sys |
14 | -import random | 14 | +import hashlib |
15 | -import string | ||
16 | 15 | ||
17 | convert = lambda text: int(text) if text.isdigit() else text.lower() | 16 | convert = lambda text: int(text) if text.isdigit() else text.lower() |
18 | alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] | 17 | alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] |
... | @@ -46,7 +45,7 @@ if __name__ == '__main__': | ... | @@ -46,7 +45,7 @@ if __name__ == '__main__': |
46 | partitions = generate_permutations([v.get('id') for v in nodes], 3) | 45 | partitions = generate_permutations([v.get('id') for v in nodes], 3) |
47 | name = 0 | 46 | name = 0 |
48 | for node in nodes: | 47 | for node in nodes: |
49 | - name = name ^ node['ip'] | 48 | + name = name ^ hash(node['ip']) |
50 | data = { | 49 | data = { |
51 | 'name': name, | 50 | 'name': name, |
52 | 'nodes': nodes, | 51 | 'nodes': nodes, | ... | ... |
-
Please register or login to post a comment