mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-17 19:30:00 +08:00
Fix bug in the new ResourceOwner implementation.
When the hash table is in use, ResoureOwnerSort() moves any elements from the small fixed-size array to the hash table, and sorts it. When the hash table is not in use, it sorts the elements in the small fixed-size array directly. However, ResourceOwnerSort() and ResourceOwnerReleaseAll() had different idea on when the hash table is in use: ResourceOwnerSort() checked owner->nhash != 0, and ResourceOwnerReleaseAll() checked owner->hash != NULL. If the hash table was allocated but was currently empty, you hit an assertion failure. Reported-by: Alexander Lakhin <exclusion@gmail.com> Discussion: https://www.postgresql.org/message-id/be58d565-9e95-d417-4e47-f6bd408dea4b@gmail.com
This commit is contained in:
parent
322f55bdbd
commit
8f4a1ab471
@ -349,10 +349,13 @@ ResourceOwnerReleaseAll(ResourceOwner owner, ResourceReleasePhase phase,
|
||||
ResourceElem *items;
|
||||
uint32 nitems;
|
||||
|
||||
/* ResourceOwnerSort must've been called already */
|
||||
/*
|
||||
* ResourceOwnerSort must've been called already. All the resources are
|
||||
* either in the array or the hash.
|
||||
*/
|
||||
Assert(owner->releasing);
|
||||
Assert(owner->sorted);
|
||||
if (!owner->hash)
|
||||
if (owner->nhash == 0)
|
||||
{
|
||||
items = owner->arr;
|
||||
nitems = owner->narr;
|
||||
@ -393,7 +396,7 @@ ResourceOwnerReleaseAll(ResourceOwner owner, ResourceReleasePhase phase,
|
||||
kind->ReleaseResource(value);
|
||||
nitems--;
|
||||
}
|
||||
if (!owner->hash)
|
||||
if (owner->nhash == 0)
|
||||
owner->narr = nitems;
|
||||
else
|
||||
owner->nhash = nitems;
|
||||
|
Loading…
Reference in New Issue
Block a user