[elephant-cvs] CVS elephant/src/elephant

ieslick ieslick at common-lisp.net
Wed Apr 25 02:28:18 UTC 2007


Update of /project/elephant/cvsroot/elephant/src/elephant
In directory clnet:/tmp/cvs-serv4997/src/elephant

Modified Files:
	classes.lisp collections.lisp controller.lisp package.lisp 
	pset.lisp variables.lisp 
Log Message:
Export bdb performance tweaks; lots more documentation; new ops for libberkeley-db

--- /project/elephant/cvsroot/elephant/src/elephant/classes.lisp	2007/04/24 16:39:30	1.31
+++ /project/elephant/cvsroot/elephant/src/elephant/classes.lisp	2007/04/25 02:28:01	1.32
@@ -186,10 +186,12 @@
 ;;
 
 (defmethod change-class ((inst persistent) (class t) &rest rest)
-  (error "Changing a persistent instance's class to a non-persistent class is not currently allowed"))
+  (cerror "Ignore and continue?"
+          "Changing a persistent instance's class to a non-persistent class is not currently allowed"))
 
 (defmethod change-class ((inst standard-object) (class persistent-metaclass) &rest rest)
-  (error "Changing a standard instance to a persistent instance is not supported"))
+  (cerror "Ignore and continue?" 
+          "Changing a standard instance to a persistent instance is not supported"))
 
 (defmethod update-instance-for-different-class :around ((previous persistent) (current persistent) &rest initargs &key)
   (let* ((old-class (class-of previous))
--- /project/elephant/cvsroot/elephant/src/elephant/collections.lisp	2007/04/24 03:02:27	1.25
+++ /project/elephant/cvsroot/elephant/src/elephant/collections.lisp	2007/04/25 02:28:01	1.26
@@ -354,7 +354,7 @@
 (defun lisp-compare-equal (a b)
   (equal a b))
 
-(defgeneric map-btree (fn btree &rest args &key start end value)
+(defgeneric map-btree (fn btree &rest args &key start end value &allow-other-keys)
   (:documentation   "Map btree maps over a btree from the value start to the value of end.
    If values are not provided, then it maps over all values.  BTrees 
    do not have duplicates, but map-btree can also be used with indices
@@ -365,9 +365,9 @@
 ;; function orders by type tag and nil is the highest valued type tag so nils are the last
 ;; possible element in a btree ordered by value.
 
-(defmethod map-btree (fn (btree btree) &rest args &key start end (value nil value-set-p))
+(defmethod map-btree (fn (btree btree) &rest args &key start end (value nil value-set-p) &allow-other-keys)
   (let ((end (if value-set-p value end)))
-    (ensure-transaction (:store-controller (get-con btree))
+    (ensure-transaction (:store-controller (get-con btree) :degree-2 *map-using-degree2*)
       (with-btree-cursor (curs btree)
 	(multiple-value-bind (exists? key value)
 	    (cond (value-set-p
@@ -386,7 +386,7 @@
 		   (funcall fn k v)
 		   (return nil)))))))))
 
-(defgeneric map-index (fn index &rest args &key start end value from-end collect)
+(defgeneric map-index (fn index &rest args &key start end value from-end collect &allow-other-keys)
   (:documentation "Map-index is like map-btree but for secondary indices, it
    takes a function of three arguments: key, value and primary
    key.  As with map-btree the keyword arguments start and end
@@ -398,7 +398,8 @@
    and end."))
 
 (defmethod map-index (fn (index btree-index) &rest args 
-		      &key start end (value nil value-set-p) from-end collect)
+		      &key start end (value nil value-set-p) from-end collect 
+		      &allow-other-keys)
   (declare (dynamic-extent args))
   (unless (or (null start) (null end) (lisp-compare<= start end))
     (error "map-index called with start = ~A and end = ~A. Start must be less than or equal to end according to elephant::lisp-compare<=."
@@ -410,7 +411,7 @@
 	     (push (funcall fn k v pk) results)))
       (let ((fn (if collect #'collector fn)))
       (declare (dynamic-extent (function collector)))
-      (ensure-transaction (:store-controller sc)
+      (ensure-transaction (:store-controller sc :degree-2 *map-using-degree2*)
 	(with-btree-cursor (cur index)
 	  (labels ((continue-p (key) 
 		     ;; Do we go to the next value?
--- /project/elephant/cvsroot/elephant/src/elephant/controller.lisp	2007/04/23 02:26:53	1.49
+++ /project/elephant/cvsroot/elephant/src/elephant/controller.lisp	2007/04/25 02:28:01	1.50
@@ -133,6 +133,11 @@
    name
    (asdf:find-system :elephant)))
 
+(defun initialize-user-parameters ()
+  (loop for (keyword variable) in *user-configurable-parameters* do
+       (awhen (get-user-configuration-parameter keyword)
+	 (setf variable it))))
+
 ;;
 ;; COMMON STORE CONTROLLER FUNCTIONALITY
 ;;
@@ -465,6 +470,8 @@
    their *store-controller* to a given dynamic context or wrap each store-specific op in
    a transaction using with or ensure transaction"
   (assert (consp spec))
+  ;; Ensure that parameters are set
+  (initialize-user-parameters)
   (let ((controller (get-controller spec)))
     (apply #'open-controller controller args)
     (if *store-controller*
--- /project/elephant/cvsroot/elephant/src/elephant/package.lisp	2007/04/22 03:35:09	1.32
+++ /project/elephant/cvsroot/elephant/src/elephant/package.lisp	2007/04/25 02:28:02	1.33
@@ -208,7 +208,7 @@
    #:persistent #:persistent-object #:persistent-metaclass #:defpclass
    #:persistent-collection #:drop-pobject
 
-   #:pset #:make-pset #:insert-item #:remove-item #:map-pset #:find-item #:pset-list
+   #:pset #:make-pset #:insert-item #:remove-item #:map-pset #:find-item #:pset-list #:drop-pset
 
    #:btree #:make-btree
    #:get-value #:remove-kv #:existsp
--- /project/elephant/cvsroot/elephant/src/elephant/pset.lisp	2007/04/12 02:47:33	1.2
+++ /project/elephant/cvsroot/elephant/src/elephant/pset.lisp	2007/04/25 02:28:02	1.3
@@ -54,6 +54,9 @@
   (:documentation "Construct an empty default pset or backend specific pset.
                    This is an internal function used by make-pset"))
 
+(defgeneric drop-pset (pset)
+  (:documentation "Release pset storage to database for reuse"))
+
 ;; NOTE: Other operators?
 ;; - Efficient union, intersection and difference fn's exploiting an underlying
 ;;   sorted order?
@@ -117,6 +120,16 @@
 		   (push item list))
 		 (pset-btree pset)))
     list))
+
+(defmethod drop-pset ((pset default-pset))
+  (ensure-transaction (:store-controller *store-controller*)
+    (with-btree-cursor (cur (pset-btree pset))
+      (loop for exists? = (cursor-first cur)
+	    then (cursor-next cur)
+	    while exists?
+            do (cursor-delete cur)))))
+            
+            
 	  
 	   
 
--- /project/elephant/cvsroot/elephant/src/elephant/variables.lisp	2007/04/24 12:58:10	1.16
+++ /project/elephant/cvsroot/elephant/src/elephant/variables.lisp	2007/04/25 02:28:02	1.17
@@ -39,11 +39,32 @@
    error")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; General support for user configurable parameters
+
+(defvar *user-configurable-parameters*
+  '((:map-using-degree2 *map-using-degree2*)
+    (:berkeley-db-cachesize *berkeley-db-cachesize*)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;; Optimization parameters
 
 (defvar *circularity-initial-hash-size* 50
   "This is the default size of the circularity cache used in the serializer")
 
+(defparameter *map-using-degree2* t
+  "This parameter enables an optimization for the Berkeley DB data store
+   that allows a map operator to walk over a btree without locking all
+   read data, it only locks written objects and the current object")
+
+(defvar *berkeley-db-cachesize* 10485760
+  "This parameter controls the size of the berkeley db data store page
+   cache.  This parameter can be increased by to 4GB on 32-bit machines
+   and much larger on other machines.  Using the db_stat utility to identify
+   cache hit frequency on your application is a good way to tune this number.
+   The default is 20 megabytes specified in bytes.  If you need to specify
+   Gigbyte + cache sizes, talk to the developers!  This is ignored for
+   existing databases that were created with different parameters")
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Legacy Thread-local specials
 




More information about the Elephant-cvs mailing list