Skip to content

Refine MergeInterceptor to not cancel current job when awaiter exists#1950

Merged
revonateB0T merged 7 commits intomainfrom
asd
Nov 19, 2024
Merged

Refine MergeInterceptor to not cancel current job when awaiter exists#1950
revonateB0T merged 7 commits intomainfrom
asd

Conversation

@revonateB0T
Copy link
Copy Markdown
Collaborator

No description provided.

@revonateB0T revonateB0T marked this pull request as ready for review November 19, 2024 14:49
@revonateB0T
Copy link
Copy Markdown
Collaborator Author

fun testTightRope() = runBlocking {
    fun exit(): Nothing = unreachable()
    fun ensure(precondition: Boolean): Nothing = unreachable()
    TightRopeTracker.use("test") {
        val chan = Channel<Int>(capacity = 1)

        println("Test 1 started")
        // job1 must complete as job2 is awaiting
        val job1 = launch { sendAndAwait { delay(1000).also { chan.send(1) } } }
        delay(50)
        val job2 = launch { sendAndAwait { delay(500).also { check(chan.receive() == 1) } } }
        delay(100)
        job1.cancel()

        delay(5000)
        println("Job1 ${job1.isCompleted}")
        println("Job2 ${job2.isCompleted}")
        println("Test 1 passed")

        println("Test 2 started")
        // job3 must not complete as no awaiters
        val job3 = launch { sendAndAwait { delay(1000) } }
        delay(500)
        job3.cancel()

        delay(5000)
        println("Test 2 passed")

        println("Test 3 started")
        // job4 must not complete as cancel happens before awaiters added
        val job4 = launch { sendAndAwait { delay(1000).also { exit() } } }
        delay(100)
        val job5 = launch {
            job4.cancel()
            sendAndAwait { delay(500) }
        }

        delay(5000)
        println("Test 3 passed")

        println("Test 4 started")
        // job6 must not complete as awaiters all gone
        // job7 must not enter sendAndAwait content
        val job6 = launch { sendAndAwait { delay(1000).also { exit() } } }
        val job7 = launch { sendAndAwait { delay(1000).also { exit() } } }
        delay(200)
        job6.cancel()
        job7.cancel()

        delay(5000)
        println("Test 4 passed")

        println("Test 5 started")
        // job9 ust not enter sendAndAwait content as it's cancelled before job8 completed
        val job8 = launch { sendAndAwait { delay(1000) } }
        val job9 = launch { sendAndAwait { exit() } }
        val job10 = launch { sendAndAwait { delay(1000) } }
        job9.cancel()
        delay(5000)
        println("Test 5 passed")
    }
}

@revonateB0T revonateB0T enabled auto-merge (squash) November 19, 2024 18:04
@revonateB0T revonateB0T merged commit a554982 into main Nov 19, 2024
@revonateB0T revonateB0T deleted the asd branch November 19, 2024 18:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants