From: Robert Varga Date: Sat, 16 May 2015 00:21:19 +0000 (+0200) Subject: Optimize barrier-implied flushes X-Git-Tag: release/beryllium~63 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=f1f556a90176490a6044dbd76b0d14b9d81520c1;p=openflowjava.git Optimize barrier-implied flushes Original code did a full queue scan up to the current request. This is inefficient if there are previously-completed barriers, as we end up checking the same slots multiple times. Remember the offset of last completed future and only flush slots from that offset on subsequent barrier completion. Change-Id: I9715f9f7818de611c01d0cd2eaa7637ac5372e91 Signed-off-by: Robert Varga (cherry picked from commit 7da0dcda4b5d9e5c4510ceb8e4d7840696fbdd90) --- diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/connection/OutboundQueueImpl.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/connection/OutboundQueueImpl.java index 2d94b679..5d22435d 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/connection/OutboundQueueImpl.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/connection/OutboundQueueImpl.java @@ -37,6 +37,7 @@ final class OutboundQueueImpl implements OutboundQueue { // Updated from Netty only private int flushOffset; private int completeCount; + private int lastBarrierOffset = -1; OutboundQueueImpl(final OutboundQueueManager manager, final long baseXid, final int maxQueue) { /* @@ -233,29 +234,31 @@ final class OutboundQueueImpl implements OutboundQueue { // This has been a barrier -- make sure we complete all preceding requests if (entry.isBarrier()) { - LOG.debug("Barrier XID {} completed, cascading completion to XIDs {} to {}", xid, baseXid, xid - 1); - for (int i = 0; i < offset; ++i) { - final OutboundQueueEntry e = queue[i]; - if (!e.isCompleted() && e.complete(null)) { - completeCount++; - } - } + LOG.debug("Barrier XID {} completed, cascading completion to XIDs {} to {}", xid, baseXid + lastBarrierOffset + 1, xid - 1); + completeRequests(offset); + lastBarrierOffset = offset; } } return entry; } - void completeAll() { - for (OutboundQueueEntry entry : queue) { + private void completeRequests(final int toOffset) { + for (int i = lastBarrierOffset + 1; i < toOffset; ++i) { + final OutboundQueueEntry entry = queue[i]; if (!entry.isCompleted() && entry.complete(null)) { completeCount++; } } } + void completeAll() { + completeRequests(queue.length); + } + int failAll(final Throwable cause) { int ret = 0; - for (OutboundQueueEntry entry : queue) { + for (int i = lastBarrierOffset + 1; i < queue.length; ++i) { + final OutboundQueueEntry entry = queue[i]; if (!entry.isCompleted()) { entry.fail(cause); ret++;