Thread: fix oversight converting buf_id to Buffer
Attached patch fixes oversights converting buf_id to Buffer in PrintBufferDescs() and InvalidateBuffer(). Especially for the latter, the reason we haven't seen any reports of the issue might be that it needs certain concurrent conditions to be true. Along the line, it also changes all direct maths against buf_id to use BufferDescriptorGetBuffer() instead. Regards, Qingqing
Attachment
Hi, That's a very nice catch! Did you trigger the error or just found it when reading the code? On 2015-08-10 12:12:01 -0700, Qingqing Zhou wrote: > Attached patch fixes oversights converting buf_id to Buffer in > PrintBufferDescs() and InvalidateBuffer(). Especially for the latter, > the reason we haven't seen any reports of the issue might be that it > needs certain concurrent conditions to be true. PrintBufferDescs() is dead code, so bit is not surprising. I'm also not surprised that the wrong buffer in InvalidateBuffer()'s check doesn't trigger. You'd have to have a cursor open in the current backend that currently pins the off-by-one buffer. I'm too tired right now to look at this, but it generally looked sane. Regards, Andres
On Mon, Aug 10, 2015 at 4:15 PM, Andres Freund <andres@anarazel.de> wrote: > > That's a very nice catch! Did you trigger the error or just found it > when reading the code? > My fellow colleagues hit the issue during some stress: I am not clear the exact repro but from the failed assertion, the cause is kinda clear. Regards, Qingqing
Hi, On 2015-08-11 01:15:37 +0200, Andres Freund wrote: > I'm too tired right now to look at this, but it generally looked sane. Pushed your fix to master and 9.5, with two very minor changes: 1) I moved the BufferDescriptorGetBuffer() call in PinBuffer_Locked() to after the spinlock release. It's rather minor,but there seems little reason to do it before except the assert, which isn't compiled in production. 2) I removed the two asserts you added. They essentially asserted that i + 1 == i + 1. Thanks again for the catch and patch. Greetings, Andres Freund
All look good to me, Thank you, Qingqing On Wed, Aug 12, 2015 at 8:37 AM, Andres Freund <andres@anarazel.de> wrote: > Hi, > > On 2015-08-11 01:15:37 +0200, Andres Freund wrote: >> I'm too tired right now to look at this, but it generally looked sane. > > Pushed your fix to master and 9.5, with two very minor changes: > 1) I moved the BufferDescriptorGetBuffer() call in PinBuffer_Locked() to > after the spinlock release. It's rather minor, but there seems > little reason to do it before except the assert, which isn't compiled > in production. > 2) I removed the two asserts you added. They essentially asserted that > i + 1 == i + 1. > > Thanks again for the catch and patch. > > Greetings, > > Andres Freund