This is an automated email from the ASF dual-hosted git repository. Arsnael pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 0fd97a477b59f0a98d4f4cbf8c0f75e09e8fd710 Author: Benoit TELLIER <[email protected]> AuthorDate: Thu Apr 23 15:38:35 2026 +0200 [ENHANCEMENT] LeakAware: explicit resource naming to enhance auditability --- .../james/mailbox/store/mail/model/impl/MessageParser.java | 2 +- .../james/server/core/MimeMessageInputStreamSource.java | 2 +- .../main/java/org/apache/james/lifecycle/api/Disposable.java | 12 +++++++++--- .../java/org/apache/james/lifecycle/api/LeakAwareTest.java | 2 +- .../james/imapserver/netty/ImapRequestFrameDecoder.java | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java index 99644ce0e7..6918c0d69b 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java @@ -36,7 +36,7 @@ public interface MessageParser { private final List<ParsedAttachment> attachments; Resource(List<ParsedAttachment> attachments, Disposable cleanup) { - super(cleanup); + super("MessageParser.ParsingResult", cleanup); this.attachments = attachments; } } diff --git a/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java b/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java index 31393a99a5..6517392b66 100644 --- a/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java +++ b/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java @@ -69,7 +69,7 @@ public class MimeMessageInputStreamSource extends Disposable.LeakAware<MimeMessa private final Set<InputStream> streams; Resource(BufferedDeferredFileOutputStream out, Set<InputStream> streams) { - super(() -> { + super("MimeMessageInputStreamSource", () -> { // explicit close all streams for (InputStream stream : streams) { try { diff --git a/server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java b/server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java index 68da201d4b..1363ca941f 100644 --- a/server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java +++ b/server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java @@ -46,8 +46,10 @@ public interface Disposable { public static class Resource implements Disposable { private final AtomicBoolean isDisposed = new AtomicBoolean(false); private final Disposable cleanup; + private final String name; - public Resource(Disposable cleanup) { + public Resource(String name, Disposable cleanup) { + this.name = name; this.cleanup = cleanup; } @@ -169,6 +171,10 @@ public interface Disposable { } } + private String resourceName() { + return resource.name + "@" + Integer.toHexString(System.identityHashCode(resource)); + } + public void detectLeak() { switch (LeakAware.LEVEL) { case NONE: // nothing @@ -194,11 +200,11 @@ public interface Disposable { public void errorLog() { if (LeakAware.tracedEnabled()) { LOGGER.error("Leak detected! Resource {} was not released before its referent was garbage-collected. \n" + - "This resource was instanced at: \n{}", resource, traceRecord.toString()); + "This resource was instanced at: \n{}", resourceName(), traceRecord.toString()); } else { LOGGER.error("Leak detected! Resource {} was not released before its referent was garbage-collected. \n" + "Resource management needs to be reviewed: ensure to always call dispose() for disposable objects you work with. \n" + - "Consider enabling advanced leak detection to further identify the problem.", resource); + "Consider enabling advanced leak detection to further identify the problem.", resourceName()); } } diff --git a/server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java b/server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java index bc5ddb0a1d..bd357cf60a 100644 --- a/server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java +++ b/server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java @@ -44,7 +44,7 @@ class LeakAwareTest { private static final class LeakResourceSample extends LeakAware<LeakResourceSample.TestResource> { static class TestResource extends LeakAware.Resource { public TestResource(Disposable cleanup) { - super(cleanup); + super("LeakAwareTest.TestResource", cleanup); } } diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java index 14cb8aae92..1a658c4a86 100644 --- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java +++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java @@ -329,7 +329,7 @@ public class ImapRequestFrameDecoder extends ByteToMessageDecoder implements Net private final File file; private FileHolderInner(File file) { - super(() -> FileUtils.deleteQuietly(file)); + super("ImapRequestFrameDecoder.FileHolder", () -> FileUtils.deleteQuietly(file)); this.file = file; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
