Skip to content

Commit 820dd33

Browse files
committed
Attempt to monitor stuck threads
1 parent 62fa9af commit 820dd33

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

src/main/kotlin/ml/duncte123/skybot/database/AbstractDatabase.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,42 @@ package ml.duncte123.skybot.database
2121
import com.dunctebot.models.settings.GuildSetting
2222
import com.dunctebot.models.settings.WarnAction
2323
import io.sentry.Sentry
24+
import ml.duncte123.skybot.SkyBot
2425
import ml.duncte123.skybot.objects.Tag
2526
import ml.duncte123.skybot.objects.api.*
2627
import ml.duncte123.skybot.objects.command.CommandResult
2728
import ml.duncte123.skybot.objects.command.CustomCommand
2829
import java.time.OffsetDateTime
2930
import java.util.concurrent.CompletableFuture
3031
import java.util.concurrent.Executors
32+
import java.util.concurrent.ThreadPoolExecutor
33+
import java.util.concurrent.TimeUnit
3134

3235
abstract class AbstractDatabase(threads: Int = 2) {
3336
private val databaseThread = Executors.newFixedThreadPool(threads) {
3437
val t = Thread(it, "DatabaseThread")
3538
t.isDaemon = true
3639
t
40+
} as ThreadPoolExecutor
41+
private val databaseKiller = Executors.newScheduledThreadPool(threads) {
42+
val t = Thread(it, "Database-kill-Thread")
43+
t.isDaemon = true
44+
t
45+
}
46+
47+
// Monitor the thread, hopefully this can help us
48+
init {
49+
databaseKiller.scheduleAtFixedRate(
50+
{
51+
if (databaseThread.queue.size > 10) {
52+
SkyBot.getInstance().shardManager
53+
// #breaking-bots
54+
.getTextChannelById(387881926691782657L)
55+
?.sendMessage("<@191231307290771456> Database thread queue is currently at ${databaseThread.queue.size} tasks! (active threads: ${databaseThread.activeCount})")
56+
?.queue()
57+
}
58+
}, 1L, 1L, TimeUnit.DAYS
59+
)
3760
}
3861

3962
// ////////////////
@@ -208,7 +231,7 @@ abstract class AbstractDatabase(threads: Int = 2) {
208231
protected fun <T> runOnThread(r: () -> T): CompletableFuture<T> {
209232
val future = CompletableFuture<T>()
210233

211-
databaseThread.execute {
234+
val runnableFuture = databaseThread.submit {
212235
try {
213236
val result = r.invoke()
214237

@@ -220,6 +243,11 @@ abstract class AbstractDatabase(threads: Int = 2) {
220243
}
221244
}
222245

246+
// Kill the thread after 20 seconds, hopefully this works
247+
databaseKiller.schedule({
248+
runnableFuture.cancel(true)
249+
}, 20, TimeUnit.SECONDS)
250+
223251
return future
224252
}
225253
}

0 commit comments

Comments
 (0)