On Sat, Jan 19, 2019 at 4:02 AM Nishant, Fnu <nisha...@amazon.com> wrote: > > Hello, > > While locking heap pages (function RelationGetBufferForTuple() in file hio.c) > we acquire locks in increasing block number order to avoid deadlock. In > certain cases, we do have to drop and reacquire lock on heap pages (when we > have to pin visibility map pages) to avoid doing IO while holding exclusive > lock. The problem is we now acquire locks in bufferId order, which looks like > a slip and the intention was to grab it in block number order. Since it is a > trivial change, I am attaching a patch to correct it. >
On a quick look, your analysis seems correct, but I am bit surprised to see how this survived so long without being caught. I think you need to change below code as well if your analysis and fix is correct. GetVisibilityMapPins() { .. Assert(buffer2 == InvalidBuffer || buffer1 <= buffer2); .. } AFAICS, this code has been added by below commit, so adding author in the loop. commit e16954f3d27fa8e16c379ff6623ae18d6250a39c Author: Robert Haas <rh...@postgresql.org> Date: Mon Jun 27 13:55:55 2011 -0400 Try again to make the visibility map crash safe. My previous attempt was quite a bit less than half-baked with respect to heap_update(). Robert, can you please once see if we are missing anything here because to me the report and fix look genuine. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com