backport GossipLinkStore changes back to trivial.
Change-Id: I7900b33ac47aa890692f6598a85ff92a9c14a5f6
Showing
2 changed files
with
33 additions
and
32 deletions
... | @@ -348,7 +348,7 @@ public class SimpleDeviceStore | ... | @@ -348,7 +348,7 @@ public class SimpleDeviceStore |
348 | 348 | ||
349 | synchronized (descsMap) { | 349 | synchronized (descsMap) { |
350 | DeviceDescriptions descs = descsMap.get(providerId); | 350 | DeviceDescriptions descs = descsMap.get(providerId); |
351 | - // assuming all providers must to give DeviceDescription | 351 | + // assuming all providers must give DeviceDescription first |
352 | checkArgument(descs != null, | 352 | checkArgument(descs != null, |
353 | "Device description for Device ID %s from Provider %s was not found", | 353 | "Device description for Device ID %s from Provider %s was not found", |
354 | deviceId, providerId); | 354 | deviceId, providerId); | ... | ... |
1 | package org.onlab.onos.store.trivial.impl; | 1 | package org.onlab.onos.store.trivial.impl; |
2 | 2 | ||
3 | import com.google.common.base.Function; | 3 | import com.google.common.base.Function; |
4 | -import com.google.common.base.Predicate; | ||
5 | import com.google.common.collect.FluentIterable; | 4 | import com.google.common.collect.FluentIterable; |
6 | import com.google.common.collect.HashMultimap; | 5 | import com.google.common.collect.HashMultimap; |
7 | import com.google.common.collect.SetMultimap; | 6 | import com.google.common.collect.SetMultimap; |
8 | 7 | ||
9 | -import org.apache.commons.lang3.concurrent.ConcurrentUtils; | ||
10 | import org.apache.felix.scr.annotations.Activate; | 8 | import org.apache.felix.scr.annotations.Activate; |
11 | import org.apache.felix.scr.annotations.Component; | 9 | import org.apache.felix.scr.annotations.Component; |
12 | import org.apache.felix.scr.annotations.Deactivate; | 10 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -20,7 +18,6 @@ import org.onlab.onos.net.Link; | ... | @@ -20,7 +18,6 @@ import org.onlab.onos.net.Link; |
20 | import org.onlab.onos.net.SparseAnnotations; | 18 | import org.onlab.onos.net.SparseAnnotations; |
21 | import org.onlab.onos.net.Link.Type; | 19 | import org.onlab.onos.net.Link.Type; |
22 | import org.onlab.onos.net.LinkKey; | 20 | import org.onlab.onos.net.LinkKey; |
23 | -import org.onlab.onos.net.Provided; | ||
24 | import org.onlab.onos.net.link.DefaultLinkDescription; | 21 | import org.onlab.onos.net.link.DefaultLinkDescription; |
25 | import org.onlab.onos.net.link.LinkDescription; | 22 | import org.onlab.onos.net.link.LinkDescription; |
26 | import org.onlab.onos.net.link.LinkEvent; | 23 | import org.onlab.onos.net.link.LinkEvent; |
... | @@ -28,11 +25,12 @@ import org.onlab.onos.net.link.LinkStore; | ... | @@ -28,11 +25,12 @@ import org.onlab.onos.net.link.LinkStore; |
28 | import org.onlab.onos.net.link.LinkStoreDelegate; | 25 | import org.onlab.onos.net.link.LinkStoreDelegate; |
29 | import org.onlab.onos.net.provider.ProviderId; | 26 | import org.onlab.onos.net.provider.ProviderId; |
30 | import org.onlab.onos.store.AbstractStore; | 27 | import org.onlab.onos.store.AbstractStore; |
31 | -import org.onlab.util.NewConcurrentHashMap; | ||
32 | import org.slf4j.Logger; | 28 | import org.slf4j.Logger; |
33 | 29 | ||
34 | import java.util.Collections; | 30 | import java.util.Collections; |
31 | +import java.util.HashMap; | ||
35 | import java.util.HashSet; | 32 | import java.util.HashSet; |
33 | +import java.util.Map; | ||
36 | import java.util.Set; | 34 | import java.util.Set; |
37 | import java.util.Map.Entry; | 35 | import java.util.Map.Entry; |
38 | import java.util.concurrent.ConcurrentHashMap; | 36 | import java.util.concurrent.ConcurrentHashMap; |
... | @@ -47,6 +45,7 @@ import static org.onlab.onos.net.link.LinkEvent.Type.*; | ... | @@ -47,6 +45,7 @@ import static org.onlab.onos.net.link.LinkEvent.Type.*; |
47 | import static org.slf4j.LoggerFactory.getLogger; | 45 | import static org.slf4j.LoggerFactory.getLogger; |
48 | import static com.google.common.collect.Multimaps.synchronizedSetMultimap; | 46 | import static com.google.common.collect.Multimaps.synchronizedSetMultimap; |
49 | import static com.google.common.base.Predicates.notNull; | 47 | import static com.google.common.base.Predicates.notNull; |
48 | +import static com.google.common.base.Verify.verifyNotNull; | ||
50 | 49 | ||
51 | /** | 50 | /** |
52 | * Manages inventory of infrastructure links using trivial in-memory structures | 51 | * Manages inventory of infrastructure links using trivial in-memory structures |
... | @@ -61,8 +60,7 @@ public class SimpleLinkStore | ... | @@ -61,8 +60,7 @@ public class SimpleLinkStore |
61 | private final Logger log = getLogger(getClass()); | 60 | private final Logger log = getLogger(getClass()); |
62 | 61 | ||
63 | // Link inventory | 62 | // Link inventory |
64 | - private final ConcurrentMap<LinkKey, | 63 | + private final ConcurrentMap<LinkKey, Map<ProviderId, LinkDescription>> |
65 | - ConcurrentMap<ProviderId, LinkDescription>> | ||
66 | linkDescs = new ConcurrentHashMap<>(); | 64 | linkDescs = new ConcurrentHashMap<>(); |
67 | 65 | ||
68 | // Link instance cache | 66 | // Link instance cache |
... | @@ -151,7 +149,7 @@ public class SimpleLinkStore | ... | @@ -151,7 +149,7 @@ public class SimpleLinkStore |
151 | LinkDescription linkDescription) { | 149 | LinkDescription linkDescription) { |
152 | LinkKey key = linkKey(linkDescription.src(), linkDescription.dst()); | 150 | LinkKey key = linkKey(linkDescription.src(), linkDescription.dst()); |
153 | 151 | ||
154 | - ConcurrentMap<ProviderId, LinkDescription> descs = getLinkDescriptions(key); | 152 | + Map<ProviderId, LinkDescription> descs = getOrCreateLinkDescriptions(key); |
155 | synchronized (descs) { | 153 | synchronized (descs) { |
156 | final Link oldLink = links.get(key); | 154 | final Link oldLink = links.get(key); |
157 | // update description | 155 | // update description |
... | @@ -166,7 +164,7 @@ public class SimpleLinkStore | ... | @@ -166,7 +164,7 @@ public class SimpleLinkStore |
166 | 164 | ||
167 | // Guarded by linkDescs value (=locking each Link) | 165 | // Guarded by linkDescs value (=locking each Link) |
168 | private LinkDescription createOrUpdateLinkDescription( | 166 | private LinkDescription createOrUpdateLinkDescription( |
169 | - ConcurrentMap<ProviderId, LinkDescription> descs, | 167 | + Map<ProviderId, LinkDescription> descs, |
170 | ProviderId providerId, | 168 | ProviderId providerId, |
171 | LinkDescription linkDescription) { | 169 | LinkDescription linkDescription) { |
172 | 170 | ||
... | @@ -227,7 +225,7 @@ public class SimpleLinkStore | ... | @@ -227,7 +225,7 @@ public class SimpleLinkStore |
227 | @Override | 225 | @Override |
228 | public LinkEvent removeLink(ConnectPoint src, ConnectPoint dst) { | 226 | public LinkEvent removeLink(ConnectPoint src, ConnectPoint dst) { |
229 | final LinkKey key = linkKey(src, dst); | 227 | final LinkKey key = linkKey(src, dst); |
230 | - ConcurrentMap<ProviderId, LinkDescription> descs = getLinkDescriptions(key); | 228 | + Map<ProviderId, LinkDescription> descs = getOrCreateLinkDescriptions(key); |
231 | synchronized (descs) { | 229 | synchronized (descs) { |
232 | Link link = links.remove(key); | 230 | Link link = links.remove(key); |
233 | descs.clear(); | 231 | descs.clear(); |
... | @@ -247,8 +245,8 @@ public class SimpleLinkStore | ... | @@ -247,8 +245,8 @@ public class SimpleLinkStore |
247 | /** | 245 | /** |
248 | * @return primary ProviderID, or randomly chosen one if none exists | 246 | * @return primary ProviderID, or randomly chosen one if none exists |
249 | */ | 247 | */ |
250 | - private ProviderId pickPrimaryPID( | 248 | + // Guarded by linkDescs value (=locking each Link) |
251 | - ConcurrentMap<ProviderId, LinkDescription> providerDescs) { | 249 | + private ProviderId getBaseProviderId(Map<ProviderId, LinkDescription> providerDescs) { |
252 | 250 | ||
253 | ProviderId fallBackPrimary = null; | 251 | ProviderId fallBackPrimary = null; |
254 | for (Entry<ProviderId, LinkDescription> e : providerDescs.entrySet()) { | 252 | for (Entry<ProviderId, LinkDescription> e : providerDescs.entrySet()) { |
... | @@ -262,9 +260,10 @@ public class SimpleLinkStore | ... | @@ -262,9 +260,10 @@ public class SimpleLinkStore |
262 | return fallBackPrimary; | 260 | return fallBackPrimary; |
263 | } | 261 | } |
264 | 262 | ||
265 | - private Link composeLink(ConcurrentMap<ProviderId, LinkDescription> descs) { | 263 | + // Guarded by linkDescs value (=locking each Link) |
266 | - ProviderId primary = pickPrimaryPID(descs); | 264 | + private Link composeLink(Map<ProviderId, LinkDescription> descs) { |
267 | - LinkDescription base = descs.get(primary); | 265 | + ProviderId primary = getBaseProviderId(descs); |
266 | + LinkDescription base = descs.get(verifyNotNull(primary)); | ||
268 | 267 | ||
269 | ConnectPoint src = base.src(); | 268 | ConnectPoint src = base.src(); |
270 | ConnectPoint dst = base.dst(); | 269 | ConnectPoint dst = base.dst(); |
... | @@ -289,9 +288,20 @@ public class SimpleLinkStore | ... | @@ -289,9 +288,20 @@ public class SimpleLinkStore |
289 | return new DefaultLink(primary , src, dst, type, annotations); | 288 | return new DefaultLink(primary , src, dst, type, annotations); |
290 | } | 289 | } |
291 | 290 | ||
292 | - private ConcurrentMap<ProviderId, LinkDescription> getLinkDescriptions(LinkKey key) { | 291 | + private Map<ProviderId, LinkDescription> getOrCreateLinkDescriptions(LinkKey key) { |
293 | - return ConcurrentUtils.createIfAbsentUnchecked(linkDescs, key, | 292 | + Map<ProviderId, LinkDescription> r; |
294 | - NewConcurrentHashMap.<ProviderId, LinkDescription>ifNeeded()); | 293 | + r = linkDescs.get(key); |
294 | + if (r != null) { | ||
295 | + return r; | ||
296 | + } | ||
297 | + r = new HashMap<>(); | ||
298 | + final Map<ProviderId, LinkDescription> concurrentlyAdded; | ||
299 | + concurrentlyAdded = linkDescs.putIfAbsent(key, r); | ||
300 | + if (concurrentlyAdded == null) { | ||
301 | + return r; | ||
302 | + } else { | ||
303 | + return concurrentlyAdded; | ||
304 | + } | ||
295 | } | 305 | } |
296 | 306 | ||
297 | private final Function<LinkKey, Link> lookupLink = new LookupLink(); | 307 | private final Function<LinkKey, Link> lookupLink = new LookupLink(); |
... | @@ -302,20 +312,11 @@ public class SimpleLinkStore | ... | @@ -302,20 +312,11 @@ public class SimpleLinkStore |
302 | private final class LookupLink implements Function<LinkKey, Link> { | 312 | private final class LookupLink implements Function<LinkKey, Link> { |
303 | @Override | 313 | @Override |
304 | public Link apply(LinkKey input) { | 314 | public Link apply(LinkKey input) { |
305 | - return links.get(input); | 315 | + if (input == null) { |
306 | - } | 316 | + return null; |
307 | - } | 317 | + } else { |
308 | - | 318 | + return links.get(input); |
309 | - private static final Predicate<Provided> IS_PRIMARY = new IsPrimary(); | 319 | + } |
310 | - private static final Predicate<Provided> isPrimary() { | ||
311 | - return IS_PRIMARY; | ||
312 | - } | ||
313 | - | ||
314 | - private static final class IsPrimary implements Predicate<Provided> { | ||
315 | - | ||
316 | - @Override | ||
317 | - public boolean apply(Provided input) { | ||
318 | - return !input.providerId().isAncillary(); | ||
319 | } | 320 | } |
320 | } | 321 | } |
321 | } | 322 | } | ... | ... |
-
Please register or login to post a comment