Author: wstrzalka
Date: Wed Feb 23 20:04:50 2011
New Revision: 1073919
URL: http://svn.apache.org/viewvc?rev=1073919&view=rev
Log:
Fetch optimisation by moving batch responsibility to mailbox. See IMAP-258
Removed:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MessageRangeException.java
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
Wed Feb 23 20:04:50 2011
@@ -40,7 +40,6 @@ import org.apache.james.imap.message.res
import org.apache.james.imap.message.response.FetchResponse;
import org.apache.james.imap.message.response.RecentResponse;
import org.apache.james.imap.processor.base.AbstractChainedProcessor;
-import org.apache.james.imap.processor.base.MessageRangeException;
import org.apache.james.mailbox.MailboxConstants;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxManager;
@@ -48,6 +47,7 @@ import org.apache.james.mailbox.MailboxP
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageRangeException;
import org.apache.james.mailbox.MessageResult;
import org.apache.james.mailbox.util.FetchGroupImpl;
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
Wed Feb 23 20:04:50 2011
@@ -32,11 +32,11 @@ import org.apache.james.imap.api.process
import org.apache.james.imap.api.process.ImapSession;
import org.apache.james.imap.api.process.SelectedMailbox;
import org.apache.james.imap.message.request.CopyRequest;
-import org.apache.james.imap.processor.base.MessageRangeException;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPath;
import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageRangeException;
import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
import org.apache.james.mailbox.MessageRange;
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
Wed Feb 23 20:04:50 2011
@@ -32,12 +32,12 @@ import org.apache.james.imap.api.process
import org.apache.james.imap.api.process.ImapSession;
import org.apache.james.imap.api.process.SelectedMailbox;
import org.apache.james.imap.message.request.ExpungeRequest;
-import org.apache.james.imap.processor.base.MessageRangeException;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageRangeException;
public class ExpungeProcessor extends AbstractMailboxProcessor<ExpungeRequest>
implements CapabilityImplementingProcessor{
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
Wed Feb 23 20:04:50 2011
@@ -40,10 +40,10 @@ import org.apache.james.imap.api.process
import org.apache.james.imap.api.process.SelectedMailbox;
import org.apache.james.imap.message.request.SearchRequest;
import org.apache.james.imap.message.response.SearchResponse;
-import org.apache.james.imap.processor.base.MessageRangeException;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageRangeException;
import org.apache.james.mailbox.SearchQuery;
import org.apache.james.mailbox.SearchQuery.Criterion;
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
Wed Feb 23 20:04:50 2011
@@ -33,12 +33,12 @@ import org.apache.james.imap.api.process
import org.apache.james.imap.api.process.SelectedMailbox;
import org.apache.james.imap.message.request.StoreRequest;
import org.apache.james.imap.message.response.FetchResponse;
-import org.apache.james.imap.processor.base.MessageRangeException;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageRangeException;
public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
Wed Feb 23 20:04:50 2011
@@ -19,11 +19,8 @@
package org.apache.james.imap.processor.fetch;
-import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
-import java.util.List;
import org.apache.james.imap.api.ImapCommand;
import org.apache.james.imap.api.ImapSessionUtils;
@@ -38,17 +35,18 @@ import org.apache.james.imap.api.process
import org.apache.james.imap.message.request.FetchRequest;
import org.apache.james.imap.message.response.FetchResponse;
import org.apache.james.imap.processor.AbstractMailboxProcessor;
-import org.apache.james.imap.processor.base.MessageRangeException;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.MessageRange.Type;
+import org.apache.james.mailbox.MessageRangeException;
import org.apache.james.mailbox.MessageResult;
+import org.apache.james.mailbox.UnsupportedCriteriaException;
+import org.apache.james.mailbox.MessageManager.MessageCallback;
+import org.apache.james.mailbox.MessageRange.Type;
import org.apache.james.mailbox.MessageResult.FetchGroup;
import org.apache.james.mailbox.MessageResult.MimePath;
-import org.apache.james.mailbox.UnsupportedCriteriaException;
import org.apache.james.mailbox.util.FetchGroupImpl;
import org.apache.james.mime4j.field.address.parser.ParseException;
@@ -67,8 +65,8 @@ public class FetchProcessor extends Abst
* (non-Javadoc)
* @see
org.apache.james.imap.processor.AbstractMailboxProcessor#doProcess(org.apache.james.imap.api.message.request.ImapRequest,
org.apache.james.imap.api.process.ImapSession, java.lang.String,
org.apache.james.imap.api.ImapCommand,
org.apache.james.imap.api.process.ImapProcessor.Responder)
*/
- protected void doProcess(FetchRequest request, ImapSession session,
- String tag, ImapCommand command, Responder responder) {
+ protected void doProcess(FetchRequest request, final ImapSession session,
+ String tag, ImapCommand command, final Responder responder) {
final boolean useUids = request.isUseUids();
final IdRange[] idSet = request.getIdSet();
final FetchData fetch = request.getFetch();
@@ -80,36 +78,33 @@ public class FetchProcessor extends Abst
throw new MailboxException("Session not in SELECTED state");
}
+ final MailboxSession mailboxSession =
ImapSessionUtils.getMailboxSession(session);
+ final FetchResponseBuilder builder = new FetchResponseBuilder(new
EnvelopeBuilder(session.getLog()));
+
for (int i = 0; i < idSet.length; i++) {
- final FetchResponseBuilder builder = new FetchResponseBuilder(
- new EnvelopeBuilder(session.getLog()));
MessageRange messageSet = messageRange(session.getSelected(),
idSet[i], useUids);
-
- // TODO: Maybe this should better be handled by the mailbox..
- //
- // split the MessageRange to not risk an OOM on big ranges
- List<MessageRange> batchSet;
- if (batchSize > 0) {
- batchSet = splitMessageRange(session.getSelected(),
messageSet);
- } else {
- batchSet = Arrays.asList(messageSet);
- }
- for (int a = 0; a < batchSet.size(); a++) {
- final MailboxSession mailboxSession = ImapSessionUtils
- .getMailboxSession(session);
- final Iterator<MessageResult> it =
mailbox.getMessages(batchSet.get(a), resultToFetch, mailboxSession);
- while (it.hasNext()) {
- final MessageResult result = (MessageResult) it.next();
- try {
- final FetchResponse response =
builder.build(fetch, result, mailbox, session, useUids);
- responder.respond(response);
- } catch (ParseException e) {
- // we can't for whatever reason parse the message
so just skip it and log it to debug
- session.getLog().debug("Unable to parse message
with uid " + result.getUid(), e);
- }
- }
- }
+ MessageRange normalizedMessageSet =
normalizeMessageRange(session.getSelected(), messageSet);
+ MessageRange batchedMessageSet =
MessageRange.range(normalizedMessageSet.getUidFrom(),
normalizedMessageSet.getUidTo(), batchSize);
+ mailbox.getMessages(batchedMessageSet, resultToFetch,
mailboxSession, new MessageCallback() {
+
+ public void
onMessages(Iterator<MessageResult> it) throws MailboxException {
+ while (it.hasNext()) {
+ final MessageResult result =
it.next();
+ try {
+ final FetchResponse response =
builder.build(fetch, result, mailbox, session, useUids);
+ responder.respond(response);
+ } catch (ParseException e) {
+ // we can't for whatever reason
parse the message so just skip it and log it to debug
+ session.getLog().debug("Unable
to parse message with uid " + result.getUid(), e);
+ } catch (MessageRangeException e) {
+ // we can't for whatever reason
find the message so just skip it and log it to debug
+ session.getLog().debug("Unable
to find message with uid " + result.getUid(), e);
+ }
+ }
+ }
+ });
}
+
unsolicitedResponses(session, responder, useUids);
okComplete(command, tag, responder);
} catch (UnsupportedCriteriaException e) {
@@ -119,68 +114,50 @@ public class FetchProcessor extends Abst
taggedBad(command, tag, responder,
HumanReadableText.INVALID_MESSAGESET);
} catch (MailboxException e) {
no(command, tag, responder, HumanReadableText.SEARCH_FAILED);
- }
+ }
}
-
+
/**
- * Split the given MessageRange in pieces
+ * Format MessageRange to RANGE format applying selected folder min & max
UIDs constraints
*
- * @param selected
- * @param range
- * @return splitted
+ * @param selected currently selected mailbox
+ * @param range input range
+ * @return normalized message range
+ * @throws MessageRangeException
*/
- private List<MessageRange> splitMessageRange(SelectedMailbox selected,
MessageRange range) {
+ private MessageRange normalizeMessageRange(SelectedMailbox selected,
MessageRange range) throws MessageRangeException {
Type rangeType = range.getType();
long start;
long end;
+
switch (rangeType) {
case ONE:
- Arrays.asList(range);
- break;
+ return range;
case ALL:
start = selected.getFirstUid();
end = selected.getLastUid();
- return createRanges(start, end);
-
+ return MessageRange.range(start, end);
case RANGE:
start = range.getUidFrom();
- if (start < 1 || start == Long.MAX_VALUE) {
+ if (start < 1 || start == Long.MAX_VALUE || start <
selected.getFirstUid()) {
start = selected.getFirstUid();
}
end = range.getUidTo();
- if (end < 1 || end == Long.MAX_VALUE) {
+ if (end < 1 || end == Long.MAX_VALUE || end >
selected.getLastUid()) {
end = selected.getLastUid();
}
- return createRanges(start, end);
+ return MessageRange.range(start, end);
case FROM:
start = range.getUidFrom();
- end = range.getUidTo();
- if (end < 1 || end == Long.MAX_VALUE) {
- end = selected.getLastUid();
+ if (start < 1 || start == Long.MAX_VALUE || start <
selected.getFirstUid()) {
+ start = selected.getFirstUid();
}
- return createRanges(start, end);
+
+ end = selected.getLastUid();
+ return MessageRange.range(start, end);
default:
- break;
- }
- return Arrays.asList(range);
- }
-
- private List<MessageRange> createRanges(long start, long end) {
- List<MessageRange> ranges = new ArrayList<MessageRange>();
- if (start == end) {
- ranges.add(MessageRange.one(start));
- } else {
- while (start < end) {
- long to = start + batchSize;
- if (to > end) {
- to = end;
- }
- MessageRange r = MessageRange.range(start, to);
- ranges.add(r);
- start = to;
- }
+ throw new MessageRangeException("Unknown message range type:
"+rangeType);
}
- return ranges;
}
private FetchGroup getFetchGroup(FetchData fetch) {
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
Wed Feb 23 20:04:50 2011
@@ -36,12 +36,12 @@ import org.apache.james.imap.api.message
import org.apache.james.imap.api.process.ImapSession;
import org.apache.james.imap.api.process.SelectedMailbox;
import org.apache.james.imap.message.response.FetchResponse;
-import org.apache.james.imap.processor.base.MessageRangeException;
import org.apache.james.mailbox.Content;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageRangeException;
import org.apache.james.mailbox.MessageResult;
import org.apache.james.mailbox.MimeDescriptor;
import org.apache.james.mime4j.field.address.parser.ParseException;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]