[elephant-devel] Class definition vs. store schema conflicts
Ian Eslick
eslick at media.mit.edu
Tue Mar 4 22:18:18 UTC 2008
My fellow Elephants,
I've recently added support for a full schema evolution infrastructure
on my local development branch. Every persistent class now has a
schema object associated with it and each store that has one or more
instances of that class has a corresponding database-specific schema
that includes, among other things, a unique schema id for that class
version and that store. The schema in the database is sufficient to
reproduce a basic defclass form (slot names and types, not accessors,
initargs, initforms).
The prior version of class indexing had a sophisticated mechanism for
synchronizing between the in-memory class definition and the in-store
index list. This doesn't seem to be used, and is too complicated to
be useful so I have nixed it. For the new schema-based notion of
synchronization, I have made some simplifying assumptions:
MASTER SCHEMA:
The in-memory class definition is always the master schema for all
open stores that contain instances
of that class.
A class redefinition or connecting to a store with a stale schema may
mean that the master and the store schemas are now different. This
means we need to upgrade the store schema and potentially store
instances to the new master schema.
IN-PLACE EVOLUTION:
If only the indexed slots differ, then we simply add/delete
indices to accommodate.
This means that we have to keep track of the hierarchy so we can
remove subclasses,
or merge a set of subclass schemas if we move the index to a base
class. In-place
is fine because no data becomes irrecoverable and all changes are
at the class level.
FULL SCHEMA EVOLUTION:
We have add/deleted slots or changed the type of a slot
(persistent->transient)
- We compute a diff function that adds/deletes the slot storage
from the store
- Any in-memory instances are upgraded
- Store instances are upgraded:
1) A scan function is provided to upgrade all instances in the
store and delete the old schema versions
2) Instances of prior schema versions still in the store can be
lazily upgraded on load
SOME DESIGN CHOICES:
- Do we delete data (dropped slots, indices) by default during a
schema evolution, or do we keep it around just in case?
- What kind of warning/error conditions do we want to provide and when?
- When we load a new class def, connect to a store, and need to
make schema changes on the store?
- Class redefinition with one or more open stores
- etc...
- How do we enable users to specify an upgrade function to move from
schema to schema; do we provide a way to specify a schema version and
an upgrade function and allow non-specified versions to just upgrade
automatically?
- What happens when two lisp images are attached to the same store and
one updates its class definition? (Maybe you just get what you
deserve?)
- What happens if a store has a schema for a class for which there is
no in-memory class object?
- Do we want the database schema to store initforms, initargs, and
accessor/reader/writer names?
- Given class schemas we could probably add persistent class slots...
Thanks,
Ian
More information about the elephant-devel
mailing list