stalwart-mail: build against system jemalloc [second try] (#411265)

This commit is contained in:
Yt 2025-05-31 18:07:15 -04:00 committed by GitHub
commit 24b70d6579
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 37 additions and 3 deletions

View file

@ -48,9 +48,20 @@ in
session.auth.directory = "'in-memory'"; session.auth.directory = "'in-memory'";
storage.directory = "in-memory"; storage.directory = "in-memory";
storage.data = "rocksdb";
storage.fts = "rocksdb";
storage.blob = "rocksdb";
storage.lookup = "rocksdb";
session.rcpt.directory = "'in-memory'"; session.rcpt.directory = "'in-memory'";
queue.outbound.next-hop = "'local'"; queue.outbound.next-hop = "'local'";
store."rocksdb" = {
type = "rocksdb";
path = "/var/lib/stalwart-mail/data";
compression = "lz4";
};
directory."in-memory" = { directory."in-memory" = {
type = "memory"; type = "memory";
principals = [ principals = [
@ -116,6 +127,12 @@ in
main.wait_for_open_port(143) main.wait_for_open_port(143)
main.succeed("test-smtp-submission") main.succeed("test-smtp-submission")
# restart stalwart to test rocksdb compaction of existing database
main.succeed("systemctl restart stalwart-mail.service")
main.wait_for_open_port(587)
main.wait_for_open_port(143)
main.succeed("test-imap-read") main.succeed("test-imap-read")
''; '';

View file

@ -9,6 +9,7 @@
sqlite, sqlite,
foundationdb, foundationdb,
zstd, zstd,
rust-jemalloc-sys-unprefixed,
stdenv, stdenv,
nix-update-script, nix-update-script,
nixosTests, nixosTests,
@ -18,6 +19,9 @@
stalwartEnterprise ? false, stalwartEnterprise ? false,
}: }:
let
rocksdbJemalloc = rocksdb.override { enableJemalloc = true; };
in
rustPlatform.buildRustPackage (finalAttrs: { rustPlatform.buildRustPackage (finalAttrs: {
pname = "stalwart-mail" + (lib.optionalString stalwartEnterprise "-enterprise"); pname = "stalwart-mail" + (lib.optionalString stalwartEnterprise "-enterprise");
version = "0.11.8"; version = "0.11.8";
@ -29,6 +33,17 @@ rustPlatform.buildRustPackage (finalAttrs: {
hash = "sha256-VqGosbSQxNeOS+kGtvXAmz6vyz5mJlXvKZM57B1Xue4="; hash = "sha256-VqGosbSQxNeOS+kGtvXAmz6vyz5mJlXvKZM57B1Xue4=";
}; };
# rocksdb does not properly distinguish between pointers it has allocated itself
# and pointers which were passed in and might be registered with a different
# allocator, so we enable the unprefixed_malloc_on_supported_platforms to use
# jemalloc implicitly in the entire process.
postPatch = ''
for file in crates/main/Cargo.toml tests/Cargo.toml; do
substituteInPlace $file --replace-fail \
'jemallocator = "0.5.0"' 'jemallocator = { version = "0.5.0", features = ["unprefixed_malloc_on_supported_platforms"] }'
done
'';
useFetchCargoVendor = true; useFetchCargoVendor = true;
cargoHash = "sha256-iheURWxO0cOvO+FV01l2Vmo0B+S2mXzue6mx3gapftQ="; cargoHash = "sha256-iheURWxO0cOvO+FV01l2Vmo0B+S2mXzue6mx3gapftQ=";
@ -43,6 +58,8 @@ rustPlatform.buildRustPackage (finalAttrs: {
openssl openssl
sqlite sqlite
zstd zstd
rust-jemalloc-sys-unprefixed
rocksdbJemalloc
] ++ lib.optionals (stdenv.hostPlatform.isLinux && withFoundationdb) [ foundationdb ]; ] ++ lib.optionals (stdenv.hostPlatform.isLinux && withFoundationdb) [ foundationdb ];
# Issue: https://github.com/stalwartlabs/mail-server/issues/1104 # Issue: https://github.com/stalwartlabs/mail-server/issues/1104
@ -63,8 +80,8 @@ rustPlatform.buildRustPackage (finalAttrs: {
env = { env = {
OPENSSL_NO_VENDOR = true; OPENSSL_NO_VENDOR = true;
ZSTD_SYS_USE_PKG_CONFIG = true; ZSTD_SYS_USE_PKG_CONFIG = true;
ROCKSDB_INCLUDE_DIR = "${rocksdb}/include"; ROCKSDB_INCLUDE_DIR = "${rocksdbJemalloc}/include";
ROCKSDB_LIB_DIR = "${rocksdb}/lib"; ROCKSDB_LIB_DIR = "${rocksdbJemalloc}/lib";
}; };
postInstall = '' postInstall = ''
@ -151,7 +168,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
__darwinAllowLocalNetworking = true; __darwinAllowLocalNetworking = true;
passthru = { passthru = {
inherit rocksdb; # make used rocksdb version available (e.g., for backup scripts) rocksdb = rocksdbJemalloc; # make used rocksdb version available (e.g., for backup scripts)
webadmin = callPackage ./webadmin.nix { }; webadmin = callPackage ./webadmin.nix { };
updateScript = nix-update-script { }; updateScript = nix-update-script { };
tests.stalwart-mail = nixosTests.stalwart-mail; tests.stalwart-mail = nixosTests.stalwart-mail;