On Mon, Apr 14, 2025 at 12:50 PM Dmitry Dolgov <9erthali...@gmail.com> wrote: > > > On Mon, Apr 14, 2025 at 10:40:28AM GMT, Ashutosh Bapat wrote: > > > > However, when we put back the patches to shrink buffers, we will evict > > the extra buffers, and shrink - if all the processes haven't > > participated in the barrier by then, some of them may try to access > > those buffers - re-installing them and then bad things can happen. > > As I've mentioned above, I don't see how a process could try to access a > buffer, if it's on the path between receiving the ProcSignalBarrier and > attaching to the global shmem Barrier, even if we shrink buffers. > AFAICT interrupt handles should not touch buffers, and otherwise the > process doesn't have any point withing this window where it might do > this. Do you have some particular scenario in mind?
ProcessProcSignalBarrier() is not within an interrupt handler but it responds to a flag set by an interrupt handler. After calling pg_atomic_write_u64(&MyProcSignalSlot->pss_barrierReceivedGeneration, shared_gen); it will enter the loop while (flags != 0) where it may process many barriers before processing PROCSIGNAL_BARRIER_SHMEM_RESIZE. Nothing stops the other barrier processing code from touching buffers. Right now it's just smgrrelease that gets called in the other barrier. But that's not guaranteed in future. > > > I might have not noticed it, but are we putting two mappings one > > reserved and one allocated in the same address space, so that when the > > allocated mapping shrinks or expands, the reserved mapping continues > > to prohibit any other mapping from appearing there? I looked at some > > of the previous emails, but didn't find anything that describes how > > the reserved mapped space is managed. > > I though so, but this turns out to be incorrect. Just have done a small > experiment -- looks like when reserving some space, mapping and > unmapping a small segment from it leaves a non-mapped gap. That would > mean for shrinking the new available space has to be reserved again. Right. That's what I thought. But I didn't see the corresponding code. So we have to keep track of two mappings for every segment - 1 for allocation and one for reserving space and resize those two while shrinking and expanding buffers. Am I correct? -- Best Wishes, Ashutosh Bapat