Committed by
Ray Milkey
ONOS-2717: Handle duplicate resource unregistration in resource store
Change-Id: I49648be9c26ba66218172d570632d54584a908d8
Showing
2 changed files
with
11 additions
and
8 deletions
| ... | @@ -26,7 +26,7 @@ public interface ResourceStore { | ... | @@ -26,7 +26,7 @@ public interface ResourceStore { |
| 26 | /** | 26 | /** |
| 27 | * Unregisters the resources in transactional way. | 27 | * Unregisters the resources in transactional way. |
| 28 | * The state after completion of this method is all the resources are unregistered, | 28 | * The state after completion of this method is all the resources are unregistered, |
| 29 | - * or no resource is unregistered. The whole unregistration fails when any one of the | 29 | + * or none of the given resources is unregistered. The whole unregistration fails when any one of the |
| 30 | * resource can't be unregistered. | 30 | * resource can't be unregistered. |
| 31 | * | 31 | * |
| 32 | * @param resources resources to be unregistered | 32 | * @param resources resources to be unregistered | ... | ... |
| ... | @@ -305,6 +305,7 @@ public class ConsistentResourceStore implements ResourceStore { | ... | @@ -305,6 +305,7 @@ public class ConsistentResourceStore implements ResourceStore { |
| 305 | 305 | ||
| 306 | /** | 306 | /** |
| 307 | * Removes teh values from the existing values associated with the specified key. | 307 | * Removes teh values from the existing values associated with the specified key. |
| 308 | + * If the map doesn't contain the given values, removal will not happen. | ||
| 308 | * | 309 | * |
| 309 | * @param map map holding multiple values for a key | 310 | * @param map map holding multiple values for a key |
| 310 | * @param key key specifying values | 311 | * @param key key specifying values |
| ... | @@ -315,16 +316,18 @@ public class ConsistentResourceStore implements ResourceStore { | ... | @@ -315,16 +316,18 @@ public class ConsistentResourceStore implements ResourceStore { |
| 315 | */ | 316 | */ |
| 316 | private <K, V> boolean removeValues(TransactionalMap<K, List<V>> map, K key, List<V> values) { | 317 | private <K, V> boolean removeValues(TransactionalMap<K, List<V>> map, K key, List<V> values) { |
| 317 | List<V> oldValues = map.get(key); | 318 | List<V> oldValues = map.get(key); |
| 318 | - List<V> newValues; | ||
| 319 | if (oldValues == null) { | 319 | if (oldValues == null) { |
| 320 | - newValues = new ArrayList<>(); | 320 | + return map.replace(key, oldValues, new ArrayList<>()); |
| 321 | - } else { | ||
| 322 | - LinkedHashSet<V> newSet = new LinkedHashSet<>(oldValues); | ||
| 323 | - newSet.removeAll(values); | ||
| 324 | - newValues = new ArrayList<>(newSet); | ||
| 325 | } | 321 | } |
| 326 | 322 | ||
| 327 | - return map.replace(key, oldValues, newValues); | 323 | + LinkedHashSet<V> oldSet = new LinkedHashSet<>(oldValues); |
| 324 | + if (values.stream().allMatch(x -> !oldSet.contains(x))) { | ||
| 325 | + // don't write map because none of the values are stored | ||
| 326 | + return true; | ||
| 327 | + } | ||
| 328 | + | ||
| 329 | + oldSet.removeAll(values); | ||
| 330 | + return map.replace(key, oldValues, new ArrayList<>(oldSet)); | ||
| 328 | } | 331 | } |
| 329 | 332 | ||
| 330 | /** | 333 | /** | ... | ... |
-
Please register or login to post a comment