Skip to content

Fix deadlock when fetching next chunk#242

Merged
staticlibs merged 1 commit intoduckdb:mainfrom
staticlibs:rs_fetch_lock_order
Jun 2, 2025
Merged

Fix deadlock when fetching next chunk#242
staticlibs merged 1 commit intoduckdb:mainfrom
staticlibs:rs_fetch_lock_order

Conversation

@staticlibs
Copy link
Collaborator

When connection is being closed, it closes all statements and all result sets on these statements. All this is done while holding connection lock.

When fetching next chunk, result set needs to take both result set and connection locks. Because of the wrong order of taking these locks, concurrent close() call on result set, initiated from Connection#close() was causing a deadlock.

This change reorders locks in ResultSet#fetchChunk() to fix this.

Testing: new test added that reproduces the deadlock reliably (may need to raise the number of iterations).

Fixes: #241

When connection is being closed, it closes all statements and all result
sets on these statements. All this is done while holding connection
lock.

When fetching next chunk, result set needs to take both result set and
connection locks. Because of the wrong order of taking these locks,
concurrent `close()` call on result set, initiated from
`Connection#close()` was causing a deadlock.

This change reorders locks in `ResultSet#fetchChunk()` to fix this.

Testing: new test added that reproduces the deadlock reliably (may need
to raise the number of iterations).

Fixes: duckdb#241
@staticlibs staticlibs merged commit 5bf9ae3 into duckdb:main Jun 2, 2025
10 checks passed
@staticlibs staticlibs deleted the rs_fetch_lock_order branch June 2, 2025 17:46
staticlibs added a commit to staticlibs/duckdb-java that referenced this pull request Jun 15, 2025
This is a backport of the PR duckdb#242 to `v1.3-ossivalis` stable branch.

When connection is being closed, it closes all statements and all result
sets on these statements. All this is done while holding connection
lock.

When fetching next chunk, result set needs to take both result set and
connection locks. Because of the wrong order of taking these locks,
concurrent `close()` call on result set, initiated from
`Connection#close()` was causing a deadlock.

This change reorders locks in `ResultSet#fetchChunk()` to fix this.

Testing: new test added that reproduces the deadlock reliably (may need
to raise the number of iterations).

Fixes: duckdb#241
staticlibs added a commit that referenced this pull request Jun 15, 2025
This is a backport of the PR #242 to `v1.3-ossivalis` stable branch.

When connection is being closed, it closes all statements and all result
sets on these statements. All this is done while holding connection
lock.

When fetching next chunk, result set needs to take both result set and
connection locks. Because of the wrong order of taking these locks,
concurrent `close()` call on result set, initiated from
`Connection#close()` was causing a deadlock.

This change reorders locks in `ResultSet#fetchChunk()` to fix this.

Testing: new test added that reproduces the deadlock reliably (may need
to raise the number of iterations).

Fixes: #241
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.

deadlock when closing connections

1 participant