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