Fixes for a hanging issue when creating treemaps and multimaps through the storage parition client.
Change-Id: I3886310bcabbec7499a57f1e91b21e8a36d33e4e
Showing
2 changed files
with
61 additions
and
43 deletions
... | @@ -15,13 +15,12 @@ | ... | @@ -15,13 +15,12 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.store.primitives.impl; | 16 | package org.onosproject.store.primitives.impl; |
17 | 17 | ||
18 | -import java.util.Arrays; | 18 | +import com.google.common.collect.ImmutableList; |
19 | - | 19 | +import com.google.common.collect.Maps; |
20 | import io.atomix.catalyst.serializer.Serializer; | 20 | import io.atomix.catalyst.serializer.Serializer; |
21 | import io.atomix.catalyst.serializer.TypeSerializerFactory; | 21 | import io.atomix.catalyst.serializer.TypeSerializerFactory; |
22 | import io.atomix.manager.util.ResourceManagerTypeResolver; | 22 | import io.atomix.manager.util.ResourceManagerTypeResolver; |
23 | import io.atomix.variables.internal.LongCommands; | 23 | import io.atomix.variables.internal.LongCommands; |
24 | - | ||
25 | import org.onlab.util.Match; | 24 | import org.onlab.util.Match; |
26 | import org.onosproject.cluster.Leader; | 25 | import org.onosproject.cluster.Leader; |
27 | import org.onosproject.cluster.Leadership; | 26 | import org.onosproject.cluster.Leadership; |
... | @@ -31,7 +30,10 @@ import org.onosproject.store.primitives.MapUpdate; | ... | @@ -31,7 +30,10 @@ import org.onosproject.store.primitives.MapUpdate; |
31 | import org.onosproject.store.primitives.TransactionId; | 30 | import org.onosproject.store.primitives.TransactionId; |
32 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapCommands; | 31 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapCommands; |
33 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapFactory; | 32 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapFactory; |
33 | +import org.onosproject.store.primitives.resources.impl.AtomixConsistentMultimapCommands; | ||
34 | +import org.onosproject.store.primitives.resources.impl.AtomixConsistentSetMultimapFactory; | ||
34 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapCommands; | 35 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapCommands; |
36 | +import org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapFactory; | ||
35 | import org.onosproject.store.primitives.resources.impl.AtomixLeaderElectorCommands; | 37 | import org.onosproject.store.primitives.resources.impl.AtomixLeaderElectorCommands; |
36 | import org.onosproject.store.primitives.resources.impl.AtomixLeaderElectorFactory; | 38 | import org.onosproject.store.primitives.resources.impl.AtomixLeaderElectorFactory; |
37 | import org.onosproject.store.primitives.resources.impl.AtomixWorkQueueCommands; | 39 | import org.onosproject.store.primitives.resources.impl.AtomixWorkQueueCommands; |
... | @@ -47,8 +49,7 @@ import org.onosproject.store.service.Task; | ... | @@ -47,8 +49,7 @@ import org.onosproject.store.service.Task; |
47 | import org.onosproject.store.service.Versioned; | 49 | import org.onosproject.store.service.Versioned; |
48 | import org.onosproject.store.service.WorkQueueStats; | 50 | import org.onosproject.store.service.WorkQueueStats; |
49 | 51 | ||
50 | -import com.google.common.collect.ImmutableList; | 52 | +import java.util.Arrays; |
51 | -import com.google.common.collect.Maps; | ||
52 | 53 | ||
53 | /** | 54 | /** |
54 | * Serializer utility for Atomix Catalyst. | 55 | * Serializer utility for Atomix Catalyst. |
... | @@ -63,12 +64,12 @@ public final class CatalystSerializers { | ... | @@ -63,12 +64,12 @@ public final class CatalystSerializers { |
63 | TypeSerializerFactory factory = | 64 | TypeSerializerFactory factory = |
64 | new DefaultCatalystTypeSerializerFactory( | 65 | new DefaultCatalystTypeSerializerFactory( |
65 | org.onosproject.store.service.Serializer.using(Arrays.asList((KryoNamespaces.API)), | 66 | org.onosproject.store.service.Serializer.using(Arrays.asList((KryoNamespaces.API)), |
66 | - MapEntryUpdateResult.class, | 67 | + MapEntryUpdateResult.class, |
67 | - MapEntryUpdateResult.Status.class, | 68 | + MapEntryUpdateResult.Status.class, |
68 | - Transaction.State.class, | 69 | + Transaction.State.class, |
69 | - PrepareResult.class, | 70 | + PrepareResult.class, |
70 | - CommitResult.class, | 71 | + CommitResult.class, |
71 | - RollbackResult.class)); | 72 | + RollbackResult.class)); |
72 | // ONOS classes | 73 | // ONOS classes |
73 | serializer.register(Change.class, factory); | 74 | serializer.register(Change.class, factory); |
74 | serializer.register(Leader.class, factory); | 75 | serializer.register(Leader.class, factory); |
... | @@ -98,10 +99,13 @@ public final class CatalystSerializers { | ... | @@ -98,10 +99,13 @@ public final class CatalystSerializers { |
98 | serializer.resolve(new AtomixWorkQueueCommands.TypeResolver()); | 99 | serializer.resolve(new AtomixWorkQueueCommands.TypeResolver()); |
99 | serializer.resolve(new ResourceManagerTypeResolver()); | 100 | serializer.resolve(new ResourceManagerTypeResolver()); |
100 | serializer.resolve(new AtomixConsistentTreeMapCommands.TypeResolver()); | 101 | serializer.resolve(new AtomixConsistentTreeMapCommands.TypeResolver()); |
102 | + serializer.resolve(new AtomixConsistentMultimapCommands.TypeResolver()); | ||
101 | 103 | ||
102 | serializer.registerClassLoader(AtomixConsistentMapFactory.class) | 104 | serializer.registerClassLoader(AtomixConsistentMapFactory.class) |
103 | - .registerClassLoader(AtomixLeaderElectorFactory.class) | 105 | + .registerClassLoader(AtomixLeaderElectorFactory.class) |
104 | - .registerClassLoader(AtomixWorkQueueFactory.class); | 106 | + .registerClassLoader(AtomixWorkQueueFactory.class) |
107 | + .registerClassLoader(AtomixConsistentTreeMapFactory.class) | ||
108 | + .registerClassLoader(AtomixConsistentSetMultimapFactory.class); | ||
105 | 109 | ||
106 | return serializer; | 110 | return serializer; |
107 | } | 111 | } | ... | ... |
... | @@ -38,7 +38,12 @@ import java.util.function.Predicate; | ... | @@ -38,7 +38,12 @@ import java.util.function.Predicate; |
38 | import java.util.stream.Collectors; | 38 | import java.util.stream.Collectors; |
39 | 39 | ||
40 | /** | 40 | /** |
41 | - * Created by admin on 8/3/16. | 41 | + * An {@code AsyncConsistentTreeMap} that maps its operations to operations on |
42 | + * a differently typed {@code AsyncConsistentTreeMap} by transcoding operation | ||
43 | + * inputs and outputs. | ||
44 | + * | ||
45 | + * @param <V2> value type of other map | ||
46 | + * @param <V1> value type of this map | ||
42 | */ | 47 | */ |
43 | public class TranscodingAsyncConsistentTreeMap<V1, V2> | 48 | public class TranscodingAsyncConsistentTreeMap<V1, V2> |
44 | implements AsyncConsistentTreeMap<V1> { | 49 | implements AsyncConsistentTreeMap<V1> { |
... | @@ -79,7 +84,8 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -79,7 +84,8 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
79 | entry -> | 84 | entry -> |
80 | Maps.immutableEntry( | 85 | Maps.immutableEntry( |
81 | entry.getKey(), | 86 | entry.getKey(), |
82 | - entry.getValue().map(valueDecoder))); | 87 | + versionedValueTransform |
88 | + .apply(entry.getValue()))); | ||
83 | } | 89 | } |
84 | 90 | ||
85 | @Override | 91 | @Override |
... | @@ -90,7 +96,8 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -90,7 +96,8 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
90 | entry -> | 96 | entry -> |
91 | Maps.immutableEntry( | 97 | Maps.immutableEntry( |
92 | entry.getKey(), | 98 | entry.getKey(), |
93 | - entry.getValue().map(valueDecoder))); | 99 | + versionedValueTransform |
100 | + .apply(entry.getValue()))); | ||
94 | } | 101 | } |
95 | 102 | ||
96 | @Override | 103 | @Override |
... | @@ -99,19 +106,21 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -99,19 +106,21 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
99 | return backingMap | 106 | return backingMap |
100 | .higherEntry(key) | 107 | .higherEntry(key) |
101 | .thenApply(entry -> | 108 | .thenApply(entry -> |
102 | - Maps.immutableEntry( | 109 | + Maps.immutableEntry( |
103 | - entry.getKey(), | 110 | + entry.getKey(), |
104 | - entry.getValue().map(valueDecoder))); | 111 | + versionedValueTransform |
105 | -} | 112 | + .apply(entry.getValue()))); |
113 | + } | ||
106 | 114 | ||
107 | @Override | 115 | @Override |
108 | public CompletableFuture<Map.Entry<String, Versioned<V1>>> | 116 | public CompletableFuture<Map.Entry<String, Versioned<V1>>> |
109 | lowerEntry(String key) { | 117 | lowerEntry(String key) { |
110 | return backingMap.lowerEntry(key).thenApply( | 118 | return backingMap.lowerEntry(key).thenApply( |
111 | entry -> | 119 | entry -> |
112 | - Maps.immutableEntry( | 120 | + Maps.immutableEntry( |
113 | - entry.getKey(), | 121 | + entry.getKey(), |
114 | - entry.getValue().map(valueDecoder))); | 122 | + versionedValueTransform |
123 | + .apply(entry.getValue()))); | ||
115 | } | 124 | } |
116 | 125 | ||
117 | @Override | 126 | @Override |
... | @@ -120,8 +129,9 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -120,8 +129,9 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
120 | return backingMap.firstEntry() | 129 | return backingMap.firstEntry() |
121 | .thenApply(entry -> | 130 | .thenApply(entry -> |
122 | Maps.immutableEntry( | 131 | Maps.immutableEntry( |
123 | - entry.getKey(), | 132 | + entry.getKey(), |
124 | - entry.getValue().map(valueDecoder))); | 133 | + versionedValueTransform |
134 | + .apply(entry.getValue()))); | ||
125 | } | 135 | } |
126 | 136 | ||
127 | @Override | 137 | @Override |
... | @@ -131,7 +141,8 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -131,7 +141,8 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
131 | .thenApply( | 141 | .thenApply( |
132 | entry -> Maps.immutableEntry( | 142 | entry -> Maps.immutableEntry( |
133 | entry.getKey(), | 143 | entry.getKey(), |
134 | - entry.getValue().map(valueDecoder))); | 144 | + versionedValueTransform |
145 | + .apply(entry.getValue()))); | ||
135 | } | 146 | } |
136 | 147 | ||
137 | @Override | 148 | @Override |
... | @@ -141,7 +152,8 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -141,7 +152,8 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
141 | .thenApply( | 152 | .thenApply( |
142 | entry -> Maps.immutableEntry( | 153 | entry -> Maps.immutableEntry( |
143 | entry.getKey(), | 154 | entry.getKey(), |
144 | - entry.getValue().map(valueDecoder))); | 155 | + versionedValueTransform |
156 | + .apply(entry.getValue()))); | ||
145 | } | 157 | } |
146 | 158 | ||
147 | @Override | 159 | @Override |
... | @@ -150,7 +162,7 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -150,7 +162,7 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
150 | return backingMap.pollLastEntry() | 162 | return backingMap.pollLastEntry() |
151 | .thenApply(entry -> Maps.immutableEntry( | 163 | .thenApply(entry -> Maps.immutableEntry( |
152 | entry.getKey(), | 164 | entry.getKey(), |
153 | - entry.getValue().map(valueDecoder))); | 165 | + versionedValueTransform.apply(entry.getValue()))); |
154 | } | 166 | } |
155 | 167 | ||
156 | @Override | 168 | @Override |
... | @@ -210,7 +222,7 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -210,7 +222,7 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
210 | 222 | ||
211 | @Override | 223 | @Override |
212 | public CompletableFuture<Versioned<V1>> get(String key) { | 224 | public CompletableFuture<Versioned<V1>> get(String key) { |
213 | - return backingMap.get(key).thenApply(value -> value.map(valueDecoder)); | 225 | + return backingMap.get(key).thenApply(versionedValueTransform); |
214 | } | 226 | } |
215 | 227 | ||
216 | @Override | 228 | @Override |
... | @@ -237,18 +249,18 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -237,18 +249,18 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
237 | @Override | 249 | @Override |
238 | public CompletableFuture<Versioned<V1>> put(String key, V1 value) { | 250 | public CompletableFuture<Versioned<V1>> put(String key, V1 value) { |
239 | return backingMap.put(key, valueEncoder.apply(value)) | 251 | return backingMap.put(key, valueEncoder.apply(value)) |
240 | - .thenApply(v -> v.map(valueDecoder)); | 252 | + .thenApply(versionedValueTransform); |
241 | } | 253 | } |
242 | 254 | ||
243 | @Override | 255 | @Override |
244 | public CompletableFuture<Versioned<V1>> putAndGet(String key, V1 value) { | 256 | public CompletableFuture<Versioned<V1>> putAndGet(String key, V1 value) { |
245 | return backingMap.putAndGet(key, valueEncoder.apply(value)) | 257 | return backingMap.putAndGet(key, valueEncoder.apply(value)) |
246 | - .thenApply(v -> v.map(valueDecoder)); | 258 | + .thenApply(versionedValueTransform); |
247 | } | 259 | } |
248 | 260 | ||
249 | @Override | 261 | @Override |
250 | public CompletableFuture<Versioned<V1>> remove(String key) { | 262 | public CompletableFuture<Versioned<V1>> remove(String key) { |
251 | - return backingMap.remove(key).thenApply(v -> v.map(valueDecoder)); | 263 | + return backingMap.remove(key).thenApply(versionedValueTransform); |
252 | } | 264 | } |
253 | 265 | ||
254 | @Override | 266 | @Override |
... | @@ -264,7 +276,7 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -264,7 +276,7 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
264 | @Override | 276 | @Override |
265 | public CompletableFuture<Collection<Versioned<V1>>> values() { | 277 | public CompletableFuture<Collection<Versioned<V1>>> values() { |
266 | return backingMap.values().thenApply(valueSet -> valueSet.stream() | 278 | return backingMap.values().thenApply(valueSet -> valueSet.stream() |
267 | - .map(v -> v.map(valueDecoder)).collect(Collectors.toSet())); | 279 | + .map(versionedValueTransform).collect(Collectors.toSet())); |
268 | } | 280 | } |
269 | 281 | ||
270 | @Override | 282 | @Override |
... | @@ -272,19 +284,21 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -272,19 +284,21 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
272 | entrySet() { | 284 | entrySet() { |
273 | return backingMap.entrySet() | 285 | return backingMap.entrySet() |
274 | .thenApply( | 286 | .thenApply( |
275 | - entries -> entries | 287 | + entries -> entries |
276 | - .stream() | 288 | + .stream() |
277 | - .map(entry -> | 289 | + .map(entry -> |
278 | - Maps.immutableEntry(entry.getKey(), | 290 | + Maps.immutableEntry( |
279 | - entry.getValue() | 291 | + entry.getKey(), |
280 | - .map(valueDecoder))) | 292 | + versionedValueTransform |
281 | - .collect(Collectors.toSet())); | 293 | + .apply(entry.getValue()) |
282 | - } | 294 | + )) |
295 | + .collect(Collectors.toSet())); | ||
296 | + } | ||
283 | 297 | ||
284 | @Override | 298 | @Override |
285 | public CompletableFuture<Versioned<V1>> putIfAbsent(String key, V1 value) { | 299 | public CompletableFuture<Versioned<V1>> putIfAbsent(String key, V1 value) { |
286 | return backingMap.putIfAbsent(key, valueEncoder.apply(value)) | 300 | return backingMap.putIfAbsent(key, valueEncoder.apply(value)) |
287 | - .thenApply(v -> v.map(valueDecoder)); | 301 | + .thenApply(versionedValueTransform); |
288 | } | 302 | } |
289 | 303 | ||
290 | @Override | 304 | @Override |
... | @@ -300,7 +314,7 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> | ... | @@ -300,7 +314,7 @@ public class TranscodingAsyncConsistentTreeMap<V1, V2> |
300 | @Override | 314 | @Override |
301 | public CompletableFuture<Versioned<V1>> replace(String key, V1 value) { | 315 | public CompletableFuture<Versioned<V1>> replace(String key, V1 value) { |
302 | return backingMap.replace(key, valueEncoder.apply(value)) | 316 | return backingMap.replace(key, valueEncoder.apply(value)) |
303 | - .thenApply(v -> v.map(valueDecoder)); | 317 | + .thenApply(versionedValueTransform); |
304 | } | 318 | } |
305 | 319 | ||
306 | @Override | 320 | @Override | ... | ... |
-
Please register or login to post a comment