[elephant-cvs] CVS update: elephant/NOTES

blee at common-lisp.net blee at common-lisp.net
Fri Aug 27 17:31:09 UTC 2004


Update of /project/elephant/cvsroot/elephant
In directory common-lisp.net:/tmp/cvs-serv13389

Modified Files:
	NOTES 
Log Message:
more changes than i can count

Date: Fri Aug 27 10:31:08 2004
Author: blee

Index: elephant/NOTES
diff -u elephant/NOTES:1.1 elephant/NOTES:1.2
--- elephant/NOTES:1.1	Thu Aug 26 19:59:46 2004
+++ elephant/NOTES	Fri Aug 27 10:31:08 2004
@@ -6,7 +6,12 @@
 this has been optimized for use with CMUCL.  it has been
 tested and somewhat optimized for allegro.  SBCL and OpenMCL
 are definitely also desired targets.  Lispworks is a target
-as well but less so; i can't test it.
+as well but less so: i don't have access to it.
+
+Theoretically one can port this to any lisp with a decent
+FFI and MOP.  However since those are two of the less
+standardized bits of Lisp, in practice this might be
+difficult.
 
 From top to bottom, here are the implementation layers:
 
@@ -24,6 +29,52 @@
 database / serializer, specials are needed.  The store
 controller (see below) is also a special.
 
+-----------------------
+CLASSES AND METACLASSES
+-----------------------
+
+Persistent classes which the user defines are declared and
+instrumented by using the persistent-metaclass.
+
+-----------
+COLLECTIONS
+-----------
+
+While we support serializing and persisting a wide class of
+Lisp data types, there are problems with aggregate types
+(conses, lists, arrays, objects, hash-tables...)
+
+1) not automatic: there's no way for elephant to know when
+you've changed a value in an aggregate object, so you have
+to manually restore it back into the slot to get it saved.
+
+slot-1 of obj A contains a cons.  you change the car of the
+cons.  this is not reflected into the database unless you
+re-set slot-1 of obj A with the cons.
+
+2) merge-conflicts: changing one value and saving an
+aggregate will write out the whole aggregate, possibly
+blowing away changes other threads have made behind your
+back.  this is not protected by transactions!
+
+3) consing, non-lazy and expensive (de)serialization: you
+have to serialize/deserialize the entire aggregate every
+time you save it or restore it.  This is pretty fast all
+things considered, but it's probably better to use
+persistent collections.
+
+4) you have to store the entire collection in memory,
+whereas one of the points of the database to store large
+collections of objects.....
+
+For these and other reasons, we provide a hash-table-like
+interface to Berkeley BTrees.  These have many advantages
+over ordinary hash-tables from the point of view of
+persistence.
+
+TODO: programmatic way to create secondary indicies
+(probably Lisp-level, since FFI callbacks are nasty.)
+
 ----------
 CONTROLLER
 ----------
@@ -57,6 +108,8 @@
 determines liveness.  The root object is a btree collection
 with a special OID 0.
 
+TODO: write the garbage collector.
+
 ------------
 TABLE LAYOUT
 ------------
@@ -157,32 +210,6 @@
 SERIALIZER: AGGREGATE TYPES
 ---------------------------
 
-problems, or Do You REALLY Want to Persist Aggregates?
-
-0) not automatic: there's no way for elephant to know when
-you've changed a value in an aggregate object, so you have
-to manually restore it back into the slot to get it saved.
-
-1) merge-conflicts: changing one value in the aggregate will
-write out the whole aggregate, possibly blowing away changes
-other threads have made behind your back.  this is not
-protected by transactions!
-
-2) object identity / circularity: what are the right
-semantics for things not tagged with OIDs?  certainly can't
-maintain identity across slots.
-
-obj A has slots slot-1 and slot-2.  puts same cons in each
-slot.  no way to keep track that they are supposed to be the
-same cons!
-
-3) consing, non-lazy and expensive (de)serialization
-
-"solution": in the FEW BIG TABLES schema, it is cheap to
-create and use persistent collection types, which will
-preserve identity et al.  as with all persistent objects,
-persistent collections are lazy-loading.
-
 if you really must store non-persistent aggregates, we support:
 
 conses (lists): 1 + car + cdr
@@ -238,6 +265,8 @@
 default accessed through a special variable
 *current-transaction*.  The special *auto-commit* (which
 defaults to nil!) is also a special.
+
+TODO: do transactions memory leak?
 
 UFFI is used as much as possible.  Because some
 implementations can't call function pointers, and because we





More information about the Elephant-cvs mailing list