Re: Fix overflow of nbatch
Tomas Vondra <tomas@vondra.me>
From: Tomas Vondra <tomas@vondra.me>
To: Konstantin Knizhnik <knizhnik@garret.ru>,
David Rowley <dgrowleyml@gmail.com>
Cc: Vaibhav Jain <jainva@google.com>, pgsql-hackers@postgresql.org,
Madhukar <madhukarprasad@google.com>,
Sangeetha Seshadri <sangsesh@google.com>
Date: 2025-09-23T19:57:47Z
Lists: pgsql-hackers
On 9/23/25 21:13, Konstantin Knizhnik wrote: > On 23/09/2025 6:11 PM, Tomas Vondra wrote: > >> Hi, >> >> I kept looking at this, and unfortunately the it seems a bit worse :-( >> >> Fixing the overflow is easy enough - adding the cast does the trick. >> >> But then there's the second issue I mentioned - the loop does not adjust >> the hash_table_bytes. It updates the *space_allowed, but that's not what >> the current_space/new_space formulas use. >> >> This breaks the "balancing" as the nbatch gets decreased until >> >> nbatch <= (work_mem / BLCKSZ) >> >> while the hash table "space_allowed" is increasing. This may result in >> an *increased* memory usage :-( >> >> I also noticed the code does not clamp nbuckets properly as it should. >> >> >> The question what to do about this. If we got this a week ago, I'd just >> probably just revert a1b4f289, and then try again for PG19. After all, >> the issue it meant to address is somewhat rare. >> >> But with 18 already stamped ... >> >> I've shared these findings with the rest of the RMT, I'll see what their >> thoughts are. Of course, other opinions/suggestions are welcome. >> >> >> regards >> > > > Hi Tomas, > > If you are going to investigate this problem more, can you also look at > the related problem: > > https://www.postgresql.org/message-id/flat/52b94d5b- > a135-489d-9833-2991a69ec623%40garret.ru#ebe4151f1d505bbcc32cf93b2e8a1936 > > I proposed the patch but got no feedback. > Thanks, I'll take a look. I wasn't aware of that thread (or rather I didn't realize it might have been related to this). And AFAICS the max_batches business is separate. But the last bit seems very relevant: - while (nbatch > 0) + while (nbatch > 0 && + nbuckets * 2 <= max_pointers) /* prevent allocation limit overflow */ I believe this is the missing "nbucket claiming" that I mentioned above. But I think it needs to work a bit differently. The max_pointers is calculated from work_mem, but the whole point here is to grow the hash table beyond that. I think it makes sense to relax that limit, and allow up to MaxAllocSize, or something like that. regards -- Tomas Vondra
Commits
-
Fix hashjoin memory balancing logic
- aa151022ec13 18.1 landed
- b85c4700fc51 19 (unreleased) landed