Skip to content

Commit f1dfa25

Browse files
committed
Try catching closed pool message
1 parent a55c9c9 commit f1dfa25

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

integrations/room/src/commonIntegrationTest/kotlin/com/powersync/integrations/room/PowerSyncRoomTest.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package com.powersync.integrations.room
22

33
import androidx.sqlite.driver.bundled.BundledSQLiteDriver
44
import app.cash.turbine.turbineScope
5+
import co.touchlab.kermit.CommonWriter
56
import co.touchlab.kermit.Logger
7+
import co.touchlab.kermit.Severity
68
import co.touchlab.kermit.loggerConfigInit
79
import com.powersync.PowerSyncDatabase
810
import com.powersync.db.getString
@@ -28,14 +30,14 @@ class PowerSyncRoomTest {
2830

2931
@AfterTest
3032
fun tearDown() {
33+
logger.i { "Closing Room database" }
3134
database.close()
3235
}
3336

3437
@Test
3538
fun roomWritePowerSyncRead() =
3639
runTest {
3740
database.userDao().create(User(id = "test", name = "Test user"))
38-
val logger = Logger(loggerConfigInit())
3941

4042
val powersync =
4143
PowerSyncDatabase.opened(
@@ -61,7 +63,6 @@ class PowerSyncRoomTest {
6163
@Test
6264
fun roomWritePowerSyncWatch() =
6365
runTest {
64-
val logger = Logger(loggerConfigInit())
6566
val pool = RoomConnectionPool(database, TestDatabase.schema)
6667

6768
val powersync =
@@ -95,7 +96,6 @@ class PowerSyncRoomTest {
9596
@Test
9697
fun powersyncWriteRoomRead() =
9798
runTest {
98-
val logger = Logger(loggerConfigInit())
9999
val pool = RoomConnectionPool(database, TestDatabase.schema)
100100

101101
val powersync =
@@ -116,7 +116,6 @@ class PowerSyncRoomTest {
116116
@Test
117117
fun powersyncWriteRoomWatch() =
118118
runTest {
119-
val logger = Logger(loggerConfigInit())
120119
val pool = RoomConnectionPool(database, TestDatabase.schema)
121120

122121
val powersync =
@@ -139,4 +138,8 @@ class PowerSyncRoomTest {
139138

140139
powersync.close()
141140
}
141+
142+
companion object {
143+
private val logger = Logger(loggerConfigInit(CommonWriter()))
144+
}
142145
}

integrations/room/src/commonMain/kotlin/com/powersync/integrations/room/RoomConnectionPool.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.room.Transactor
55
import androidx.room.execSQL
66
import androidx.room.useReaderConnection
77
import androidx.room.useWriterConnection
8+
import androidx.sqlite.SQLiteException
89
import androidx.sqlite.SQLiteStatement
910
import com.powersync.db.driver.SQLiteConnectionLease
1011
import com.powersync.db.driver.SQLiteConnectionPool
@@ -73,7 +74,19 @@ public class RoomConnectionPool(
7374
db.getCoroutineScope().launch {
7475
val tables = schema.rawTables.map { it.name }.toTypedArray()
7576
db.invalidationTracker.createFlow(*tables, emitInitialState = false).collect {
76-
transferPendingRoomUpdatesToPowerSync()
77+
try {
78+
transferPendingRoomUpdatesToPowerSync()
79+
} catch (e: SQLiteException) {
80+
// It can happen that we get an update shortly before the database is closed. Since this is
81+
// asynchronous, we'd then be using the database in a closed state, which fails. We handle that by
82+
// stopping the flow collection.
83+
if (e.message == "Connection pool is closed") {
84+
return@collect
85+
}
86+
87+
throw e
88+
}
89+
7790
}
7891
}
7992
}

0 commit comments

Comments
 (0)