Issue Details (XML | Word | Printable)

Key: JAMES-584
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Major Major
Assignee: Stefano Bagnara
Reporter: Stefano Bagnara
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
JAMES Server

FileStreamStore diskspace leak for removed messages in file based spool under windows

Created: 01/Aug/06 03:22 PM   Updated: 21/Nov/07 08:31 AM
Return to search
Component/s: MailStore & MailRepository
Affects Version/s: None
Fix Version/s: 2.3.0

Time Tracking:
Not Specified

Environment: Win32

Resolution Date: 05/Aug/06 12:34 PM


 Description  « Hide
Iwasa Kazmi reported this on server-user:
-----
Hi,

I sent a message to a local user and the delivery was
done successfully, but a FileStreamStore file is still
in the `spool' directory.
Is the FileStreamStore file used ?

I'm using james-2.3.0rc1 on WinXP.

I did the following:

1. edit config.xml for disable server name detection.

      <servernames autodetect="false" autodetectIP="true">
         <servername>localhost</servername>
      </servernames>

2. add user `iwasa'.

3. send email to iwasa@localhost.

Thank you,
Iwasa Kazmi
------
Confirmed by me here:
------
FWIW I can reproduce the issue with current 2.3rc1 and current trunk.

Config file as default for 2.3, repositories changed to file in trunk
(we still have derby as default in trunk).

I connect to remote manager, create an user. Connect to smtp server and
send a message to that user.

The XXX.Repository.FileStreamStore file is stuck there, in the spool.
If I restart James it got cleaned by the cleaning procedure in
AvalonMailRepository.

This seems to be a bug. Every file that is spooled remain there until a
restart. This is diskspace leak.

I tried manually calling from all the places the
ContainerUtil.dispose(mail) and set mail to null to be sure that the
remove were called and I can see that remove is called twice on that
file but it is not removed. It seems that a stream is still opened when
we try to remove it and it's not removed.

I've not investigated more on this. I only use filerepository in a small
production server that I rarely check. Noel, Vincenzo, can you check
what does it happen in the long term? Maybe this is a test for
Postage... spool folder should increase it size in a linear way if this
bug is there.
------
This could be platform specific: I'm able to reproduce it under windows.

This would also make sense because in unix os you can remove opened
files and they are really removed when the file is closed while under
windows an opened file cannot be deleted.


 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Repository Revision Date User Message
ASF #428073 Wed Aug 02 17:57:27 UTC 2006 bago Added a few missing call to MailImpl.dispose() method (Investigating JAMES-584)
Files Changed
MODIFY /james/server/trunk/src/test/org/apache/james/core/MailImplTest.java
MODIFY /james/server/trunk/src/test/org/apache/james/transport/LinearProcessorTest.java
MODIFY /james/server/trunk/src/java/org/apache/james/James.java
MODIFY /james/server/trunk/src/test/org/apache/james/pop3server/POP3ServerTest.java
MODIFY /james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
MODIFY /james/server/trunk/src/java/org/apache/james/transport/mailets/ToMultiRepository.java

Repository Revision Date User Message
ASF #428109 Wed Aug 02 19:36:35 UTC 2006 bago Fix for racing conditions between stream finalizers and file removal (JAMES-584).
Files Changed
MODIFY /james/server/trunk/src/java/org/apache/james/transport/JamesSpoolManager.java
MODIFY /james/server/trunk/src/java/org/apache/james/transport/mailets/RemoteDelivery.java
MODIFY /james/server/trunk/src/java/org/apache/james/management/SpoolManagement.java

Stefano Bagnara made changes - 02/Aug/06 10:30 PM
Field Original Value New Value
Assignee Stefano Bagnara [ bago ]
Stefano Bagnara made changes - 02/Aug/06 10:30 PM
Status Open [ 1 ] In Progress [ 3 ]
Repository Revision Date User Message
ASF #428557 Thu Aug 03 22:56:47 UTC 2006 bago Backport JAMES-584 fix:
r428073: Added a few missing call to MailImpl.dispose() method (Investigating JAMES-584)
r428109: Fix for racing conditions between stream finalizers and file removal (JAMES-584)
(Tests fixes not backported yet, will be committed later with lineending fixes)
Files Changed
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/transport/JamesSpoolManager.java
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/James.java
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/RemoteDelivery.java

Repository Revision Date User Message
ASF #428585 Fri Aug 04 01:07:18 UTC 2006 bago Fix lineendings for tests. Also including test changes from JAMES-584 fix.
Files Changed
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/JamesTestConfiguration.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/javaxmail/MockMimeMessage.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/james/MockMailRepository.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/avalon/MockContext.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/services/MailServerTestAllImplementations.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/james/MockSpoolRepository.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/core/MailTestAllImplementations.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/core/MailImplTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/util/ExtraDotOutputStreamTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/transport/LinearProcessorTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/pop3server/POP3TestConfiguration.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageFromMimeMessageTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageCopyOnWriteProxyTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/JamesTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/james/MockUsersStore.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/mailet/MockMailetConfig.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/avalon/MockThreadManager.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/remotemanager/RemoteManagerTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/avalon/MockStore.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/userrepository/MockUsersRepository.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/avalon/MockServiceManager.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/avalon/MockSocketManager.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/remotemanager/RemoteManagerTestConfiguration.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageFromSharedStreamTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/test/mock/avalon/MockLogger.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/smtpserver/SMTPServerTest.java
MODIFY /james/server/branches/v2.3/src/test/org/apache/james/pop3server/POP3ServerTest.java

Repository Revision Date User Message
ASF #428743 Fri Aug 04 14:56:54 UTC 2006 bago Make sure mail get disposed asap even if the state is GHOST or it will keep locks (JAMES-584)
Files Changed
MODIFY /james/server/trunk/src/java/org/apache/james/transport/LinearProcessor.java

Repository Revision Date User Message
ASF #428745 Fri Aug 04 15:06:02 UTC 2006 bago Make sure mails generated by LinearProcessor (partial matches) get disposed asap or they will keep locks (JAMES-584)
Files Changed
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/transport/LinearProcessor.java

Stefano Bagnara added a comment - 04/Aug/06 04:32 PM
Let's mark this fixed. Optimism never killed anyone ;-)

Stefano Bagnara made changes - 04/Aug/06 04:32 PM
Resolution Fixed [ 1 ]
Fix Version/s 2.3.0rc2 [ 12312012 ]
Status In Progress [ 3 ] Resolved [ 5 ]
Stefano Bagnara added a comment - 05/Aug/06 09:42 AM
Iwasa Kazmi found another way to reproduce this issue:
----
I inserted Redirect mailet in the "transport" processor.
(see config.xml.diff)
It duplicates a message for local-user before the RemoteDelivery runs.
Then I sent a mail to the external server via james.
FileStreamStore file in the spool was not deleted.
----

Stefano Bagnara made changes - 05/Aug/06 09:42 AM
Resolution Fixed [ 1 ]
Status Resolved [ 5 ] Reopened [ 4 ]
Repository Revision Date User Message
ASF #428989 Sat Aug 05 12:07:03 UTC 2006 bago Another attempt to fix JAMES-584.
Add more mail.dispose() calls to mailets that creates new MailImpls.
Add some try/finally code to make sure mail.dispose is called even if exceptions happens in the middle.
Change MailImpl.setMessage() to make sure to dispose a previous message if any.
Files Changed
MODIFY /james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java
MODIFY /james/server/trunk/src/java/org/apache/james/core/MailImpl.java
MODIFY /james/server/trunk/src/java/org/apache/james/James.java
MODIFY /james/server/trunk/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
MODIFY /james/server/trunk/src/java/org/apache/james/transport/mailets/DSNBounce.java
MODIFY /james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractRedirect.java

Repository Revision Date User Message
ASF #428992 Sat Aug 05 12:26:23 UTC 2006 bago Backport r428989 (latest fix to JAMES-584).
Add more mail.dispose() calls to mailets that creates new MailImpls.
Add some try/finally code to make sure mail.dispose is called even if exceptions happens in the middle.
Change MailImpl.setMessage() to make sure to dispose a previous message if any.
Files Changed
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/ToMultiRepository.java
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/DSNBounce.java
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/core/MailImpl.java
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/James.java
MODIFY /james/server/branches/v2.3/src/java/org/apache/james/transport/mailets/AbstractVirtualUserTable.java

Stefano Bagnara added a comment - 05/Aug/06 12:34 PM
Optimism didn't work yesterday... let's test it again...

The main problem was that we were duplicating a Mail object using "new MailImpl(Mail)" that create a CoW proxy for the shared MimeMessage and then we were calling setMessage that replaced the previous message with no care of its "unreferencing".
So, now, if we call setMessage and a message was already there then we dispose the previous one first, and then we set the new one.

I also added a few mail.dispose to mailets that created local duplicates of serviced Mail and were not disposing it (AbstractRedirect, DSNBounce....).

Doing all this stuff I also thought that if something gone wrong after the mail duplication and before the disposal we would have leaked, so I added a few try/finally code to make sure the dispose was called anyway.

Stefano Bagnara made changes - 05/Aug/06 12:34 PM
Resolution Fixed [ 1 ]
Status Reopened [ 4 ] Resolved [ 5 ]
Danny Angus added a comment - 21/Nov/07 08:31 AM
Closing issue fixed in released version.

Danny Angus made changes - 21/Nov/07 08:31 AM
Status Resolved [ 5 ] Closed [ 6 ]