Skip to content

Commit 2df86a7

Browse files
Improve logging of storage initialization (both reactive and suspending parts) (#2991)
1 parent e4c1988 commit 2df86a7

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

common/src/jvmMain/kotlin/com/saveourtool/common/storage/StorageInitializer.kt

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@ package com.saveourtool.common.storage
33
import com.saveourtool.common.utils.getLogger
44
import com.saveourtool.common.utils.info
55
import com.saveourtool.common.utils.isNotNull
6-
import io.ktor.client.utils.*
7-
86
import org.slf4j.Logger
97
import reactor.core.publisher.Mono
108
import reactor.core.scheduler.Scheduler
119
import reactor.core.scheduler.Schedulers
12-
1310
import java.util.concurrent.atomic.AtomicBoolean
1411
import java.util.concurrent.atomic.AtomicInteger
15-
1612
import kotlin.reflect.KClass
17-
import kotlinx.coroutines.*
13+
import kotlinx.coroutines.CoroutineDispatcher
14+
import kotlinx.coroutines.CoroutineScope
15+
import kotlinx.coroutines.launch
1816
import kotlinx.coroutines.reactor.asCoroutineDispatcher
1917

2018
/**
@@ -64,7 +62,7 @@ class StorageInitializer(
6462
}
6563
if (wasDoInitCalled) {
6664
log.info {
67-
"Initialization $storageName is done (reactive part)"
65+
"Initialization of $storageName done (reactive part); started: $isInitStarted; finished: ${isDone()}; pending steps: ${pendingStepsCount()}."
6866
}
6967
}
7068
}
@@ -76,10 +74,13 @@ class StorageInitializer(
7674
require(isInitFinishedCount.decrementAndGet() >= 0) {
7775
"Init method cannot be called more than 1 time. Initialization $storageName already finished by another run"
7876
}
79-
if (initResult.isNotNull()) {
80-
log.info {
81-
"Initialization $storageName is done (suspending part)"
77+
log.info {
78+
val status = when {
79+
initResult.isNotNull() -> "done"
80+
else -> "ignored"
8281
}
82+
83+
"Initialization of $storageName $status (suspending part); started: $isInitStarted; finished: ${isDone()}; pending steps: ${pendingStepsCount()}."
8384
}
8485
}
8586
}
@@ -122,6 +123,15 @@ class StorageInitializer(
122123
return action()
123124
}
124125

126+
/**
127+
* @return the value of [isInitFinishedCount] in a human-readable format.
128+
*/
129+
private fun pendingStepsCount(): String =
130+
when (val pendingStepsCount = isInitFinishedCount.get()) {
131+
0 -> "0"
132+
else -> "\u2264 $pendingStepsCount"
133+
}
134+
125135
companion object {
126136
private val log: Logger = getLogger<StorageInitializer>()
127137
private val initScheduler: Scheduler = Schedulers.newBoundedElastic(5, Schedulers.DEFAULT_BOUNDED_ELASTIC_QUEUESIZE, "storage-init-")

cosv-backend/src/main/kotlin/com/saveourtool/cosv/backend/storage/CosvFileStorage.kt

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@ import com.saveourtool.common.storage.ReactiveStorageWithDatabase
77
import com.saveourtool.common.storage.deleteUnexpectedKeys
88
import com.saveourtool.common.utils.blockingToFlux
99
import com.saveourtool.common.utils.blockingToMono
10+
import com.saveourtool.common.utils.getLogger
11+
import com.saveourtool.common.utils.info
1012
import com.saveourtool.common.utils.switchIfEmptyToNotFound
13+
import org.slf4j.Logger
1114
import org.springframework.stereotype.Service
1215
import reactor.core.publisher.Flux
1316
import reactor.core.publisher.Mono
1417
import java.nio.ByteBuffer
18+
import java.util.concurrent.CompletableFuture.runAsync
19+
import java.util.concurrent.Executor
1520

1621
/**
1722
* Storage for COSV files.
@@ -31,10 +36,16 @@ class CosvFileStorage(
3136
* Init method to remove deleted (unexpected) ids which are detected in storage, but missed in database
3237
*/
3338
override fun doInit(underlying: DefaultStorageProjectReactor<CosvFile>): Mono<Unit> = Mono.fromFuture {
34-
s3Operations.deleteUnexpectedKeys(
35-
storageName = "${this::class.simpleName}",
36-
s3KeyManager = s3KeyManager,
37-
)
39+
runAsync({ log.info { "COSV file storage: deleting unexpected keys..." } },
40+
Executor(Runnable::run),
41+
).thenCompose {
42+
s3Operations.deleteUnexpectedKeys(
43+
storageName = "${this::class.simpleName}",
44+
s3KeyManager = s3KeyManager,
45+
)
46+
}.thenApply {
47+
log.info { "COSV file storage: unexpected keys deleted (if any)." }
48+
}
3849
}.publishOn(s3Operations.scheduler)
3950

4051
/**
@@ -54,4 +65,8 @@ class CosvFileStorage(
5465
"Not found CosvFile by id $keyId"
5566
}
5667
.flatMapMany { download(it) }
68+
69+
private companion object {
70+
private val log: Logger = getLogger<CosvFileStorage>()
71+
}
5772
}

0 commit comments

Comments
 (0)