Committed by
Gerrit Code Review
Make serialized resources more compact to omit redundant parent resource ID
Change-Id: Icafe92f35bded405dd39e57ad8380bca82a6d720
Showing
9 changed files
with
97 additions
and
272 deletions
| 1 | -/* | ||
| 2 | - * Copyright 2016-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onosproject.net.resource; | ||
| 17 | - | ||
| 18 | -import com.google.common.annotations.Beta; | ||
| 19 | -import com.google.common.collect.ImmutableSet; | ||
| 20 | - | ||
| 21 | -import java.util.Objects; | ||
| 22 | -import java.util.Optional; | ||
| 23 | -import java.util.Set; | ||
| 24 | - | ||
| 25 | -import static com.google.common.base.Preconditions.checkArgument; | ||
| 26 | -import static com.google.common.base.Preconditions.checkNotNull; | ||
| 27 | -import static com.google.common.base.Preconditions.checkState; | ||
| 28 | - | ||
| 29 | -/** | ||
| 30 | - * Represents a set of discrete type resources. | ||
| 31 | - * This class is intended to be used by ConsistentResourceStore though it is exposed to the public. | ||
| 32 | - */ | ||
| 33 | -@Beta | ||
| 34 | -public final class DiscreteResourceSet { | ||
| 35 | - private final Set<DiscreteResource> values; | ||
| 36 | - private final DiscreteResourceCodec codec; | ||
| 37 | - | ||
| 38 | - private static final DiscreteResourceSet EMPTY = new DiscreteResourceSet(ImmutableSet.of(), NoOpCodec.INSTANCE); | ||
| 39 | - | ||
| 40 | - /** | ||
| 41 | - * Creates an instance with resources and the codec for them. | ||
| 42 | - * | ||
| 43 | - * @param values resources to be contained in the instance | ||
| 44 | - * @param codec codec for the specified resources | ||
| 45 | - * @return an instance | ||
| 46 | - */ | ||
| 47 | - public static DiscreteResourceSet of(Set<DiscreteResource> values, DiscreteResourceCodec codec) { | ||
| 48 | - checkNotNull(values); | ||
| 49 | - checkNotNull(codec); | ||
| 50 | - checkArgument(!values.isEmpty()); | ||
| 51 | - | ||
| 52 | - return new DiscreteResourceSet(ImmutableSet.copyOf(values), codec); | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - /** | ||
| 56 | - * Creates the instance representing an empty resource set. | ||
| 57 | - * | ||
| 58 | - * @return an empty resource set | ||
| 59 | - */ | ||
| 60 | - public static DiscreteResourceSet empty() { | ||
| 61 | - return EMPTY; | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - private DiscreteResourceSet(Set<DiscreteResource> values, DiscreteResourceCodec codec) { | ||
| 65 | - this.values = values; | ||
| 66 | - this.codec = codec; | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - private DiscreteResourceSet() { | ||
| 70 | - this.values = null; | ||
| 71 | - this.codec = null; | ||
| 72 | - } | ||
| 73 | - | ||
| 74 | - /** | ||
| 75 | - * Returns resources contained in this instance. | ||
| 76 | - * | ||
| 77 | - * @return resources | ||
| 78 | - */ | ||
| 79 | - public Set<DiscreteResource> values() { | ||
| 80 | - return values; | ||
| 81 | - } | ||
| 82 | - | ||
| 83 | - /** | ||
| 84 | - * Returns the parent resource of the resources contained in this instance. | ||
| 85 | - * | ||
| 86 | - * @return the parent resource of the resources | ||
| 87 | - */ | ||
| 88 | - public DiscreteResourceId parent() { | ||
| 89 | - if (values.isEmpty()) { | ||
| 90 | - // Dummy value avoiding null | ||
| 91 | - return ResourceId.ROOT; | ||
| 92 | - } | ||
| 93 | - Optional<DiscreteResourceId> parent = values.iterator().next().id().parent(); | ||
| 94 | - checkState(parent.isPresent()); | ||
| 95 | - | ||
| 96 | - return parent.get(); | ||
| 97 | - } | ||
| 98 | - | ||
| 99 | - /** | ||
| 100 | - * Returns the codec for the resources contained in this instance. | ||
| 101 | - * | ||
| 102 | - * @return the codec for the resources | ||
| 103 | - */ | ||
| 104 | - public DiscreteResourceCodec codec() { | ||
| 105 | - return codec; | ||
| 106 | - } | ||
| 107 | - | ||
| 108 | - @Override | ||
| 109 | - public int hashCode() { | ||
| 110 | - return Objects.hash(values, codec); | ||
| 111 | - } | ||
| 112 | - | ||
| 113 | - @Override | ||
| 114 | - public boolean equals(Object obj) { | ||
| 115 | - if (this == obj) { | ||
| 116 | - return true; | ||
| 117 | - } | ||
| 118 | - | ||
| 119 | - if (obj == null || getClass() != obj.getClass()) { | ||
| 120 | - return false; | ||
| 121 | - } | ||
| 122 | - | ||
| 123 | - final DiscreteResourceSet other = (DiscreteResourceSet) obj; | ||
| 124 | - return Objects.equals(this.values, other.values) | ||
| 125 | - && Objects.equals(this.codec, other.codec); | ||
| 126 | - } | ||
| 127 | - | ||
| 128 | - public boolean contains(DiscreteResource resource) { | ||
| 129 | - return values.contains(resource); | ||
| 130 | - } | ||
| 131 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2016-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onosproject.net.resource; | ||
| 17 | - | ||
| 18 | -/** | ||
| 19 | - * Represents no-op codec intended to used in an empty discrete resource set only. | ||
| 20 | - * It's not supposed to be used by other classes. | ||
| 21 | - */ | ||
| 22 | -public class NoOpCodec implements DiscreteResourceCodec<Object> { | ||
| 23 | - public static final DiscreteResourceCodec INSTANCE = new NoOpCodec(); | ||
| 24 | - | ||
| 25 | - @Override | ||
| 26 | - public int encode(Object resource) { | ||
| 27 | - return 0; | ||
| 28 | - } | ||
| 29 | - | ||
| 30 | - @Override | ||
| 31 | - public Object decode(int value) { | ||
| 32 | - return Resource.ROOT; | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - @Override | ||
| 36 | - public boolean equals(Object obj) { | ||
| 37 | - if (obj == this) { | ||
| 38 | - return true; | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | - if (obj == null || getClass() != obj.getClass()) { | ||
| 42 | - return false; | ||
| 43 | - } | ||
| 44 | - | ||
| 45 | - return true; | ||
| 46 | - } | ||
| 47 | - | ||
| 48 | - @Override | ||
| 49 | - public int hashCode() { | ||
| 50 | - return NoOpCodec.class.hashCode(); | ||
| 51 | - } | ||
| 52 | -} |
| ... | @@ -76,6 +76,7 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour | ... | @@ -76,6 +76,7 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour |
| 76 | .register(new EncodableDiscreteResourcesSerializer(), EncodableDiscreteResources.class) | 76 | .register(new EncodableDiscreteResourcesSerializer(), EncodableDiscreteResources.class) |
| 77 | .register(GenericDiscreteResources.class) | 77 | .register(GenericDiscreteResources.class) |
| 78 | .register(EmptyDiscreteResources.class) | 78 | .register(EmptyDiscreteResources.class) |
| 79 | + .register(new EncodedResourcesSerializer(), EncodedDiscreteResources.class) | ||
| 79 | .register(ContinuousResourceAllocation.class) | 80 | .register(ContinuousResourceAllocation.class) |
| 80 | .build()); | 81 | .build()); |
| 81 | 82 | ... | ... |
| ... | @@ -19,7 +19,6 @@ import com.google.common.collect.Sets; | ... | @@ -19,7 +19,6 @@ import com.google.common.collect.Sets; |
| 19 | import org.onosproject.net.resource.DiscreteResource; | 19 | import org.onosproject.net.resource.DiscreteResource; |
| 20 | import org.onosproject.net.resource.DiscreteResourceCodec; | 20 | import org.onosproject.net.resource.DiscreteResourceCodec; |
| 21 | import org.onosproject.net.resource.DiscreteResourceId; | 21 | import org.onosproject.net.resource.DiscreteResourceId; |
| 22 | -import org.onosproject.net.resource.DiscreteResourceSet; | ||
| 23 | import org.onosproject.net.resource.Resources; | 22 | import org.onosproject.net.resource.Resources; |
| 24 | 23 | ||
| 25 | import java.util.LinkedHashMap; | 24 | import java.util.LinkedHashMap; |
| ... | @@ -36,7 +35,7 @@ import java.util.stream.Collectors; | ... | @@ -36,7 +35,7 @@ import java.util.stream.Collectors; |
| 36 | final class EncodableDiscreteResources implements DiscreteResources { | 35 | final class EncodableDiscreteResources implements DiscreteResources { |
| 37 | private static final Codecs CODECS = Codecs.getInstance(); | 36 | private static final Codecs CODECS = Codecs.getInstance(); |
| 38 | private final DiscreteResource parent; | 37 | private final DiscreteResource parent; |
| 39 | - private final Map<Class<?>, DiscreteResourceSet> values; | 38 | + private final Map<Class<?>, EncodedDiscreteResources> values; |
| 40 | 39 | ||
| 41 | private static Class<?> getClass(DiscreteResource resource) { | 40 | private static Class<?> getClass(DiscreteResource resource) { |
| 42 | return resource.valueAs(Object.class).map(Object::getClass).get(); | 41 | return resource.valueAs(Object.class).map(Object::getClass).get(); |
| ... | @@ -55,16 +54,16 @@ final class EncodableDiscreteResources implements DiscreteResources { | ... | @@ -55,16 +54,16 @@ final class EncodableDiscreteResources implements DiscreteResources { |
| 55 | Map<Class<?>, Set<DiscreteResource>> grouped = resources.stream() | 54 | Map<Class<?>, Set<DiscreteResource>> grouped = resources.stream() |
| 56 | .collect(Collectors.groupingBy(x -> getClass(x), Collectors.toCollection(LinkedHashSet::new))); | 55 | .collect(Collectors.groupingBy(x -> getClass(x), Collectors.toCollection(LinkedHashSet::new))); |
| 57 | 56 | ||
| 58 | - Map<Class<?>, DiscreteResourceSet> values = new LinkedHashMap<>(); | 57 | + Map<Class<?>, EncodedDiscreteResources> values = new LinkedHashMap<>(); |
| 59 | for (Map.Entry<Class<?>, Set<DiscreteResource>> entry : grouped.entrySet()) { | 58 | for (Map.Entry<Class<?>, Set<DiscreteResource>> entry : grouped.entrySet()) { |
| 60 | DiscreteResourceCodec<?> codec = CODECS.getCodec(entry.getKey()); | 59 | DiscreteResourceCodec<?> codec = CODECS.getCodec(entry.getKey()); |
| 61 | - values.put(entry.getKey(), DiscreteResourceSet.of(entry.getValue(), codec)); | 60 | + values.put(entry.getKey(), EncodedDiscreteResources.of(entry.getValue(), codec)); |
| 62 | } | 61 | } |
| 63 | 62 | ||
| 64 | return new EncodableDiscreteResources(parent, values); | 63 | return new EncodableDiscreteResources(parent, values); |
| 65 | } | 64 | } |
| 66 | 65 | ||
| 67 | - private EncodableDiscreteResources(DiscreteResource parent, Map<Class<?>, DiscreteResourceSet> values) { | 66 | + private EncodableDiscreteResources(DiscreteResource parent, Map<Class<?>, EncodedDiscreteResources> values) { |
| 68 | this.parent = parent; | 67 | this.parent = parent; |
| 69 | this.values = values; | 68 | this.values = values; |
| 70 | } | 69 | } |
| ... | @@ -93,10 +92,8 @@ final class EncodableDiscreteResources implements DiscreteResources { | ... | @@ -93,10 +92,8 @@ final class EncodableDiscreteResources implements DiscreteResources { |
| 93 | 92 | ||
| 94 | @Override | 93 | @Override |
| 95 | public boolean isEmpty() { | 94 | public boolean isEmpty() { |
| 96 | - return !values.values().stream() | 95 | + return values.values().stream() |
| 97 | - .flatMap(x -> x.values().stream()) | 96 | + .allMatch(x -> x.isEmpty()); |
| 98 | - .findAny() | ||
| 99 | - .isPresent(); | ||
| 100 | } | 97 | } |
| 101 | 98 | ||
| 102 | @Override | 99 | @Override |
| ... | @@ -120,7 +117,7 @@ final class EncodableDiscreteResources implements DiscreteResources { | ... | @@ -120,7 +117,7 @@ final class EncodableDiscreteResources implements DiscreteResources { |
| 120 | @Override | 117 | @Override |
| 121 | public Set<DiscreteResource> values() { | 118 | public Set<DiscreteResource> values() { |
| 122 | return values.values().stream() | 119 | return values.values().stream() |
| 123 | - .flatMap(x -> x.values().stream()) | 120 | + .flatMap(x -> x.resources(parent.id()).stream()) |
| 124 | .collect(Collectors.toCollection(LinkedHashSet::new)); | 121 | .collect(Collectors.toCollection(LinkedHashSet::new)); |
| 125 | } | 122 | } |
| 126 | 123 | ||
| ... | @@ -128,7 +125,7 @@ final class EncodableDiscreteResources implements DiscreteResources { | ... | @@ -128,7 +125,7 @@ final class EncodableDiscreteResources implements DiscreteResources { |
| 128 | return parent; | 125 | return parent; |
| 129 | } | 126 | } |
| 130 | 127 | ||
| 131 | - Map<Class<?>, DiscreteResourceSet> rawValues() { | 128 | + Map<Class<?>, EncodedDiscreteResources> rawValues() { |
| 132 | return values; | 129 | return values; |
| 133 | } | 130 | } |
| 134 | } | 131 | } | ... | ... |
| ... | @@ -20,7 +20,6 @@ import com.esotericsoftware.kryo.Serializer; | ... | @@ -20,7 +20,6 @@ import com.esotericsoftware.kryo.Serializer; |
| 20 | import com.esotericsoftware.kryo.io.Input; | 20 | import com.esotericsoftware.kryo.io.Input; |
| 21 | import com.esotericsoftware.kryo.io.Output; | 21 | import com.esotericsoftware.kryo.io.Output; |
| 22 | import org.onosproject.net.resource.DiscreteResource; | 22 | import org.onosproject.net.resource.DiscreteResource; |
| 23 | -import org.onosproject.net.resource.DiscreteResourceSet; | ||
| 24 | 23 | ||
| 25 | import java.util.LinkedHashSet; | 24 | import java.util.LinkedHashSet; |
| 26 | import java.util.Set; | 25 | import java.util.Set; |
| ... | @@ -40,11 +39,11 @@ class EncodableDiscreteResourcesSerializer extends Serializer<EncodableDiscreteR | ... | @@ -40,11 +39,11 @@ class EncodableDiscreteResourcesSerializer extends Serializer<EncodableDiscreteR |
| 40 | public EncodableDiscreteResources read(Kryo kryo, Input input, Class<EncodableDiscreteResources> cls) { | 39 | public EncodableDiscreteResources read(Kryo kryo, Input input, Class<EncodableDiscreteResources> cls) { |
| 41 | DiscreteResource parent = kryo.readObject(input, DiscreteResource.class); | 40 | DiscreteResource parent = kryo.readObject(input, DiscreteResource.class); |
| 42 | @SuppressWarnings("unchecked") | 41 | @SuppressWarnings("unchecked") |
| 43 | - Set<DiscreteResourceSet> resources = kryo.readObject(input, LinkedHashSet.class); | 42 | + Set<EncodedDiscreteResources> resources = kryo.readObject(input, LinkedHashSet.class); |
| 44 | 43 | ||
| 45 | return EncodableDiscreteResources.of(parent, | 44 | return EncodableDiscreteResources.of(parent, |
| 46 | resources.stream() | 45 | resources.stream() |
| 47 | - .flatMap(x -> x.values().stream()) | 46 | + .flatMap(x -> x.resources(parent.id()).stream()) |
| 48 | .collect(Collectors.toCollection(LinkedHashSet::new))); | 47 | .collect(Collectors.toCollection(LinkedHashSet::new))); |
| 49 | } | 48 | } |
| 50 | } | 49 | } | ... | ... |
core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.store.resource.impl; | ||
| 17 | + | ||
| 18 | +import org.onlab.util.Tools; | ||
| 19 | +import org.onosproject.net.resource.DiscreteResource; | ||
| 20 | +import org.onosproject.net.resource.DiscreteResourceCodec; | ||
| 21 | +import org.onosproject.net.resource.DiscreteResourceId; | ||
| 22 | +import org.onosproject.net.resource.Resources; | ||
| 23 | + | ||
| 24 | +import java.util.LinkedHashSet; | ||
| 25 | +import java.util.Set; | ||
| 26 | +import java.util.stream.Collectors; | ||
| 27 | + | ||
| 28 | +/** | ||
| 29 | + * Represents discrete resources encoded by a codec. | ||
| 30 | + */ | ||
| 31 | +final class EncodedDiscreteResources { | ||
| 32 | + private final Set<Integer> rawValues; | ||
| 33 | + private final DiscreteResourceCodec codec; | ||
| 34 | + | ||
| 35 | + EncodedDiscreteResources(Set<Integer> rawValues, DiscreteResourceCodec codec) { | ||
| 36 | + this.rawValues = rawValues; | ||
| 37 | + this.codec = codec; | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + static EncodedDiscreteResources of(Set<DiscreteResource> resources, DiscreteResourceCodec codec) { | ||
| 41 | + Set<Integer> rawValues = resources.stream() | ||
| 42 | + .map(x -> x.valueAs(Object.class)) | ||
| 43 | + .flatMap(Tools::stream) | ||
| 44 | + .map(x -> codec.encode(x)) | ||
| 45 | + .collect(Collectors.toCollection(LinkedHashSet::new)); | ||
| 46 | + | ||
| 47 | + return new EncodedDiscreteResources(rawValues, codec); | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + Set<Integer> rawValues() { | ||
| 51 | + return rawValues; | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + DiscreteResourceCodec codec() { | ||
| 55 | + return codec; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + Set<DiscreteResource> resources(DiscreteResourceId parent) { | ||
| 59 | + return rawValues.stream() | ||
| 60 | + .map(x -> codec.decode(x)) | ||
| 61 | + .map(x -> Resources.discrete(parent, x).resource()) | ||
| 62 | + .collect(Collectors.toCollection(LinkedHashSet::new)); | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + @SuppressWarnings("unchecked") | ||
| 66 | + boolean contains(DiscreteResource resource) { | ||
| 67 | + return rawValues.contains(codec.encode(resource)); | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + boolean isEmpty() { | ||
| 71 | + return rawValues.isEmpty(); | ||
| 72 | + } | ||
| 73 | +} |
| ... | @@ -13,42 +13,33 @@ | ... | @@ -13,42 +13,33 @@ |
| 13 | * See the License for the specific language governing permissions and | 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. | 14 | * limitations under the License. |
| 15 | */ | 15 | */ |
| 16 | -package org.onosproject.net.resource; | 16 | +package org.onosproject.store.resource.impl; |
| 17 | 17 | ||
| 18 | import com.esotericsoftware.kryo.Kryo; | 18 | import com.esotericsoftware.kryo.Kryo; |
| 19 | import com.esotericsoftware.kryo.Serializer; | 19 | import com.esotericsoftware.kryo.Serializer; |
| 20 | import com.esotericsoftware.kryo.io.Input; | 20 | import com.esotericsoftware.kryo.io.Input; |
| 21 | import com.esotericsoftware.kryo.io.Output; | 21 | import com.esotericsoftware.kryo.io.Output; |
| 22 | -import com.google.common.annotations.Beta; | ||
| 23 | import com.google.common.collect.DiscreteDomain; | 22 | import com.google.common.collect.DiscreteDomain; |
| 24 | import com.google.common.collect.Range; | 23 | import com.google.common.collect.Range; |
| 25 | import com.google.common.collect.TreeRangeSet; | 24 | import com.google.common.collect.TreeRangeSet; |
| 26 | import org.onlab.util.ClosedOpenRange; | 25 | import org.onlab.util.ClosedOpenRange; |
| 27 | -import org.onlab.util.Tools; | 26 | +import org.onosproject.net.resource.DiscreteResourceCodec; |
| 28 | 27 | ||
| 29 | import java.util.ArrayList; | 28 | import java.util.ArrayList; |
| 29 | +import java.util.HashSet; | ||
| 30 | +import java.util.LinkedHashSet; | ||
| 30 | import java.util.List; | 31 | import java.util.List; |
| 31 | -import java.util.Set; | ||
| 32 | import java.util.stream.Collectors; | 32 | import java.util.stream.Collectors; |
| 33 | import java.util.stream.IntStream; | 33 | import java.util.stream.IntStream; |
| 34 | 34 | ||
| 35 | /** | 35 | /** |
| 36 | - * Kryo serializer for {@link DiscreteResourceSet}. | 36 | + * Kryo Serializer for {@link EncodedDiscreteResources}. |
| 37 | */ | 37 | */ |
| 38 | -@Beta | 38 | +final class EncodedResourcesSerializer extends Serializer<EncodedDiscreteResources> { |
| 39 | -public final class DiscreteResourceSetSerializer extends Serializer<DiscreteResourceSet> { | ||
| 40 | - | ||
| 41 | - public DiscreteResourceSetSerializer() { | ||
| 42 | - super(false, true); | ||
| 43 | - } | ||
| 44 | - | ||
| 45 | @Override | 39 | @Override |
| 46 | - public void write(Kryo kryo, Output output, DiscreteResourceSet object) { | 40 | + public void write(Kryo kryo, Output output, EncodedDiscreteResources object) { |
| 47 | TreeRangeSet<Integer> rangeSet = TreeRangeSet.create(); | 41 | TreeRangeSet<Integer> rangeSet = TreeRangeSet.create(); |
| 48 | - object.values().stream() | 42 | + object.rawValues().stream() |
| 49 | - .map(x -> x.valueAs(Object.class)) | ||
| 50 | - .flatMap(Tools::stream) | ||
| 51 | - .map(x -> object.codec().encode(x)) | ||
| 52 | .map(Range::singleton) | 43 | .map(Range::singleton) |
| 53 | .map(x -> x.canonical(DiscreteDomain.integers())) | 44 | .map(x -> x.canonical(DiscreteDomain.integers())) |
| 54 | .forEach(rangeSet::add); | 45 | .forEach(rangeSet::add); |
| ... | @@ -57,26 +48,18 @@ public final class DiscreteResourceSetSerializer extends Serializer<DiscreteReso | ... | @@ -57,26 +48,18 @@ public final class DiscreteResourceSetSerializer extends Serializer<DiscreteReso |
| 57 | .collect(Collectors.toList()); | 48 | .collect(Collectors.toList()); |
| 58 | kryo.writeObject(output, ranges); | 49 | kryo.writeObject(output, ranges); |
| 59 | kryo.writeClassAndObject(output, object.codec()); | 50 | kryo.writeClassAndObject(output, object.codec()); |
| 60 | - kryo.writeObject(output, object.parent()); | ||
| 61 | } | 51 | } |
| 62 | 52 | ||
| 63 | @Override | 53 | @Override |
| 64 | - public DiscreteResourceSet read(Kryo kryo, Input input, Class<DiscreteResourceSet> type) { | 54 | + public EncodedDiscreteResources read(Kryo kryo, Input input, Class<EncodedDiscreteResources> cls) { |
| 65 | @SuppressWarnings("unchecked") | 55 | @SuppressWarnings("unchecked") |
| 66 | List<ClosedOpenRange> ranges = kryo.readObject(input, ArrayList.class); | 56 | List<ClosedOpenRange> ranges = kryo.readObject(input, ArrayList.class); |
| 67 | DiscreteResourceCodec codec = (DiscreteResourceCodec) kryo.readClassAndObject(input); | 57 | DiscreteResourceCodec codec = (DiscreteResourceCodec) kryo.readClassAndObject(input); |
| 68 | - DiscreteResourceId parent = kryo.readObject(input, DiscreteResourceId.class); | ||
| 69 | 58 | ||
| 70 | - if (ranges.isEmpty()) { | 59 | + HashSet<Integer> rawValues = ranges.stream() |
| 71 | - return DiscreteResourceSet.empty(); | ||
| 72 | - } | ||
| 73 | - | ||
| 74 | - Set<DiscreteResource> resources = ranges.stream() | ||
| 75 | .flatMapToInt(x -> IntStream.range(x.lowerBound(), x.upperBound())) | 60 | .flatMapToInt(x -> IntStream.range(x.lowerBound(), x.upperBound())) |
| 76 | - .mapToObj(x -> codec.decode(x)) | 61 | + .boxed() |
| 77 | - .map(x -> Resources.discrete(parent, x).resource()) | 62 | + .collect(Collectors.toCollection(LinkedHashSet::new)); |
| 78 | - .collect(Collectors.toSet()); | 63 | + return new EncodedDiscreteResources(rawValues, codec); |
| 79 | - | ||
| 80 | - return DiscreteResourceSet.of(resources, codec); | ||
| 81 | } | 64 | } |
| 82 | } | 65 | } | ... | ... |
| ... | @@ -195,10 +195,7 @@ import org.onosproject.net.resource.ContinuousResourceId; | ... | @@ -195,10 +195,7 @@ import org.onosproject.net.resource.ContinuousResourceId; |
| 195 | import org.onosproject.net.resource.DiscreteResource; | 195 | import org.onosproject.net.resource.DiscreteResource; |
| 196 | import org.onosproject.net.resource.DiscreteResourceCodec; | 196 | import org.onosproject.net.resource.DiscreteResourceCodec; |
| 197 | import org.onosproject.net.resource.DiscreteResourceId; | 197 | import org.onosproject.net.resource.DiscreteResourceId; |
| 198 | -import org.onosproject.net.resource.DiscreteResourceSet; | ||
| 199 | -import org.onosproject.net.resource.DiscreteResourceSetSerializer; | ||
| 200 | import org.onosproject.net.resource.MplsCodec; | 198 | import org.onosproject.net.resource.MplsCodec; |
| 201 | -import org.onosproject.net.resource.NoOpCodec; | ||
| 202 | import org.onosproject.net.resource.ResourceAllocation; | 199 | import org.onosproject.net.resource.ResourceAllocation; |
| 203 | import org.onosproject.net.resource.ResourceConsumerId; | 200 | import org.onosproject.net.resource.ResourceConsumerId; |
| 204 | import org.onosproject.net.packet.DefaultOutboundPacket; | 201 | import org.onosproject.net.packet.DefaultOutboundPacket; |
| ... | @@ -538,11 +535,9 @@ public final class KryoNamespaces { | ... | @@ -538,11 +535,9 @@ public final class KryoNamespaces { |
| 538 | org.onlab.packet.MPLS.class | 535 | org.onlab.packet.MPLS.class |
| 539 | ) | 536 | ) |
| 540 | .register(ClosedOpenRange.class) | 537 | .register(ClosedOpenRange.class) |
| 541 | - .register(new DiscreteResourceSetSerializer(), DiscreteResourceSet.class) | ||
| 542 | .register(DiscreteResourceCodec.class) | 538 | .register(DiscreteResourceCodec.class) |
| 543 | .register(VlanCodec.class) | 539 | .register(VlanCodec.class) |
| 544 | .register(MplsCodec.class) | 540 | .register(MplsCodec.class) |
| 545 | - .register(NoOpCodec.class) | ||
| 546 | .register(ImmutableByteSequence.class) | 541 | .register(ImmutableByteSequence.class) |
| 547 | .build("API"); | 542 | .build("API"); |
| 548 | 543 | ... | ... |
| ... | @@ -24,7 +24,6 @@ import org.junit.After; | ... | @@ -24,7 +24,6 @@ import org.junit.After; |
| 24 | import org.junit.Before; | 24 | import org.junit.Before; |
| 25 | import org.junit.BeforeClass; | 25 | import org.junit.BeforeClass; |
| 26 | import org.junit.Test; | 26 | import org.junit.Test; |
| 27 | -import org.onlab.packet.MplsLabel; | ||
| 28 | import org.onlab.packet.VlanId; | 27 | import org.onlab.packet.VlanId; |
| 29 | import org.onlab.util.Bandwidth; | 28 | import org.onlab.util.Bandwidth; |
| 30 | import org.onlab.util.Frequency; | 29 | import org.onlab.util.Frequency; |
| ... | @@ -63,9 +62,6 @@ import org.onosproject.net.flow.FlowId; | ... | @@ -63,9 +62,6 @@ import org.onosproject.net.flow.FlowId; |
| 63 | import org.onosproject.net.flow.FlowRule; | 62 | import org.onosproject.net.flow.FlowRule; |
| 64 | import org.onosproject.net.flow.FlowRuleBatchEntry; | 63 | import org.onosproject.net.flow.FlowRuleBatchEntry; |
| 65 | import org.onosproject.net.intent.IntentId; | 64 | import org.onosproject.net.intent.IntentId; |
| 66 | -import org.onosproject.net.resource.DiscreteResource; | ||
| 67 | -import org.onosproject.net.resource.DiscreteResourceSet; | ||
| 68 | -import org.onosproject.net.resource.MplsCodec; | ||
| 69 | import org.onosproject.net.resource.ResourceAllocation; | 65 | import org.onosproject.net.resource.ResourceAllocation; |
| 70 | import org.onosproject.net.resource.ResourceConsumerId; | 66 | import org.onosproject.net.resource.ResourceConsumerId; |
| 71 | import org.onosproject.net.resource.Resources; | 67 | import org.onosproject.net.resource.Resources; |
| ... | @@ -84,15 +80,11 @@ import org.onlab.packet.IpPrefix; | ... | @@ -84,15 +80,11 @@ import org.onlab.packet.IpPrefix; |
| 84 | import org.onlab.packet.Ip4Prefix; | 80 | import org.onlab.packet.Ip4Prefix; |
| 85 | import org.onlab.packet.Ip6Prefix; | 81 | import org.onlab.packet.Ip6Prefix; |
| 86 | import org.onlab.packet.MacAddress; | 82 | import org.onlab.packet.MacAddress; |
| 87 | -import org.onosproject.net.resource.VlanCodec; | ||
| 88 | 83 | ||
| 89 | import java.nio.ByteBuffer; | 84 | import java.nio.ByteBuffer; |
| 90 | import java.util.Arrays; | 85 | import java.util.Arrays; |
| 91 | import java.util.Collections; | 86 | import java.util.Collections; |
| 92 | import java.time.Duration; | 87 | import java.time.Duration; |
| 93 | -import java.util.Set; | ||
| 94 | -import java.util.stream.Collectors; | ||
| 95 | -import java.util.stream.IntStream; | ||
| 96 | 88 | ||
| 97 | import static java.util.Arrays.asList; | 89 | import static java.util.Arrays.asList; |
| 98 | import static org.junit.Assert.*; | 90 | import static org.junit.Assert.*; |
| ... | @@ -355,38 +347,6 @@ public class KryoSerializerTest { | ... | @@ -355,38 +347,6 @@ public class KryoSerializerTest { |
| 355 | } | 347 | } |
| 356 | 348 | ||
| 357 | @Test | 349 | @Test |
| 358 | - public void testVlanIdResourceSet() { | ||
| 359 | - DiscreteResource port = Resources.discrete(DID1, P1).resource(); | ||
| 360 | - | ||
| 361 | - Set<DiscreteResource> vlans = IntStream.range(0, 4096) | ||
| 362 | - .mapToObj(x -> VlanId.vlanId((short) x)) | ||
| 363 | - .map(x -> Resources.discrete(port.id(), x).resource()) | ||
| 364 | - .collect(Collectors.toSet()); | ||
| 365 | - | ||
| 366 | - DiscreteResourceSet sut = DiscreteResourceSet.of(vlans, new VlanCodec()); | ||
| 367 | - testSerializedEquals(sut); | ||
| 368 | - } | ||
| 369 | - | ||
| 370 | - @Test | ||
| 371 | - public void testMplsLabelResourceSet() { | ||
| 372 | - DiscreteResource port = Resources.discrete(DID1, P1).resource(); | ||
| 373 | - | ||
| 374 | - Set<DiscreteResource> labels = IntStream.range(0, 1024) | ||
| 375 | - .mapToObj(MplsLabel::mplsLabel) | ||
| 376 | - .map(x -> Resources.discrete(port.id(), x).resource()) | ||
| 377 | - .collect(Collectors.toSet()); | ||
| 378 | - | ||
| 379 | - DiscreteResourceSet sut = DiscreteResourceSet.of(labels, new MplsCodec()); | ||
| 380 | - testSerializedEquals(sut); | ||
| 381 | - } | ||
| 382 | - | ||
| 383 | - @Test | ||
| 384 | - public void testEmptyResourceSet() { | ||
| 385 | - DiscreteResourceSet sut = DiscreteResourceSet.empty(); | ||
| 386 | - testSerializedEquals(sut); | ||
| 387 | - } | ||
| 388 | - | ||
| 389 | - @Test | ||
| 390 | public void testResourceId() { | 350 | public void testResourceId() { |
| 391 | testSerializedEquals(Resources.discrete(DID1, P1).id()); | 351 | testSerializedEquals(Resources.discrete(DID1, P1).id()); |
| 392 | } | 352 | } | ... | ... |
-
Please register or login to post a comment