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

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

commit d0aa4da771284cbdf6863b237e417a96eaddfa21
Author: Benoit TELLIER <btell...@linagora.com>
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: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to