Committed by
Thomas Vachuska
ONOS-2716: Handle duplicate registration in resource store
Change-Id: Ic46ad17359d76a23fa9d9c78afc4fc65a41d1dbc
Showing
2 changed files
with
11 additions
and
8 deletions
... | @@ -15,7 +15,7 @@ public interface ResourceStore { | ... | @@ -15,7 +15,7 @@ public interface ResourceStore { |
15 | /** | 15 | /** |
16 | * Registers the resources in transactional way. | 16 | * Registers the resources in transactional way. |
17 | * Resource registration is must be done before resource allocation. The state after completion | 17 | * Resource registration is must be done before resource allocation. The state after completion |
18 | - * of this method is all the resources are registered, or no resource is registered. | 18 | + * of this method is all the resources are registered, or none of the given resources is registered. |
19 | * The whole registration fails when any one of the resource can't be registered. | 19 | * The whole registration fails when any one of the resource can't be registered. |
20 | * | 20 | * |
21 | * @param resources resources to be registered | 21 | * @param resources resources to be registered | ... | ... |
... | @@ -278,6 +278,7 @@ public class ConsistentResourceStore implements ResourceStore { | ... | @@ -278,6 +278,7 @@ public class ConsistentResourceStore implements ResourceStore { |
278 | 278 | ||
279 | /** | 279 | /** |
280 | * Appends the values to the existing values associated with the specified key. | 280 | * Appends the values to the existing values associated with the specified key. |
281 | + * If the map already has all the given values, appending will not happen. | ||
281 | * | 282 | * |
282 | * @param map map holding multiple values for a key | 283 | * @param map map holding multiple values for a key |
283 | * @param key key specifying values | 284 | * @param key key specifying values |
... | @@ -288,16 +289,18 @@ public class ConsistentResourceStore implements ResourceStore { | ... | @@ -288,16 +289,18 @@ public class ConsistentResourceStore implements ResourceStore { |
288 | */ | 289 | */ |
289 | private <K, V> boolean appendValues(TransactionalMap<K, List<V>> map, K key, List<V> values) { | 290 | private <K, V> boolean appendValues(TransactionalMap<K, List<V>> map, K key, List<V> values) { |
290 | List<V> oldValues = map.get(key); | 291 | List<V> oldValues = map.get(key); |
291 | - List<V> newValues; | ||
292 | if (oldValues == null) { | 292 | if (oldValues == null) { |
293 | - newValues = new ArrayList<>(values); | 293 | + return map.replace(key, oldValues, new ArrayList<>(values)); |
294 | - } else { | ||
295 | - LinkedHashSet<V> newSet = new LinkedHashSet<>(oldValues); | ||
296 | - newSet.addAll(values); | ||
297 | - newValues = new ArrayList<>(newSet); | ||
298 | } | 294 | } |
299 | 295 | ||
300 | - return map.replace(key, oldValues, newValues); | 296 | + LinkedHashSet<V> oldSet = new LinkedHashSet<>(oldValues); |
297 | + if (oldSet.containsAll(values)) { | ||
298 | + // don't write to map because all values are already stored | ||
299 | + return true; | ||
300 | + } | ||
301 | + | ||
302 | + oldSet.addAll(values); | ||
303 | + return map.replace(key, oldValues, new ArrayList<>(oldSet)); | ||
301 | } | 304 | } |
302 | 305 | ||
303 | /** | 306 | /** | ... | ... |
-
Please register or login to post a comment