Re: Fix overflow of nbatch
От | Tomas Vondra |
---|---|
Тема | Re: Fix overflow of nbatch |
Дата | |
Msg-id | 85efb4dd-2be5-40ec-817f-1d7fe3e5768f@vondra.me обсуждение исходный текст |
Ответ на | Re: Fix overflow of nbatch (Konstantin Knizhnik <knizhnik@garret.ru>) |
Список | 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
В списке pgsql-hackers по дате отправления: