You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/05/30 08:33:19 UTC

[1/3] james-project git commit: JAMES-2038 Move collect out of future

Repository: james-project
Updated Branches:
  refs/heads/master 09c9d34c6 -> 9505324c1


JAMES-2038 Move collect out of future

A bug exists: Datastax driver hangs when collecting in a future.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/12ac91f4
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/12ac91f4
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/12ac91f4

Branch: refs/heads/master
Commit: 12ac91f4ba80adc809c8b8e68fa913fa058df931
Parents: 09c9d34
Author: benwa <bt...@linagora.com>
Authored: Mon May 29 07:59:29 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue May 30 15:31:34 2017 +0700

----------------------------------------------------------------------
 .../mail/CassandraMailboxRecentsDAO.java        |  6 ++--
 .../cassandra/mail/CassandraMessageMapper.java  |  3 +-
 .../mail/CassandraIndexTableHandlerTest.java    | 18 ++++++----
 .../mail/CassandraMailboxRecentDAOTest.java     | 38 ++++++++++++++++----
 4 files changed, 48 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/12ac91f4/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
index 06df836..48a6a9c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
@@ -27,6 +27,7 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
@@ -78,12 +79,11 @@ public class CassandraMailboxRecentsDAO {
                 .value(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID, bindMarker(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID)));
     }
 
-    public CompletableFuture<List<MessageUid>> getRecentMessageUidsInMailbox(CassandraId mailboxId) {
+    public CompletableFuture<Stream<MessageUid>> getRecentMessageUidsInMailbox(CassandraId mailboxId) {
         return cassandraAsyncExecutor.execute(bindWithMailbox(mailboxId, readStatement))
             .thenApply(CassandraUtils::convertToStream)
             .thenApply(stream -> stream.map(row -> row.getLong(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID)))
-            .thenApply(stream -> stream.map(MessageUid::of))
-            .thenApply(stream -> stream.collect(Guavate.toImmutableList()));
+            .thenApply(stream -> stream.map(MessageUid::of));
     }
 
     private BoundStatement bindWithMailbox(CassandraId mailboxId, PreparedStatement statement) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/12ac91f4/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 8d00e77..b4ac929 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -202,7 +202,8 @@ public class CassandraMessageMapper implements MessageMapper {
     public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
         return mailboxRecentDAO.getRecentMessageUidsInMailbox(mailboxId)
-                .join();
+                .join()
+                .collect(Guavate.toImmutableList());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/12ac91f4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
index b82fb4a..e1b9f34 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
@@ -149,7 +149,8 @@ public class CassandraIndexTableHandlerTest {
 
         testee.updateIndexOnAdd(message, MAILBOX_ID).join();
 
-        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join())
+        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join()
+            .collect(Guavate.toImmutableList()))
             .isEmpty();
     }
 
@@ -161,7 +162,8 @@ public class CassandraIndexTableHandlerTest {
 
         testee.updateIndexOnAdd(message, MAILBOX_ID).join();
 
-        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join())
+        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join()
+            .collect(Guavate.toImmutableList()))
             .containsOnly(MESSAGE_UID);
     }
 
@@ -232,7 +234,8 @@ public class CassandraIndexTableHandlerTest {
                 MODSEQ),
             MAILBOX_ID).join();
 
-        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join())
+        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join()
+            .collect(Guavate.toImmutableList()))
             .isEmpty();
     }
 
@@ -250,7 +253,8 @@ public class CassandraIndexTableHandlerTest {
                 MODSEQ),
             MAILBOX_ID).join();
 
-        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join())
+        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join()
+            .collect(Guavate.toImmutableList()))
             .isEmpty();
     }
 
@@ -476,7 +480,8 @@ public class CassandraIndexTableHandlerTest {
             .modSeq(MODSEQ)
             .build()).join();
 
-        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join())
+        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join()
+            .collect(Guavate.toImmutableList()))
             .containsOnly(MESSAGE_UID);
     }
 
@@ -495,7 +500,8 @@ public class CassandraIndexTableHandlerTest {
             .modSeq(MODSEQ)
             .build()).join();
 
-        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join())
+        assertThat(mailboxRecentsDAO.getRecentMessageUidsInMailbox(MAILBOX_ID).join()
+            .collect(Guavate.toImmutableList()))
             .isEmpty();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/12ac91f4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
index 81bb313..0517b4f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
@@ -21,14 +21,19 @@ package org.apache.james.mailbox.cassandra.mail;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.stream.IntStream;
+
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
+import org.apache.james.util.FluentFutureStream;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.github.steveash.guavate.Guavate;
+
 public class CassandraMailboxRecentDAOTest {
     public static final MessageUid UID1 = MessageUid.of(36L);
     public static final MessageUid UID2 = MessageUid.of(37L);
@@ -52,14 +57,16 @@ public class CassandraMailboxRecentDAOTest {
 
     @Test
     public void getRecentMessageUidsInMailboxShouldBeEmptyByDefault() throws Exception {
-        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()).isEmpty();
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
+            .collect(Guavate.toImmutableList())).isEmpty();
     }
 
     @Test
     public void addToRecentShouldAddUidWhenEmpty() throws Exception {
         testee.addToRecent(CASSANDRA_ID, UID1).join();
 
-        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()).containsOnly(UID1);
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
+            .collect(Guavate.toImmutableList())).containsOnly(UID1);
     }
 
     @Test
@@ -68,14 +75,16 @@ public class CassandraMailboxRecentDAOTest {
 
         testee.removeFromRecent(CASSANDRA_ID, UID1).join();
 
-        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()).isEmpty();
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
+            .collect(Guavate.toImmutableList())).isEmpty();
     }
 
     @Test
     public void removeFromRecentShouldNotFailIfNotExisting() throws Exception {
         testee.removeFromRecent(CASSANDRA_ID, UID1).join();
 
-        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()).isEmpty();
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
+            .collect(Guavate.toImmutableList())).isEmpty();
     }
 
     @Test
@@ -84,7 +93,8 @@ public class CassandraMailboxRecentDAOTest {
 
         testee.addToRecent(CASSANDRA_ID, UID2).join();
 
-        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()).containsOnly(UID1, UID2);
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
+            .collect(Guavate.toImmutableList())).containsOnly(UID1, UID2);
     }
 
     @Test
@@ -94,7 +104,8 @@ public class CassandraMailboxRecentDAOTest {
 
         testee.removeFromRecent(CASSANDRA_ID, UID2).join();
 
-        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()).containsOnly(UID1);
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
+            .collect(Guavate.toImmutableList())).containsOnly(UID1);
     }
 
     @Test
@@ -102,6 +113,19 @@ public class CassandraMailboxRecentDAOTest {
         testee.addToRecent(CASSANDRA_ID, UID1).join();
         testee.addToRecent(CASSANDRA_ID, UID1).join();
 
-        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()).containsOnly(UID1);
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
+            .collect(Guavate.toImmutableList())).containsOnly(UID1);
+    }
+
+    @Test
+    public void getRecentMessageUidsInMailboxShouldNotTimeoutWhenOverPagingLimit() throws Exception {
+        int pageSize = 5000;
+        int size = pageSize + 1000;
+        FluentFutureStream.of(IntStream.range(0, size)
+            .mapToObj(i -> testee.addToRecent(CASSANDRA_ID, MessageUid.of(i + 1))))
+            .join();
+
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID).join()
+            .collect(Guavate.toImmutableList())).hasSize(size);
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[3/3] james-project git commit: JAMES-2033 RemoteDelivery should not raise error on JMAP when message is moved out of OUTBOX

Posted by bt...@apache.org.
JAMES-2033 RemoteDelivery should not raise error on JMAP when message is moved out of OUTBOX


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9505324c
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9505324c
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9505324c

Branch: refs/heads/master
Commit: 9505324c1530cd5dd16c842120789ddb5175d632
Parents: 986059d
Author: quynhn <qn...@linagora.com>
Authored: Mon May 29 16:49:15 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue May 30 15:32:27 2017 +0700

----------------------------------------------------------------------
 .../james/jmap/send/PostDequeueDecorator.java   |  2 ++
 .../jmap/send/PostDequeueDecoratorTest.java     | 26 +++++++++++++++++---
 2 files changed, 25 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9505324c/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/PostDequeueDecorator.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/PostDequeueDecorator.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/PostDequeueDecorator.java
index 41add56..5631c83 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/PostDequeueDecorator.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/PostDequeueDecorator.java
@@ -80,6 +80,8 @@ public class PostDequeueDecorator extends MailQueueItemDecorator {
                     MailboxSession mailboxSession = mailboxManager.createSystemSession(username, LOG);
                     moveFromOutboxToSent(messageId, mailboxSession);
                     getMail().setAttribute(IS_DELIVERED, IS_DELIVERED);
+                } catch (MailShouldBeInOutboxException e) {
+                    LOG.info("Message does not exist on Outbox anymore, it could have already been sent {}", e);
                 } catch (MailboxException e) {
                     throw new MailQueueException(e.getMessage(), e);
                 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9505324c/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/PostDequeueDecoratorTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/PostDequeueDecoratorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/PostDequeueDecoratorTest.java
index 568aac9..beb0210 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/PostDequeueDecoratorTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/PostDequeueDecoratorTest.java
@@ -34,7 +34,6 @@ import javax.mail.Flags;
 
 import org.apache.james.jmap.DefaultMailboxes;
 import org.apache.james.jmap.exceptions.MailboxRoleNotFoundException;
-import org.apache.james.jmap.send.exception.MailShouldBeInOutboxException;
 import org.apache.james.jmap.utils.SystemMailboxesProviderImpl;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -42,6 +41,7 @@ import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -52,6 +52,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.MessageResultIterator;
+import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueue.MailQueueItem;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
@@ -100,8 +101,8 @@ public class PostDequeueDecoratorTest {
         verify(mockedMailQueueItem).done(true);
     }
     
-    @Test(expected=MailShouldBeInOutboxException.class)
-    public void doneShouldThrowWhenMessageIsNotInOutbox() throws Exception {
+    @Test
+    public void doneShouldNotThrowWhenMessageIsNotInOutbox() throws Exception {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(USERNAME, LOGGER);
         mailboxManager.createMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
         mailboxManager.createMailbox(SENT_MAILBOX_PATH, mailboxSession);
@@ -266,4 +267,23 @@ public class PostDequeueDecoratorTest {
 
         verifyNoMoreInteractions(messageIdManager);
     }
+
+    @Test(expected = MailQueue.MailQueueException.class)
+    public void doneShouldThrowWhenMailboxException() throws Exception {
+        MessageIdManager messageIdManager = mock(MessageIdManager.class);
+        testee = new PostDequeueDecorator(mockedMailQueueItem, mailboxManager, new InMemoryMessageId.Factory(),
+                messageIdManager, new SystemMailboxesProviderImpl(mailboxManager));
+
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(USERNAME, LOGGER);
+        mailboxManager.createMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
+        mailboxManager.createMailbox(SENT_MAILBOX_PATH, mailboxSession).get();
+        MessageManager messageManager = mailboxManager.getMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
+        ComposedMessageId messageId = messageManager.appendMessage(new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), mailboxSession, false, new Flags());
+        mail.setAttribute(MailMetadata.MAIL_METADATA_MESSAGE_ID_ATTRIBUTE, messageId.getMessageId().serialize());
+        mail.setAttribute(MailMetadata.MAIL_METADATA_USERNAME_ATTRIBUTE, USERNAME);
+
+        when(messageIdManager.getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroupImpl.MINIMAL), any(MailboxSession.class))).thenThrow(MailboxException.class);
+
+        testee.done(true);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[2/3] james-project git commit: JAMES-2036 Store should not get RECENT and COUNTs when checking UID validity

Posted by bt...@apache.org.
JAMES-2036 Store should not get RECENT and COUNTs when checking UID validity

The FetchGroup level for this Metadata was too high


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/986059d7
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/986059d7
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/986059d7

Branch: refs/heads/master
Commit: 986059d78b6ebbfd78f98b6512d260dc325ca1dd
Parents: 12ac91f
Author: benwa <bt...@linagora.com>
Authored: Fri May 26 17:47:36 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue May 30 15:31:38 2017 +0700

----------------------------------------------------------------------
 .../main/java/org/apache/james/imap/processor/AppendProcessor.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/986059d7/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
index 01db050..2d976c7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
@@ -142,7 +142,7 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
             }
 
             // get folder UIDVALIDITY
-            Long uidValidity = mailboxManager.getMailbox(mailboxPath, mailboxSession).getMetaData(false, mailboxSession, FetchGroup.NO_UNSEEN).getUidValidity();
+            Long uidValidity = mailboxManager.getMailbox(mailboxPath, mailboxSession).getMetaData(false, mailboxSession, FetchGroup.NO_COUNT).getUidValidity();
 
             unsolicitedResponses(session, responder, false);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org