On 2019-Jun-16, Alvaro Herrera wrote: > So, I'm too lazy today to generate a case that fully reproduces the > deadlock, because you need to stall 's2' a little bit using the > well-known advisory lock trick, but this one hits the code that would > re-initialize the variable.
Here's such a case. I was unable to reproduce the condition with a smaller sequence of commands. This one does hit the deadlock when used with the previous code, as expected; with the fixed code (ie. skip_tuple_lock in the outer scope and same lifetime as "first_time") then it works fine, no deadlock. I'm going to push the fixed commit this afternoon, including this as an additional permutation in the spec file. setup { drop table if exists tlu_job; create table tlu_job (id integer primary key, name text); insert into tlu_job values(1, 'a'); } teardown { drop table tlu_job; } session "s0" setup { begin; } step "s0_keyshare" { select id from tlu_job where id = 1 for key share; } step "s0_share" { select id from tlu_job where id = 1 for share; } step "s0_rollback" { rollback; } session "s1" setup { begin; } step "s1_keyshare" { select id from tlu_job where id = 1 for key share; } step "s1_savept_e" { savepoint s1_e; } step "s1_share" { select id from tlu_job where id = 1 for share; } step "s1_savept_f" { savepoint s1_f; } step "s1_fornokeyupd" { select id from tlu_job where id = 1 for no key update; } step "s1_rollback_f" { rollback to s1_f; } step "s1_rollback_e" { rollback to s1_e; } step "s1_rollback" { rollback; } session "s2" setup { begin; } step "s2_keyshare" { select id from tlu_job where id = 1 for key share; } step "s2_fornokeyupd" { select id from tlu_job where id = 1 for no key update; } step "s2_rollback" { rollback; } session "s3" setup { begin; } step "s3_for_update" { select id from tlu_job where id = 1 for update; } step "s3_rollback" { rollback; } permutation "s1_keyshare" "s3_for_update" "s2_keyshare" "s1_savept_e" "s1_share" "s1_savept_f" "s1_fornokeyupd" "s2_fornokeyupd" "s0_keyshare" "s1_rollback_f" "s0_share" "s1_rollback_e" "s1_rollback" "s2_rollback" "s0_rollback" "s3_rollback" -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services