Re: Concurrency bug in UPDATE of partition-key
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Amit Khandekar <amitdkhan.pg@gmail.com>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2018-06-11T09:59:26Z
Lists: pgsql-hackers
On Mon, Jun 11, 2018 at 3:02 PM, Amit Kapila <amit.kapila16@gmail.com> wrote: > On Thu, Jun 7, 2018 at 1:53 PM, Amit Khandekar <amitdkhan.pg@gmail.com> wrote: >> On 7 June 2018 at 11:44, Amit Kapila <amit.kapila16@gmail.com> wrote: >>> On Tue, Jun 5, 2018 at 8:03 PM, Amit Khandekar <amitdkhan.pg@gmail.com> >>> wrote: >>> >>> I think this will allow before row delete triggers to be fired more than >>> once. Normally, if the EvalPlanQual testing generates a new tuple, we don't >>> fire the triggers again. >> >> If there are BR delete triggers, the tuple will be locked using >> GetTupleForTrigger(). So the subsequent EvalPlanQual testing won't be >> run, since the tuple is already locked due to triggers having run. >> >> But that leads me to think : The same concurrency issue can occur in >> GetTupleForTrigger() also. Say, a concurrent session has already >> locked the tuple, and GetTupleForTrigger() would wait and then return >> the updated tuple in its last parameter newSlot. In that case, we need >> to pass this slot back through ExecBRDeleteTriggers(), and further >> through epqslot parameter of ExecDelete(). But yes, in this case, we >> should avoid calling this trigger function the second time. >> >> If you agree on the above, I will send an updated patch. >> > > Sounds reasonable to me. > Try to add a test case which covers BR trigger code path where you are planning to update. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com
Commits
-
Allow using the updated tuple while moving it to a different partition.
- 40ca70ebcc9d 12.0 landed
- 0527df732beb 11.0 landed