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
This commit is contained in:
Jorge Martin Espinosa
2026-02-25 12:59:21 +01:00
committed by GitHub
parent 5f29446f75
commit dc11430a73
2 changed files with 11 additions and 3 deletions

View File

@@ -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)

View File

@@ -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))