I think that I’ve got a deadlock (which is handled by `exception when others` 
statements). But the problem is it occurs too fast. Is it possible to get a 
deadlock faster than deadlock_timeout? It’s set to 1s (default value) but it 
looks like I get it immidiately. Error message I’m getting after removing the 
second exception handling is the following:

psycopg2.errors.DeadlockDetected: deadlock detected
DETAIL:  Process 33 waits for AccessExclusiveLock on relation 16453 of database 
16384; blocked by process 37.
Process 37 waits for AccessExclusiveLock on relation 16453 of database 16384; 
blocked by process 33.
HINT:  See server log for query details.
CONTEXT:  SQL statement "
            CREATE TABLE IF NOT EXISTS prov_level_1.log_*__2019_12_16_10_25_46 
PARTITION OF prov_level_1.log_*
                FOR VALUES FROM ('2019-12-16 10:25:46+00') TO ('2019-12-16 
10:25:47+00');
        "

> On 15. Nov 2019, at 11:49, Andrei Zhidenkov <andrei.zhiden...@n26.com> wrote:
> 
> We use this code in order to automatically create new partitions for a 
> partitioned table (Postgres 10.6):
> 
> begin
>  insert into <partitioned_table>;
> exception when undefined_table then
>  begin
>    <create_unexistent_partition>
>    -- A concurrent txn has created the new partition
>    exception when others then end;
>    -- Insert data into the new partition
>    insert into <partitioned_table>;
>  end;
> end;
> 
> As far as I understand we should always have a new partition created either 
> in current or in concurrent transaction but today we faced the problem when 
> we failed to insert data due to a partition nonexistence for a small period 
> of time. Have I missed something?
> 
> Thank you.
> 
> —
> 
> With best regards, Andrei Zhidenkov.



Reply via email to