diff options
author | Joakim Erdfelt | 2015-03-06 22:57:52 +0000 |
---|---|---|
committer | Joakim Erdfelt | 2015-03-06 22:57:52 +0000 |
commit | 130afb95358618bd4027f206f4915ea4d6d9bfff (patch) | |
tree | 2f1b1df1ffd511a455c948d767303ef6cb70addd /jetty-io | |
parent | 9b5205ba40e3b605dfff96b5c9e831a419d038d2 (diff) | |
parent | dd88d393e4aaf6b234c1dc00326941e7d34b6f92 (diff) | |
download | org.eclipse.jetty.project-130afb95358618bd4027f206f4915ea4d6d9bfff.tar.gz org.eclipse.jetty.project-130afb95358618bd4027f206f4915ea4d6d9bfff.tar.xz org.eclipse.jetty.project-130afb95358618bd4027f206f4915ea4d6d9bfff.zip |
Merge branch 'jetty-9.2.x'
Conflicts:
jetty-client/src/main/java/org/eclipse/jetty/client/LeakTrackingConnectionPool.java
jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientLoadTest.java
jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java
jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java
jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynDataReplyDataLoadTest.java
jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/TooFastClientTest.java
Diffstat (limited to 'jetty-io')
3 files changed, 57 insertions, 20 deletions
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/LeakTrackingByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/LeakTrackingByteBufferPool.java index 4192c448e2..a84428801c 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/LeakTrackingByteBufferPool.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/LeakTrackingByteBufferPool.java @@ -19,6 +19,7 @@ package org.eclipse.jetty.io; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicLong; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.LeakDetector; @@ -32,15 +33,16 @@ public class LeakTrackingByteBufferPool extends ContainerLifeCycle implements By private final LeakDetector<ByteBuffer> leakDetector = new LeakDetector<ByteBuffer>() { - @Override - protected void leaked(LeakInfo leakInfo) + public String id(ByteBuffer resource) { - LeakTrackingByteBufferPool.this.leaked(leakInfo); + return BufferUtil.toIDString(resource); } }; private final static boolean NOISY = Boolean.getBoolean(LeakTrackingByteBufferPool.class.getName() + ".NOISY"); private final ByteBufferPool delegate; + private final AtomicLong leakedReleases = new AtomicLong(0); + private final AtomicLong leakedAcquires = new AtomicLong(0); public LeakTrackingByteBufferPool(ByteBufferPool delegate) { @@ -53,10 +55,13 @@ public class LeakTrackingByteBufferPool extends ContainerLifeCycle implements By public ByteBuffer acquire(int size, boolean direct) { ByteBuffer buffer = delegate.acquire(size,direct); - boolean leakd = leakDetector.acquired(buffer); - if (NOISY || !leakd) - LOG.info(String.format("ByteBuffer acquire %s leakd.acquired=%s",BufferUtil.toIDString(buffer),leakd ? "normal" : "LEAK"), + boolean leaked = leakDetector.acquired(buffer); + if (NOISY || !leaked) + { + leakedAcquires.incrementAndGet(); + LOG.info(String.format("ByteBuffer acquire %s leaked.acquired=%s",leakDetector.id(buffer),leaked ? "normal" : "LEAK"), new Throwable("LeakStack.Acquire")); + } return buffer; } @@ -65,15 +70,47 @@ public class LeakTrackingByteBufferPool extends ContainerLifeCycle implements By { if (buffer == null) return; - boolean leakd = leakDetector.released(buffer); - if (NOISY || !leakd) - LOG.info(String.format("ByteBuffer release %s leakd.released=%s",BufferUtil.toIDString(buffer),leakd ? "normal" : "LEAK"), - new Throwable("LeakStack.Release")); + boolean leaked = leakDetector.released(buffer); + if (NOISY || !leaked) { + leakedReleases.incrementAndGet(); + LOG.info(String.format("ByteBuffer release %s leaked.released=%s",leakDetector.id(buffer),leaked ? "normal" : "LEAK"),new Throwable( + "LeakStack.Release")); + } delegate.release(buffer); } - - protected void leaked(LeakDetector<ByteBuffer>.LeakInfo leakInfo) + + public void clearTracking() + { + leakDetector.clear(); + leakedAcquires.set(0); + leakedReleases.set(0); + } + + /** + * Get the count of BufferPool.acquire() calls that detected a leak + * @return count of BufferPool.acquire() calls that detected a leak + */ + public long getLeakedAcquires() + { + return leakedAcquires.get(); + } + + /** + * Get the count of BufferPool.release() calls that detected a leak + * @return count of BufferPool.release() calls that detected a leak + */ + public long getLeakedReleases() + { + return leakedReleases.get(); + } + + /** + * At the end of the run, when the LeakDetector runs, this reports the + * number of unreleased resources. + * @return count of resources that were acquired but not released (byt the end of the run) + */ + public long getLeakedUnreleased() { - LOG.warn("ByteBuffer " + leakInfo.getResourceDescription() + " leaked at:",leakInfo.getStackFrames()); + return leakDetector.getUnreleasedCount(); } } diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/MappedByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/MappedByteBufferPool.java index 84073409ce..b3c08d34e7 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/MappedByteBufferPool.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/MappedByteBufferPool.java @@ -57,7 +57,7 @@ public class MappedByteBufferPool implements ByteBufferPool if (result == null) { int capacity = bucket * factor; - result = direct ? createDirect(capacity) : createInDirect(capacity); + result = direct ? createDirect(capacity) : createIndirect(capacity); } BufferUtil.clear(result); @@ -69,12 +69,11 @@ public class MappedByteBufferPool implements ByteBufferPool return BufferUtil.allocateDirect(capacity); } - protected ByteBuffer createInDirect(int capacity) + public ByteBuffer createIndirect(int capacity) { return BufferUtil.allocate(capacity); } - @Override public void release(ByteBuffer buffer) { @@ -121,10 +120,11 @@ public class MappedByteBufferPool implements ByteBufferPool return direct ? directBuffers : heapBuffers; } - static AtomicInteger __tag = new AtomicInteger(); + private static AtomicInteger __tag = new AtomicInteger(); + public static class Tagged extends MappedByteBufferPool { - protected ByteBuffer createInDirect(int capacity) + public ByteBuffer createIndirect(int capacity) { ByteBuffer buffer = BufferUtil.allocate(capacity+4); buffer.limit(4); @@ -138,7 +138,7 @@ public class MappedByteBufferPool implements ByteBufferPool protected ByteBuffer createDirect(int capacity) { - return createInDirect(capacity); + return createIndirect(capacity); } } } diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java index 47b6ea6e55..0ec33fb660 100644 --- a/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java +++ b/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java @@ -53,7 +53,7 @@ import org.junit.Test; public class SslConnectionTest { private static SslContextFactory __sslCtxFactory=new SslContextFactory(); - private static ByteBufferPool __byteBufferPool = new LeakTrackingByteBufferPool(new MappedByteBufferPool()); + private static ByteBufferPool __byteBufferPool = new LeakTrackingByteBufferPool(new MappedByteBufferPool.Tagged()); protected volatile EndPoint _lastEndp; private volatile boolean _testFill=true; |