Hi,

On 25.03.2010, at 20:44, Mike Schrag wrote:
> it certainly seems fragile, but in practice, i think it's right ... any time 
> you register a new snapshot, it would push into the fast hash (and reset the 
> value). any time you fast hash remove, it would remove the backing snapshot 
> also.

No, that's what it doesn't. It removes the value, but it doesn't check that 
that value actually belonged to the key it was asked to remove. It needs to 
check for _lastGID == gid before doing that _lastRec = null. Effectively what 
it does at the moment, when you tell it to remove gid, it also temporarily 
removes _lastGID.

It's the user of the class who has to make sure that _lastGID == gid by 
explicitely calling get(gid) before remove(gid). That's a quite unstable 
contract I think. Of course, EODatabase adheres to this, but who knows who else 
is calling these underscore methods.

But, as I said, this is unfortunately not the problem we experience, and it 
seems to work, so it probably doesn't matter. That other bug sounds much more 
like the one we see, I have to look into that tomorrow.

Thanks,
Marc

PS: I wouldn't know why, but for some reason I always typed git instead of gid. 
How strange...

> so the only real window of failure would be if you managed to have a fast GID 
> set, a null fast hash rec, but a non-null snapshot in the dictionary. the 
> rest of the API seems to effectively prevent this scenario, so what this is 
> really providing is fast "cache-the-negative" support -- EODatabase can 
> bypass a dictionary lookup into the snapshot dictionary if you're asking for 
> a snapshot that was just removed.
> 
> now, if you're not careful in subclassing this class, you might be able to 
> break this contract, but if you're subclassing EODatabase, you're probably 
> comfortable being careful.
> 
> ms
> 
> On Mar 25, 2010, at 3:25 PM, Marc Guenther wrote:
> 
>> I just digged around in EODatabase, and found the following graphic.
>> 
>> This is basically a wrapper around the _snapshots dictionary, which caches 
>> the last accessed key/value for speed reasons.
>> 
>> But the _fastHashRemove() method seems to be wrong. It doesn't set _lastGID 
>> to null. This means, I could insert(valueA, keyA), then remove(keyB) and 
>> then get(keyA) would return null instead of valueA?
>> 
>> What am I missing here? In EODatabase, a remove() is always called after a 
>> get() of the same key, which is the only scenario tgat works. Still, sounds 
>> dangerous to me, just to save a single assignment, and these messages are 
>> protected not private.
>> 
>> Anyway, this is not my original problem, as the missing snapshot really was 
>> missing from the _snapshots dictionary.
>> 
>> Marc
>> <EODatabase.png>
>> 
>> 
>> On 25.03.2010, at 18:24, Marc Guenther wrote:
>> 
>>> Hi,
>>> 
>>> we have switched to WO 5.4.3 (from 5.2.3) several months ago. And since 
>>> that time, we sporadically experience strange exceptions, mostly 
>>> NullPointerExceptions deep within EOF, most of which could be traced back 
>>> to a snapshot mysteriously vanishing.
>>> 
>>> I had this in the debugger once, and drilled down to all the snapshots in 
>>> the EODatabase, and there was one entry missing. Interestingly, this was 
>>> from an entity which is readonly and cached, and also that entry had to 
>>> have been there before, otherwise the app wouldn't have gotten to the point 
>>> where it failed. I checked the DB and the value was there. It is from a 
>>> table which is only used for lookup and never changes.
>>> 
>>> This also happened with other snapshots of regular entitites, and we have 
>>> never really been able to reproduce it reliably. It seems to happen when 
>>> lots of ECs are involved, but that's only an assumption.
>>> 
>>> Has anyone ever seen something like this? Can this be related to the WO 
>>> 5.4.3 switch? I remember some talk about open bugs in 5.4.3, but haven't 
>>> been able to find anything substantial about it.
>>> 
>>> Btw, no WOnder (yet, sniff)
>>> 
>>> Thanks,
>>> Marc
>>> 
>>> _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
>>> Help/Unsubscribe/Update your Subscription:
>>> http://lists.apple.com/mailman/options/webobjects-dev/yoda%40schli.ch
>>> 
>>> This email sent to y...@schli.ch
>> 
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/webobjects-dev/mschrag%40mdimension.com
>> 
>> This email sent to msch...@mdimension.com
> 
> 

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to