From: | Noah Misch <noah(at)leadboat(dot)com> |
---|---|
To: | Andrey Borodin <x4mmm(at)yandex-team(dot)ru> |
Cc: | Michael Paquier <michael(at)paquier(dot)xyz>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-bugs(at)lists(dot)postgresql(dot)org |
Subject: | Re: CREATE INDEX CONCURRENTLY does not index prepared xact's data |
Date: | 2021-01-24 02:27:43 |
Message-ID: | 20210124022743.GA2270535@rfd.leadboat.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
On Fri, Jan 22, 2021 at 10:44:35AM +0500, Andrey Borodin wrote:
> > 17 янв. 2021 г., в 12:24, Noah Misch <noah(at)leadboat(dot)com> написал(а):
> >> @@ -4461,9 +4462,21 @@ bool
> >> VirtualXactLock(VirtualTransactionId vxid, bool wait)
> >> {
> >> LOCKTAG tag;
> >> - PGPROC *proc;
> >> + PGPROC *proc = NULL;
> >>
> >> - Assert(VirtualTransactionIdIsValid(vxid));
> >> + Assert(VirtualTransactionIdIsValid(vxid) ||
> >> + VirtualTransactionIdIsPreparedXact(vxid));
> >> +
> >> + if (VirtualTransactionIdIsPreparedXact(vxid))
> >> + {
> >> + LockAcquireResult lar;
> >> + /* If it's prepared xact - just wait for it */
> >> + SET_LOCKTAG_TRANSACTION(tag, vxid.localTransactionId);
> >> + lar = LockAcquire(&tag, ShareLock, false, !wait);
> >> + if (lar == LOCKACQUIRE_OK)
> >
> > This should instead test "!= LOCKACQUIRE_NOT_AVAIL", lest
> > LOCKACQUIRE_ALREADY_HELD happen. (It perhaps can't happen, but skipping the
> > LockRelease() would be wrong if it did.)
> I think that code that successfully acquired lock should release it. Other way we risk to release someone's else lock held for a reason. We only acquire lock to release it instantly anyway.
LockAcquire() increments the reference count before returning
LOCKACQUIRE_ALREADY_HELD, so it is an acquire. If this caller doesn't
LockRelease(), the lock will persist until end of transaction.
I changed that, updated comments, and fixed pgindent damage. I plan to push
the attached version.
> > The array can contain many of these new "invalid"
> > VXIDs, and an all-zeroes VXID terminates the array. Rather than change the
Correction: the terminator contains (InvalidBackendId,0).
> By the way maybe rename "check-prepared-txns" to "check-prepared-xacts" for consistency?
The "xact" term is about three times as frequent "txn". I favor "xact" in new
usage. It's not dominant enough to change old usage unless done pervasively.
Attachment | Content-Type | Size |
---|---|---|
prepared-transactions-cic-v7nm.patch | text/plain | 11.0 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Kimon Krenz | 2021-01-24 23:03:13 | Re: BUG #16827: macOS interrupted syscall leads to a crash |
Previous Message | Alvaro Herrera | 2021-01-23 21:44:11 | Re: BUG #16794: BEFORE UPDATE FOR EACH ROW triggers on partitioned tables can break tuple moving UPDATEs |