Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Erdfelt2015-03-06 22:57:52 +0000
committerJoakim Erdfelt2015-03-06 22:57:52 +0000
commit130afb95358618bd4027f206f4915ea4d6d9bfff (patch)
tree2f1b1df1ffd511a455c948d767303ef6cb70addd /jetty-io
parent9b5205ba40e3b605dfff96b5c9e831a419d038d2 (diff)
parentdd88d393e4aaf6b234c1dc00326941e7d34b6f92 (diff)
downloadorg.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')
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/LeakTrackingByteBufferPool.java63
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/MappedByteBufferPool.java12
-rw-r--r--jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java2
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;

Back to the top