diff options
Diffstat (limited to 'bank/src/main')
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/Config.kt | 11 | ||||
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/Main.kt | 21 | ||||
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/db/GcDAO.kt | 18 |
3 files changed, 36 insertions, 14 deletions
diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Config.kt b/bank/src/main/kotlin/tech/libeufin/bank/Config.kt index 9c252b8f..54f2c44b 100644 --- a/bank/src/main/kotlin/tech/libeufin/bank/Config.kt +++ b/bank/src/main/kotlin/tech/libeufin/bank/Config.kt @@ -24,6 +24,7 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import tech.libeufin.common.* import java.nio.file.Path +import java.time.Duration private val logger: Logger = LoggerFactory.getLogger("libeufin-bank") @@ -47,7 +48,10 @@ data class BankConfig( val spaPath: Path?, val tanChannels: Map<TanChannel, Pair<Path, Map<String, String>>>, val payto: BankPaytoCtx, - val wireMethod: WireMethod + val wireMethod: WireMethod, + val gcAbortAfter: Duration, + val gcCleanAfter: Duration, + val gcDeleteAfter: Duration ) @Serializable @@ -141,7 +145,10 @@ fun TalerConfig.loadBankConfig(): BankConfig { fiatCurrencySpec = fiatCurrencySpec, tanChannels = tanChannels, payto = payto, - wireMethod = method + wireMethod = method, + gcAbortAfter = requireDuration("libeufin-bank", "gc_abort_after"), + gcCleanAfter = requireDuration("libeufin-bank", "gc_clean_after"), + gcDeleteAfter = requireDuration("libeufin-bank", "gc_delete_after"), ) } diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Main.kt b/bank/src/main/kotlin/tech/libeufin/bank/Main.kt index ecdc5810..0663e49e 100644 --- a/bank/src/main/kotlin/tech/libeufin/bank/Main.kt +++ b/bank/src/main/kotlin/tech/libeufin/bank/Main.kt @@ -58,6 +58,7 @@ import java.net.InetAddress import java.sql.SQLException import java.util.zip.DataFormatException import java.util.zip.Inflater +import java.time.Instant import kotlin.io.path.Path import kotlin.io.path.exists import kotlin.io.path.readText @@ -505,10 +506,28 @@ class CreateAccount : CliktCommand( } } +class GC : CliktCommand( + "Run garbage collection: abort expired operations and clean expired data", + name = "gc" +) { + private val common by CommonOption() + + override fun run() = cliCmd(logger, common.log) { + val cfg = talerConfig(common.config) + val ctx = cfg.loadBankConfig() + val dbCfg = cfg.loadDbConfig() + + Database(dbCfg.dbConnStr, ctx.regionalCurrency, ctx.fiatCurrency).use { db -> + logger.info("Run garbage collection") + db.gc.collect(Instant.now(), ctx.gcAbortAfter, ctx.gcCleanAfter, ctx.gcDeleteAfter) + } + } +} + class LibeufinBankCommand : CliktCommand() { init { versionOption(getVersion()) - subcommands(ServeBank(), BankDbInit(), CreateAccount(), EditAccount(), ChangePw(), CliConfigCmd(BANK_CONFIG_SOURCE)) + subcommands(ServeBank(), BankDbInit(), CreateAccount(), EditAccount(), ChangePw(), GC(), CliConfigCmd(BANK_CONFIG_SOURCE)) } override fun run() = Unit diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/GcDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/GcDAO.kt index 9f5e9431..7e1c7a08 100644 --- a/bank/src/main/kotlin/tech/libeufin/bank/db/GcDAO.kt +++ b/bank/src/main/kotlin/tech/libeufin/bank/db/GcDAO.kt @@ -23,24 +23,20 @@ import tech.libeufin.bank.* import tech.libeufin.common.* import tech.libeufin.common.crypto.* import java.time.Instant -import java.time.ZoneOffset -import java.time.LocalDateTime -import java.time.temporal.TemporalAmount -import java.time.chrono.ChronoLocalDateTime +import java.time.Duration /** Data access logic for garbage collection */ class GcDAO(private val db: Database) { /** Run garbage collection */ suspend fun collect( now: Instant, - abortAfter: TemporalAmount, - cleanAfter: TemporalAmount, - deleteAfter: TemporalAmount + abortAfter: Duration, + cleanAfter: Duration, + deleteAfter: Duration ) = db.conn { conn -> - val dateTime = LocalDateTime.ofInstant(now, ZoneOffset.UTC) - val abortAfterMicro = dateTime.minus(abortAfter).toInstant(ZoneOffset.UTC).micros() - val cleanAfterMicro = dateTime.minus(cleanAfter).toInstant(ZoneOffset.UTC).micros() - val deleteAfterMicro = dateTime.minus(deleteAfter).toInstant(ZoneOffset.UTC).micros() + val abortAfterMicro = now.minus(abortAfter).micros() + val cleanAfterMicro = now.minus(cleanAfter).micros() + val deleteAfterMicro = now.minus(deleteAfter).micros() // Abort pending operations conn.prepareStatement( |