Re: [HACKERS] Restrict concurrent update/delete with UPDATE of partition key
Amul Sul <sulamul@gmail.com>
From: amul sul <sulamul@gmail.com>
To: Robert Haas <robertmhaas@gmail.com>
Cc: PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2017-11-23T11:48:44Z
Lists: pgsql-hackers
Attachments
- 0001-POC-Invalidate-ip_blkid-v2.patch (application/octet-stream) patch v2-0001
- 0002-isolation-tests-v1.patch (application/octet-stream) patch v1-0002
On Sat, Nov 11, 2017 at 1:05 AM, Robert Haas <robertmhaas@gmail.com> wrote: > On Wed, Sep 27, 2017 at 7:07 AM, amul sul <sulamul@gmail.com> wrote: >> Attaching POC patch that throws an error in the case of a concurrent update >> to an already deleted tuple due to UPDATE of partition key[1]. >> >> In a normal update new tuple is linked to the old one via ctid forming >> a chain of tuple versions but UPDATE of partition key[1] move tuple >> from one partition to an another partition table which breaks that chain. > > This patch needs a rebase. It has one whitespace-only hunk that > should possibly be excluded. > Thanks for looking at the patch. > I think the basic idea of this is sound. Either you or Amit need to > document the behavior in the user-facing documentation, and it needs > tests that hit every single one of the new error checks you've added > (obviously, the tests will only work in combination with Amit's > patch). The isolation should be sufficient to write such tests. > > It needs some more extensive comments as well. The fact that we're > assigning a meaning to ip_blkid -> InvalidBlockNumber is a big deal, > and should at least be documented in itemptr.h in the comments for the > ItemPointerData structure. > > I suspect ExecOnConflictUpdate needs an update for the > HeapTupleUpdated case similar to what you've done elsewhere. > UPDATE of partition key v25[1] has documented this concurrent scenario, I need to rework on that document paragraph to include this behaviour, will discuss with Amit. Attached 0001 patch includes error check for 8 functions, out of 8 I am able to build isolation test for 4 functions -- ExecUpdate,ExecDelete, GetTupleForTrigger & ExecLockRows. And remaining are EvalPlanQualFetch, ExecOnConflictUpdate, RelationFindReplTupleByIndex & RelationFindReplTupleSeq. Note that check in RelationFindReplTupleByIndex & RelationFindReplTupleSeq will have LOG not an ERROR. Any help/suggestion to build test for these function would be much appreciated. 1] http://postgr.es/m/CAJ3gD9f4Um99sOJmVSEPj783VWw5GbXkgU3OWcYZJv=ipjTkAw@mail.gmail.com Regards, Amul
Commits
-
Raise error when affecting tuple moved into different partition.
- f16241bef7cc 11.0 landed
-
Handle INSERT .. ON CONFLICT with partitioned tables
- 555ee77a9668 11.0 cited
-
Change the way we mark tuples as frozen.
- 37484ad2aace 9.4.0 cited