Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,6 @@ private static void createKeyspace(KeyspaceConfiguration keyspaceConfiguration,
}

private static void ensureContactable(CqlSession session) {
session.execute("SELECT dateof(now()) FROM system.local ;");
session.execute("SELECT toTimestamp(now()) FROM system.local ;");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ private static Optional<String> getFixedBuildId() {

@SuppressWarnings("resource")
public DockerCassandra() {
this("cassandra_4_1_5-" + buildSpecificImageDiscriminator(),
this("cassandra_5_0_4-" + buildSpecificImageDiscriminator(),
getFixedBuildId().isEmpty(),
AdditionalDockerFileStep.IDENTITY);
}
Expand Down Expand Up @@ -170,18 +170,14 @@ public void close() {
}
});

String memorySettingCommand = Optional.ofNullable(System.getenv("CI"))
.map(Boolean::parseBoolean)
.filter(Boolean.TRUE::equals)
.map(ci -> "echo \"\" ")
.orElse("echo \"-Xms" + CASSANDRA_MEMORY + "M\" >> " + JVM_OPTIONS
+ "&& echo \"-Xmx" + CASSANDRA_MEMORY + "M\" >> " + JVM_OPTIONS);
String memorySettingCommand = "echo \"-Xms" + CASSANDRA_MEMORY + "M\" >> " + JVM_OPTIONS
+ "&& echo \"-Xmx" + CASSANDRA_MEMORY + "M\" >> " + JVM_OPTIONS;

cassandraContainer = new GenericContainer<>(
new ImageFromDockerfile(imageName,deleteImageAfterUsage)
.withDockerfileFromBuilder(builder ->
additionalSteps.applyStep(builder
.from("cassandra:4.1.9")
.from("cassandra:5.0.4")
.env("CASSANDRA_CONFIG", "/etc/cassandra")
.run(memorySettingCommand
+ "&& echo \"-Dcassandra.skip_wait_for_gossip_to_settle=0\" >> " + JVM_OPTIONS
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ void createShouldReturnAContactableCluster(DockerCassandra dockerCassandra) {

void assertThatClusterIsContactable(CqlSession session) {
try {
session.execute("SELECT dateof(now()) FROM system.local ;");
session.execute("SELECT toTimestamp(now()) FROM system.local ;");
} catch (Exception e) {
throw new AssertionError("expecting cluster can be connected but actually not", e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ services:
- discovery.type=single-node

cassandra:
image: cassandra:4.1.9
image: cassandra:5.0.4
ports:
- "9042:9042"

Expand Down
2 changes: 1 addition & 1 deletion docs/modules/servers/pages/distributed/run/run-docker.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ Firstly, create your own user network on Docker for the James environment:

You need a running *cassandra* in docker which connects to *james* network. To achieve this run:

$ docker run -d --network james --name=cassandra cassandra:4.1.9
$ docker run -d --network james --name=cassandra cassandra:5.0.4

You need a running *rabbitmq* in docker which connects to *james* network. To achieve this run:

Expand Down
2 changes: 1 addition & 1 deletion docs/modules/servers/pages/distributed/run/run-java.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ running. You can either install the servers or launch them via docker:

[source,bash]
----
$ docker run -d -p 9042:9042 --name=cassandra cassandra:4.1.9
$ docker run -d -p 9042:9042 --name=cassandra cassandra:5.0.4
$ docker run -d --network james -p 9200:9200 --name=opensearch --env 'discovery.type=single-node' opensearchproject/opensearch:2.19.2
$ docker run -d -p 5672:5672 -p 15672:15672 --name=rabbitmq rabbitmq:4.1.1-management
$ docker run -d --env 'REMOTE_MANAGEMENT_DISABLE=1' --env 'SCALITY_ACCESS_KEY_ID=accessKey1' --env 'SCALITY_SECRET_ACCESS_KEY=secretKey1' --name=s3 ghcr.io/scality/cloudserver:c1ba296859690c1cbbec609aaae430f6b04b4745
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ public interface CassandraMailboxDataDefinition {
.table(CassandraMailboxTable.TABLE_NAME)
.comment("Holds the mailboxes information.")
.options(options -> options
.withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
.withLZ4Compression(8, 1))
.withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
.statement(statement -> types -> statement
.withPartitionKey(CassandraMailboxTable.ID, TIMEUUID)
.withColumn(CassandraMailboxTable.MAILBOX_BASE, types.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE.asCql(true)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ public interface CassandraMessageDataDefinition {
.comment("Holds mailbox and flags for each message, lookup by message ID")
.options(options -> options
.withCompaction(SchemaBuilder.sizeTieredCompactionStrategy())
.withLZ4Compression(8, 1)
.withCaching(true, rows(CACHED_IMAP_UID_ROWS)))
.statement(statement -> types -> statement
.withPartitionKey(CassandraMessageIds.MESSAGE_ID, TIMEUUID)
Expand Down
2 changes: 1 addition & 1 deletion server/apps/cassandra-app/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Third party compulsory dependencies:

[source]
----
$ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:4.1.9
$ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:5.0.4
$ docker run -d --network james -p 9200:9200 --name=opensearch --env 'discovery.type=single-node' opensearchproject/opensearch:2.19.2
----

Expand Down
2 changes: 1 addition & 1 deletion server/apps/cassandra-app/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ services:
- DISABLE_SECURITY_PLUGIN=true

cassandra:
image: cassandra:4.1.9
image: cassandra:5.0.4
ports:
- "9042:9042"
healthcheck:
Expand Down
2 changes: 1 addition & 1 deletion server/apps/distributed-app/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Third party compulsory dependencies:

[source]
----
$ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:4.1.9
$ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:5.0.4
$ docker run -d --network james -p 9200:9200 --name=opensearch --env 'discovery.type=single-node' --env 'DISABLE_SECURITY_PLUGIN=true' --env 'DISABLE_INSTALL_DEMO_CONFIG=true' opensearchproject/opensearch:2.19.2
$ docker run -d --network james -p 5672:5672 -p 15672:15672 --name=rabbitmq rabbitmq:4.1.1-management
$ docker run -d --network james -p 8000:8000 --env 'REMOTE_MANAGEMENT_DISABLE=1' --env 'SCALITY_ACCESS_KEY_ID=accessKey1' --env 'SCALITY_SECRET_ACCESS_KEY=secretKey1' --name=s3 ghcr.io/scality/cloudserver:c1ba296859690c1cbbec609aaae430f6b04b4745
Expand Down
2 changes: 1 addition & 1 deletion server/apps/distributed-app/docker-compose-with-pulsar.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ services:

cassandra:
container_name: cassandra
image: cassandra:4.1.9
image: cassandra:5.0.4
ports:
- "9042:9042"
healthcheck:
Expand Down
2 changes: 1 addition & 1 deletion server/apps/distributed-app/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ services:
- elasticsearch

cassandra:
image: cassandra:4.1.9
image: cassandra:5.0.4
ports:
- "9042:9042"
healthcheck:
Expand Down
2 changes: 1 addition & 1 deletion server/apps/distributed-pop3-app/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Third party compulsory dependencies:

[source]
----
$ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:4.1.9
$ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:5.0.4
$ docker run -d --network james -p 5672:5672 -p 15672:15672 --name=rabbitmq rabbitmq:4.1.1-management
$ docker run -d --network james --env 'REMOTE_MANAGEMENT_DISABLE=1' --env 'SCALITY_ACCESS_KEY_ID=accessKey1' --env 'SCALITY_SECRET_ACCESS_KEY=secretKey1' --name=s3 ghcr.io/scality/cloudserver:c1ba296859690c1cbbec609aaae430f6b04b4745
----
Expand Down
2 changes: 1 addition & 1 deletion server/apps/distributed-pop3-app/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ services:
- elasticsearch

cassandra:
image: cassandra:4.1.9
image: cassandra:5.0.4
ports:
- "9042:9042"
healthcheck:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ public interface CassandraBlobCacheDataDefinition {
.builder()
.table(TABLE_NAME)
.options(options -> options
.withCompaction(SchemaBuilder.sizeTieredCompactionStrategy())
.withCompression("LZ4Compressor", 8, 1.0))
.withCompaction(SchemaBuilder.sizeTieredCompactionStrategy()))
.comment("Write through cache for small blobs stored in a slower blob store implementation.")
.statement(statement -> types -> statement
.withPartitionKey(ID, DataTypes.TEXT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ public interface CassandraMessageFastViewProjectionDataDefinition {
CassandraDataDefinition MODULE = CassandraDataDefinition.table(TABLE_NAME)
.comment("Storing the JMAP projections for MessageFastView, an aggregation of JMAP properties expected to be fast to fetch.")
.options(options -> options
.withCaching(true, rows(DEFAULT_CACHED_ROW_PER_PARTITION))
.withLZ4Compression(8, 1.0))
.withCaching(true, rows(DEFAULT_CACHED_ROW_PER_PARTITION)))
.statement(statement -> types -> statement
.withPartitionKey(MESSAGE_ID, DataTypes.UUID)
.withColumn(PREVIEW, DataTypes.TEXT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -667,14 +667,14 @@ public static TaskDTOModule<CassandraExecutingTask, CassandraExecutingTaskDTO> m
this.pause = pause;

// Some task requires cassandra query execution upon their creation
Mono.from(session.executeReactive("SELECT dateof(now()) FROM system.local ;"))
Mono.from(session.executeReactive("SELECT toTimestamp(now()) FROM system.local ;"))
.block();
}

@Override
public Result run() throws InterruptedException {
// Task often execute Cassandra logic
Mono.from(session.executeReactive("SELECT dateof(now()) FROM system.local ;"))
Mono.from(session.executeReactive("SELECT toTimestamp(now()) FROM system.local ;"))
.block();

if (pause) {
Expand All @@ -692,7 +692,7 @@ public TaskType type() {
@Override
public Optional<TaskExecutionDetails.AdditionalInformation> details() {
// Some task requires cassandra query execution upon detail generation
Mono.from(session.executeReactive("SELECT dateof(now()) FROM system.local ;"))
Mono.from(session.executeReactive("SELECT toTimestamp(now()) FROM system.local ;"))
.block();

return Optional.empty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore
You need to have a Cassandra, OpenSearch, S3 and RabbitMQ instance running. You can either install the servers or launch them via docker:

```bash
$ docker run -d -p 9042:9042 --name=cassandra cassandra:4.1.9
$ docker run -d -p 9042:9042 --name=cassandra cassandra:5.0.4
$ docker run -d --network james -p 9200:9200 --name=opensearch --env 'discovery.type=single-node' opensearchproject/opensearch:2.19.2
$ docker run -d -p 5672:5672 -p 15672:15672 --name=rabbitmq rabbitmq:3.13.3-management
$ docker run -d --env 'REMOTE_MANAGEMENT_DISABLE=1' --env 'SCALITY_ACCESS_KEY_ID=accessKey1' --env 'SCALITY_SECRET_ACCESS_KEY=secretKey1' --name=s3 ghcr.io/scality/cloudserver:c1ba296859690c1cbbec609aaae430f6b04b4745
Expand Down
2 changes: 1 addition & 1 deletion src/site/markdown/server/install/guice-cassandra.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore
You need to have a Cassandra and an OpenSearch instance running. You can either install the servers or launch them via docker:

```bash
$ docker run -d -p 9042:9042 --name=cassandra cassandra:4.1.9
$ docker run -d -p 9042:9042 --name=cassandra cassandra:5.0.4
$ docker run -d --network james -p 9200:9200 --name=opensearch --env 'discovery.type=single-node' opensearchproject/opensearch:2.19.2
```

Expand Down
2 changes: 1 addition & 1 deletion src/site/xdoc/server/quick-start-cassandra.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ Step 3: Deploy
3.1. Deploy Cassandra (optional)
You may skip this part if you already have a running Cassandra on your network.

<i>$ docker run --detach=true --name=cassandra cassandra:4.1.9</i>
<i>$ docker run --detach=true --name=cassandra cassandra:5.0.4</i>

3.2. Deploy OpenSearch (optional)
You may skip this part if you already have a running OpenSearch on your network.
Expand Down
2 changes: 1 addition & 1 deletion third-party/clamav/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ services:
- elasticsearch

cassandra:
image: cassandra:4.1.9
image: cassandra:5.0.4
ports:
- "9042:9042"
healthcheck:
Expand Down
2 changes: 1 addition & 1 deletion third-party/rspamd/docker-compose-distributed.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ services:
- elasticsearch

cassandra:
image: cassandra:4.1.9
image: cassandra:5.0.4
ports:
- "9042:9042"
healthcheck:
Expand Down
26 changes: 26 additions & 0 deletions upgrade-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,32 @@ Change list:
- [JAMES-1409 Change JPARecipientRewriteTable to store separate record per target address](#james-1409-change-jparecipientrewritetable-to-store-separate-record-per-target-address)
- [JAMES-4118 Cleanup message previews](#james-4118-cleanup-message-previews)
- [JAMES-4128 Breaking Mailet API changes](#james-4128-breaking-mailet-api-changes)
- [JAMES-4142 Cassandra upgrade to version 5](#james-4142-cassandra-upgrade-to-version-5)

### JAMES-4142 Cassandra upgrade to version 5

Date: 01/08/2025

JIRA: https://issues.apache.org/jira/browse/JAMES-4142

A breaking change was introduced in Cassandra 5.0 regarding a compression option that changed name from `chunk_length_kb`
to `chunk_length_in_kb`, which creates issues with the dedicated java driver for Cassandra.

As such, the compression has been dropped on the following tables at creation:

- CassandraBlobCacheDataDefinition: `blob_cache` table.
- CassandraMailboxDataDefinition: `mailbox` table.
- CassandraMessageDataDefinition: `imapUidTable` table.
- CassandraMessageFastViewProjectionDataDefinition: `message_fast_view_projection` table.

If tables exist already and upgrade is done from Cassandra 4 to 5, nothing to do, the change in compression should be migrated.

If you need are on a new setup and need compression on those tables, you can do this manually for each table via cqlsh with Cassandra,
like the following command:

```
ALTER TABLE james_keyspace.mailbox WITH compression = {'class': 'LZ4Compressor', 'chunk_length_in_kb': '8', 'crc_check_chance': '1.0'};
```

### JAMES-4128 Breaking Mailet API changes
Date: 02/04/2025
Expand Down