Skip to content

Commit 2184cf6

Browse files
committed
Remove late cancellation checks
I'm slowly changing my mind about this.
1 parent 1732244 commit 2184cf6

File tree

4 files changed

+18
-36
lines changed

4 files changed

+18
-36
lines changed

GRDB/Core/DatabasePool.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -801,17 +801,14 @@ extension DatabasePool: DatabaseWriter {
801801
try Task.checkCancellation()
802802
return try await readerPool.barrier {
803803
try Task.checkCancellation()
804-
let value = try writer.sync { db in
804+
return try writer.sync { db in
805805
cancelMutex.store(db.cancel)
806806
try Task.checkCancellation()
807807
defer {
808808
db.uncancel()
809809
}
810810
return try updates(db)
811811
}
812-
#warning("TODO: remove this check, and fix tests accordingly. The database access has succeeded, it's useless to lose its result.")
813-
try Task.checkCancellation()
814-
return value
815812
}
816813
} onCancel: {
817814
cancelMutex.withLock { $0?() }

GRDB/Core/SerializedDatabase.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,7 @@ final class SerializedDatabase {
261261
}
262262
cancelMutex.store(db.cancel)
263263
try Task.checkCancellation()
264-
let value = try block(db)
265-
#warning("TODO: remove this check, and fix tests accordingly. The database access has succeeded, it's useless to lose its result.")
266-
try Task.checkCancellation()
267-
return value
264+
return try block(db)
268265
}
269266
} onCancel: {
270267
cancelMutex.withLock { $0?() }

Tests/GRDBTests/DatabaseReaderTests.swift

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -417,25 +417,22 @@ class DatabaseReaderTests : GRDBTestCase {
417417
try await test(AnyDatabaseWriter(makeDatabaseQueue()))
418418
}
419419

420-
func test_read_is_cancelled_by_Task_cancellation_performed_after_database_access() async throws {
420+
func test_successful_read_is_not_cancelled_by_Task_cancellation_performed_after_database_access() async throws {
421421
func test(_ dbReader: some DatabaseReader) async throws {
422422
let semaphore = AsyncSemaphore(value: 0)
423423
let cancelledTaskMutex = Mutex<Task<Void, any Error>?>(nil)
424424
let task = Task {
425425
await semaphore.wait()
426426
try await dbReader.read { db in
427427
try XCTUnwrap(cancelledTaskMutex.load()).cancel()
428+
XCTAssertTrue(Task.isCancelled)
428429
}
429430
}
430431
cancelledTaskMutex.store(task)
431432
semaphore.signal()
432433

433-
do {
434-
try await task.value
435-
XCTFail("Expected error")
436-
} catch {
437-
XCTAssert(error is CancellationError)
438-
}
434+
// Task has completed without any error
435+
try await task.value
439436

440437
// Database access is restored after cancellation (no error is thrown)
441438
try await dbReader.read { db in
@@ -568,25 +565,22 @@ class DatabaseReaderTests : GRDBTestCase {
568565
try await test(AnyDatabaseWriter(makeDatabaseQueue()))
569566
}
570567

571-
func test_unsafeRead_is_cancelled_by_Task_cancellation_performed_after_database_access() async throws {
568+
func test_successful_unsafeRead_is_not_cancelled_by_Task_cancellation_performed_after_database_access() async throws {
572569
func test(_ dbReader: some DatabaseReader) async throws {
573570
let semaphore = AsyncSemaphore(value: 0)
574571
let cancelledTaskMutex = Mutex<Task<Void, any Error>?>(nil)
575572
let task = Task {
576573
await semaphore.wait()
577574
try await dbReader.unsafeRead { db in
578575
try XCTUnwrap(cancelledTaskMutex.load()).cancel()
576+
XCTAssertTrue(Task.isCancelled)
579577
}
580578
}
581579
cancelledTaskMutex.store(task)
582580
semaphore.signal()
583581

584-
do {
585-
try await task.value
586-
XCTFail("Expected error")
587-
} catch {
588-
XCTAssert(error is CancellationError)
589-
}
582+
// Task has completed without any error
583+
try await task.value
590584

591585
// Database access is restored after cancellation (no error is thrown)
592586
try await dbReader.unsafeRead { db in

Tests/GRDBTests/DatabaseWriterTests.swift

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -540,25 +540,22 @@ class DatabaseWriterTests : GRDBTestCase {
540540
try await test(AnyDatabaseWriter(makeDatabaseQueue()))
541541
}
542542

543-
func test_writeWithoutTransaction_is_cancelled_by_Task_cancellation_performed_after_database_access() async throws {
543+
func test_successful_writeWithoutTransaction_is_not_cancelled_by_Task_cancellation_performed_after_database_access() async throws {
544544
func test(_ dbWriter: some DatabaseWriter) async throws {
545545
let semaphore = AsyncSemaphore(value: 0)
546546
let cancelledTaskMutex = Mutex<Task<Void, any Error>?>(nil)
547547
let task = Task {
548548
await semaphore.wait()
549549
try await dbWriter.writeWithoutTransaction { db in
550550
try XCTUnwrap(cancelledTaskMutex.load()).cancel()
551+
XCTAssertTrue(Task.isCancelled)
551552
}
552553
}
553554
cancelledTaskMutex.store(task)
554555
semaphore.signal()
555556

556-
do {
557-
try await task.value
558-
XCTFail("Expected error")
559-
} catch {
560-
XCTAssert(error is CancellationError)
561-
}
557+
// Task has completed without any error
558+
try await task.value
562559

563560
// Database access is restored after cancellation (no error is thrown)
564561
try await dbWriter.writeWithoutTransaction { db in
@@ -802,25 +799,22 @@ class DatabaseWriterTests : GRDBTestCase {
802799
try await test(AnyDatabaseWriter(makeDatabaseQueue()))
803800
}
804801

805-
func test_barrierWriteWithoutTransaction_is_cancelled_by_Task_cancellation_performed_after_database_access() async throws {
802+
func test_successful_barrierWriteWithoutTransaction_is_not_cancelled_by_Task_cancellation_performed_after_database_access() async throws {
806803
func test(_ dbWriter: some DatabaseWriter) async throws {
807804
let semaphore = AsyncSemaphore(value: 0)
808805
let cancelledTaskMutex = Mutex<Task<Void, any Error>?>(nil)
809806
let task = Task {
810807
await semaphore.wait()
811808
try await dbWriter.barrierWriteWithoutTransaction { db in
812809
try XCTUnwrap(cancelledTaskMutex.load()).cancel()
810+
XCTAssertTrue(Task.isCancelled)
813811
}
814812
}
815813
cancelledTaskMutex.store(task)
816814
semaphore.signal()
817815

818-
do {
819-
try await task.value
820-
XCTFail("Expected error")
821-
} catch {
822-
XCTAssert(error is CancellationError)
823-
}
816+
// Task has completed without any error
817+
try await task.value
824818

825819
// Database access is restored after cancellation (no error is thrown)
826820
try await dbWriter.barrierWriteWithoutTransaction { db in

0 commit comments

Comments
 (0)