Skip to content

Commit d9fa264

Browse files
Flaxooskmayoral
andauthored
Task scheduling fix (#92)
- removed task releasing. now only lock acquisition is required - removed acquire lock mutex, it's enough to rely on redis - added retry in TaskSchedulingPluginTest.kt as sometimes - Bump to 2.2.1 Dependency version updates: * Update to support latest versions of ktor, exposed, kotlin, etc * remove dup dep * update build pull request to use JDK 17 instead of 11 --------- Co-authored-by: Keith Mayoral <keith.mayoral@bird.co>
1 parent 49a2cd3 commit d9fa264

15 files changed

Lines changed: 225 additions & 168 deletions

File tree

.github/workflows/build-pull-request.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ jobs:
1313
- name: Checkout Repository
1414
uses: actions/checkout@v4
1515

16-
- name: Set up JDK 11
16+
- name: Set up JDK 17
1717
uses: actions/setup-java@v4
1818
with:
19-
java-version: 11
19+
java-version: 17
2020
distribution: 'temurin'
2121

2222
- name: Detect modified subprojects

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,4 @@ out/
4545
/.run/publish kafka and run example.run.xml
4646
/.kotlin
4747
/buildSrc/.kotlin
48+
**/node_modules/

buildSrc/src/main/kotlin/io/github/flaxoos/ktor/Conventions.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import kotlinx.kover.gradle.plugin.dsl.KoverReportExtension
1717
import org.gradle.api.NamedDomainObjectCollection
1818
import org.gradle.api.Plugin
1919
import org.gradle.api.Project
20-
import org.gradle.api.tasks.testing.Test
2120
import org.gradle.api.tasks.wrapper.Wrapper
2221
import org.gradle.kotlin.dsl.DependencyHandlerScope
2322
import org.gradle.kotlin.dsl.findByType
@@ -30,6 +29,7 @@ import org.gradle.plugins.ide.idea.model.IdeaModel
3029
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
3130
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
3231
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
32+
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTest
3333
import org.jlleitschuh.gradle.ktlint.KtlintExtension
3434
import org.jlleitschuh.gradle.ktlint.tasks.KtLintCheckTask
3535
import org.jlleitschuh.gradle.ktlint.tasks.KtLintFormatTask
@@ -54,7 +54,6 @@ open class Conventions : Plugin<Project> {
5454
apply(project.plugin("ktlint"))
5555
}
5656
repositories {
57-
mavenLocal()
5857
mavenCentral()
5958
maven {
6059
url = uri("https://maven.pkg.github.com/flaxoos/flax-gradle-plugins")
@@ -120,12 +119,12 @@ open class Conventions : Plugin<Project> {
120119
tasks.named("build") {
121120
dependsOn(tasks.matching { it.name.matches(Regex("detekt(?!.*Baseline).*\\b(Main|Test)\\b\n")) })
122121
}
123-
tasks.withType(Test::class) {
122+
tasks.withType<KotlinJvmTest> {
124123
useJUnitPlatform()
125124
}
126125

127126
tasks.withType<Wrapper> {
128-
gradleVersion = "8.3"
127+
gradleVersion = "8.11"
129128
distributionType = Wrapper.DistributionType.BIN
130129
}
131130
extensions.findByType(KoverReportExtension::class)?.apply {

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ github.repository.name=extra-ktor-plugins
33
kotlin.native.cacheKind.linuxX64=none
44
kotlin.native.ignoreDisabledTargets=true
55
gradle.publish.enable.module-metadata=true
6-
version=2.1.3
6+
version=2.2.1
77
gpr.user=flaxoos
88
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=2g
99
kotlin.mpp.applyDefaultHierarchyTemplate=false

gradle/libs.versions.toml

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,41 @@
11
[versions]
22
# Core technologies
3-
kotlin = "2.0.20"
4-
java = "11"
5-
kotlinx-serialization = "1.7.3"
6-
kotlinx-io = "0.3.0"
7-
ksp = "1.9.10-1.0.13"
3+
kotlin = "2.1.10"
4+
java = "17"
5+
kotlinx-serialization = "1.8.0"
6+
kotlinx-io = "0.7.0"
7+
ksp = "2.1.10-1.0.31"
88
reactor = "3.7.4"
99

1010
# Web Framework
11-
ktor = "3.0.0"
11+
ktor = "3.1.1"
1212

1313
# Android
1414
android = "8.1.0"
1515

1616
# Database
17-
h2 = "2.2.224"
18-
postgres = "42.6.0"
19-
exposed = "0.44.0"
20-
mongodb = "5.2.0"
17+
h2 = "2.3.232"
18+
postgres = "42.7.5"
19+
exposed = "0.60.0"
20+
mongodb = "5.3.1"
2121

2222
# Logging
2323
logback = "1.5.12"
2424
kotlin-logging = "5.1.0"
2525
logging_capabilities = "0.11.1"
2626

2727
# Asynchronous and Concurrency
28-
atomicfu = "0.25.0"
29-
kotlinx-coroutines = "1.9.0"
28+
atomicfu = "0.27.0"
29+
kotlinx-coroutines = "1.10.1"
3030

3131
# Testing
32-
#kotest = "6.0.0.M1"
33-
kotest = "5.9.1"
34-
kotest-stable = "5.9.1"
32+
kotest-6 = "6.0.0.M1"
33+
kotest-5 = "5.9.1"
3534
kotest-test-containers = "2.0.2"
3635
mockk = "1.13.4"
3736
mockative = "2.0.1"
3837
kmock = "0.3.0-rc08"
39-
testcontainers = "1.19.8"
38+
testcontainers = "1.20.6"
4039
redis-testcontainers = "1.6.4"
4140

4241
# Code Quality and Coverage
@@ -47,7 +46,7 @@ koverBadge = "0.0.6"
4746
detekt = "1.23.1"
4847

4948
# Date and Time
50-
kotlinx-datetime = "0.4.0"
49+
kotlinx-datetime = "0.6.2"
5150

5251
# Functional Programming
5352
arrow = "1.2.4"
@@ -74,8 +73,8 @@ gradle-release = "3.0.2"
7473
nexusPublish = "2.0.0"
7574

7675
# Miscellaneous
77-
krontab = "2.2.1"
78-
uuid = "0.8.1"
76+
krontab = "2.7.2"
77+
uuid = "0.8.4"
7978

8079
[libraries]
8180
# Core libraries
@@ -128,11 +127,11 @@ mongodb-driver-kotlin-coroutine = { module = "org.mongodb:mongodb-driver-kotlin-
128127
mongodb-bson-kotlinx = { module = "org.mongodb:bson-kotlinx", version.ref = "mongodb" }
129128

130129
# Testing libraries
131-
kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" }
132-
kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" }
133-
kotest-framework-datatest = { module = "io.kotest:kotest-framework-datatest", version.ref = "kotest-stable" }
134-
kotest-assertions-core = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest-stable" }
135-
kotest-framework-engine = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest" }
130+
kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest-6" }
131+
kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest-6" }
132+
kotest-framework-datatest = { module = "io.kotest:kotest-framework-datatest", version.ref = "kotest-5" }
133+
kotest-assertions-core = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest-6" }
134+
kotest-framework-engine = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest-6" }
136135
mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
137136
mockk-agent-jvm = { module = "io.mockk:mockk-agent-jvm", version.ref = "mockk" }
138137
mockative = { module = "io.mockative:mockative", version.ref = "mockative" }
@@ -170,7 +169,7 @@ kotlin-logging = { module = "io.github.oshai:kotlin-logging", version.ref = "kot
170169
loggingCapabilities-gradlePlugin = { module = "dev.jacomet.gradle.plugins:logging-capabilities", version.ref = "logging_capabilities" }
171170

172171
# Testing plugins
173-
kotestFrameworkMultiplatform-gradlePlugin = { module = "io.kotest:kotest-framework-multiplatform-plugin-gradle", version.ref = "kotest" }
172+
kotestFrameworkMultiplatform-gradlePlugin = { module = "io.kotest:kotest-framework-multiplatform-plugin-gradle", version.ref = "kotest-6" }
174173

175174
# Documentation
176175
dokka-gradlePlugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" }
@@ -221,7 +220,7 @@ dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
221220
atomicfu = { id = "org.jetbrains.kotlinx.atomicfu", version.ref = "atomicfu" }
222221

223222
# Testing
224-
kotest = { id = "io.kotest.multiplatform", version.ref = "kotest" }
223+
kotest = { id = "io.kotest.multiplatform", version.ref = "kotest-6" }
225224

226225
# Ksp
227226
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }

ktor-server-task-scheduling/ktor-server-task-scheduling-core/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/taskscheduling/TaskSchedulingConfiguration.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public open class TaskSchedulingConfiguration {
5151
)
5252
}
5353

54-
public fun addTaskManager(taskManagerConfiguration: TaskManagerConfiguration<*>) {
54+
public fun addTaskManager(taskManagerConfiguration: TaskManagerConfiguration) {
5555
taskManagers.add {
5656
taskManagerConfiguration.createTaskManager(it)
5757
}

ktor-server-task-scheduling/ktor-server-task-scheduling-core/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/taskscheduling/managers/TaskManager.kt

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import io.github.flaxoos.ktor.server.plugins.taskscheduling.tasks.Task
55
import io.github.oshai.kotlinlogging.KotlinLogging
66
import io.ktor.server.application.Application
77
import io.ktor.utils.io.core.Closeable
8-
import korlibs.time.DateFormat
8+
import korlibs.time.DateFormat.Companion.FORMAT2
99
import korlibs.time.DateTime
10+
import korlibs.time.TimeFormat.Companion.DEFAULT_FORMAT
1011
import korlibs.time.parseLocal
11-
import kotlinx.coroutines.async
12-
import kotlinx.coroutines.awaitAll
12+
import kotlinx.coroutines.joinAll
13+
import kotlinx.coroutines.launch
1314
import kotlin.jvm.JvmInline
1415

1516
private val logger = KotlinLogging.logger { }
@@ -22,9 +23,10 @@ public abstract class TaskManager<TASK_EXECUTION_TOKEN : TaskExecutionToken> : C
2223
task: Task,
2324
executionTime: DateTime,
2425
) {
25-
val runs =
26-
task.concurrencyRange().map { concurrencyIndex ->
27-
application.async {
26+
task
27+
.concurrencyRange()
28+
.map { concurrencyIndex ->
29+
application.launch {
2830
logger.trace {
2931
"${application.host()}: Attempting task execution at ${executionTime.format2()} for ${task.name} - $concurrencyIndex"
3032
}
@@ -42,10 +44,7 @@ public abstract class TaskManager<TASK_EXECUTION_TOKEN : TaskExecutionToken> : C
4244
null
4345
}
4446
}
45-
}
46-
runs.awaitAll().filterNotNull().forEach {
47-
markExecuted(it)
48-
}
47+
}.joinAll()
4948
}
5049

5150
/**
@@ -62,25 +61,22 @@ public abstract class TaskManager<TASK_EXECUTION_TOKEN : TaskExecutionToken> : C
6261
concurrencyIndex: Int,
6362
): TASK_EXECUTION_TOKEN?
6463

65-
/**
66-
* Mark this task as, provided a key was acquired
67-
*/
68-
public abstract suspend fun markExecuted(key: TASK_EXECUTION_TOKEN)
69-
7064
public companion object {
7165
public fun Application.host(): String = "Host ${environment.config.property("ktor.deployment.host").getString()}"
7266

73-
public fun DateTime.format2(): String = format(DateFormat.FORMAT2)
67+
public fun DateTime.format2(): String = format(FORMAT2)
68+
69+
public fun DateTime.formatTime(): String = time.format(DEFAULT_FORMAT)
7470

75-
public fun String.format2ToDateTime(): DateTime = DateFormat.FORMAT2.parseLocal(this)
71+
public fun String.format2ToDateTime(): DateTime = FORMAT2.parseLocal(this)
7672
}
7773
}
7874

7975
/**
8076
* Configuration for [TaskManager]
8177
*/
8278
@TaskSchedulingDsl
83-
public abstract class TaskManagerConfiguration<TASK_EXECUTION_TOKEN> {
79+
public abstract class TaskManagerConfiguration {
8480
/**
8581
* The name of the task manager, will be used to identify the task manager when assigning tasks to it
8682
* if none is provided, it will be considered the default one. only one default task manager is allowed.

ktor-server-task-scheduling/ktor-server-task-scheduling-core/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/taskscheduling/managers/lock/TaskLockManager.kt

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@ public abstract class TaskLockManager<TASK_LOCK : TaskLock> : TaskManager<TASK_L
1414
concurrencyIndex: Int,
1515
): TASK_LOCK? = acquireLockKey(task, executionTime, concurrencyIndex)
1616

17-
override suspend fun markExecuted(key: TASK_LOCK) {
18-
releaseLockKey(key)
19-
}
20-
2117
/**
2218
* Get permission to execute the task
2319
*/
@@ -26,12 +22,7 @@ public abstract class TaskLockManager<TASK_LOCK : TaskLock> : TaskManager<TASK_L
2622
executionTime: DateTime,
2723
concurrencyIndex: Int,
2824
): TASK_LOCK?
29-
30-
/**
31-
* Release permission to execute the task
32-
*/
33-
protected abstract suspend fun releaseLockKey(key: TASK_LOCK)
3425
}
3526

3627
@TaskSchedulingDsl
37-
public abstract class TaskLockManagerConfiguration<TASK_LOCK> : TaskManagerConfiguration<TASK_LOCK>()
28+
public abstract class TaskLockManagerConfiguration : TaskManagerConfiguration()

ktor-server-task-scheduling/ktor-server-task-scheduling-core/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/taskscheduling/managers/lock/database/DatabaseTaskLockManager.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,4 @@ public interface DatabaseTaskLock : TaskLock {
8585
}
8686

8787
@TaskSchedulingDsl
88-
public abstract class DatabaseTaskLockManagerConfiguration<DB_TASK_LOCK_KEY : DatabaseTaskLock> :
89-
TaskLockManagerConfiguration<DB_TASK_LOCK_KEY>()
88+
public abstract class DatabaseTaskLockManagerConfiguration : TaskLockManagerConfiguration()

0 commit comments

Comments
 (0)