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

[james-project] branch master updated (0a2f137 -> 8918482)

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

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


    from 0a2f137  [PERFORMANCE] AmqpForwardAttribute should reuse connection (#454)
     new 47056bb  [PERFORMANCE] Use static TypeToken for complex CQL types
     new 8918482  [PERFORMANCE] Further improve things by passing codecs

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../mailbox/cassandra/mail/CassandraMessageDAOV3.java | 19 +++++++++++++++----
 .../james/mailbox/cassandra/mail/FlagsExtractor.java  | 14 ++++++++++++--
 2 files changed, 27 insertions(+), 6 deletions(-)

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


[james-project] 02/02: [PERFORMANCE] Further improve things by passing codecs

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8918482b10027814e8d5d2ffda0cda3d96e03498
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon May 24 00:21:30 2021 +0700

    [PERFORMANCE] Further improve things by passing codecs
    
    For Row types they are already known, and their lookup takes
    and additional 0.5% of CPU.
---
 .../james/mailbox/cassandra/mail/CassandraMessageDAOV3.java    | 10 +++++++---
 .../apache/james/mailbox/cassandra/mail/FlagsExtractor.java    |  8 ++++++--
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
index e981078..b044020 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
@@ -78,10 +78,12 @@ import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import com.datastax.driver.core.BoundStatement;
 import com.datastax.driver.core.CodecRegistry;
 import com.datastax.driver.core.ConsistencyLevel;
+import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Session;
+import com.datastax.driver.core.TypeCodec;
 import com.datastax.driver.core.TypeTokens;
 import com.datastax.driver.core.UDTValue;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
@@ -98,7 +100,9 @@ public class CassandraMessageDAOV3 {
     public static final long DEFAULT_LONG_VALUE = 0L;
     private static final byte[] EMPTY_BYTE_ARRAY = {};
     private static final TypeToken<Map<String, String>> MAP_OF_STRING = TypeTokens.mapOf(String.class, String.class);
+    private static final TypeCodec<Map<String, String>> MAP_OF_STRINGS_CODEC = CodecRegistry.DEFAULT_INSTANCE.codecFor(DataType.frozenMap(DataType.text(), DataType.text()), MAP_OF_STRING);
     private static final TypeToken<List<String>> LIST_OF_STRINGS = TypeTokens.listOf(String.class);
+    private static final TypeCodec<List<String>> LIST_OF_STRINGS_CODEC = CodecRegistry.DEFAULT_INSTANCE.codecFor(DataType.frozenList(DataType.text()), LIST_OF_STRINGS);
     private static final TypeToken<List<UDTValue>> LIST_OF_UDT = TypeTokens.listOf(UDTValue.class);
 
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
@@ -333,9 +337,9 @@ public class CassandraMessageDAOV3 {
         property.setContentMD5(row.getString(CONTENT_MD5));
         property.setContentTransferEncoding(row.getString(CONTENT_TRANSFER_ENCODING));
         property.setContentLocation(row.getString(CONTENT_LOCATION));
-        property.setContentLanguage(row.get(CONTENT_LANGUAGE, LIST_OF_STRINGS));
-        property.setContentDispositionParameters(row.get(CONTENT_DISPOSITION_PARAMETERS, MAP_OF_STRING));
-        property.setContentTypeParameters(row.get(CONTENT_TYPE_PARAMETERS, MAP_OF_STRING));
+        property.setContentLanguage(row.get(CONTENT_LANGUAGE, LIST_OF_STRINGS_CODEC));
+        property.setContentDispositionParameters(row.get(CONTENT_DISPOSITION_PARAMETERS, MAP_OF_STRINGS_CODEC));
+        property.setContentTypeParameters(row.get(CONTENT_TYPE_PARAMETERS, MAP_OF_STRINGS_CODEC));
         property.setTextualLineCount(row.getLong(TEXTUAL_LINE_COUNT));
         return property.build();
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
index 1ae4608..89a9f04 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
@@ -24,12 +24,16 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.cassandra.table.Flag;
 
+import com.datastax.driver.core.CodecRegistry;
+import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.Row;
+import com.datastax.driver.core.TypeCodec;
 import com.datastax.driver.core.TypeTokens;
 import com.google.common.reflect.TypeToken;
 
 public class FlagsExtractor {
     public static final TypeToken<Set<String>> STRING_SET = TypeTokens.setOf(String.class);
+    public static final TypeCodec<Set<String>> SET_OF_STRINGS_CODEC = CodecRegistry.DEFAULT_INSTANCE.codecFor(DataType.set(DataType.text()), STRING_SET);
 
     public static Flags getFlags(Row row) {
         Flags flags = new Flags();
@@ -38,14 +42,14 @@ public class FlagsExtractor {
                 flags.add(Flag.JAVAX_MAIL_FLAG.get(flag));
             }
         }
-        row.get(Flag.USER_FLAGS, STRING_SET)
+        row.get(Flag.USER_FLAGS, SET_OF_STRINGS_CODEC)
             .forEach(flags::add);
         return flags;
     }
 
     public static Flags getApplicableFlags(Row row) {
         Flags flags = new Flags();
-        row.get(Flag.USER_FLAGS, STRING_SET)
+        row.get(Flag.USER_FLAGS, SET_OF_STRINGS_CODEC)
             .forEach(flags::add);
         return flags;
     }

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


[james-project] 01/02: [PERFORMANCE] Use static TypeToken for complex CQL types

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 47056bba6d7833788d1587b30715d17670ad9801
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon May 24 00:03:01 2021 +0700

    [PERFORMANCE] Use static TypeToken for complex CQL types
    
    There computing take up to 1,3% of CPU time, doing reflection
    over and over again to build them.
---
 .../mailbox/cassandra/mail/CassandraMessageDAOV3.java     | 15 +++++++++++----
 .../james/mailbox/cassandra/mail/FlagsExtractor.java      | 10 ++++++++--
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
index 1692d6e..e981078 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
@@ -50,6 +50,7 @@ import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.T
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -75,17 +76,20 @@ import org.apache.james.mailbox.store.mail.model.impl.Properties;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 
 import com.datastax.driver.core.BoundStatement;
+import com.datastax.driver.core.CodecRegistry;
 import com.datastax.driver.core.ConsistencyLevel;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Session;
+import com.datastax.driver.core.TypeTokens;
 import com.datastax.driver.core.UDTValue;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteSource;
 import com.google.common.primitives.Bytes;
+import com.google.common.reflect.TypeToken;
 
 import reactor.core.publisher.Mono;
 import reactor.util.function.Tuple2;
@@ -93,6 +97,9 @@ import reactor.util.function.Tuple2;
 public class CassandraMessageDAOV3 {
     public static final long DEFAULT_LONG_VALUE = 0L;
     private static final byte[] EMPTY_BYTE_ARRAY = {};
+    private static final TypeToken<Map<String, String>> MAP_OF_STRING = TypeTokens.mapOf(String.class, String.class);
+    private static final TypeToken<List<String>> LIST_OF_STRINGS = TypeTokens.listOf(String.class);
+    private static final TypeToken<List<UDTValue>> LIST_OF_UDT = TypeTokens.listOf(UDTValue.class);
 
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final CassandraTypesProvider typesProvider;
@@ -326,15 +333,15 @@ public class CassandraMessageDAOV3 {
         property.setContentMD5(row.getString(CONTENT_MD5));
         property.setContentTransferEncoding(row.getString(CONTENT_TRANSFER_ENCODING));
         property.setContentLocation(row.getString(CONTENT_LOCATION));
-        property.setContentLanguage(row.getList(CONTENT_LANGUAGE, String.class));
-        property.setContentDispositionParameters(row.getMap(CONTENT_DISPOSITION_PARAMETERS, String.class, String.class));
-        property.setContentTypeParameters(row.getMap(CONTENT_TYPE_PARAMETERS, String.class, String.class));
+        property.setContentLanguage(row.get(CONTENT_LANGUAGE, LIST_OF_STRINGS));
+        property.setContentDispositionParameters(row.get(CONTENT_DISPOSITION_PARAMETERS, MAP_OF_STRING));
+        property.setContentTypeParameters(row.get(CONTENT_TYPE_PARAMETERS, MAP_OF_STRING));
         property.setTextualLineCount(row.getLong(TEXTUAL_LINE_COUNT));
         return property.build();
     }
 
     private Stream<MessageAttachmentRepresentation> getAttachments(Row row) {
-        List<UDTValue> udtValues = row.getList(ATTACHMENTS, UDTValue.class);
+        List<UDTValue> udtValues = row.get(ATTACHMENTS, LIST_OF_UDT);
         return attachmentByIds(udtValues);
     }
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
index c18d37c..1ae4608 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
@@ -18,13 +18,19 @@
  ****************************************************************/
 package org.apache.james.mailbox.cassandra.mail;
 
+import java.util.Set;
+
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.cassandra.table.Flag;
 
 import com.datastax.driver.core.Row;
+import com.datastax.driver.core.TypeTokens;
+import com.google.common.reflect.TypeToken;
 
 public class FlagsExtractor {
+    public static final TypeToken<Set<String>> STRING_SET = TypeTokens.setOf(String.class);
+
     public static Flags getFlags(Row row) {
         Flags flags = new Flags();
         for (String flag : Flag.ALL) {
@@ -32,14 +38,14 @@ public class FlagsExtractor {
                 flags.add(Flag.JAVAX_MAIL_FLAG.get(flag));
             }
         }
-        row.getSet(Flag.USER_FLAGS, String.class)
+        row.get(Flag.USER_FLAGS, STRING_SET)
             .forEach(flags::add);
         return flags;
     }
 
     public static Flags getApplicableFlags(Row row) {
         Flags flags = new Flags();
-        row.getSet(Flag.USER_FLAGS, String.class)
+        row.get(Flag.USER_FLAGS, STRING_SET)
             .forEach(flags::add);
         return flags;
     }

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