[elephant-devel] Re: recreate-instance-using-class
Ian Eslick
eslick at csail.mit.edu
Tue Jan 8 20:12:49 UTC 2008
persistent is simply a base class that maintains an OID which is
initialized using the :from-oid (so it picks up the oid during
deserialization by default)
persistent-object is the superclass for all objects for which we are
allowing the persistent slot access protocol
persistent-collection is essentially a placeholder. Persistent
collection objects do not have persistent slots, but act as types to
specialize gf's like get-value. persistent-collection inherits oid
and the :from-oid initarg from persistent.
Cool! I apologize that I really don't have time to fully think
through your code just now so I might get some of this wrong as it's
mostly off the top of my head, however it seems like you've got the
right idea.
1) The call to shared-initialize (and the :around method on persistent-
object) could cause some of the problems people have reported. For
example, if I make a slot unbound on an instance, when it is reloaded,
shared-initialize will evaluate the default form and rebind it to that
value. If the initform is at all interesting, rather than a default
value, then that function can get called more than once leading to
potentially unexpected side-effects.
FIX?: If you call shared-initialize with the slotnames returned by
(transient-slot-names class) this might avoid those problems and
handle the transient slot init all in one go.
2) This code seems to bypass initialize-instance :before which sets up
the connection to the home store controller and I think is responsible
for setting the oid. but then we've called the :around function on
persistent-objects which calls instance initialization for all the
slots.
FIX: We should factor out this functionality into a helper function
called 'associate-persistent-object' (or perhaps this what you
intended by initial-persistence-setup? You didn't provide a
definition for it) and put a call to the helper function in initialize-
instance :before as well as after the allocate-instance call in
recreate-instance-using-class
The functions for persistent-objects are:
- initialize-instance :before
sets up the OIDs and store-controller link for the instance
called in both cases
has to be called prior to shared-initialize :around in the creation
case
- shared-initialize :around
initializes both persistent and transient slot values
should be called only during creation
PROBLEM: I think the standard shared-initialize needs to be called
during deserialization too?
- update-instance-for-redefined-class
called by CLOS; should be OK, but isn't applied properly to all db
instances
so needs some schema-evolution support
- change-class / update-instance-for-different-class
FIX! This should be specialized on persistent-object, not persistent
I think
Does it make any sense today to change the class of a btree? Perhaps
we should
keep it as it is and catch the cases where a user tries this on a
persistent-collection
- slot protocol
relies on the oid/controller being set, but should be good until we get
into slot value caching
I guess this wasn't as hard as I thought!
Ian
On Jan 8, 2008, at 2:31 PM, Alex Mizrahi wrote:
> SR> I'm sorry to hear that my patch caused so many issues with
> postmodern
> SR> and I'm quite keen to investigate the cause of this. I'll be
> SR> installing setting up the postmodern backend and seeing if I can
> track
> SR> down the causes of these problems.
>
> looks like it's related to some deep weirdness of db-postmodern
> implementation, and i think i've almost tracked this down, so i don't
> recommend anyone spending time on this. (well, until/if i'll give
> up..)
>
> however i'd like to see comments about class "persistent" -- it
> doesn't even
> recieve shared-initialize, are there any reasons for special
> threating of
> it?
>
> and are there reasons for using this recreate initialization
> sequence for
> class "persistent"?
>
> only instances of classes of persistent-metaclass metaclass (e.g.
> persistent-object) can have persistent slots, so it makes sense to
> bypass
> make-instance only for such classes.
> other classes have quite
>
> SR> As to where to go from here I do agree with robert on this and
> that it
> SR> is nice to have the seperation between the creation and
> restoration of
> SR> instances although I think this needs to be done with a well
> thought
> SR> out protocol.
>
> SR> cheers,
> SR> sean.
>
> )
> (With-best-regards '(Alex Mizrahi) :aka 'killer_storm)
> "Hanging In The Balance Of Deceit And Blasphemy")
>
>
>
> _______________________________________________
> elephant-devel site list
> elephant-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/elephant-devel
More information about the elephant-devel
mailing list