summaryrefslogtreecommitdiff
path: root/bank/src/main/kotlin/tech/libeufin/bank
diff options
context:
space:
mode:
Diffstat (limited to 'bank/src/main/kotlin/tech/libeufin/bank')
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/Config.kt11
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/Main.kt21
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/db/GcDAO.kt18
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(