yes, this is what happens:
You have a graph that can look like this:
A->b->c->D
where A and D represent roots of voyage (#isVoyageRoot = true)
you removed D, but A is not updated (the logic for auto update references is
too complex, and this is a known limitation of voyage).
So, in a next cycle you try to bring A to the image, and A is trying to load
eagerly an instance of D... which does not exists anymore, so you have the
error.
To prevent this kind of problems, I use something that I call "eventual
integrity" :) you can configure your collection to not fail when you try to get
it and it does not exists. For achieve that, you have to add a setting to the
class you want to take as "lazy deletable" (is a very dangerous property to
just allow it by defect).
You have to do something like this:
D class>>#mongoContainer
<mongoContainer>
^VOMongoContainer new
enableMissingContent;
yourself
note that who is enabling missing content is D, not A :)
hope it helps.
Cheers,
Esteban
ps: y si no se entiende nada, mandame un mail privado y lo explico en español :)
On Feb 8, 2013, at 12:12 PM, Bernat Romagosa <[email protected]>
wrote:
> It says "Reference not found", and the method signaling the error is
> VOMongoMaterializer >> #missingContentFor:id:
>
> I can try to set up a minimal test case and sent it to you, would that help?
>
> Thanks!
>
>
> 2013/2/8 Esteban Lorenzano <[email protected]>
> Hi,
>
> Voyage should keep a weak cache... objects should be disposed as soon as they
> are not used anymore.
> Now... it is saying "Reference not found", or "Lazy reference not found"?
>
> Esteban
>
> On Feb 8, 2013, at 11:46 AM, Bernat Romagosa <[email protected]>
> wrote:
>
>> Hi!
>>
>> We've been trying to migrate the data of our Iliad webapp to Voyage, and so
>> far everything was going great, until the garbage collector collected
>> objects it shouldn't have... Here's what we did:
>>
>> We used to have all objects stored in an Instances classVar belonging to
>> their own classes, so:
>>
>> I had our classes return true to #isVoyageRoot
>> ourClasses do: [ :c | (c classVarNamed: #Instances) do: [ :i | i save ]]
>> I checked MongoDB and all was looking great. From Pharo, we could get all
>> our instances and explore all of their relationships by OurClass selectAll.
>> Everything was working, so we thought we didn't need the image stored
>> instances anymore, thus:
>> ourClasses do: [ :c | c classVarNamed: #Instances put: nil ]
>> Smalltalk garbageCollect
>> RMUser selectAll → (long delay) → BOOM → 'Reference not found RMUser:
>> OID(3725800612)'
>> So, should we actually keep references to our instances in the image? I
>> doubt this is the case, cos that'd mean we still have the 2Gb storage
>> limitation, and then having an external DB would not be helping much...
>>
>> Thanks a lot in advance!
>>
>> Bernat.
>>
>> p.s. I've also tried saving copies of my objects, but the result's been the
>> same, after garbage-collecting, I lose references.
>>
>> --
>> Bernat Romagosa.
>
>
>
>
> --
> Bernat Romagosa.