Hmmm....I can't reproduce this locally with my copy of latest. Your test code passes on a fresh DB as well. It's possible you're catching an error having to do with opening non 1.0 databases.
A few quick sanity checks: 1) Did you clean out the test repository before running? (tests/delscript.sh) 2) Also, are you using elephant-1.0 or the defunct elephant-dev darcs repository? Thank you, Ian On Dec 29, 2009, at 12:52 PM, Red Daly wrote: > This bug is easy to reproduce with the latest version of elephant. > Here is some code I used to reproduce the bug: > > (require :elephant) > > (defpackage :ele-bug > (:use :ele :cl)) > > (in-package :ele-bug) > > (defclass a () > ((x :initarg :x :index t :initform 0 :accessor x)) > (:metaclass ele:persistent-metaclass)) > > (defun create-instances (n &optional (class 'a)) > (dotimes (i n) > (make-instance class :x i))) > > (defun stats () > (dolist (class-sym '(a b)) > (format t "~A: ~A instances; ~A with value 10~%" > class-sym > (length (get-instances-by-class class-sym)) > (length (get-instances-by-value class-sym 'x 10))))) > > (defun open-close-test () > (declare (optimize (debug 3))) > (macrolet ((is (form) > `(assert ,form))) > (flet ((open-it () > (ele:open-store '(:bdb "db2/"))) > (test-class-indexes (n-class n-10) > (is (= n-class (length (get-instances-by-class 'a)))) > (is (= n-10 (length (get-instances-by-value 'a 'x 10)))))) > (with-open-store ('(:bdb "db2/")) > (create-instances 100 'a) > (test-class-indexes 100 1)) > (with-open-store ('(:bdb "db2/")) > (test-class-indexes 100 1))))) > > (open-close-test) > > I was able to fix the problem with a minor patch, but I doubt the > correctness of my solution. Here is the diff: > > diff -rN old-elephant-1.0/src/elephant/controller.lisp > new-elephant-1.0/src/elephant/controller.lisp > 711c711,712 > < :key-form 'schema-classname-keyform)) > --- >> :key-form 'schema-classname-keyform >> :populate t)) > 716c717,718 > < :key-form 'instance-cidx-keyform)))) > --- >> :key-form 'instance-cidx-keyform >> :populate t)))) > > > I essentially just added a :populate t argument to the open-controller > method. This seems to indicate that the 'BY-NAME secondary indices > that map a class indices to OIDs, and class names to class indices, do > not persist. Is this expected behavior? I'm not familiar enough with > the internals to tell. > > Thanks, > Red > > > > > > On Wed, Sep 23, 2009 at 3:27 PM, Red Daly <redd...@gmail.com> wrote: >> This is the 1.0 repository. I will see if I can reproduce the problem in a >> test case. >> Red >> >> >> >> >> On Sep 23, 2009, at 9:50 AM, Ian Eslick <esl...@media.mit.edu> wrote: >> >> Which darcs repository? There is the old 0.91 release and the new >> elephant-1.0 branch... >> Ian >> On Sep 22, 2009, at 8:41 PM, Red Daly wrote: >> >> I should also note that I am using the version of elephant from darcs. And >> I discovered that when the program went down it was due to a segfault (I >> believe in emacs). However, all instances had been created under many >> different transactions that did not abort. >> >> Here is some more fiddling around: >> >> CL-USER> (lisp-implementation-version) >> "1.0.29.54.rc1" >> BOOKS> (ele::get-db-schemas *ele-db* 'material) >> NIL >> BOOKS> (ele::controller-instance-class-index *ele-db*) >> #<BDB-BTREE-INDEX >> oid:13701> >> BOOKS> (ele:map-btree #'(lambda (key >> val) >> (format t "~S => ~S~%" key >> val)) >> (ele::controller-instance-class-index *ele-db*)) >> 307 => >> 307 >> NIL >> >> >> Red >> >> On Tue, Sep 22, 2009 at 8:08 PM, Red Daly <redd...@gmail.com> wrote: >>> >>> I noticed there was a disparity between get-instances-by-class and >>> map-inverted-index. I will let the code speak for itself: >>> >>> BOOKS> (length (ele:map-inverted-index #'(lambda (isbn obj) obj) 'material >>> 'isbn :collect >>> t)) >>> >>> 1945 >>> BOOKS> (length (ele:get-instances-by-class 'material)) >>> 0 >>> BOOKS> (defparameter f (make-instance 'material :title "Fake Book")) >>> >>> F >>> BOOKS> (length (ele:get-instances-by-class 'material)) >>> >>> 1 >>> BOOKS> (length (ele:map-inverted-index #'(lambda (isbn obj) obj) 'material >>> 'isbn :collect >>> t)) >>> 1946 >>> >>> There is a similar problem with the university class. >>> >>> BOOKS> (length (ele:get-instances-by-class 'university)) >>> 0 >>> BOOKS> *stanford-university* >>> #<UNIVERSITY >>> oid:204> >>> BOOKS> (official-name *stanford-university*) >>> "Stanford University" >>> >>> All of the instances in the database were created in a prior session. >>> Then I shut down the DB and restarted Lisp. Now MAP-CLASS and >>> GET-INSTANCES-BY-CLASS return nil for all classes. It seems like new >>> instances get added to the "class index," but older instances are not >>> found. However, these classes persist in the inverted slot indexes. Can >>> anybody diagnose what's going on? >>> >>> here are the definitions of the classes: >>> >>> (defclass department () >>> ((university :initarg :university :initform nil :accessor >>> department-university >>> :index t) >>> (official-name :initarg :official-name :initform nil :accessor >>> official-name) >>> (common-name :initarg :common-name :initform nil :accessor common-name) >>> (abbreviation :initarg :abbreviation :initform nil :accessor >>> abbreviation >>> :index t)) >>> (:metaclass ele:persistent-metaclass) >>> (:documentation "A department has a bunch of course listings.")) >>> >>> (defclass material () >>> ((title :initarg :title :initform nil :accessor material-title >>> :index t) >>> (authors :initarg :authors :initform nil :accessor material-authors) ;; >>> a list of >>> authors >>> (edition :initarg :edition :initform nil :accessor material-edition) >>> (isbn :initarg :isbn :initform nil :accessor material-isbn >>> :index t) >>> (asin :initarg :asin :initform nil :accessor material-asin >>> :index t >>> :documentation "An Amazon.com identifier that uniquely identifies >>> the material") >>> (image-uri :initarg :image-uri :initform nil :accessor >>> material-image-uri)) >>> (:metaclass ele:persistent-metaclass)) >>> >>> Thanks, >>> Red >>> >> >> _______________________________________________ >> elephant-devel site list >> elephant-devel@common-lisp.net >> http://common-lisp.net/mailman/listinfo/elephant-devel >> >> _______________________________________________ >> elephant-devel site list >> elephant-devel@common-lisp.net >> http://common-lisp.net/mailman/listinfo/elephant-devel > > _______________________________________________ > elephant-devel site list > elephant-devel@common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel _______________________________________________ elephant-devel site list elephant-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/elephant-devel