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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to