Skip to content

Commit

Permalink
Workaround for mysql2 prepared statements flaky test
Browse files Browse the repository at this point in the history
Ref: brianmario/mysql2#1383

The proper fix can only be upstream, however we can reduce the likeliness
of hitting the bug by only calling `#affected_rows` when strictly necessary,
meaning when we performed a query that didn't return a result set.

Co-Authored-By: Étienne Barrié <etienne.barrie@gmail.com>
  • Loading branch information
byroot and etiennebarrie committed Dec 2, 2024
1 parent 4060253 commit d45d186
Showing 1 changed file with 6 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,12 @@ def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notif
result = if binds.nil? || binds.empty?
ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
result = raw_connection.query(sql)
@affected_rows_before_warnings = raw_connection.affected_rows
# Ref: https://github.com/brianmario/mysql2/pull/1383
# As of mysql2 0.5.6 `#affected_rows` might raise Mysql2::Error if a prepared statement
# from that same connection was GCed while `#query` released the GVL.
# By avoiding to call `#affected_rows` when we have a result, we reduce the likeliness
# of hitting the bug.
@affected_rows_before_warnings = result&.size || raw_connection.affected_rows
result
end
result
Expand Down

0 comments on commit d45d186

Please sign in to comment.