Bugfix and cosmetic changes to resource subsystem
- Continuous resource was always considered not available
- Support querying for child resource against Continuous
(result is no children)
- Resource equality to compare id and exact type
- Add missing information in Continuous resource toString()
- More concise String representation for ResourceId
- additional logging added during above bug investigation.
Change-Id: I58a95b95b91c246c3c5dbb136a1820f988c6fccd
diff --git a/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java b/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
index 707ce4b..817f8d2 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
@@ -143,6 +143,9 @@
@Override
public boolean register(List<Resource> resources) {
checkNotNull(resources);
+ if (log.isTraceEnabled()) {
+ resources.forEach(r -> log.trace("registering {}", r));
+ }
TransactionContext tx = service.transactionContextBuilder().build();
tx.begin();
@@ -324,17 +327,36 @@
checkNotNull(resource);
checkArgument(resource instanceof Resource.Discrete || resource instanceof Resource.Continuous);
+ // check if it's registered or not.
+ Versioned<Set<Resource>> v = childMap.get(resource.parent().get());
+ if (v == null || !v.value().contains(resource)) {
+ return false;
+ }
+
if (resource instanceof Resource.Discrete) {
+ // check if already consumed
return getConsumer((Resource.Discrete) resource).isEmpty();
} else {
- return isAvailable((Resource.Continuous) resource);
+ Resource.Continuous requested = (Resource.Continuous) resource;
+ Resource.Continuous registered = v.value().stream()
+ .filter(c -> c.equals(resource))
+ .findFirst()
+ .map(c -> (Resource.Continuous) c)
+ .get();
+ if (registered.value() < requested.value()) {
+ // Capacity < requested, can never satisfy
+ return false;
+ }
+ // check if there's enough left
+ return isAvailable(requested);
}
}
private boolean isAvailable(Resource.Continuous resource) {
Versioned<ContinuousResourceAllocation> allocation = continuousConsumers.get(resource.id());
if (allocation == null) {
- return false;
+ // no allocation (=no consumer) full registered resources available
+ return true;
}
return hasEnoughResource(allocation.value().original(), resource, allocation.value());
@@ -362,7 +384,10 @@
@Override
public Collection<Resource> getChildResources(Resource parent) {
checkNotNull(parent);
- checkArgument(parent instanceof Resource.Discrete);
+ if (!(parent instanceof Resource.Discrete)) {
+ // only Discrete resource can have child resource
+ return ImmutableList.of();
+ }
Versioned<Set<Resource>> children = childMap.get((Resource.Discrete) parent);
if (children == null) {