On Thu, Dec 15, 2011 at 8:19 AM, Simon Riggs <si...@2ndquadrant.com> wrote: > Comments?
I think there is a small bug here: + TransactionId xid = pgxact->xid; + + /* + * Don't record locks for transactions if we know they have already + * issued their WAL record for commit but not yet released lock. + * It is still possible that we see locks held by already complete + * transactions, if they haven't yet zeroed their xids. + */ + if (!TransactionIdIsValid(xid)) + continue; accessExclusiveLocks[index].xid = pgxact->xid; accessExclusiveLocks[index].dbOid = lock->tag.locktag_field1; ...because you're fetching pgxact->xid, testing whether it's valid, and then fetching it again. It could change in the meantime. You probably want to change the assignment to read: accessExclusiveLocks[index].xid = xid; Also, we should probably change this pointer to be declared volatile: PGXACT *pgxact = &ProcGlobal->allPgXact[proc->pgprocno]; Otherwise, I think the compiler might get cute and decide to fetch the xid twice anyway, effectively undoing our attempt to pull it into a local variable. I think this comment could be clarified in some way, to make it more clear that we had a bug at one point, and it was fixed - the "from a time when they were possible" language wouldn't be entirely clear to me after the fact: + * Zero xids should no longer be possible, but we may be replaying WAL + * from a time when they were possible. It would probably make sense to break out of this loop if a match is found: ! for (i = 0; i < nxids; i++) ! { ! if (lock->xid == xids[i]) ! found = true; ! } I'm not sure I fully understand the rest of this, but those are the only things I noticed on a read-through. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers