From reddaly at gmail.com Fri Jul 9 01:11:45 2010 From: reddaly at gmail.com (Red Daly) Date: Thu, 8 Jul 2010 18:11:45 -0700 Subject: [elephant-devel] Database evolution (i.e. schema migration) Message-ID: In the other database systems I have worked with, it is common to have some means of migrating the schema of a database and the data along with it. As far as I know, in Elephant there is no standard way to define database versions and upgrades/downgrades to accompany them. Elephant could do with such a system. In my use case, the main problem comes when a new class or slot is introduced, a slot is renamed, or slot properties change. I will make such a change in a development environment and then run a function that performs any necessary migration. I must then remember to run the migration function on the production database. For example, when a new slot is introduced it is unbound in existing instances. I will often set the slot value to nil in the migration function. Other times I will need to query the web for the correct value for existing objects' new slots. Defining a schema evolution system seems tricky now because the database schema is derived somewhat implicitly from defclass forms. Compare this scenario to Ruby on Rails where a series of migrations moves the database from a blank slate to a the latest and greatest with a series of migration scripts. The actual 'model' for a persistent Rails class is derived from the database itself, and the rails equivalent of defclass does not even list slots. I am not suggesting that we do things the Rails way, but I must say that the migration scheme is rather simple and powerful. The desire is to define a migration framework that satisfies the following criteria: * the database should keep track of the version of its schema. This need not be linear (see the difference between Ruby on Rails migrations in 2.0 and 2.1) * a developer should be able to introduce a new version of the database and know exactly how the schema changes * version upgrades should call hooks that migrate the database in light of the schema changes Perhaps the most straightforward implementation would be to introduce a new means of defining persistent classes and their indices more explicitly, instead of letting defclass do all the work. Instead of adding ":index t" to a slot definition, you would instead define a migration and call (add-index-for-slot (find-class 'user) 'telephone-number). Is there a means of achieving this already? If not, it would be a great feature to add and I would appreciate any comments. Best, Red From killerstorm at newmail.ru Fri Jul 9 07:56:51 2010 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Fri, 9 Jul 2010 10:56:51 +0300 Subject: [elephant-devel] Database evolution (i.e. schema migration) References: Message-ID: RD> For example, when a new slot is introduced it is unbound in existing RD> instances. I will often set the slot value to nil in the migration RD> function. Other times I will need to query the web for the correct RD> value for existing objects' new slots. Here's how I do it (my-persistent-object is root class for all my persistent objects): (defmethod slot-unbound (class (instance my-persistent-object) name) ;; when we've got unbound slot ;; try reinitializing it with initform via shared initialize (shared-initialize instance (list name)) (if (slot-boundp instance name) ;; if it becomes bound, call slot-value once again. ;; (I hope it does not get into loop.) (slot-value instance name) ;; otherwise call next method which signals error (call-next-method))) Then it boils down to having correct shared-initialize which can fix partially-initialized classes. For most cases initform is enough, I think. Initform is a function and it can do pretty much anything. If you want to refer to instance in initform, you can do that through special variables and shared-initialize :around (defvar *current-instance* nil) (defmethod shared-initialize :around ((instance my-persistent-object) slot-names &key) (let ((*current-instance* instance)) (call-next-method))) Then initform you can refer to it: (defpclass foobar () ((foo :accessor foo-of :initarg :foo) (bar :initform (+ 10 (foo-of *current-instance*)) :initarg :bar) Or you can explicitly implement this stuff in shared-initialize methods, if it doesn't fit into initform somehow. Of course, this method implies that unbound slots are not possible in healthy instances. I haven't yet seen the case where I want slot to be unbound... RD> The desire is to define a migration framework that satisfies the RD> following criteria: RD> * the database should keep track of the version of its schema. Elephant 1.0 does this and it implements scheme evolution in some way. But, honestly, I didn't look into it in details. Check schema.lisp and schema-evolution.lisp. RD> Perhaps the most straightforward implementation would be to introduce RD> a new means of defining persistent classes and their indices more RD> explicitly, instead of letting defclass do all the work. Hmm, I think the whole point of Elephant is that it is a CLOS persistence and classes are defined via defclass. It is actually good that you don't see how class definition was changing over time -- you see only current class definition. And code which translates old instances to new ones -- that can be a separate _temporary_ layer. RD> Instead of adding ":index t" to a slot definition, you would instead RD> define a migration and call (add-index-for-slot (find-class 'user) RD> 'telephone-number). This is too close to SQL :) Which is not necessarily a bad thing, but if you want to do it in SQL style, won't it be easier to use SQL directly? From reddaly at gmail.com Sat Jul 10 20:00:37 2010 From: reddaly at gmail.com (Red Daly) Date: Sat, 10 Jul 2010 13:00:37 -0700 Subject: [elephant-devel] Error: The slot ELEPHANT::INSTANCE-TABLE is unbound Message-ID: When I try to open a controller of mine, I get this error: The slot ELEPHANT::INSTANCE-TABLE is unbound in the object # It seems that this is caused by a bug with how the instance-table is established in a new controller, since the stack trace indicates this bug occurs when the INSTANCE-TABLE slot is being set up. Specifically, at this line in bdb-controller.lisp: (setf (slot-value sc 'instance-table) (if (or new-p (elephant::prior-version-p (database-version sc) '(0 9 1))) ;; When opening the DB equal or prior to 0.9.1, always get the indices initialized, ;; regardless of the indices is initialized before. ;; Even the indices is serialized before(in the case that open the <=0.9.1 DB file for the second time), ;; it still can not be unserialized here, because its persistent object's oid ;; does not match the hardcoded one in oid->schema-id, which only work on the DB file ;; created in release > 0.9.1. (make-instance 'bdb-indexed-btree :from-oid -3 :sc sc :indices (make-hash-table)) >>>> (make-instance 'bdb-indexed-btree :from-oid -3 :sc sc))) <<<< I will work on a fix now. If anybody has insights, gotchas, etc. let me know. A patch soon to follow... The slot ELEPHANT::INSTANCE-TABLE is unbound in the object #. [Condition of type UNBOUND-SLOT] Restarts: 0: [USE-VALUE] Return a value as the slot-value. 1: [STORE-VALUE] Store and return a value as the slot-value. 2: [RETRY] Retry SLIME REPL evaluation request. 3: [ABORT] Return to SLIME's top level. 4: [TERMINATE-THREAD] Terminate this thread (#) Backtrace: 0: ((SB-PCL::FAST-METHOD SLOT-UNBOUND (T T T)) ..) 1: (SB-PCL::SLOT-UNBOUND-INTERNAL # 9) 2: ((SB-PCL::FAST-METHOD ELEPHANT::OID->SCHEMA-ID (T ELEPHANT:STORE-CONTROLLER)) #) 3: ((SB-PCL::FAST-METHOD ELEPHANT::GET-INSTANCE-CLASS (ELEPHANT:STORE-CONTROLLER T)) #) 4: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK)) 5: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]324)) 6: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..) 7: ((FLET #:FORM-FUN-[CONTROLLER-RECREATE-INSTANCE]14)) 8: ((SB-PCL::FAST-METHOD ELEPHANT::CONTROLLER-RECREATE-INSTANCE (ELEPHANT:STORE-CONTROLLER T)) ..) 9: ((LABELS ELEPHANT-SERIALIZER2::%DESERIALIZE) #S(ELEPHANT-MEMUTIL:BUFFER-STREAM :BUFFER # :SIZE 76 :POSITION 76 :LENGTH 80)) 10: ((LABELS ELEPHANT-SERIALIZER2::%DESERIALIZE) #S(ELEPHANT-MEMUTIL:BUFFER-STREAM :BUFFER # :SIZE 76 :POSITION 76 :LENGTH 80)) 11: (ELEPHANT-SERIALIZER2::DESERIALIZE ..) 12: ((FLET #:FORM-FUN-[DESERIALIZE]2)) 13: (ELEPHANT::DESERIALIZE ..) 14: ((LAMBDA ()) #) 15: (SLOT-VALUE # DB-BDB::INDICES) 16: ((SB-PCL::FAST-METHOD SHARED-INITIALIZE :AFTER (DB-BDB::BDB-INDEXED-BTREE T)) #)[:EXTERNAL] 17: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) ..) 18: ((SB-PCL::FAST-METHOD SHARED-INITIALIZE :AROUND (ELEPHANT:PERSISTENT-OBJECT T)) # # # #)[:EXTERNAL] 19: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) ..) 20: (SB-PCL::FAST-MAKE-INSTANCE #)[:EXTERNAL] 21: ((LAMBDA ())) 22: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION (DB-BDB::BDB-STORE-CONTROLLER T)) # # # #)[:EXTERNAL] 23: ((SB-PCL::FAST-METHOD ELEPHANT::OPEN-CONTROLLER (DB-BDB::BDB-STORE-CONTROLLER)) #(13 NIL 9 NIL 3 NIL ...) # #)[:EXTER.. 24: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) ..) 25: (ELEPHANT:OPEN-STORE #)[:EXTERNAL] -- Red From reddaly at gmail.com Sat Jul 10 20:34:58 2010 From: reddaly at gmail.com (Red Daly) Date: Sat, 10 Jul 2010 13:34:58 -0700 Subject: [elephant-devel] Error: The slot ELEPHANT::INSTANCE-TABLE is unbound In-Reply-To: References: Message-ID: Here is the patch. I identified a boostrapping issue: (setf (instances-cache instance) (indices instance)) was being called on an instance of BDB-INDEXED-BDB, forcing a deserialization of the persistent INDICES slot. Unfortunately at this point in bootstrapping the database, instance-table is not yet set up, so deserialization does not quite work to fetch the persistent value of the INDICES slot. I correct this bug by defining a custom reader that lazily loads the indices-cache slot. Not the smoothest bug fix, but it seems to work. - Red On Sat, Jul 10, 2010 at 1:00 PM, Red Daly wrote: > When I try to open a controller of mine, I get this error: > > The slot ELEPHANT::INSTANCE-TABLE is unbound in the object > # > > It seems that this is caused by a bug with how the instance-table is > established in a new controller, since the stack trace indicates this > bug occurs when the INSTANCE-TABLE slot is being set up. > Specifically, at this line in bdb-controller.lisp: > > > ? ? ?(setf (slot-value sc 'instance-table) > ? ? ? ? ? ? ?(if (or new-p (elephant::prior-version-p > (database-version sc) '(0 9 1))) > ? ? ? ? ? ? ? ? ?;; When opening the DB equal or prior to 0.9.1, > always get the indices initialized, > ? ? ? ? ? ? ? ? ?;; regardless of the indices is initialized before. > ? ? ? ? ? ? ? ? ?;; Even the indices is serialized before(in the case > that open the <=0.9.1 DB file for the second time), > ? ? ? ? ? ? ? ? ?;; it still can not be unserialized here, because > its persistent object's oid > ? ? ? ? ? ? ? ? ?;; does not match the hardcoded one in > oid->schema-id, which only work on the DB file > ? ? ? ? ? ? ? ? ?;; created in release > 0.9.1. > ? ? ? ? ? ? ? ? ?(make-instance 'bdb-indexed-btree :from-oid -3 :sc > sc :indices (make-hash-table)) >>>>> ? ? ? ? ? ? ? ? ?(make-instance 'bdb-indexed-btree :from-oid -3 :sc sc))) <<<< > > > I will work on a fix now. ?If anybody has insights, gotchas, etc. let > me know. ?A patch soon to follow... > > The slot ELEPHANT::INSTANCE-TABLE is unbound in the object > #. > ? [Condition of type UNBOUND-SLOT] > > Restarts: > ?0: [USE-VALUE] Return a value as the slot-value. > ?1: [STORE-VALUE] Store and return a value as the slot-value. > ?2: [RETRY] Retry SLIME REPL evaluation request. > ?3: [ABORT] Return to SLIME's top level. > ?4: [TERMINATE-THREAD] Terminate this thread (# "new-repl-thread" RUNNING {10054B88F1}>) > > Backtrace: > ?0: ((SB-PCL::FAST-METHOD SLOT-UNBOUND (T T T)) ..) > ?1: (SB-PCL::SLOT-UNBOUND-INTERNAL # /apps/bookllama-dev/server/data/production/> 9) > ?2: ((SB-PCL::FAST-METHOD ELEPHANT::OID->SCHEMA-ID (T > ELEPHANT:STORE-CONTROLLER)) #) > ?3: ((SB-PCL::FAST-METHOD ELEPHANT::GET-INSTANCE-CLASS > (ELEPHANT:STORE-CONTROLLER T)) #) > ?4: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK)) > ?5: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]324)) > ?6: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..) > ?7: ((FLET #:FORM-FUN-[CONTROLLER-RECREATE-INSTANCE]14)) > ?8: ((SB-PCL::FAST-METHOD ELEPHANT::CONTROLLER-RECREATE-INSTANCE > (ELEPHANT:STORE-CONTROLLER T)) ..) > ?9: ((LABELS ELEPHANT-SERIALIZER2::%DESERIALIZE) > #S(ELEPHANT-MEMUTIL:BUFFER-STREAM :BUFFER > # :SIZE 76 > :POSITION 76 :LENGTH 80)) > ?10: ((LABELS ELEPHANT-SERIALIZER2::%DESERIALIZE) > #S(ELEPHANT-MEMUTIL:BUFFER-STREAM :BUFFER > # :SIZE 76 > :POSITION 76 :LENGTH 80)) > ?11: (ELEPHANT-SERIALIZER2::DESERIALIZE ..) > ?12: ((FLET #:FORM-FUN-[DESERIALIZE]2)) > ?13: (ELEPHANT::DESERIALIZE ..) > ?14: ((LAMBDA ()) #) > ?15: (SLOT-VALUE # DB-BDB::INDICES) > ?16: ((SB-PCL::FAST-METHOD SHARED-INITIALIZE :AFTER > (DB-BDB::BDB-INDEXED-BTREE T)) #)[:EXTERNAL] > ?17: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. > SB-PCL::.ARG1. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. > SB-PCL::.DFUN-MORE-COUNT.)) ..) > ?18: ((SB-PCL::FAST-METHOD SHARED-INITIALIZE :AROUND > (ELEPHANT:PERSISTENT-OBJECT T)) # # argument> # #)[:EXTERNAL] > ?19: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. > SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) > ..) > ?20: (SB-PCL::FAST-MAKE-INSTANCE #)[:EXTERNAL] > ?21: ((LAMBDA ())) > ?22: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION > (DB-BDB::BDB-STORE-CONTROLLER T)) # > # # # argument>)[:EXTERNAL] > ?23: ((SB-PCL::FAST-METHOD ELEPHANT::OPEN-CONTROLLER > (DB-BDB::BDB-STORE-CONTROLLER)) #(13 NIL 9 NIL 3 NIL ...) # argument> # /apps/bookllama-dev/server/data/production/>)[:EXTER.. > ?24: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. > SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) > ..) > ?25: (ELEPHANT:OPEN-STORE #)[:EXTERNAL] > > > -- Red From reddaly at gmail.com Sat Jul 10 20:38:40 2010 From: reddaly at gmail.com (Red Daly) Date: Sat, 10 Jul 2010 13:38:40 -0700 Subject: [elephant-devel] Error: The slot ELEPHANT::INSTANCE-TABLE is unbound In-Reply-To: References: Message-ID: I think the patch was scrubbed. Here it is again just in case. Sat Jul 10 13:27:27 PDT 2010 reddaly at gmail.com * instance-table-bootstrapping-bug Lazily load the indices-cache to avoid bootstrapping issues: If we do not lazy-load the indices cache, it we attempt to initialize it before the instance-table is available (thus we cannot map oids to classes -- deserialize does not really work for complex objects). -- Red Daly 07/10/2010 New patches: [instance-table-bootstrapping-bug reddaly at gmail.com**20100710202727 Ignore-this: 2e1e2651fb7e76b14f208226b5c37378 Lazily load the indices-cache to avoid bootstrapping issues: If we do not lazy-load the indices cache, it we attempt to initialize it before the instance-table is available (thus we cannot map oids to classes -- deserialize does not really work for complex objects). -- Red Daly 07/10/2010 ] { hunk ./src/db-bdb/bdb-collections.lisp 102 (:metaclass persistent-metaclass) (:documentation "A BDB-based BTree supports secondary indices.")) +(defmethod indices-cache ((instance bdb-indexed-btree)) + ;; Lazily load the indices-cache to avoid bootstrapping issues: If + ;; we do not lazy-load the indices cache, it we attempt to + ;; initialize it before the instance-table is available (thus we + ;; cannot map oids to classes -- deserialize does not really work + ;; for complex objects). -- Red Daly 07/10/2010 + (aif (slot-value instance 'indices-cache) + it + (setf (indices-cache instance) (indices instance)))) + (defmethod shared-initialize :after ((instance bdb-indexed-btree) slot-names &rest rest) (declare (ignore slot-names rest)) hunk ./src/db-bdb/bdb-collections.lisp 115 - (setf (indices-cache instance) (indices instance))) + (setf (indices-cache instance) nil)) (defmethod build-indexed-btree ((sc bdb-store-controller)) (make-instance 'bdb-indexed-btree :sc sc)) } Context: [Cached slot test fixes ieslick at common-lisp.net**20100110202521 Ignore-this: 67c91f2d308a3a6824ace42b61ebcb43 ] [Default behavior for non-cached objects ieslick at common-lisp.net**20091224183800] [Fix recreate instance sync issues for cached slots and instances ieslick at common-lisp.net**20091222225421] [Fixed circularity bug in snapshot sets. Elliott Slaughter **20090321043319 Ignore-this: 5de2aad563e72d7c393078bed4479656 Touch object before saving its slots, to avoid problems if those slots contain circular references back to the original object. ] [doc-update-june29v1 gtarcea at umich.edu**20080629155930] [doc-patch-1 gtarcea at umich.edu**20080620145630] [Update credits ieslick at common-lisp.net**20091216112247] [Fix configuration parameters, some macro fixes, Lucas' association patch ieslick at common-lisp.net**20091216112051] [remove-association lukas.giessmann at hotmail.de**20091216101047 Ignore-this: 86dc87403a2617800d913be373dd6992 ] [Fix bug in GET-CON to re-open controller with correct initial args. Patch by Alain Picard Leslie P. Polzer **20091017152139 Ignore-this: 502c7a37e056e4b8ed6aae6146d27de7 ] [Fix upgrade-all-memory-instances; weak pointer values may be NIL. Leslie P. Polzer **20091013205530 Ignore-this: b617e880774c1768630c94809a973b06 ] [Fix x86 build on Snow Leopard (Chun Tian ) Leslie P. Polzer **20091011081106 Ignore-this: e8e9a997af84e7c1f7e201a0a46d9aca ] [Improve lost controller restart model ieslick at common-lisp.net**20091005012336] [Fix missing store restart and get-con bugs ieslick at common-lisp.net**20091005005104] [Fix or parameterize edge condition warnings and errors ieslick at common-lisp.net**20090921200412] [Add with-store macro for multi-store operations ieslick at common-lisp.net**20090909200653] [DB-BDB: fixed thread read conditional. polzer at gnu.org**20090809081918 Ignore-this: dab554003a90b23f26ca839d150b2f45 ] [Make TRANSACTION-RETRY-COUNT-EXCEEDED inherit from ERROR. Leslie P. Polzer **20090805200157 Ignore-this: 704443829e8a64db7494dc6ed9ca1d79 ] [DB-BDB: Support configuring the maximum number of transactions. Leslie P. Polzer **20090802173447 Ignore-this: a6107aa93ce22039a7cf094c362da9fd ] [Make WITH-BTREE-CURSOR even more bullet-proof against interrupts. Leslie P. Polzer **20090802173323 Ignore-this: 39e87e8f053f054529f8ea8077c3abc7 ] [DB-BDB: allow global defaulting for the custom txn retry wait function. Leslie P. Polzer **20090722090405 Ignore-this: 947b5ca817a0c1f34857bb26dd015ad4 ] [Amended message about creating uninterned symbols. Leslie P. Polzer **20090731111446 Ignore-this: dcb0555b73a03adefd8be4e1e0a3949e ] [DB-BDB: trivial syntax-only refactoring. Leslie P. Polzer **20090726080046 Ignore-this: fb2c512cdf93e3f3ae1a5fa2d6cd31ee ] [memutil: added two FIXMEs concerning async unwind and allocation. Leslie P. Polzer **20090726075929 Ignore-this: 5ea639589f6b05e163bf6016e638d8b6 ] [DB-BDB: a few errno buffers weren't freed by berkeley-db.lisp. Use WITH-FOREIGN-ALLOC for them. Leslie P. Polzer **20090726075745 Ignore-this: 3cedacf585cbecb9e0b7450f5b7a89a9 ] [DB-BDB: get rid of the "Catch tag 'TRANSACTION does not exist" variety of errors in collections, too. Leslie P. Polzer **20090708154501 Ignore-this: f3677195657571a1b2aedf71d25077ee ] [Fix compilation on LW (patch by Chun Tian ) Leslie P. Polzer **20090629084752 Ignore-this: 7a7ce6847d79c0f05818df05ede596b9 ] [DB-POSTMODERN: sb-impl::quick-integer-to-string is gone. Remove the hack and replace the FORMAT instead. Leslie P. Polzer **20090627133517 Ignore-this: cecd74326e3f4aa035c21836dfdf1699 ] [Minor fixes to query.lisp. Leslie P. Polzer **20090625182229 Ignore-this: 2d5e5d8fcf51bff0d6f8a2f640c81281 ] [Move ENSURE-TRANSACTION bits from last patches to BDB backend; others probably don't need this. Leslie P. Polzer **20090625152725 Ignore-this: f8c24a23880db4aa6b90289ae4b6a174 ] [Added another missing ENSURE-TRANSACTION. Leslie P. Polzer **20090625141208 Ignore-this: a237fa2acb8d4750c56e1ed7a3c7f51b ] [Ensure that persistent slot reads and writes happen in a txn. Leslie P. Polzer **20090625093539 Ignore-this: 50108310b594d079aed78126c2f428d0 ] [Fix bug 'There is no class named X'. Leslie P. Polzer **20090620164448 Ignore-this: 6683d442de9b28436e04e518413c05ff This occured under the following conditions: * open store controller * class X is being defined for the first time (notably doesn't exist in store registry) * class X has slots with readers or writers ] [Portably define WITHOUT-INTERRUPTS. Use it to run cursor/transaction creation/deletion with interrupts disabled. Leslie P. Polzer **20090620122628 Ignore-this: b6ce8a1838a38e4a323154e3a5983f88 ] [Added PERSISTENT-PROXY contrib. Leslie P. Polzer **20090620111923 Ignore-this: 7f344b3bd37335e0b2087049e08eac04 ] [Added some notes on deadlocks to the manual. Leslie P. Polzer **20090617110237 Ignore-this: 8dcc20e02b15b12c4b907c709e299eae ] [REBUILD-SLOT-INDICES, SLOT-INDEX-SANE-P: ensure classes are finalized. Leslie P. Polzer **20090613140807 Ignore-this: 4a23bd087a20a333693a4f8502736d66 ] [Fixed NIL handling of SLOT-MAKUNBOUND-USING-CLASS for indexed slots and UPDATE-SLOT-INDEX. Add tests for it. Leslie P. Polzer **20090613140650 Ignore-this: 6a44ed346cea9d85d5c40ac5260200a0 ] [Add functions to help checking and rebuilding slot indices. Leslie P. Polzer **20090613091923 Ignore-this: b32c4d8655dfe7d6a4bc21ee711fc0f8 ] [REBUILD-SLOT-INDEX: handle unbound slots correctly. Leslie P. Polzer **20090613091849 Ignore-this: 8135dd3c44c0bf8f08b7c29d005f2012 ] [Add a test case for UPDATE-INSTANCE-SLOT. Leslie P. Polzer **20090611102515 Ignore-this: d8ac815c7404aef2fc5864e42d09fcf5 ] [Fix unbound slot handling in CHANGE-INSTANCE-SLOT; add test case for it. Leslie P. Polzer **20090611071625 Ignore-this: ff340c39d52b75718d18986b407f5e0b ] [Make deserialization errors inherit from ERROR. Leslie P. Polzer **20090610134702 Ignore-this: 7c62a72116a33b44480895c4072302c0 ] [DB-POSTMODERN: fix SB-IMPL usage. Leslie P. Polzer **20090610134525 Ignore-this: 2bf1db5d9aa6eb759b4fa6e7b09ae694 ] [Restore original values for concurrency test suite. Leslie P. Polzer **20090610103302 Ignore-this: 5567793d79cee5082d728356f6214fa ] [Support custom retry delays (defaulting to 0.1s) and functions. Leslie P. Polzer **20090610103228 Ignore-this: fd7797243b56cd97611263177b3b952b ] [Minor amendments to concurrency test suite. Leslie P. Polzer **20090610092203 Ignore-this: cb316292d990900a96f2d17fed4c1653 ] [SYNCHRONIZE-STORE-CLASSES: support picking the classes to be synchronized; also ensure that classes are finalized. Leslie P. Polzer **20090606094129 Ignore-this: 8502b065dd05503b36d952d0fac00138 ] [Fix/enhance CERROR mechanism for dropped slots. Leslie P. Polzer **20090603130600 Ignore-this: 505e7776beeb46a967413fbd2ab5910a ] [synchronize-store-classes: ignore non-existent classes. Leslie P. Polzer **20090601151322 Ignore-this: da62f7acff403829a7a79ca46d5464d9 ] [Fix openmcl handling of instance updates on redef. Leslie P. Polzer **20090519085457 Ignore-this: a36f363b92a7b81ef2bba98f5ce2bb2d ] [Ensure fresh line for "Synchronizing..." message. Leslie P. Polzer **20090504064749 Ignore-this: 9f2d72e901b4a705a5f7ce2f9fbef756 ] [Fix association delete for N:1 endpoints ieslick at common-lisp.net**20090321203319] [Fixed minor paren mismatch in CLP. Elliott Slaughter **20090216062037 Ignore-this: 633cf8106eb1fdd66b22d51935475205 ] [Fix typos in ccl/openmcl locking patch ieslick at common-lisp.net**20090311202355] [Add locking for ccl/openmcl ieslick at common-lisp.net**20090311202156] [Fix type deser typo bug ieslick at common-lisp.net**20090311195907] [More informative deserialization error reporting ieslick at common-lisp.net**20090311150241] [Refactor slot protocol; MOP fix for ccl ieslick at common-lisp.net**20090303162100] [ClozureCL fixes ieslick at common-lisp.net**20090303153635] [OpenMCL weak pointer fixes ieslick at common-lisp.net**20090225141141] [Support for secondary clp cursors; bugs remain ieslick at common-lisp.net**20090216043228] [Experimental (NOT STABLE) support for part of the cursor API with CLP. Elliott Slaughter **20090214230838 Implemented most of the cursor API, stopping at the p* cursor functions. With the changes, about 14 more tests pass, although there are still some strange results floating around.... ] [migration-fix-for-1.0A2 ihuquan at gmail.com**20090212110735 0.9.1->1.0 alpha2 migration fails when using SBCL. It is caused by that controller-recreate-instance is recursively called in migration process. It results in a recursive call for sb-thread:with-mutex. The solution is to replace sb-thread:with-mutex by sb-thread:sb-thread:with-recursive-lock. ] [SBCL: ensure that all stores are closed on exit. Leslie P. Polzer **20090211084035 Ignore-this: 94be0e62949d9e9ca863aa70eec6a553 ] [Move confusing query folder from src to contrib ieslick at common-lisp.net**20090210192606] [CLP gensym test exception ieslick at common-lisp.net**20090208230446] [Warn on drop data by class redefinition ieslick at common-lisp.net**20090208230424] [Move clsql data store into contrib ieslick at common-lisp.net**20090207213032] [Promote db-clp to standard-issue DB ieslick at common-lisp.net**20090207212641] [Fix serializer bugs on re-opening of store ieslick at common-lisp.net**20090207205919] [Fix RBT empty node bug; fix lost proxy trees bug; fix serializer reopen bug; open/close store works ieslick at common-lisp.net**20090207202356] [More fixes for reopening a store ieslick at common-lisp.net**20090207183403] [Fix clp bugs; partial open-store implementation ieslick at common-lisp.net**20090207181117] [db-postmodern: cursor semantics alex.mizrahi at gmail.com**20090205174924] [db-postmodern: hardened type handling alex.mizrahi at gmail.com**20090205161017] [tests for mixed-type btrees alex.mizrahi at gmail.com**20090205160934] [db-postmodern: btree upgrade handling, btree wrappers. WARNING: incompatible store format! alex.mizrahi at gmail.com**20090205160838] [db-postmodern: dup btree value type alex.mizrahi at gmail.com**20090205155335] [db-postmodern: proper transaction handling alex.mizrahi at gmail.com**20090205155239] [postmodern doc update alex.mizrahi at gmail.com**20090205112036] [postmodern documentation update alex.mizrahi at gmail.com**20090205111642] [Better support for (:prebuilt-libraries nil) under win32/SBCL. Elliott Slaughter **20090108090553 Elephant can now build DLLs properly under win32/SBCL, even when stored in a directory whose name contains spaces, or on another drive letter. Also doesn't litter *.o files in the current directory when compiling. ] [Chun Tian's lispworks 5.1 patch ieslick at common-lisp.net**20090203165530] [Fix slot unbound test failures for CLP data store ieslick at common-lisp.net**20090203044202] [Initial db-clp implementation contrib ieslick at common-lisp.net**20090202202857] [Core elephant prep for clp ieslick at common-lisp.net**20090126023824] [Fix fixnum64 declaration bug ieslick at common-lisp.net**20090126171924] [merge conflict resolution 1-26 eslick at common-lisp.net**20090126150411] [Allegro compatabiliity 2 ieslick at common-lisp.net**20090120205655] [Allegro compatibility fixes ieslick at common-lisp.net**20090119223005] [Unify DB-LOCK structures for ccl compilation ieslick at common-lisp.net**20090119211557] [Clean up test ordering for ccl; compatible with openmcl; fix test bug ieslick at common-lisp.net**20090119160831] [Clozure CL support (2 errors left in tests) ieslick at common-lisp.net**20090118234322] [TAG ELEPHANT-1-0-A2 eslick at common-lisp.net**20090113201539] [Clean up memutil fixnum interface ieslick at common-lisp.net**20090113200727] [Association declaration bug ieslick at common-lisp.net**20090113200713] [Clean up serialier use of memutil; bdb condition msg ieslick at common-lisp.net**20090113195939] [Revert sbcl fast locks; add errfile to BDB; improve cache locking ieslick at common-lisp.net**20090113013529] [Fix race condition in caching; add BDB errfile support; minor imprrovements to transaction macro and pset api. ieslick at common-lisp.net**20090112223522] [Ensure that BDB condition is valid during macroexpansion ieslick at common-lisp.net**20090112210529] [Fix testcondition conflicts eslick at common-lisp.net**20090110200538] [Fix transaction inhibit test ieslick at common-lisp.net**20090110004336] [Fixup indexing for clozure; BDB transaction inhibiting bugfix eslick at common-lisp.net**20090110165542] [Fix rollback test ieslick at common-lisp.net**20090110004026] [Performance declarations (not verified on all lisps) ieslick at common-lisp.net**20090109143359] [Fix bug in inhibit-rollback; fix reinit bug on persistent-metaclas ieslick at common-lisp.net**20090109104433] [Remove default register argument enabled for BDB ieslick at common-lisp.net**20090109071045] [Inhibit-rollback option to BDB transactions for arbitrary non-local exits ieslick at common-lisp.net**20090109070733] [Revert some minor changes ieslick at common-lisp.net**20090109035713] [Simple extension to snapshot-set ieslick at common-lisp.net**20090109031720] [Fix duplicate item warning in BDB index writes ieslick at common-lisp.net**20090107153442] [Fix load order and layout for GC subsystem ieslick at common-lisp.net**20090107125806] [Enhance concurrent gc to catch writes during the mark phase ieslick at common-lisp.net**20090107053908] [Change code version to 1.0; optimize symbol interning in serializer ieslick at common-lisp.net**20090107042700] [TAG ELEPHANT-1-0-A1 ieslick at common-lisp.net**20090105234537] Patch bundle hash: 957713aa8db0c38019086644d5850eb0ff101b45 On Sat, Jul 10, 2010 at 1:34 PM, Red Daly wrote: > Here is the patch. ?I identified a boostrapping issue: > > (setf (instances-cache instance) (indices instance)) was being called > on an instance of BDB-INDEXED-BDB, forcing a deserialization of the > persistent INDICES slot. ?Unfortunately at this point in bootstrapping > the database, instance-table is not yet set up, so deserialization > does not quite work to fetch the persistent value of the INDICES slot. > > I correct this bug by defining a custom reader that lazily loads the > indices-cache slot. ?Not the smoothest bug fix, but it seems to work. > > - Red > > > On Sat, Jul 10, 2010 at 1:00 PM, Red Daly wrote: >> When I try to open a controller of mine, I get this error: >> >> The slot ELEPHANT::INSTANCE-TABLE is unbound in the object >> # >> >> It seems that this is caused by a bug with how the instance-table is >> established in a new controller, since the stack trace indicates this >> bug occurs when the INSTANCE-TABLE slot is being set up. >> Specifically, at this line in bdb-controller.lisp: >> >> >> ? ? ?(setf (slot-value sc 'instance-table) >> ? ? ? ? ? ? ?(if (or new-p (elephant::prior-version-p >> (database-version sc) '(0 9 1))) >> ? ? ? ? ? ? ? ? ?;; When opening the DB equal or prior to 0.9.1, >> always get the indices initialized, >> ? ? ? ? ? ? ? ? ?;; regardless of the indices is initialized before. >> ? ? ? ? ? ? ? ? ?;; Even the indices is serialized before(in the case >> that open the <=0.9.1 DB file for the second time), >> ? ? ? ? ? ? ? ? ?;; it still can not be unserialized here, because >> its persistent object's oid >> ? ? ? ? ? ? ? ? ?;; does not match the hardcoded one in >> oid->schema-id, which only work on the DB file >> ? ? ? ? ? ? ? ? ?;; created in release > 0.9.1. >> ? ? ? ? ? ? ? ? ?(make-instance 'bdb-indexed-btree :from-oid -3 :sc >> sc :indices (make-hash-table)) >>>>>> ? ? ? ? ? ? ? ? ?(make-instance 'bdb-indexed-btree :from-oid -3 :sc sc))) <<<< >> >> >> I will work on a fix now. ?If anybody has insights, gotchas, etc. let >> me know. ?A patch soon to follow... >> >> The slot ELEPHANT::INSTANCE-TABLE is unbound in the object >> #. >> ? [Condition of type UNBOUND-SLOT] >> >> Restarts: >> ?0: [USE-VALUE] Return a value as the slot-value. >> ?1: [STORE-VALUE] Store and return a value as the slot-value. >> ?2: [RETRY] Retry SLIME REPL evaluation request. >> ?3: [ABORT] Return to SLIME's top level. >> ?4: [TERMINATE-THREAD] Terminate this thread (#> "new-repl-thread" RUNNING {10054B88F1}>) >> >> Backtrace: >> ?0: ((SB-PCL::FAST-METHOD SLOT-UNBOUND (T T T)) ..) >> ?1: (SB-PCL::SLOT-UNBOUND-INTERNAL #> /apps/bookllama-dev/server/data/production/> 9) >> ?2: ((SB-PCL::FAST-METHOD ELEPHANT::OID->SCHEMA-ID (T >> ELEPHANT:STORE-CONTROLLER)) #) >> ?3: ((SB-PCL::FAST-METHOD ELEPHANT::GET-INSTANCE-CLASS >> (ELEPHANT:STORE-CONTROLLER T)) #) >> ?4: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK)) >> ?5: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]324)) >> ?6: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..) >> ?7: ((FLET #:FORM-FUN-[CONTROLLER-RECREATE-INSTANCE]14)) >> ?8: ((SB-PCL::FAST-METHOD ELEPHANT::CONTROLLER-RECREATE-INSTANCE >> (ELEPHANT:STORE-CONTROLLER T)) ..) >> ?9: ((LABELS ELEPHANT-SERIALIZER2::%DESERIALIZE) >> #S(ELEPHANT-MEMUTIL:BUFFER-STREAM :BUFFER >> # :SIZE 76 >> :POSITION 76 :LENGTH 80)) >> ?10: ((LABELS ELEPHANT-SERIALIZER2::%DESERIALIZE) >> #S(ELEPHANT-MEMUTIL:BUFFER-STREAM :BUFFER >> # :SIZE 76 >> :POSITION 76 :LENGTH 80)) >> ?11: (ELEPHANT-SERIALIZER2::DESERIALIZE ..) >> ?12: ((FLET #:FORM-FUN-[DESERIALIZE]2)) >> ?13: (ELEPHANT::DESERIALIZE ..) >> ?14: ((LAMBDA ()) #) >> ?15: (SLOT-VALUE # DB-BDB::INDICES) >> ?16: ((SB-PCL::FAST-METHOD SHARED-INITIALIZE :AFTER >> (DB-BDB::BDB-INDEXED-BTREE T)) #)[:EXTERNAL] >> ?17: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. >> SB-PCL::.ARG1. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. >> SB-PCL::.DFUN-MORE-COUNT.)) ..) >> ?18: ((SB-PCL::FAST-METHOD SHARED-INITIALIZE :AROUND >> (ELEPHANT:PERSISTENT-OBJECT T)) # #> argument> # #)[:EXTERNAL] >> ?19: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. >> SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) >> ..) >> ?20: (SB-PCL::FAST-MAKE-INSTANCE #)[:EXTERNAL] >> ?21: ((LAMBDA ())) >> ?22: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION >> (DB-BDB::BDB-STORE-CONTROLLER T)) # >> # # #> argument>)[:EXTERNAL] >> ?23: ((SB-PCL::FAST-METHOD ELEPHANT::OPEN-CONTROLLER >> (DB-BDB::BDB-STORE-CONTROLLER)) #(13 NIL 9 NIL 3 NIL ...) #> argument> #> /apps/bookllama-dev/server/data/production/>)[:EXTER.. >> ?24: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. >> SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) >> ..) >> ?25: (ELEPHANT:OPEN-STORE #)[:EXTERNAL] >> >> >> -- Red > -------------- next part -------------- A non-text attachment was scrubbed... Name: instance-table-bootstrapping-bug.patch Type: text/x-patch Size: 16289 bytes Desc: not available URL: From sky at viridian-project.de Mon Jul 12 10:56:26 2010 From: sky at viridian-project.de (Leslie P. Polzer) Date: Mon, 12 Jul 2010 12:56:26 +0200 (CEST) Subject: [elephant-devel] Error: The slot ELEPHANT::INSTANCE-TABLE is unbound In-Reply-To: References: Message-ID: Red Daly wrote: > I think the patch was scrubbed. Here it is again just in case. Pushed (with slight modifications), thanks! I don't suppose there is a decent way to test this in the test suite? Leslie From reddaly at gmail.com Tue Jul 13 06:38:24 2010 From: reddaly at gmail.com (Red Daly) Date: Mon, 12 Jul 2010 23:38:24 -0700 Subject: [elephant-devel] Error: The slot ELEPHANT::INSTANCE-TABLE is unbound In-Reply-To: References: Message-ID: On Mon, Jul 12, 2010 at 3:56 AM, Leslie P. Polzer wrote: > > Red Daly wrote: >> I think the patch was scrubbed. ?Here it is again just in case. > > Pushed (with slight modifications), thanks! > > I don't suppose there is a decent way to test this in the test suite? > > ?Leslie It seems strange that we did not encounter this before. It seems like whenever an instance-table is stored persistently, this bug will arise when the database is opened anew. A test case would set up a database and ensure that the instance table slot was set, then close the database and reopen it, and assert that no condition was thrown. Red > > > > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel > From jingtaozf at gmail.com Wed Jul 14 12:40:01 2010 From: jingtaozf at gmail.com (Xu Jingtao) Date: Wed, 14 Jul 2010 20:40:01 +0800 Subject: [elephant-devel] a bug when not use elephant:*store-controller* when close-store Message-ID: <20100714.204001.223028418.jingtaozf@gmail.com> hi elephant-devel: when there are no store-controller and i don't use elephant:*store-controller* as default controller like this: ================================================== ;;start store (unless *license-store* (setq *license-store* (open-store `(:BDB ,*license-store-dir*)))) ;;close store (close-store *license-store*) (setf *license-store* nil) ================================================== This works fine when i first open it,but when i close it and re-open it, the store is not working. i have to add following codes when close store ================================================== (when (eq elephant:*store-controller* *license-store*) (setf elephant:*store-controller* nil)) ================================================== obvioursly function close-store has a bug that not assign elephant:*store-controller* to nil when it should re-setf it. best regards. jingtao. From sky at viridian-project.de Tue Jul 27 09:23:04 2010 From: sky at viridian-project.de (Leslie P. Polzer) Date: Tue, 27 Jul 2010 11:23:04 +0200 (CEST) Subject: [elephant-devel] a bug when not use elephant:*store-controller* when close-store In-Reply-To: <20100714.204001.223028418.jingtaozf@gmail.com> References: <20100714.204001.223028418.jingtaozf@gmail.com> Message-ID: <1d7ebf34944364a30c8a607289095679.squirrel@mail.stardawn.org> Hi Jingtao, the documentation for close-store says: If you pass a custom store controller, you are responsible for setting it to NIL. Do you think this behavior should be changed? Leslie From jingtaozf at gmail.com Tue Jul 27 09:53:11 2010 From: jingtaozf at gmail.com (Xu Jingtao) Date: Tue, 27 Jul 2010 17:53:11 +0800 Subject: [elephant-devel] a bug when not use elephant:*store-controller* when close-store In-Reply-To: <1d7ebf34944364a30c8a607289095679.squirrel@mail.stardawn.org> References: <20100714.204001.223028418.jingtaozf@gmail.com> <1d7ebf34944364a30c8a607289095679.squirrel@mail.stardawn.org> Message-ID: <20100727.175311.343184542.jingtaozf@gmail.com> Hi elephant-devel, Sorry i have not notice it in document. But i think this behavior will confuse me. I hope you change it and don't let user care this maybe better. best regards. jingtao. sky> sky> Hi Jingtao, sky> sky> the documentation for close-store says: sky> sky> If you pass a custom store controller, sky> you are responsible for setting it to NIL. sky> sky> Do you think this behavior should be changed? sky> sky> Leslie sky> sky> sky> _______________________________________________ sky> elephant-devel site list sky> elephant-devel at common-lisp.net sky> http://common-lisp.net/mailman/listinfo/elephant-devel From killerstorm at newmail.ru Wed Jul 28 07:36:03 2010 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Wed, 28 Jul 2010 10:36:03 +0300 Subject: [elephant-devel] a bug when not use elephant:*store-controller* when close-store References: <20100714.204001.223028418.jingtaozf@gmail.com> <1d7ebf34944364a30c8a607289095679.squirrel@mail.stardawn.org> Message-ID: LPP> the documentation for close-store says: LPP> If you pass a custom store controller, LPP> you are responsible for setting it to NIL. What is "it" in this context"? I think it is pretty hard to read this as "you are responsible for setting elephant:*current-controller* to NIL". LPP> Do you think this behavior should be changed? I think so -- behaviour of open-store/close-store is not symmetric and is pretty ugly. I don't know what is a right fix, though... A simple solution would be to set *current-controller* to NIL in close-store if passed custom store matches *current-controller*. I think it should work in all cases except when *current-controller* is re-bound, e.g. via with-store. Better solution would be to prevent open-store from setting *current-store* at all. E.g. with a parameter: (defparameter *foo* (open-store '(:BDB ...) :set-default NIL) Or we can set this behaviour globally, e.g. if we set *current-controller* to something other than NIL or a store: (setf *current-controller* :no-default-controller) this will prevent open-store from overwriting it. From eslick at media.mit.edu Wed Jul 28 14:05:23 2010 From: eslick at media.mit.edu (Ian Eslick) Date: Wed, 28 Jul 2010 07:05:23 -0700 Subject: [elephant-devel] a bug when not use elephant:*store-controller* when close-store In-Reply-To: References: <20100714.204001.223028418.jingtaozf@gmail.com> <1d7ebf34944364a30c8a607289095679.squirrel@mail.stardawn.org> Message-ID: Probably a global parameter with a more expected default is appropriate. Multi-store operation is not a commonly supported operating mode, although we've made provisions for it over time. The current behavior was intended to solve the following problem. 1) System one opens a store and starts using it. 2) A second system opens a store (test at the REPL, etc) and overwrites the global *store-controller* variable. 3) System one starts writing objects into store 2 silently - oops! I tended to work with a database that powered a website, but also did interactive work with a second database interactively and didn't want that default changed and I found it annoying to constantly get errors when I had error checking in there. open-store interactions with *store-controller* could have the following variables set by *open-store-policy* 1) :one-only: open-store sets *store-controller* the first time and errors if it is already set 2) :one-only silent: as above, but no error 3) :last-one-wins: silently set the global *store-controller* to the value of the last opened store. :one-only is the default. If you are using multiple stores in a system you should use (with-store (spec) ...) to ensure that code uses the proper store. Ian On Jul 28, 2010, at 12:36 AM, Alex Mizrahi wrote: > LPP> the documentation for close-store says: > > LPP> If you pass a custom store controller, > LPP> you are responsible for setting it to NIL. > > What is "it" in this context"? I think it is pretty hard to read this as > "you are responsible for setting elephant:*current-controller* to NIL". > > LPP> Do you think this behavior should be changed? > > I think so -- behaviour of open-store/close-store is not symmetric and is > pretty ugly. I don't know what is a right fix, though... > > A simple solution would be to set *current-controller* to NIL in close-store > if passed custom store matches *current-controller*. > I think it should work in all cases except when *current-controller* is > re-bound, e.g. via with-store. > > Better solution would be to prevent open-store from setting *current-store* > at all. E.g. with a parameter: > > (defparameter *foo* (open-store '(:BDB ...) :set-default NIL) > > Or we can set this behaviour globally, e.g. if we set *current-controller* > to something other than NIL or a store: > (setf *current-controller* :no-default-controller) > > this will prevent open-store from overwriting it. > > > > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel