nixos/cassandra: Prepare for cassandra 4

Its scripts disagree a bit with our flexible
logging approach and our default logging config.
Might want to revisit this at some point.

The `mkdir` failures in the log are harmless.

Changed files
+21 -3
nixos
modules
services
databases
+21 -3
nixos/modules/services/databases/cassandra.nix
···
atLeast3 = versionAtLeast cfg.package.version "3";
atLeast3_11 = versionAtLeast cfg.package.version "3.11";
+
atLeast4 = versionAtLeast cfg.package.version "4";
defaultUser = "cassandra";
···
cassandraLogbackConfig = pkgs.writeText "logback.xml" cfg.logbackConfig;
passAsFile = [ "extraEnvSh" ];
-
inherit (cfg) extraEnvSh;
+
inherit (cfg) extraEnvSh package;
buildCommand = ''
mkdir -p "$out"
···
# Delete default password file
sed -i '/-Dcom.sun.management.jmxremote.password.file=\/etc\/cassandra\/jmxremote.password/d' "$out/cassandra-env.sh"
+
+
${lib.optionalString atLeast4 ''
+
cp $package/conf/jvm*.options $out/
+
''}
'';
};
···
"-Dcom.sun.management.jmxremote.password.file=${cfg.jmxRolesFile}"
] ++ optionals cfg.remoteJmx [
"-Djava.rmi.server.hostname=${cfg.rpcAddress}"
+
] ++ optionals atLeast4 [
+
# Historically, we don't use a log dir, whereas the upstream scripts do
+
# expect this. We override those by providing our own -Xlog:gc flag.
+
"-Xlog:gc=warning,heap*=warning,age*=warning,safepoint=warning,promotion*=warning"
];
+
+
commonEnv = {
+
# Sufficient for cassandra 2.x, 3.x
+
CASSANDRA_CONF = "${cassandraEtc}";
+
+
# Required since cassandra 4
+
CASSANDRA_LOGBACK_CONF = "${cassandraEtc}/logback.xml";
+
};
in
{
···
systemd.services.cassandra = {
description = "Apache Cassandra service";
after = [ "network.target" ];
-
environment = {
-
CASSANDRA_CONF = "${cassandraEtc}";
+
environment = commonEnv // {
JVM_OPTS = builtins.concatStringsSep " " fullJvmOptions;
MAX_HEAP_SIZE = toString cfg.maxHeapSize;
HEAP_NEWSIZE = toString cfg.heapNewSize;
···
description = "Perform a full repair on this Cassandra node";
after = [ "cassandra.service" ];
requires = [ "cassandra.service" ];
+
environment = commonEnv;
serviceConfig = {
User = cfg.user;
Group = cfg.group;
···
description = "Perform an incremental repair on this cassandra node.";
after = [ "cassandra.service" ];
requires = [ "cassandra.service" ];
+
environment = commonEnv;
serviceConfig = {
User = cfg.user;
Group = cfg.group;