JAMES-1945 Compute modseq and uid in parallel when saving a message

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

Branch: refs/heads/master
Commit: f3140967ab888bed8d1dfc1cd0a219ae92ec87b1
Parents: 6d94a8f
Author: benwa <[email protected]>
Authored: Wed Feb 22 14:39:06 2017 +0700
Committer: benwa <[email protected]>
Committed: Thu Feb 23 10:38:06 2017 +0700

----------------------------------------------------------------------
 .../CassandraMailboxSessionMapperFactory.java   | 10 ++++++----
 .../cassandra/mail/CassandraMessageMapper.java  | 21 ++++++++++++--------
 2 files changed, 19 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f3140967/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index a1a7ff3..9dde162 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -37,6 +37,8 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageMapper;
+import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
+import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
 import org.apache.james.mailbox.cassandra.user.CassandraSubscriptionMapper;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -58,8 +60,8 @@ public class CassandraMailboxSessionMapperFactory extends 
MailboxSessionMapperFa
     public static final Integer DEFAULT_MAX_RETRY = 1000;
 
     private final Session session;
-    private final UidProvider uidProvider;
-    private final ModSeqProvider modSeqProvider;
+    private final CassandraUidProvider uidProvider;
+    private final CassandraModSeqProvider modSeqProvider;
     private final CassandraMessageDAO messageDAO;
     private final CassandraMessageIdDAO messageIdDAO;
     private final CassandraMessageIdToImapUidDAO imapUidDAO;
@@ -72,7 +74,7 @@ public class CassandraMailboxSessionMapperFactory extends 
MailboxSessionMapperFa
     private int maxRetry;
 
     @Inject
-    public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, 
ModSeqProvider modSeqProvider, Session session,
+    public CassandraMailboxSessionMapperFactory(CassandraUidProvider 
uidProvider, CassandraModSeqProvider modSeqProvider, Session session,
                                                 CassandraMessageDAO 
messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO 
imapUidDAO,
                                                 CassandraMailboxCounterDAO 
mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, 
CassandraMailboxDAO mailboxDAO,
                                                 CassandraMailboxPathDAO 
mailboxPathDAO, CassandraFirstUnseenDAO firstUnseenDAO, 
@Named(CassandraMailboxDAO.MAX_ACL_RETRY) Integer maxRetry) {
@@ -91,7 +93,7 @@ public class CassandraMailboxSessionMapperFactory extends 
MailboxSessionMapperFa
         this.maxRetry = maxRetry;
     }
 
-    public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, 
ModSeqProvider modSeqProvider, Session session,
+    public CassandraMailboxSessionMapperFactory(CassandraUidProvider 
uidProvider, CassandraModSeqProvider modSeqProvider, Session session,
                                                 CassandraMessageDAO 
messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO 
imapUidDAO,
                                                 CassandraMailboxCounterDAO 
mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, 
CassandraMailboxDAO mailboxDAO,
                                                 CassandraMailboxPathDAO 
mailboxPathDAO, CassandraFirstUnseenDAO firstUnseenDAO) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/f3140967/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 c439e49..47fb80d 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
@@ -49,10 +49,7 @@ import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.FlagsUpdateCalculator;
 import org.apache.james.mailbox.store.SimpleMessageMetaData;
-import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.ModSeqProvider;
-import org.apache.james.mailbox.store.mail.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
@@ -72,9 +69,9 @@ public class CassandraMessageMapper implements MessageMapper {
         .unseen(0L)
         .build();
 
-    private final ModSeqProvider modSeqProvider;
+    private final CassandraModSeqProvider modSeqProvider;
     private final MailboxSession mailboxSession;
-    private final UidProvider uidProvider;
+    private final CassandraUidProvider uidProvider;
     private final int maxRetries;
     private final CassandraMessageDAO messageDAO;
     private final CassandraMessageIdDAO messageIdDAO;
@@ -85,7 +82,7 @@ public class CassandraMessageMapper implements MessageMapper {
     private final CassandraFirstUnseenDAO firstUnseenDAO;
     private final AttachmentLoader attachmentLoader;
 
-    public CassandraMessageMapper(UidProvider uidProvider, ModSeqProvider 
modSeqProvider,
+    public CassandraMessageMapper(CassandraUidProvider uidProvider, 
CassandraModSeqProvider modSeqProvider,
                                   MailboxSession mailboxSession, int 
maxRetries, CassandraAttachmentMapper attachmentMapper,
                                   CassandraMessageDAO messageDAO, 
CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
                                   CassandraMailboxCounterDAO 
mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentDAO,
@@ -228,9 +225,17 @@ public class CassandraMessageMapper implements 
MessageMapper {
 
     @Override
     public MessageMetaData add(Mailbox mailbox, MailboxMessage message) throws 
MailboxException {
-        message.setUid(uidProvider.nextUid(mailboxSession, mailbox));
-        message.setModSeq(modSeqProvider.nextModSeq(mailboxSession, mailbox));
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
+
+        CompletableFuture<Optional<MessageUid>> uidFuture = 
uidProvider.nextUid(mailboxId);
+        CompletableFuture<Optional<Long>> modseqFuture = 
modSeqProvider.nextModSeq(mailboxId);
+        CompletableFuture.allOf(uidFuture, modseqFuture).join();
+
+        message.setUid(uidFuture.join()
+            .orElseThrow(() -> new MailboxException("Can not find a UID to 
save " + message.getMessageId() + " in " + mailboxId)));
+        message.setModSeq(modseqFuture.join()
+            .orElseThrow(() -> new MailboxException("Can not find a MODSEQ to 
save " + message.getMessageId() + " in " + mailboxId)));
+
         save(mailbox, message)
             .thenCompose(voidValue -> 
indexTableHandler.updateIndexOnAdd(message, mailboxId))
             .join();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to