diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java index a11d6793f93ad15ba919a4a98130490503233fdd..f9f44f460392d6fcfadb090af68556290461b6d1 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java +++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java @@ -69,6 +69,9 @@ import net.floodlightcontroller.counter.ICounterStoreService; import net.floodlightcontroller.debugcounter.IDebugCounterService; import net.floodlightcontroller.debugcounter.IDebugCounterService.CounterType; import net.floodlightcontroller.debugevent.IDebugEventService; +import net.floodlightcontroller.debugevent.NullDebugEvent; +import net.floodlightcontroller.debugevent.IDebugEventService.EventType; +import net.floodlightcontroller.debugevent.IDebugEventService.MaxEventsRegistered; import net.floodlightcontroller.packet.Ethernet; import net.floodlightcontroller.packet.IPv4; import net.floodlightcontroller.perfmon.IPktInProcessingTimeService; @@ -155,6 +158,8 @@ public class Controller implements IFloodlightProviderService, protected int openFlowPort = 6633; protected int workerThreads = 0; + // Event IDs for debug events + private int SWITCH_EVENT = -1; // This controller's current role that modules can use/query to decide // if they should operate in master or slave mode. @@ -931,6 +936,7 @@ public class Controller implements IFloodlightProviderService, IOFSwitch oldSw = this.activeSwitches.put(dpid, sw); // Update event history addSwitchEvent(dpid, EvAction.SWITCH_CONNECTED, "None"); + debugEvents.updateEvent(SWITCH_EVENT, new Object[] {sw.getId(), "connected"}); if (oldSw == sw) { // Note == for object equality, not .equals for value @@ -1110,6 +1116,7 @@ public class Controller implements IFloodlightProviderService, // in switchActivated(). Should we have events on the // slave as well? addSwitchEvent(dpid, EvAction.SWITCH_DISCONNECTED, "None"); + debugEvents.updateEvent(SWITCH_EVENT, new Object[] {dpid, "disconnected"}); counters.switchDisconnected.increment(); IOFSwitch oldSw = this.activeSwitches.get(dpid); if (oldSw != sw) { @@ -1361,7 +1368,6 @@ public class Controller implements IFloodlightProviderService, } evSwitch.reason = reason; evSwitch = evHistSwitch.put(evSwitch, actn); - debugEvents.flushEvents(); } } @@ -1773,9 +1779,6 @@ public class Controller implements IFloodlightProviderService, } } - - - void switchActivated(IOFSwitch sw) { this.switchManager.switchActivated(sw); } @@ -2239,6 +2242,23 @@ public class Controller implements IFloodlightProviderService, throw new FloodlightModuleException("Error while setting up sync service", e); } this.counters.createCounters(debugCounters); + registerControllerDebugEvents(); + } + + private void registerControllerDebugEvents() { + if (debugEvents == null) { + debugEvents = new NullDebugEvent(); + return; + } + try { + SWITCH_EVENT = debugEvents.registerEvent( + "controller", "switchevent", true, + "Switch connected, disconnected or port changed", + EventType.ALWAYS_LOG, 100, + "Sw=%dpid, reason=%s", null); + } catch (MaxEventsRegistered e) { + e.printStackTrace(); + } } @Override diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java index 169e539c22b11aa68fdcc3b6dd86cc93404e7ccb..2c47dacf5f10883dcd0fb0e92bb005bb23c8ae6f 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java +++ b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java @@ -1360,7 +1360,7 @@ class OFChannelHandler public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) throws Exception { OFMessage m = BasicFactory.getInstance().getMessage(OFType.ECHO_REQUEST); - e.getChannel().write(m); + e.getChannel().write(Collections.singletonList(m)); } @Override diff --git a/src/main/java/net/floodlightcontroller/debugevent/DebugEvent.java b/src/main/java/net/floodlightcontroller/debugevent/DebugEvent.java index 1595380ce1eec77b370c0c7b3d49fb2144a01e2b..1a43b970c13c0e7e3e8feea2dadf9eaa0c652787 100644 --- a/src/main/java/net/floodlightcontroller/debugevent/DebugEvent.java +++ b/src/main/java/net/floodlightcontroller/debugevent/DebugEvent.java @@ -269,7 +269,7 @@ public class DebugEvent implements IFloodlightModule, IDebugEventService { } le.nextIndex++; - if (le.nextIndex >= le.maxCapacity) { + if (le.nextIndex >= le.maxCapacity || le.flushNow) { // flush this buffer now DebugEventHistory de = allEvents[eventId]; if (de.einfo.enabled) { diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java index 2b7d72debf64a86f68fb5ca047c74a04a5e069b4..d9f111171897a66bbffaeb825e6cac75878fe303 100644 --- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java +++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java @@ -145,7 +145,6 @@ public class LinkDiscoveryManager implements IOFMessageListener, // Event Ids for debug events private int LINK_EVENT = -1; - private int SWITCH_EVENT = -1; protected IFloodlightProviderService floodlightProvider; protected IStorageSourceService storageSource; @@ -1648,9 +1647,6 @@ public class LinkDiscoveryManager implements IOFMessageListener, @Override public void switchRemoved(long sw) { - // Update event history - TODO move to controller.java - debugEvents.updateEvent(SWITCH_EVENT, new Object[] {sw, "disconnected"}); - List<Link> eraseList = new ArrayList<Link>(); lock.writeLock().lock(); try { @@ -1690,8 +1686,6 @@ public class LinkDiscoveryManager implements IOFMessageListener, processNewPort(sw.getId(), p); } } - // Update event history - TODO move to controller.java - debugEvents.updateEvent(SWITCH_EVENT, new Object[] {sw.getId(), "connected"}); LDUpdate update = new LDUpdate(sw.getId(), null, UpdateOperation.SWITCH_UPDATED); updates.add(update); @@ -2177,12 +2171,6 @@ public class LinkDiscoveryManager implements IOFMessageListener, return; } try { - SWITCH_EVENT = debugEvents.registerEvent( - getName(), "switchevent", true, - "Switch connected, disconnected or port changed", - EventType.ALWAYS_LOG, 100, - "Sw=%dpid, reason=%s", null); - LINK_EVENT = debugEvents.registerEvent( getName(), "linkevent", false, "Direct OpenFlow links discovered or timed-out", diff --git a/src/test/java/net/floodlightcontroller/debugevent/DebugEventTest.java b/src/test/java/net/floodlightcontroller/debugevent/DebugEventTest.java index 67d18288f43adde2a44b982cbaaf2ce8da24ce4f..d5fbedb9550046a6efcb7b34d301120d387fc0f7 100644 --- a/src/test/java/net/floodlightcontroller/debugevent/DebugEventTest.java +++ b/src/test/java/net/floodlightcontroller/debugevent/DebugEventTest.java @@ -25,30 +25,50 @@ public class DebugEventTest extends FloodlightTestCase { @Test public void testRegisterAndUpdateEvent() { assertEquals(0, debugEvent.currentEvents.size()); - int eventId = -1; + int eventId1 = -1, eventId2 = -1 ; try { - eventId = debugEvent.registerEvent("dbgevtest", "switchevent", true, + eventId1 = debugEvent.registerEvent("dbgevtest", "switchevent", true, "switchtest", EventType.ALWAYS_LOG, 100, "Sw=%dpid, reason=%s", null); + eventId2 = debugEvent.registerEvent("dbgevtest", "pktinevent", false, + "pktintest", EventType.ALWAYS_LOG, + 100, "Sw=%d, reason=%s", null); } catch (MaxEventsRegistered e) { e.printStackTrace(); } - assertEquals(1, debugEvent.currentEvents.size()); - assertEquals(eventId, debugEvent.moduleEvents.get("dbgevtest"). + assertEquals(2, debugEvent.currentEvents.size()); + assertEquals(eventId1, debugEvent.moduleEvents.get("dbgevtest"). get("switchevent").intValue()); + assertEquals(eventId2, debugEvent.moduleEvents.get("dbgevtest"). + get("pktinevent").intValue()); assertEquals(true, debugEvent.containsModName("dbgevtest")); assertEquals(true, debugEvent.containsMEName("dbgevtest-switchevent")); + assertEquals(true, debugEvent.containsMEName("dbgevtest-pktinevent")); + + assertEquals(0, DebugEvent.allEvents[eventId1].eventBuffer.size()); + assertEquals(0, DebugEvent.allEvents[eventId2].eventBuffer.size()); + + // update is immediately flushed to global store + debugEvent.updateEvent(eventId1, new Object[] {1L, "connected"}); + assertEquals(1, DebugEvent.allEvents[eventId1].eventBuffer.size()); + + // update is flushed only when flush is explicity called + debugEvent.updateEvent(eventId2, new Object[] {1L, "switch sent pkt-in"}); + assertEquals(0, DebugEvent.allEvents[eventId2].eventBuffer.size()); - assertEquals(0, DebugEvent.allEvents[eventId].eventBuffer.size()); - debugEvent.updateEvent(eventId, new Object[] {1L, "connected"}); - assertEquals(0, DebugEvent.allEvents[eventId].eventBuffer.size()); debugEvent.flushEvents(); - assertEquals(1, DebugEvent.allEvents[eventId].eventBuffer.size()); + assertEquals(1, DebugEvent.allEvents[eventId1].eventBuffer.size()); + assertEquals(1, DebugEvent.allEvents[eventId2].eventBuffer.size()); DebugEventInfo de = debugEvent.getSingleEventHistory("dbgevtest-switchevent"); assertEquals(1, de.events.size()); assertEquals(true, de.events.get(0) .contains("Sw=00:00:00:00:00:00:00:01, reason=connected")); + + DebugEventInfo de2 = debugEvent.getSingleEventHistory("dbgevtest-pktinevent"); + assertEquals(1, de2.events.size()); + assertEquals(true, de2.events.get(0) + .contains("Sw=1, reason=switch sent pkt-in")); } }