From dc11430a73ba2f54c5c6a84d92efc41eda009709 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 25 Feb 2026 12:59:21 +0100 Subject: [PATCH] Add some DB optimizations (#6249) * Set a maximum journal size limit (WAL file size) of 25MB The previous value was null, which meant unlimited growth. This can affect performance, since the WAL file performance as a cache will worsen the larger it is * When scheduling the vacuum task, make sure the user has enough free disk storage, since vacuuming can duplicate the DB sizes in disk --- .../libraries/matrix/impl/storage/SqliteStoreBuilder.kt | 6 ++++-- .../PerformDatabaseVacuumWorkManagerRequest.kt | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/storage/SqliteStoreBuilder.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/storage/SqliteStoreBuilder.kt index 7b5d9fb31c..84f124868e 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/storage/SqliteStoreBuilder.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/storage/SqliteStoreBuilder.kt @@ -7,6 +7,8 @@ package io.element.android.libraries.matrix.impl.storage +import io.element.android.libraries.core.data.ByteUnit +import io.element.android.libraries.core.data.megaBytes import io.element.android.libraries.matrix.impl.paths.SessionPaths import org.matrix.rustcomponents.sdk.ClientBuilder import org.matrix.rustcomponents.sdk.SqliteStoreBuilder as SdkSqliteStoreBuilder @@ -17,12 +19,12 @@ interface SqliteStoreBuilder { } class RustSqliteStoreBuilder( - private val sessionPaths: SessionPaths, + sessionPaths: SessionPaths, ) : SqliteStoreBuilder { private var inner = SdkSqliteStoreBuilder( dataPath = sessionPaths.fileDirectory.absolutePath, cachePath = sessionPaths.cacheDirectory.absolutePath, - ) + ).journalSizeLimit(25.megaBytes.into(ByteUnit.BYTES).toUInt()) override fun passphrase(passphrase: String?): SqliteStoreBuilder { inner = inner.passphrase(passphrase) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/workmanager/PerformDatabaseVacuumWorkManagerRequest.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/workmanager/PerformDatabaseVacuumWorkManagerRequest.kt index 9c192bd96d..a8636eb5d9 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/workmanager/PerformDatabaseVacuumWorkManagerRequest.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/workmanager/PerformDatabaseVacuumWorkManagerRequest.kt @@ -32,7 +32,13 @@ class PerformDatabaseVacuumWorkManagerRequest( .addTag(workManagerTag(sessionId, WorkManagerRequestType.DB_VACUUM)) .setInputData(data) // Only run when the device is idle to avoid impacting user experience - .setConstraints(Constraints.Builder().setRequiresDeviceIdle(true).build()) + .setConstraints( + Constraints.Builder() + .setRequiresDeviceIdle(true) + // Vacuuming can duplicate the DB sizes in disk + .setRequiresStorageNotLow(true) + .build() + ) .build() return Result.success(listOf(workRequest))