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
The following commit(s) were added to refs/heads/master by this push:
new 63089cdb53 [ENHANCEMENT] Allow setting a preview for TTL
63089cdb53 is described below
commit 63089cdb532c37c75599fbcd263c830835600dd7
Author: Benoit TELLIER <[email protected]>
AuthorDate: Fri Mar 14 11:37:42 2025 +0100
[ENHANCEMENT] Allow setting a preview for TTL
---
docs/modules/servers/partials/configure/jmap.adoc | 8 ++++++++
.../sample-configuration/jvm.properties | 4 ++++
.../CassandraMessageFastViewProjection.java | 24 +++++++++++++++++-----
3 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/docs/modules/servers/partials/configure/jmap.adoc
b/docs/modules/servers/partials/configure/jmap.adoc
index b2f0419844..2691fabbd3 100644
--- a/docs/modules/servers/partials/configure/jmap.adoc
+++ b/docs/modules/servers/partials/configure/jmap.adoc
@@ -109,6 +109,14 @@ This allows to prevent users from using some specific JMAP
extensions.
|===
+In cassandra we can set an expiry for preview in an attempt to mitigate disk
space usage. In `jvm.properties`:
+
+....
+# Previews takes roughly 10% DB space though can easily be recomputed. Storing
preview for historical preview is
+# also needless. This property allows setting an expiry for previews.
+# james.jmap.preview.ttl=30d
+....
+
== Wire tapping
Enabling *TRACE* on `org.apache.james.jmap.wire` enables reactor-netty
wiretap, logging of
diff --git a/server/apps/distributed-app/sample-configuration/jvm.properties
b/server/apps/distributed-app/sample-configuration/jvm.properties
index 20b9d1c067..8509aeb856 100644
--- a/server/apps/distributed-app/sample-configuration/jvm.properties
+++ b/server/apps/distributed-app/sample-configuration/jvm.properties
@@ -106,3 +106,7 @@ jmx.remote.x.mlet.allow.getMBeansFromURL=false
# Allow users to have rights for shares of different domain. Defaults to false.
#james.rights.crossdomain.allow=false
+
+# Previews takes roughly 10% DB space though can easily be recomputed. Storing
preview for historical preview is
+# also needless. This property allows setting an expiry for previews.
+# james.jmap.preview.ttl=30d
diff --git
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java
index e2a22ff790..330020cd23 100644
---
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java
+++
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java
@@ -28,6 +28,9 @@ import static
org.apache.james.jmap.cassandra.projections.table.CassandraMessage
import static
org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.PREVIEW;
import static
org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.TABLE_NAME;
+import java.time.Duration;
+import java.util.Optional;
+
import jakarta.inject.Inject;
import
org.apache.james.backends.cassandra.init.configuration.JamesExecutionProfiles;
@@ -39,6 +42,7 @@ import
org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.metrics.api.Metric;
import org.apache.james.metrics.api.MetricFactory;
+import org.apache.james.util.DurationParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -55,6 +59,10 @@ import reactor.core.publisher.Mono;
public class CassandraMessageFastViewProjection implements
MessageFastViewProjection {
public static final Logger LOGGER =
LoggerFactory.getLogger(CassandraMessageFastViewProjection.class);
+
+ private static final Optional<Duration> TTL =
Optional.ofNullable(System.getProperty("james.jmap.preview.ttl", null))
+ .map(DurationParser::parse);
+
private final Metric metricRetrieveHitCount;
private final Metric metricRetrieveMissCount;
@@ -74,11 +82,17 @@ public class CassandraMessageFastViewProjection implements
MessageFastViewProjec
.whereColumn(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID))
.build());
- this.storeStatement = session.prepare(insertInto(TABLE_NAME)
- .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
- .value(PREVIEW, bindMarker(PREVIEW))
- .value(HAS_ATTACHMENT, bindMarker(HAS_ATTACHMENT))
- .build());
+ this.storeStatement = TTL.map(ttl ->
session.prepare(insertInto(TABLE_NAME)
+ .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
+ .value(PREVIEW, bindMarker(PREVIEW))
+ .value(HAS_ATTACHMENT, bindMarker(HAS_ATTACHMENT))
+ .usingTtl((int) ttl.getSeconds())
+ .build()))
+ .orElseGet(() -> session.prepare(insertInto(TABLE_NAME)
+ .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
+ .value(PREVIEW, bindMarker(PREVIEW))
+ .value(HAS_ATTACHMENT, bindMarker(HAS_ATTACHMENT))
+ .build()));
this.retrieveStatement = session.prepare(selectFrom(TABLE_NAME)
.all()
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]