private List<MapRequest> translateBuffersToMapRequest(byte[][] buffers) {
final List<MapRequest> mapRequests = new ArrayList<>();
for (byte[] buffer : buffers) {
+ if (isBufferEmpty(buffer)) {
+ LOG.error("Empty buffer while translating Map-Request");
+ continue;
+ }
final MapRequest mapRequest = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buffer), null);
assertNotNull(mapRequest);
mapRequests.add(mapRequest);
fail("No SMR received!");
}
List<MapRequest> mapRequests = translateBuffersToMapRequest(buffers);
+ if (hosts.length != mapRequests.size()) {
+ LOG.error("Expected {} SMRs, received {}", hosts.length, mapRequests.size());
+ fail("Unexpected number of SMRs received");
+ }
final Set<Eid> eids = prepareExpectedEid(hosts);
final SourceEid expectedSourceEid = prepareSourceEid(site);
for(MapRequest mapRequest : mapRequests) {
+ LOG.trace("Map-Request: {}", mapRequest);
assertTrue(mapRequest.isSmr());
final SourceEid receivedSourceEid = mapRequest.getSourceEid();
assertEquals(expectedSourceEid, receivedSourceEid);
return true;
}
+ private static boolean isBufferEmpty(byte[] buffer) {
+ for (byte b : buffer) {
+ if (b != 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
protected static boolean areBuffersEmpty(byte[][] buffers) {
for (byte[] buffer : buffers) {
- for (byte b : buffer) {
- if (b != 0) {
- return false;
- }
+ if (!isBufferEmpty(buffer)) {
+ return false;
}
}
return true;
import org.apache.commons.lang3.BooleanUtils;
import org.opendaylight.controller.md.sal.binding.api.NotificationService;
import org.opendaylight.lispflowmapping.config.ConfigIni;
+import org.opendaylight.lispflowmapping.implementation.util.LoggingUtil;
import org.opendaylight.lispflowmapping.implementation.util.MSNotificationInputUtil;
import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber;
import org.opendaylight.lispflowmapping.lisp.util.MapRequestUtil;
import org.opendaylight.lispflowmapping.lisp.util.MappingRecordUtil;
import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
-import org.opendaylight.lispflowmapping.mapcache.lisp.LispMapCacheStringifier;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
if (oldMapping != null && !oldMapping.getEid().equals(eid)) {
subscribers = addParentSubscribers(eid, subscribers);
}
+ LoggingUtil.logSubscribers(LOG, eid, subscribers);
handleSmr(eid, subscribers);
if (oldMapping != null && oldMappingRemoved && !oldMapping.getEid().equals(eid)) {
subscribers = getSubscribers(oldMapping.getEid());
+ LoggingUtil.logSubscribers(LOG, oldMapping.getEid(), subscribers);
handleSmr(oldMapping.getEid(), subscribers);
}
mappingUpdated = true;
@Override
public void onMappingChanged(MappingChanged notification) {
- LOG.trace("MappingChanged event of type {}", notification.getChangeType());
+ LOG.trace("MappingChanged event of type: `{}'", notification.getChangeType());
if (subscriptionService) {
Eid eid = notification.getMappingRecord().getEid();
Set<Subscriber> subscribers = MSNotificationInputUtil.toSubscriberSet(notification.getSubscriberItem());
- LOG.trace("Subscribers:\n{}", LispMapCacheStringifier.prettyPrintSubscriberSet(subscribers, 0));
+ LoggingUtil.logSubscribers(LOG, eid, subscribers);
if (mapService.isMaster()) {
sendSmrs(eid, subscribers);
if (eid.getAddress() instanceof SourceDestKey) {
Set<Subscriber> dstSubscribers = MSNotificationInputUtil.toSubscriberSetFromDst(
notification.getDstSubscriberItem());
- LOG.trace("DstSubscribers:\n{}", LispMapCacheStringifier.prettyPrintSubscriberSet(subscribers, 0));
+ LoggingUtil.logSubscribers(LOG, SourceDestKeyHelper.getDstBinary(eid), dstSubscribers);
sendSmrs(SourceDestKeyHelper.getDstBinary(eid), dstSubscribers);
}
}
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface current = interfaces.nextElement();
- LOG.debug("Interface " + current.toString());
+ LOG.trace("Interface " + current.toString());
if (!current.isUp() || current.isLoopback() || current.isVirtual()) {
continue;
}
LOG.debug("Lazy removing expired subscriber entry " + subscriber.getString());
subscribers.remove();
} else {
+ final Eid srcEid = mrb.getSourceEid().getEid();
final ScheduledFuture<?> future = executor.scheduleAtFixedRate(new CancellableRunnable(
mrb, subscriber), 0L, ConfigIni.getInstance().getSmrTimeout(), TimeUnit.MILLISECONDS);
final IpAddressBinary subscriberAddress = LispAddressUtil
.addressBinaryFromAddress(subscriber.getSrcRloc().getAddress());
if (subscriberFutureMap.containsKey(subscriberAddress)) {
- subscriberFutureMap.get(subscriberAddress).put(mrb.getSourceEid().getEid(), future);
+ subscriberFutureMap.get(subscriberAddress).put(srcEid, future);
} else {
final Map<Eid, ScheduledFuture<?>> eidFutureMap = Maps.newConcurrentMap();
- eidFutureMap.put(mrb.getSourceEid().getEid(), future);
+ eidFutureMap.put(srcEid, future);
subscriberFutureMap.put(subscriberAddress, eidFutureMap);
}
}
if (eidFutureMap != null) {
final ScheduledFuture<?> future = eidFutureMap.get(event.getEid());
if (future != null && !future.isCancelled()) {
- future.cancel(false);
- LOG.debug("SMR-invoked MapRequest received, scheduled task for subscriber {} with nonce {} has "
- + "been canceled", subscriberAddress.toString(), event.getNonce());
+ future.cancel(true);
+ LOG.debug("SMR-invoked MapRequest received, scheduled task for subscriber {}, EID {} with"
+ + " nonce {} has been cancelled", subscriberAddress.toString(),
+ LispAddressStringifier.getString(event.getEid()), event.getNonce());
eidFutureMap.remove(event.getEid());
}
if (eidFutureMap.isEmpty()) {
public void run() {
final IpAddressBinary subscriberAddress = LispAddressUtil
.addressBinaryFromAddress(subscriber.getSrcRloc().getAddress());
+ final Eid srcEid = mrb.getSourceEid().getEid();
+
try {
// The address stored in the SMR's EID record is used as Source EID in the SMR-invoked
// Map-Request. To ensure consistent behavior it is set to the value used to originally request
// a given mapping.
if (executionCount <= ConfigIni.getInstance().getSmrRetryCount()) {
- mrb.setEidItem(new ArrayList<EidItem>());
- mrb.getEidItem().add(new EidItemBuilder().setEid(subscriber.getSrcEid()).build());
- notifyHandler.handleSMR(mrb.build(), subscriber.getSrcRloc());
- LOG.trace("{}. attempt to send SMR for MapRequest " + mrb.getSourceEid().getEid()
- + " to subscriber " + subscriber.getSrcRloc(), executionCount);
+ synchronized (mrb) {
+ mrb.setEidItem(new ArrayList<EidItem>());
+ mrb.getEidItem().add(new EidItemBuilder().setEid(subscriber.getSrcEid()).build());
+ notifyHandler.handleSMR(mrb.build(), subscriber.getSrcRloc());
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Attempt #{} to send SMR for EID {} to subscriber {}, source EID {}",
+ executionCount,
+ LispAddressStringifier.getString(mrb.getSourceEid().getEid()),
+ LispAddressStringifier.getString(subscriber.getSrcRloc()),
+ LispAddressStringifier.getString(mrb.getEidItem().get(0).getEid()));
+ }
+ }
} else {
LOG.trace("Cancelling execution of a SMR Map-Request after {} failed attempts.",
executionCount - 1);
- cancelAndRemove(subscriberAddress);
+ cancelAndRemove(subscriberAddress, srcEid);
+ return;
}
} catch (Exception e) {
LOG.error("Errors encountered while handling SMR:", e);
- cancelAndRemove(subscriberAddress);
+ cancelAndRemove(subscriberAddress, srcEid);
+ return;
}
executionCount++;
}
- private void cancelAndRemove(IpAddressBinary subscriberAddress) {
+ private void cancelAndRemove(IpAddressBinary subscriberAddress, Eid eid) {
final Map<Eid, ScheduledFuture<?>> eidFutureMap = subscriberFutureMap.get(subscriberAddress);
if (eidFutureMap == null) {
LOG.warn("Couldn't find subscriber {} in SMR scheduler internal list", subscriberAddress);
return;
}
- final Eid eid = mrb.getSourceEid().getEid();
+
if (eidFutureMap.containsKey(eid)) {
- eidFutureMap.get(eid).cancel(false);
+ ScheduledFuture<?> eidFuture = eidFutureMap.get(eid);
+ eidFutureMap.remove(eid);
+ eidFuture.cancel(false);
}
- eidFutureMap.remove(eid);
if (eidFutureMap.isEmpty()) {
subscriberFutureMap.remove(subscriberAddress);
}