Sho SHIMIZU
Committed by Gerrit Code Review

Use ResourceId when unregistering resources instead of Resource

Change-Id: Ib3d1c611ad9eb4491693ea10ee50ea0123f20ee2
...@@ -48,22 +48,21 @@ public interface ResourceAdminService { ...@@ -48,22 +48,21 @@ public interface ResourceAdminService {
48 /** 48 /**
49 * Unregisters the specified resources. 49 * Unregisters the specified resources.
50 * 50 *
51 - * @param resources resources to be unregistered 51 + * @param ids IDs of resources to be unregistered
52 * @return true if unregistration is successfully done, false otherwise. Unregistration 52 * @return true if unregistration is successfully done, false otherwise. Unregistration
53 * succeeds when each resource is not registered or unallocated. 53 * succeeds when each resource is not registered or unallocated.
54 */ 54 */
55 - // TODO: might need to change the first argument type to ResourceId 55 + default boolean unregisterResources(ResourceId... ids) {
56 - default boolean unregisterResources(Resource... resources) { 56 + return unregisterResources(ImmutableList.copyOf(ids));
57 - return unregisterResources(ImmutableList.copyOf(resources));
58 } 57 }
59 58
60 /** 59 /**
61 * Unregisters the specified resources. 60 * Unregisters the specified resources.
62 * 61 *
63 - * @param resources resources to be unregistered 62 + * @param ids IDs of resources to be unregistered
64 * @return true if unregistration is successfully done, false otherwise. Unregistration 63 * @return true if unregistration is successfully done, false otherwise. Unregistration
65 * succeeds when each resource is not registered or unallocated. 64 * succeeds when each resource is not registered or unallocated.
66 */ 65 */
67 // TODO: might need to change the first argument type to ResourceId 66 // TODO: might need to change the first argument type to ResourceId
68 - boolean unregisterResources(List<Resource> resources); 67 + boolean unregisterResources(List<ResourceId> ids);
69 } 68 }
......
...@@ -45,10 +45,10 @@ public interface ResourceStore extends Store<ResourceEvent, ResourceStoreDelegat ...@@ -45,10 +45,10 @@ public interface ResourceStore extends Store<ResourceEvent, ResourceStoreDelegat
45 * or none of the given resources is unregistered. The whole unregistration fails when any one of the 45 * or none of the given resources is unregistered. The whole unregistration fails when any one of the
46 * resource can't be unregistered. 46 * resource can't be unregistered.
47 * 47 *
48 - * @param resources resources to be unregistered 48 + * @param ids resources to be unregistered
49 * @return true if the registration succeeds, false otherwise 49 * @return true if the registration succeeds, false otherwise
50 */ 50 */
51 - boolean unregister(List<Resource> resources); 51 + boolean unregister(List<ResourceId> ids);
52 52
53 /** 53 /**
54 * Allocates the specified resources to the specified consumer in transactional way. 54 * Allocates the specified resources to the specified consumer in transactional way.
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onosproject.net.newresource.impl; 16 package org.onosproject.net.newresource.impl;
17 17
18 import com.google.common.collect.ImmutableSet; 18 import com.google.common.collect.ImmutableSet;
19 +import com.google.common.collect.Lists;
19 import org.onlab.packet.MplsLabel; 20 import org.onlab.packet.MplsLabel;
20 import org.onlab.packet.VlanId; 21 import org.onlab.packet.VlanId;
21 import org.onlab.util.Bandwidth; 22 import org.onlab.util.Bandwidth;
...@@ -133,7 +134,7 @@ final class ResourceDeviceListener implements DeviceListener { ...@@ -133,7 +134,7 @@ final class ResourceDeviceListener implements DeviceListener {
133 executor.submit(() -> { 134 executor.submit(() -> {
134 DiscreteResource devResource = Resources.discrete(device.id()).resource(); 135 DiscreteResource devResource = Resources.discrete(device.id()).resource();
135 List<Resource> allResources = getDescendantResources(devResource); 136 List<Resource> allResources = getDescendantResources(devResource);
136 - adminService.unregisterResources(allResources); 137 + adminService.unregisterResources(Lists.transform(allResources, Resource::id));
137 }); 138 });
138 } 139 }
139 140
...@@ -189,7 +190,7 @@ final class ResourceDeviceListener implements DeviceListener { ...@@ -189,7 +190,7 @@ final class ResourceDeviceListener implements DeviceListener {
189 executor.submit(() -> { 190 executor.submit(() -> {
190 DiscreteResource portResource = Resources.discrete(device.id(), port.number()).resource(); 191 DiscreteResource portResource = Resources.discrete(device.id(), port.number()).resource();
191 List<Resource> allResources = getDescendantResources(portResource); 192 List<Resource> allResources = getDescendantResources(portResource);
192 - adminService.unregisterResources(allResources); 193 + adminService.unregisterResources(Lists.transform(allResources, Resource::id));
193 }); 194 });
194 } 195 }
195 196
......
...@@ -178,10 +178,10 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent ...@@ -178,10 +178,10 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent
178 } 178 }
179 179
180 @Override 180 @Override
181 - public boolean unregisterResources(List<Resource> resources) { 181 + public boolean unregisterResources(List<ResourceId> ids) {
182 - checkNotNull(resources); 182 + checkNotNull(ids);
183 183
184 - return store.unregister(resources); 184 + return store.unregister(ids);
185 } 185 }
186 186
187 private class InternalStoreDelegate implements ResourceStoreDelegate { 187 private class InternalStoreDelegate implements ResourceStoreDelegate {
......
...@@ -117,7 +117,7 @@ final class ResourceNetworkConfigListener implements NetworkConfigListener { ...@@ -117,7 +117,7 @@ final class ResourceNetworkConfigListener implements NetworkConfigListener {
117 // FIXME Following should be an update to the value based on port speed 117 // FIXME Following should be an update to the value based on port speed
118 if (!adminService.unregisterResources(Resources.continuous(cp.deviceId(), 118 if (!adminService.unregisterResources(Resources.continuous(cp.deviceId(),
119 cp.port(), 119 cp.port(),
120 - Bandwidth.class).resource(0))) { 120 + Bandwidth.class).id())) {
121 log.warn("Failed to unregister Bandwidth for {}", cp); 121 log.warn("Failed to unregister Bandwidth for {}", cp);
122 } 122 }
123 break; 123 break;
...@@ -148,7 +148,7 @@ final class ResourceNetworkConfigListener implements NetworkConfigListener { ...@@ -148,7 +148,7 @@ final class ResourceNetworkConfigListener implements NetworkConfigListener {
148 // returns true (success) 148 // returns true (success)
149 149
150 if (!adminService.unregisterResources( 150 if (!adminService.unregisterResources(
151 - Resources.continuous(cp.deviceId(), cp.port(), Bandwidth.class).resource(0))) { 151 + Resources.continuous(cp.deviceId(), cp.port(), Bandwidth.class).id())) {
152 log.warn("unregisterResources for {} failed", cp); 152 log.warn("unregisterResources for {} failed", cp);
153 } 153 }
154 return adminService.registerResources(Resources.continuous(cp.deviceId(), 154 return adminService.registerResources(Resources.continuous(cp.deviceId(),
......
...@@ -167,8 +167,7 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour ...@@ -167,8 +167,7 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour
167 .collect(Collectors.groupingBy(x -> x.parent().get())); 167 .collect(Collectors.groupingBy(x -> x.parent().get()));
168 168
169 for (Map.Entry<DiscreteResource, List<Resource>> entry: resourceMap.entrySet()) { 169 for (Map.Entry<DiscreteResource, List<Resource>> entry: resourceMap.entrySet()) {
170 - Optional<DiscreteResource> child = lookup(childTxMap, entry.getKey()); 170 + if (!lookup(childTxMap, entry.getKey().id()).isPresent()) {
171 - if (!child.isPresent()) {
172 return abortTransaction(tx); 171 return abortTransaction(tx);
173 } 172 }
174 173
...@@ -189,8 +188,8 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour ...@@ -189,8 +188,8 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour
189 } 188 }
190 189
191 @Override 190 @Override
192 - public boolean unregister(List<Resource> resources) { 191 + public boolean unregister(List<ResourceId> ids) {
193 - checkNotNull(resources); 192 + checkNotNull(ids);
194 193
195 TransactionContext tx = service.transactionContextBuilder().build(); 194 TransactionContext tx = service.transactionContextBuilder().build();
196 tx.begin(); 195 tx.begin();
...@@ -203,8 +202,13 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour ...@@ -203,8 +202,13 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour
203 tx.getTransactionalMap(CONTINUOUS_CONSUMER_MAP, SERIALIZER); 202 tx.getTransactionalMap(CONTINUOUS_CONSUMER_MAP, SERIALIZER);
204 203
205 // Extract Discrete instances from resources 204 // Extract Discrete instances from resources
206 - Map<DiscreteResourceId, List<Resource>> resourceMap = resources.stream() 205 + List<Resource> resources = ids.stream()
207 .filter(x -> x.parent().isPresent()) 206 .filter(x -> x.parent().isPresent())
207 + .map(x -> lookup(childTxMap, x))
208 + .filter(Optional::isPresent)
209 + .map(Optional::get)
210 + .collect(Collectors.toList());
211 + Map<DiscreteResourceId, List<Resource>> resourceMap = resources.stream()
208 .collect(Collectors.groupingBy(x -> x.parent().get().id())); 212 .collect(Collectors.groupingBy(x -> x.parent().get().id()));
209 213
210 // even if one of the resources is allocated to a consumer, 214 // even if one of the resources is allocated to a consumer,
...@@ -241,7 +245,7 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour ...@@ -241,7 +245,7 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour
241 .collect(Collectors.toList()); 245 .collect(Collectors.toList());
242 notifyDelegate(events); 246 notifyDelegate(events);
243 } else { 247 } else {
244 - log.warn("Failed to unregister {}: Commit failed.", resources); 248 + log.warn("Failed to unregister {}: Commit failed.", ids);
245 } 249 }
246 return success; 250 return success;
247 } 251 }
...@@ -263,7 +267,7 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour ...@@ -263,7 +267,7 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour
263 267
264 for (Resource resource: resources) { 268 for (Resource resource: resources) {
265 if (resource instanceof DiscreteResource) { 269 if (resource instanceof DiscreteResource) {
266 - if (!lookup(childTxMap, resource).isPresent()) { 270 + if (!lookup(childTxMap, resource.id()).isPresent()) {
267 return abortTransaction(tx); 271 return abortTransaction(tx);
268 } 272 }
269 273
...@@ -272,18 +276,20 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour ...@@ -272,18 +276,20 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour
272 return abortTransaction(tx); 276 return abortTransaction(tx);
273 } 277 }
274 } else if (resource instanceof ContinuousResource) { 278 } else if (resource instanceof ContinuousResource) {
275 - Optional<ContinuousResource> continuous = lookup(childTxMap, (ContinuousResource) resource); 279 + Optional<Resource> lookedUp = lookup(childTxMap, resource.id());
276 - if (!continuous.isPresent()) { 280 + if (!lookedUp.isPresent()) {
277 return abortTransaction(tx); 281 return abortTransaction(tx);
278 } 282 }
279 283
280 - ContinuousResourceAllocation allocations = continuousConsumerTxMap.get(continuous.get().id()); 284 + // Down cast: this must be safe as ContinuousResource is associated with ContinuousResourceId
281 - if (!hasEnoughResource(continuous.get(), (ContinuousResource) resource, allocations)) { 285 + ContinuousResource continuous = (ContinuousResource) lookedUp.get();
286 + ContinuousResourceAllocation allocations = continuousConsumerTxMap.get(continuous.id());
287 + if (!hasEnoughResource(continuous, (ContinuousResource) resource, allocations)) {
282 return abortTransaction(tx); 288 return abortTransaction(tx);
283 } 289 }
284 290
285 boolean success = appendValue(continuousConsumerTxMap, 291 boolean success = appendValue(continuousConsumerTxMap,
286 - continuous.get(), new ResourceAllocation(continuous.get(), consumer)); 292 + continuous, new ResourceAllocation(continuous, consumer));
287 if (!success) { 293 if (!success) {
288 return abortTransaction(tx); 294 return abortTransaction(tx);
289 } 295 }
...@@ -534,34 +540,29 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour ...@@ -534,34 +540,29 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour
534 } 540 }
535 541
536 /** 542 /**
537 - * Returns the resource which has the same key as the key of the specified resource 543 + * Returns the resource which has the same key as the specified resource ID
538 - * in the list as a value of the map. 544 + * in the set as a value of the map.
539 * 545 *
540 - * @param map map storing parent - child relationship of resources 546 + * @param childTxMap map storing parent - child relationship of resources
541 - * @param resource resource to be checked for its key 547 + * @param id ID of resource to be checked
542 * @return the resource which is regarded as the same as the specified resource 548 * @return the resource which is regarded as the same as the specified resource
543 */ 549 */
544 - // Naive implementation, which traverses all elements in the list 550 + // Naive implementation, which traverses all elements in the set
545 // computational complexity: O(n) where n is the number of elements 551 // computational complexity: O(n) where n is the number of elements
546 // in the associated set 552 // in the associated set
547 - private <T extends Resource> Optional<T> lookup( 553 + private Optional<Resource> lookup(TransactionalMap<DiscreteResourceId, Set<Resource>> childTxMap, ResourceId id) {
548 - TransactionalMap<DiscreteResourceId, Set<Resource>> map, T resource) { 554 + if (!id.parent().isPresent()) {
549 - // if it is root, always returns itself 555 + return Optional.of(Resource.ROOT);
550 - if (!resource.parent().isPresent()) {
551 - return Optional.of(resource);
552 } 556 }
553 557
554 - Set<Resource> values = map.get(resource.parent().get().id()); 558 + Set<Resource> values = childTxMap.get(id.parent().get());
555 if (values == null) { 559 if (values == null) {
556 return Optional.empty(); 560 return Optional.empty();
557 } 561 }
558 562
559 - @SuppressWarnings("unchecked") 563 + return values.stream()
560 - Optional<T> result = values.stream() 564 + .filter(x -> x.id().equals(id))
561 - .filter(x -> x.id().equals(resource.id()))
562 - .map(x -> (T) x)
563 .findFirst(); 565 .findFirst();
564 - return result;
565 } 566 }
566 567
567 /** 568 /**
......