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]
