From: | Heikki Linnakangas <hlinnaka(at)iki(dot)fi> |
---|---|
To: | Peter Geoghegan <pg(at)heroku(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, Jeff Janes <jeff(dot)janes(at)gmail(dot)com>, Stephen Frost <sfrost(at)snowman(dot)net>, Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>, Bruce Momjian <bruce(at)momjian(dot)us> |
Cc: | Pg Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: INSERT ... ON CONFLICT UPDATE/IGNORE 4.0 |
Date: | 2015-04-28 03:31:25 |
Message-ID: | 553EFF0D.4040903@iki.fi |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-admin pgsql-hackers |
On 04/27/2015 07:02 PM, Peter Geoghegan wrote:
> So, this can still happen, but is now happening less often than
> before, I believe. On a 16 core server, with continual 128 client
> jjanes_upsert exclusion constraint only runs, with fsync=off, I
> started at this time:
>
> 2015-04-27 21:22:28 UTC [ 0 ]: LOG: database system was shut down at
> 2015-04-27 21:22:25 UTC
> 2015-04-27 21:22:28 UTC [ 0 ]: LOG: database system is ready to
> accept connections
> 2015-04-27 22:47:20 UTC [ 0 ]: LOG: autovacuum launcher started
> 2015-04-27 22:47:21 UTC [ 0 ]: LOG: autovacuum launcher started
>
> Finally, with ON CONFLICT UPDATE (which we don't intend to support
> with exclusion constraints anyway), the torture testing finally
> produces a deadlock several hours later (due to having "livelock
> insurance" [1]):
>
> 2015-04-28 00:22:06 UTC [ 0 ]: LOG: autovacuum launcher started
> 2015-04-28 00:37:24 UTC [ 432432057 ]: ERROR: deadlock detected
> 2015-04-28 00:37:24 UTC [ 432432057 ]: DETAIL: Process 130628 waits
> for ShareLock on transaction 432432127; blocked by process 130589.
> Process 130589 waits for ShareLock on speculative token 13 of
> transaction 432432057; blocked by process 130628.
> Process 130628: insert into upsert_race_test (index, count)
> values ('7566','-1') on conflict
> update set count=TARGET.count + EXCLUDED.count
> where TARGET.index = EXCLUDED.index
> returning count
> Process 130589: insert into upsert_race_test (index, count)
> values ('7566','1') on conflict
> update set count=TARGET.count + EXCLUDED.count
> where TARGET.index = EXCLUDED.index
> returning count
> 2015-04-28 00:37:24 UTC [ 432432057 ]: HINT: See server log for query details.
> 2015-04-28 00:37:24 UTC [ 432432057 ]: CONTEXT: while checking
> exclusion constraint on tuple (3,36) in relation "upsert_race_test"
> 2015-04-28 00:37:24 UTC [ 432432057 ]: STATEMENT: insert into
> upsert_race_test (index, count) values ('7566','-1') on conflict
> update set count=TARGET.count + EXCLUDED.count
> where TARGET.index = EXCLUDED.index
> returning count
>
> ON CONFLICT UPDATE will only ever use unique indexes, and so is not affected.
>
> Given that exclusion constraints can only be used with IGNORE, and
> given that this is so hard to recreate, I'm inclined to conclude that
> it's acceptable. It's certainly way better than risking livelocks by
> not having "deadlock insurance". This is a ridiculously CPU-bound
> workload, with extreme and constant contention. I'd be surprised if
> there were any real complaints from the field in practice.
>
> Do you think that this is acceptable, Heikki?
I thought we had an ironclad scheme to prevent deadlocks like this, so
I'd like to understand why that happens.
- Heikki
From | Date | Subject | |
---|---|---|---|
Next Message | Harshad Adalkonda | 2015-04-28 05:47:32 | Re: server doesn't listen postgresql 9.1 after service change |
Previous Message | Peter Geoghegan | 2015-04-28 02:03:29 | Re: INSERT ... ON CONFLICT UPDATE/IGNORE 4.0 |
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2015-04-28 04:05:47 | Re: pgsql: Add transforms feature |
Previous Message | Alvaro Herrera | 2015-04-28 03:24:50 | Re: Shouldn't CREATE TABLE LIKE copy the relhasoids property? |