Author: norman
Date: Sat Oct 8 18:32:35 2011
New Revision: 1180448
URL: http://svn.apache.org/viewvc?rev=1180448&view=rev
Log:
Better handling of concurrent modification while writing back the "UNSEEN"
message. See IMAP-345
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java?rev=1180448&r1=1180447&r2=1180448&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
Sat Oct 8 18:32:35 2011
@@ -121,12 +121,31 @@ abstract class AbstractSelectionProcesso
final MessageManager.MetaData metaData =
selectMailbox(fullMailboxPath, session);
final SelectedMailbox selected = session.getSelected();
-
+ Long firstUnseen = metaData.getFirstUnseen();
+
flags(responder, selected);
exists(responder, metaData);
recent(responder, selected);
uidValidity(responder, metaData);
- unseen(responder, metaData, selected,
ImapSessionUtils.getMailboxSession(session));
+
+
+ // try to write the UNSEEN message to the client and retry if we fail
because of concurrent sessions.
+ //
+ // See IMAP-345
+ int retryCount = 0;
+ while(unseen(responder, firstUnseen, selected,
ImapSessionUtils.getMailboxSession(session)) == false) {
+ // if we not was able to get find the unseen within 5 retries we
should just not send it
+ if (retryCount == 5) {
+ if (session.getLog().isInfoEnabled()) {
+ session.getLog().info("Unable to uid for unseen message "
+ firstUnseen + " in mailbox " + selected.getPath());
+ }
+ break;
+ }
+ firstUnseen = selectMailbox(fullMailboxPath,
session).getFirstUnseen();
+ retryCount++;
+
+ }
+
permanentFlags(responder, metaData, selected);
highestModSeq(responder, metaData, selected);
uidNext(responder, metaData);
@@ -342,18 +361,23 @@ abstract class AbstractSelectionProcesso
responder.respond(taggedOk);
}
- private void unseen(Responder responder, MessageManager.MetaData metaData,
final SelectedMailbox selected, MailboxSession session) throws MailboxException
{
- final Long firstUnseen = metaData.getFirstUnseen();
+ private boolean unseen(Responder responder, Long firstUnseen, final
SelectedMailbox selected, MailboxSession session) throws MailboxException {
if (firstUnseen != null) {
final long unseenUid = firstUnseen;
int msn = selected.msn(unseenUid);
- if (msn == SelectedMailbox.NO_SUCH_MESSAGE)
- throw new MailboxException("No message found with uid " +
unseenUid + " in mailbox " +
selected.getPath().getFullName(session.getPathDelimiter()));
+ if (msn == SelectedMailbox.NO_SUCH_MESSAGE) {
+ if (session.getLog().isDebugEnabled()) {
+ session.getLog().debug("No message found with uid " +
unseenUid + " in mailbox " +
selected.getPath().getFullName(session.getPathDelimiter()));
+ }
+ return false;
+ }
final StatusResponse untaggedOk =
statusResponseFactory.untaggedOk(HumanReadableText.unseen(msn),
ResponseCode.unseen(msn));
responder.respond(untaggedOk);
}
+ return true;
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]