Yuta HIGUCHI

LinkStore bugfix. avoid DIRECT -> INDIRECT transition

Change-Id: If2a4c3e5e33f705a73374010cd7941167cef1aaf
...@@ -23,9 +23,9 @@ import org.onlab.onos.net.DefaultAnnotations; ...@@ -23,9 +23,9 @@ import org.onlab.onos.net.DefaultAnnotations;
23 import org.onlab.onos.net.DefaultLink; 23 import org.onlab.onos.net.DefaultLink;
24 import org.onlab.onos.net.DeviceId; 24 import org.onlab.onos.net.DeviceId;
25 import org.onlab.onos.net.Link; 25 import org.onlab.onos.net.Link;
26 -import org.onlab.onos.net.SparseAnnotations;
27 import org.onlab.onos.net.Link.Type; 26 import org.onlab.onos.net.Link.Type;
28 import org.onlab.onos.net.LinkKey; 27 import org.onlab.onos.net.LinkKey;
28 +import org.onlab.onos.net.SparseAnnotations;
29 import org.onlab.onos.net.device.DeviceClockService; 29 import org.onlab.onos.net.device.DeviceClockService;
30 import org.onlab.onos.net.link.DefaultLinkDescription; 30 import org.onlab.onos.net.link.DefaultLinkDescription;
31 import org.onlab.onos.net.link.LinkDescription; 31 import org.onlab.onos.net.link.LinkDescription;
...@@ -263,7 +263,7 @@ public class GossipLinkStore ...@@ -263,7 +263,7 @@ public class GossipLinkStore
263 ProviderId providerId, 263 ProviderId providerId,
264 Timestamped<LinkDescription> linkDescription) { 264 Timestamped<LinkDescription> linkDescription) {
265 265
266 - LinkKey key = linkKey(linkDescription.value().src(), 266 + final LinkKey key = linkKey(linkDescription.value().src(),
267 linkDescription.value().dst()); 267 linkDescription.value().dst());
268 Map<ProviderId, Timestamped<LinkDescription>> descs = getOrCreateLinkDescriptions(key); 268 Map<ProviderId, Timestamped<LinkDescription>> descs = getOrCreateLinkDescriptions(key);
269 269
...@@ -275,6 +275,7 @@ public class GossipLinkStore ...@@ -275,6 +275,7 @@ public class GossipLinkStore
275 if (linkDescription.isNewer(linkRemovedTimestamp)) { 275 if (linkDescription.isNewer(linkRemovedTimestamp)) {
276 removedLinks.remove(key); 276 removedLinks.remove(key);
277 } else { 277 } else {
278 + log.trace("Link {} was already removed ignoring.", key);
278 return null; 279 return null;
279 } 280 }
280 } 281 }
...@@ -299,17 +300,25 @@ public class GossipLinkStore ...@@ -299,17 +300,25 @@ public class GossipLinkStore
299 // merge existing annotations 300 // merge existing annotations
300 Timestamped<LinkDescription> existingLinkDescription = descs.get(providerId); 301 Timestamped<LinkDescription> existingLinkDescription = descs.get(providerId);
301 if (existingLinkDescription != null && existingLinkDescription.isNewer(linkDescription)) { 302 if (existingLinkDescription != null && existingLinkDescription.isNewer(linkDescription)) {
303 + log.trace("local info is more up-to-date, ignoring {}.", linkDescription);
302 return null; 304 return null;
303 } 305 }
304 Timestamped<LinkDescription> newLinkDescription = linkDescription; 306 Timestamped<LinkDescription> newLinkDescription = linkDescription;
305 if (existingLinkDescription != null) { 307 if (existingLinkDescription != null) {
308 + // we only allow transition from INDIRECT -> DIRECT
309 + final Type newType;
310 + if (existingLinkDescription.value().type() == DIRECT) {
311 + newType = DIRECT;
312 + } else {
313 + newType = linkDescription.value().type();
314 + }
306 SparseAnnotations merged = union(existingLinkDescription.value().annotations(), 315 SparseAnnotations merged = union(existingLinkDescription.value().annotations(),
307 linkDescription.value().annotations()); 316 linkDescription.value().annotations());
308 newLinkDescription = new Timestamped<LinkDescription>( 317 newLinkDescription = new Timestamped<LinkDescription>(
309 new DefaultLinkDescription( 318 new DefaultLinkDescription(
310 linkDescription.value().src(), 319 linkDescription.value().src(),
311 linkDescription.value().dst(), 320 linkDescription.value().dst(),
312 - linkDescription.value().type(), merged), 321 + newType, merged),
313 linkDescription.timestamp()); 322 linkDescription.timestamp());
314 } 323 }
315 return descs.put(providerId, newLinkDescription); 324 return descs.put(providerId, newLinkDescription);
...@@ -343,6 +352,8 @@ public class GossipLinkStore ...@@ -343,6 +352,8 @@ public class GossipLinkStore
343 return null; 352 return null;
344 } 353 }
345 354
355 + // Note: INDIRECT -> DIRECT transition only
356 + // so that BDDP discovered Link will not overwrite LDDP Link
346 if ((oldLink.type() == INDIRECT && newLink.type() == DIRECT) || 357 if ((oldLink.type() == INDIRECT && newLink.type() == DIRECT) ||
347 !AnnotationsUtil.isEqual(oldLink.annotations(), newLink.annotations())) { 358 !AnnotationsUtil.isEqual(oldLink.annotations(), newLink.annotations())) {
348 359
......
...@@ -172,12 +172,19 @@ public class SimpleLinkStore ...@@ -172,12 +172,19 @@ public class SimpleLinkStore
172 LinkDescription oldDesc = descs.get(providerId); 172 LinkDescription oldDesc = descs.get(providerId);
173 LinkDescription newDesc = linkDescription; 173 LinkDescription newDesc = linkDescription;
174 if (oldDesc != null) { 174 if (oldDesc != null) {
175 + // we only allow transition from INDIRECT -> DIRECT
176 + final Type newType;
177 + if (oldDesc.type() == DIRECT) {
178 + newType = DIRECT;
179 + } else {
180 + newType = linkDescription.type();
181 + }
175 SparseAnnotations merged = union(oldDesc.annotations(), 182 SparseAnnotations merged = union(oldDesc.annotations(),
176 linkDescription.annotations()); 183 linkDescription.annotations());
177 newDesc = new DefaultLinkDescription( 184 newDesc = new DefaultLinkDescription(
178 linkDescription.src(), 185 linkDescription.src(),
179 linkDescription.dst(), 186 linkDescription.dst(),
180 - linkDescription.type(), merged); 187 + newType, merged);
181 } 188 }
182 return descs.put(providerId, newDesc); 189 return descs.put(providerId, newDesc);
183 } 190 }
......