Thread: BUG #1502: hash_seq_search might return removed entry

BUG #1502: hash_seq_search might return removed entry

From
"Thomas"
Date:
The following bug has been logged online:

Bug reference:      1502
Logged by:          Thomas
Email address:      thhal@mailblocks.com
PostgreSQL version: 8.0.1
Operating system:   N/A
Description:        hash_seq_search might return removed entry
Details:

The hash_seq_search keeps track of what element that it should return next
in a HASH_SEQ_STATUS struct when it peruses a bucket. Removing that element
from the table won't change anything since the struct remains unaffected. It
still holds onto that element and hence, will return it on next iteration.

Re: BUG #1502: hash_seq_search might return removed entry

From
Tom Lane
Date:
"Thomas" <thhal@mailblocks.com> writes:
> The hash_seq_search keeps track of what element that it should return next
> in a HASH_SEQ_STATUS struct when it peruses a bucket. Removing that element
> from the table won't change anything since the struct remains unaffected. It
> still holds onto that element and hence, will return it on next iteration.

This isn't a bug; it's the designed way for it to work.  It's up to
callers to avoid causing a problem.

            regards, tom lane

Re: BUG #1502: hash_seq_search might return removed entry

From
Thomas Hallgren
Date:
Tom Lane wrote:

>"Thomas" <thhal@mailblocks.com> writes:
>
>
>>The hash_seq_search keeps track of what element that it should return next
>>in a HASH_SEQ_STATUS struct when it peruses a bucket. Removing that element
>>from the table won't change anything since the struct remains unaffected. It
>>still holds onto that element and hence, will return it on next iteration.
>>
>>
>
>This isn't a bug; it's the designed way for it to work.  It's up to
>callers to avoid causing a problem.
>
>
This report origins from the hackers thread "SPI_finish and
RegisterExprContextCallback" where you indicated that my report did not
properly describe a problem. Since my report was correct and since you
stated that "hash_seq_search() shouldn't return any already-dropped
entries." I was led me to believe that it was *not* designed to do that.

Anyway, the AtCommit_Portals doesn't avoid this problem and the end
result for me is the same regardless of where the error is. I can't drop
portals using a ExprContextCallback and I'd like to know the best way to
fix it. I can contribute a patch but I want you to decide what needs to
be fixed.

Regards,
Thomas Hallgren

Re: BUG #1502: hash_seq_search might return removed entry

From
Bruce Momjian
Date:
Thomas Hallgren wrote:
> Tom Lane wrote:
>
> >"Thomas" <thhal@mailblocks.com> writes:
> >
> >
> >>The hash_seq_search keeps track of what element that it should return next
> >>in a HASH_SEQ_STATUS struct when it peruses a bucket. Removing that element
> >>from the table won't change anything since the struct remains unaffected. It
> >>still holds onto that element and hence, will return it on next iteration.
> >>
> >>
> >
> >This isn't a bug; it's the designed way for it to work.  It's up to
> >callers to avoid causing a problem.
> >
> >
> This report origins from the hackers thread "SPI_finish and
> RegisterExprContextCallback" where you indicated that my report did not
> properly describe a problem. Since my report was correct and since you
> stated that "hash_seq_search() shouldn't return any already-dropped
> entries." I was led me to believe that it was *not* designed to do that.
>
> Anyway, the AtCommit_Portals doesn't avoid this problem and the end
> result for me is the same regardless of where the error is. I can't drop
> portals using a ExprContextCallback and I'd like to know the best way to
> fix it. I can contribute a patch but I want you to decide what needs to
> be fixed.

Does this need a C comment addition?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: BUG #1502: hash_seq_search might return removed entry

From
Thomas Hallgren
Date:
Bruce Momjian wrote:
> Thomas Hallgren wrote:
>
>>Tom Lane wrote:
>>
>>
>>>"Thomas" <thhal@mailblocks.com> writes:
>>>
>>>
>>>
>>>>The hash_seq_search keeps track of what element that it should return next
>>>>in a HASH_SEQ_STATUS struct when it peruses a bucket. Removing that element
>>>
>>>>from the table won't change anything since the struct remains unaffected. It
>>>
>>>>still holds onto that element and hence, will return it on next iteration.
>>>>
>>>>
>>>
>>>This isn't a bug; it's the designed way for it to work.  It's up to
>>>callers to avoid causing a problem.
>>>
>>>
>>
>>This report origins from the hackers thread "SPI_finish and
>>RegisterExprContextCallback" where you indicated that my report did not
>>properly describe a problem. Since my report was correct and since you
>>stated that "hash_seq_search() shouldn't return any already-dropped
>>entries." I was led me to believe that it was *not* designed to do that.
>>
>>Anyway, the AtCommit_Portals doesn't avoid this problem and the end
>>result for me is the same regardless of where the error is. I can't drop
>>portals using a ExprContextCallback and I'd like to know the best way to
>>fix it. I can contribute a patch but I want you to decide what needs to
>>be fixed.
>
>
> Does this need a C comment addition?
>
I'm thinking of providing a remedy for my problem that does the following.

1. The AtCommit_Portals will start with building a fixed size array of
pointers to portals that is the result of an iteration of the hash table.

2. Next, it will iterate over this array and for each pointer check if
that pointer is NULL. If not, do what's done during the iteration today.

3. The method that deletes a portal from the hash-table will also
sequentially scan the pointer array and set the pointer to NULL if found.

The remedy is based on the fact that it's unlikely that you have a large
amount of portals in the hash table.

Would such a patch be accepted?

Regards,
Thomas Hallgren

Re: BUG #1502: hash_seq_search might return removed entry

From
Tom Lane
Date:
Thomas Hallgren <thhal@mailblocks.com> writes:
> Would such a patch be accepted?

Seems like a brute-force solution.  I'd look first at whether
AtCommit_Portals could just restart its hashtable scan after
each deletion; if that seems too inefficient, modify the hash
table entries themselves to carry a "portal already deleted"
flag.

            regards, tom lane

Re: BUG #1502: hash_seq_search might return removed entry

From
Thomas Hallgren
Date:
Tom Lane wrote:

>Thomas Hallgren <thhal@mailblocks.com> writes:
>
>
>>Would such a patch be accepted?
>>
>>
>
>Seems like a brute-force solution.  I'd look first at whether
>AtCommit_Portals could just restart its hashtable scan after
>each deletion; if that seems too inefficient, modify the hash
>table entries themselves to carry a "portal already deleted"
>flag.
>
>
Yes, a static flag indicating that a deletion has occured will work fine
since all portals that has not been perused but not dropped now has an
InvalidSubTransactionId. I'll do it that way then.

Regards,
Thomas Hallgren