Close Rows object if the context is canceled before deferred function
This is useful in the following situation: * `query` function gets called * SQL query is executed correctly, the `r` result (Rows) is set * after that, but before `query` returns, `ctx` is canceled * `interruptOnDone`’s goroutine catches the cancelation and signals the completion back to `query` by turning the atomic signaling variable `done` to 1 * `query` finishes and returns * the anonymous deferred function patched here is popped off the deferred stack and executed The current code, seeing that `done` is not zero, will overwrite `r` (Rows) with `nil`, and that implies the Rows can never be `Close`d. Unclosed Rows mean that read transactions never finish, and that blocks the checkpointer process and cause the WAL to grow unbounded, and other read queries to slow down unbounded. https://sqlite.org/wal.html#avoiding_excessively_large_wal_files ("Checkpoint Starvation")
Loading
Please register or sign in to comment