You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2021/05/17 02:21:54 UTC

[james-project] 11/11: [REFACTORING] CassandraMailboxSessionMapperFactory should not instantiate one mapper per request

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 14b341ead35bdc1f024c944586be36f09ba03c43
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 13 22:55:24 2021 +0700

    [REFACTORING] CassandraMailboxSessionMapperFactory should not instantiate one mapper per request
    
    Some resources like SecureRandom can be expensive to instantiate
    and result in CPU resources waste. This had been identified by
    profiling and generating a flame graph with async_profiler.
---
 .../CassandraMailboxSessionMapperFactory.java      | 86 ++++++++++------------
 1 file changed, 37 insertions(+), 49 deletions(-)

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 5a809f2..327aeca 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
@@ -69,9 +69,6 @@ import com.datastax.driver.core.Session;
  * Cassandra implementation of {@link MailboxSessionMapperFactory}
  */
 public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFactory implements AttachmentMapperFactory {
-    protected static final String ATTACHMENTMAPPER = "ATTACHMENTMAPPER";
-
-    private final Session session;
     private final UidProvider uidProvider;
     private final ModSeqProvider modSeqProvider;
     private final CassandraMessageDAO messageDAO;
@@ -80,11 +77,6 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     private final CassandraMessageIdToImapUidDAO imapUidDAO;
     private final CassandraMailboxCounterDAO mailboxCounterDAO;
     private final CassandraMailboxRecentsDAO mailboxRecentsDAO;
-    private final CassandraIndexTableHandler indexTableHandler;
-    private final CassandraMailboxDAO mailboxDAO;
-    private final CassandraMailboxPathDAOImpl mailboxPathDAO;
-    private final CassandraMailboxPathV2DAO mailboxPathV2DAO;
-    private final CassandraMailboxPathV3DAO mailboxPathV3DAO;
     private final CassandraFirstUnseenDAO firstUnseenDAO;
     private final CassandraApplicableFlagDAO applicableFlagDAO;
     private final CassandraAttachmentDAOV2 attachmentDAOV2;
@@ -94,10 +86,13 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     private final CassandraAttachmentOwnerDAO ownerDAO;
     private final ACLMapper aclMapper;
     private final CassandraUserMailboxRightsDAO userMailboxRightsDAO;
-    private final CassandraSchemaVersionManager versionManager;
-    private final CassandraUtils cassandraUtils;
-    private final RecomputeMailboxCountersService recomputeMailboxCountersService;
     private final CassandraConfiguration cassandraConfiguration;
+    private final CassandraMailboxMapper cassandraMailboxMapper;
+    private final CassandraSubscriptionMapper cassandraSubscriptionMapper;
+    private final CassandraAttachmentMapper cassandraAttachmentMapper;
+    private final CassandraMessageMapper cassandraMessageMapper;
+    private final CassandraMessageIdMapper cassandraMessageIdMapper;
+    private final CassandraAnnotationMapper cassandraAnnotationMapper;
 
     @Inject
     public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, CassandraModSeqProvider modSeqProvider, Session session,
@@ -114,17 +109,12 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
                                                 CassandraUtils cassandraUtils, CassandraConfiguration cassandraConfiguration) {
         this.uidProvider = uidProvider;
         this.modSeqProvider = modSeqProvider;
-        this.session = session;
         this.messageDAO = messageDAO;
         this.messageDAOV3 = messageDAOV3;
         this.messageIdDAO = messageIdDAO;
         this.imapUidDAO = imapUidDAO;
         this.mailboxCounterDAO = mailboxCounterDAO;
         this.mailboxRecentsDAO = mailboxRecentsDAO;
-        this.mailboxDAO = mailboxDAO;
-        this.mailboxPathDAO = mailboxPathDAO;
-        this.mailboxPathV2DAO = mailboxPathV2DAO;
-        this.mailboxPathV3DAO = mailboxPathV3DAO;
         this.firstUnseenDAO = firstUnseenDAO;
         this.attachmentDAOV2 = attachmentDAOV2;
         this.deletedMessageDAO = deletedMessageDAO;
@@ -133,59 +123,62 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
         this.attachmentMessageIdDAO = attachmentMessageIdDAO;
         this.aclMapper = aclMapper;
         this.userMailboxRightsDAO = userMailboxRightsDAO;
-        this.versionManager = versionManager;
-        this.cassandraUtils = cassandraUtils;
         this.ownerDAO = ownerDAO;
-        this.recomputeMailboxCountersService = recomputeMailboxCountersService;
         this.cassandraConfiguration = cassandraConfiguration;
-        this.indexTableHandler = new CassandraIndexTableHandler(
+        CassandraIndexTableHandler indexTableHandler = new CassandraIndexTableHandler(
             mailboxRecentsDAO,
             mailboxCounterDAO,
             firstUnseenDAO,
             applicableFlagDAO,
             deletedMessageDAO);
+        this.cassandraMailboxMapper = new CassandraMailboxMapper(mailboxDAO, mailboxPathDAO, mailboxPathV2DAO, mailboxPathV3DAO, userMailboxRightsDAO, aclMapper, versionManager, cassandraConfiguration);
+        this.cassandraSubscriptionMapper = new CassandraSubscriptionMapper(session, cassandraUtils);
+        this.cassandraAttachmentMapper = new CassandraAttachmentMapper(attachmentDAOV2, blobStore, attachmentMessageIdDAO, ownerDAO);
+        this.cassandraMessageMapper = new CassandraMessageMapper(
+            uidProvider,
+            modSeqProvider,
+            cassandraAttachmentMapper,
+            messageDAO,
+            messageDAOV3,
+            messageIdDAO,
+            imapUidDAO,
+            mailboxCounterDAO,
+            mailboxRecentsDAO,
+            applicableFlagDAO,
+            indexTableHandler,
+            firstUnseenDAO,
+            deletedMessageDAO,
+            cassandraConfiguration, recomputeMailboxCountersService);
+        this.cassandraMessageIdMapper = new CassandraMessageIdMapper(cassandraMailboxMapper, mailboxDAO,
+            cassandraAttachmentMapper,
+            imapUidDAO, messageIdDAO, messageDAO, messageDAOV3, indexTableHandler, modSeqProvider,
+            cassandraConfiguration);
+        this.cassandraAnnotationMapper = new CassandraAnnotationMapper(session, cassandraUtils);
     }
 
     @Override
     public CassandraMessageMapper createMessageMapper(MailboxSession mailboxSession) {
-        return new CassandraMessageMapper(
-                                          uidProvider,
-                                          modSeqProvider,
-                                          createAttachmentMapper(mailboxSession),
-                                          messageDAO,
-                                          messageDAOV3,
-                                          messageIdDAO,
-                                          imapUidDAO,
-                                          mailboxCounterDAO,
-                                          mailboxRecentsDAO,
-                                          applicableFlagDAO,
-                                          indexTableHandler,
-                                          firstUnseenDAO,
-                                          deletedMessageDAO,
-                                          cassandraConfiguration, recomputeMailboxCountersService);
+        return cassandraMessageMapper;
     }
 
     @Override
     public MessageIdMapper createMessageIdMapper(MailboxSession mailboxSession) {
-        return new CassandraMessageIdMapper(getMailboxMapper(mailboxSession), mailboxDAO,
-                createAttachmentMapper(mailboxSession),
-                imapUidDAO, messageIdDAO, messageDAO, messageDAOV3, indexTableHandler, modSeqProvider,
-                cassandraConfiguration);
+        return cassandraMessageIdMapper;
     }
 
     @Override
     public MailboxMapper createMailboxMapper(MailboxSession mailboxSession) {
-        return new CassandraMailboxMapper(mailboxDAO, mailboxPathDAO, mailboxPathV2DAO, mailboxPathV3DAO, userMailboxRightsDAO, aclMapper, versionManager, cassandraConfiguration);
+        return cassandraMailboxMapper;
     }
 
     @Override
     public CassandraAttachmentMapper createAttachmentMapper(MailboxSession mailboxSession) {
-        return new CassandraAttachmentMapper(attachmentDAOV2, blobStore, attachmentMessageIdDAO, ownerDAO);
+        return cassandraAttachmentMapper;
     }
 
     @Override
     public SubscriptionMapper createSubscriptionMapper(MailboxSession mailboxSession) {
-        return new CassandraSubscriptionMapper(session, cassandraUtils);
+        return cassandraSubscriptionMapper;
     }
 
     @Override
@@ -200,17 +193,12 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
 
     @Override
     public AnnotationMapper createAnnotationMapper(MailboxSession mailboxSession) {
-        return new CassandraAnnotationMapper(session, cassandraUtils);
+        return cassandraAnnotationMapper;
     }
 
     @Override
     public AttachmentMapper getAttachmentMapper(MailboxSession session) {
-        AttachmentMapper mapper = (AttachmentMapper) session.getAttributes().get(ATTACHMENTMAPPER);
-        if (mapper == null) {
-            mapper = createAttachmentMapper(session);
-            session.getAttributes().put(ATTACHMENTMAPPER, mapper);
-        }
-        return mapper;
+        return cassandraAttachmentMapper;
     }
 
     public DeleteMessageListener deleteMessageListener() {

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