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

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

commit 7a2d2c792f19f2148b9e131328ba8c866be019f0
Author: Benoit TELLIER <[email protected]>
AuthorDate: Sat Sep 5 00:40:00 2026 +0200

    JAMES-4225 Remove unused messagev3.bodyOctets column in Cassandra
---
 .../mailbox/cassandra/mail/CassandraMessageDAOV3.java   |  4 ----
 .../modules/CassandraMessageDataDefinition.java         |  1 -
 .../cassandra/table/CassandraMessageV3Table.java        |  1 -
 upgrade-instructions.md                                 | 17 +++++++++++++++++
 4 files changed, 17 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 375d61bc93..4970131648 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
@@ -32,7 +32,6 @@ import static 
org.apache.james.blob.api.BlobStore.StoragePolicy.SIZE_BASED;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.ATTACHMENTS;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_CONTENT;
-import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_OCTECTS;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_START_OCTET;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.FULL_CONTENT_OCTETS;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.HEADER_CONTENT;
@@ -158,7 +157,6 @@ public class CassandraMessageDAOV3 {
             .set(setColumn(INTERNAL_DATE, bindMarker(INTERNAL_DATE)),
                 setColumn(BODY_START_OCTET, bindMarker(BODY_START_OCTET)),
                 setColumn(FULL_CONTENT_OCTETS, 
bindMarker(FULL_CONTENT_OCTETS)),
-                setColumn(BODY_OCTECTS, bindMarker(BODY_OCTECTS)),
                 setColumn(BODY_CONTENT, bindMarker(BODY_CONTENT)),
                 setColumn(HEADER_CONTENT, bindMarker(HEADER_CONTENT)),
                 prepend(ATTACHMENTS, bindMarker(ATTACHMENTS)))
@@ -184,7 +182,6 @@ public class CassandraMessageDAOV3 {
             .setInstant(INTERNAL_DATE, message.getInternalDate().toInstant())
             .setInt(BODY_START_OCTET, message.getBodyStartOctet())
             .setLong(FULL_CONTENT_OCTETS, message.getSize())
-            .setLong(BODY_OCTECTS, message.getSize() - 
message.getBodyStartOctet())
             .setString(BODY_CONTENT, message.getBodyId().asString())
             .setString(HEADER_CONTENT, message.getHeaderId().asString());
 
@@ -227,7 +224,6 @@ public class CassandraMessageDAOV3 {
             .setInstant(INTERNAL_DATE, message.getInternalDate().toInstant())
             .setInt(BODY_START_OCTET, (int) (message.getHeaderOctets()))
             .setLong(FULL_CONTENT_OCTETS, message.getFullContentOctets())
-            .setLong(BODY_OCTECTS, message.getBodyOctets())
             .setString(BODY_CONTENT, pair.getT2().asString())
             .setString(HEADER_CONTENT, pair.getT1().asString())
             .setExecutionProfile(writeProfile);
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageDataDefinition.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageDataDefinition.java
index e5b87ff04a..10a6bfaaf4 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageDataDefinition.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageDataDefinition.java
@@ -100,7 +100,6 @@ public interface CassandraMessageDataDefinition {
             .withPartitionKey(CassandraMessageIds.MESSAGE_ID, TIMEUUID)
             .withColumn(CassandraMessageV3Table.INTERNAL_DATE, TIMESTAMP)
             .withColumn(CassandraMessageV3Table.BODY_START_OCTET, INT)
-            .withColumn(CassandraMessageV3Table.BODY_OCTECTS, BIGINT)
             .withColumn(CassandraMessageV3Table.FULL_CONTENT_OCTETS, BIGINT)
             .withColumn(CassandraMessageV3Table.BODY_CONTENT, TEXT)
             .withColumn(CassandraMessageV3Table.HEADER_CONTENT, TEXT)
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java
index d78445fc08..975be16360 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java
@@ -27,7 +27,6 @@ public interface CassandraMessageV3Table {
     CqlIdentifier INTERNAL_DATE = CqlIdentifier.fromCql("internalDate");
     CqlIdentifier BODY_START_OCTET = CqlIdentifier.fromCql("bodyStartOctet");
     CqlIdentifier FULL_CONTENT_OCTETS = 
CqlIdentifier.fromCql("fullContentOctets");
-    CqlIdentifier BODY_OCTECTS = CqlIdentifier.fromCql("bodyOctets");
     CqlIdentifier BODY_CONTENT = CqlIdentifier.fromCql("bodyContent");
     CqlIdentifier HEADER_CONTENT = CqlIdentifier.fromCql("headerContent");
     CqlIdentifier ATTACHMENTS = CqlIdentifier.fromCql("attachments");
diff --git a/upgrade-instructions.md b/upgrade-instructions.md
index 2dd12243b5..b70cc0d643 100644
--- a/upgrade-instructions.md
+++ b/upgrade-instructions.md
@@ -23,6 +23,7 @@ Change list:
  - [JAMES-4210 POP3 USER/PASS requires TLS by 
default](#james-4210-pop3-userpass-requires-tls-by-default)
  - [JAMES-4210 ManageSieve SASL 
adoption](#james-4210-managesieve-sasl-adoption)
  - [JAMES-4225 Blob ids default to 128 bits of 
entropy](#james-4225-blob-ids-default-to-128-bits-of-entropy)
+ - [Dropping the bodyOctets column of the Cassandra messagev3 
table](#dropping-the-bodyoctets-column-of-the-cassandra-messagev3-table)
 
 ### JAMES-4225 Blob ids default to 128 bits of entropy
 
@@ -41,6 +42,22 @@ against its shorter counterpart until it is rewritten. To 
keep the previous beha
 james.blobid.entropy=256
 ```
 
+### Dropping the bodyOctets column of the Cassandra messagev3 table
+
+Date: 05/09/2026
+
+Concerned products: James products using Cassandra as mailbox storage
+
+The `messagev3.bodyOctets` column was written upon every message save but 
never read back: the body size
+is derived from `fullContentOctets` and `bodyStartOctet`. James no longer 
writes it.
+
+New messages stop paying for the column right away. Reclaiming the space taken 
by existing rows requires
+dropping the column manually, after upgrading all james servers:
+
+```sql
+ALTER TABLE james_keyspace.messagev3 DROP bodyOctets;
+```
+
 ### JAMES-4210 POP3 USER/PASS requires TLS by default
 
 Date: 16/07/2026


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to