Fix function_clause on set_succeeded_or_within_failed_transaction#41
Fix function_clause on set_succeeded_or_within_failed_transaction#41nadsat wants to merge 1 commit intosemiocast:masterfrom
Conversation
…on with {error,closed}
| set_succeeded_or_within_failed_transaction({set, []}) -> true; | ||
| set_succeeded_or_within_failed_transaction({error, closed}) -> true; | ||
| set_succeeded_or_within_failed_transaction({error, {pgsql_error, _} = Error}) -> | ||
| pgsql_error:is_in_failed_sql_transaction(Error). |
There was a problem hiding this comment.
Why is the result true instead of pgsql_error:is_in_failed_sql_transaction(Error)?
There was a problem hiding this comment.
According to the definition of is_in_failed_sql_transaction in pgsql_error.erl:
is_in_failed_sql_transaction({pgsql_error, Fields}) ->
{code, <<"25P02">>} =:= lists:keyfind(code, 1, Fields).
{error, closed} wouldn't match. Also the comment on the function set_succeeded_or_within_failed_transaction states that it should always return true.
There was a problem hiding this comment.
But in the definition of pgsql_error:is_in_failed_sql_transaction/1 we can see that it might not return true... (Also, if set_succeeded_or_within_failed_transaction/1 should always return true then it's spec ought to say that instead of boolean())
But anyhow, I think I see what you're saying: if we're in an aborted transaction then the result of this function is true. You're suggesting that having the connection drop is analogous to the transaction aborting. That makes sense to me; the comment
% If set failed because the transaction was aborted, the query will fail
seems like it should apply just as well to the connection dropping.
I feel convinced that this solution is reasonable. :) Were you able to test this code?
There was a problem hiding this comment.
For the moment I haven't been able to reproduce the exact scenario where it happens
|
This code was introduced with commit 94cc7b3. The test for However, ignoring Finally, I believe this is reproduceable and could be implemented in a non-regression test where the actual query is long (e.g. |
clause {error, closed} added in function set_succeeded_or_within_failed_transaction