[elephant-cvs] CVS elephant/tests
ieslick
ieslick at common-lisp.net
Fri Mar 30 15:03:46 UTC 2007
Update of /project/elephant/cvsroot/elephant/tests
In directory clnet:/tmp/cvs-serv7809/tests
Added Files:
stress-test.lisp
Log Message:
Some working files that were missing
--- /project/elephant/cvsroot/elephant/tests/stress-test.lisp 2007/03/30 15:03:46 NONE
+++ /project/elephant/cvsroot/elephant/tests/stress-test.lisp 2007/03/30 15:03:46 1.1
(in-package :elephant-tests)
(defparameter *spec* '(:bdb "/Users/eslick/Work/db/test"))
(defparameter *names* '("David" "Jim" "Peter" "Thomas"
"Arthur" "Jans" "Klaus" "James" "Martin"))
(defclass person ()
((name :initform (elt *names* (random (length *names*)))
:accessor name
:index t)
;; Actually the index t shouldn't be needed, but since elephant
;; sometimes complained that "person is not an index class", I try if this fixes it.
(age :initform (random 100) :accessor age :index t)
;; (made-by :initform (elephant-utils::ele-thread-hash-key))
(updated-by :initform nil :accessor updated-by))
(:metaclass elephant:persistent-metaclass))
(defparameter *nr-persons* 10000) ;; Should be 10000, but for me elephant can't allocate memory after 3000.
;; I think the problem it is becuase the number of locks (999) is = max 1000. see db_stat -e
(defparameter +age+ 50)
;; I have tried different places for with-transaction below
(defun make-persons (nr-objects &optional (batch-size 500))
(loop for i from 1 to (/ nr-objects batch-size) do
(elephant:with-transaction ()
(loop for j from 1 to batch-size do
(let ((person (make-instance 'person)))
(when (zerop (mod (+ (* i batch-size) j) 1000))
(format t "~D ~a " (+ (* i batch-size) j) (name person))))))))
(defun ensure-clean-store ()
t)
;; (let ((dir (cl-fad:pathname-as-directory (second *spec*))))
;; (when (cl-fad:directory-exists-p dir)
;; (cl-fad:delete-directory-and-files dir))
;; (ensure-directories-exist dir)))
(defun my-test-create ()
(ensure-clean-store)
(elephant:with-open-store (*spec*)
(make-persons *nr-persons*)))
(defun subsets (size list)
(let ((subsets nil))
(loop for elt in list
for i from 0 do
(when (= 0 (mod i size))
(setf (car subsets) (nreverse (car subsets)))
(push nil subsets))
(push elt (car subsets)))
(setf (car subsets) (nreverse (car subsets)))
(nreverse subsets)))
(defmacro do-subsets ((subset subset-size list) &body body)
`(loop for ,subset in (subsets ,subset-size ,list) do
, at body))
(defun my-test-update (&key (new-age 27))
"Test updating all persons by changing their age."
(elephant:with-open-store (*spec*)
(do-subsets (subset 500 (elephant:get-instances-by-class 'person))
(format t "Doing subset~%")
(elephant:with-transaction ()
(mapcar #'(lambda (person)
(setf (age person) new-age))
subset)))))
(defun my-test-load ()
"Test loading all persons by computing their average age."
(let ((nr-persons 0)
(total-age 0)
(show-first nil))
(elephant:with-open-store (*spec*)
(elephant:with-transaction ()
(mapcar #'(lambda (person)
(incf nr-persons)
(print nr-persons)
(when (and show-first (> show-first))
(format t "Sample person ~a~%F" show-first)
(describe person)
(decf show-first))
(incf total-age (age person)))
(elephant:get-instances-by-class 'person))))
(values (coerce (/ total-age nr-persons) 'float)
nr-persons
total-age)))
(defun check-basic-setup ()
(my-test-update :new-age +age+)
(multiple-value-bind (average nr-persons)
(my-test-load)
(assert (= +age+ average))
(assert (= nr-persons *nr-persons*))))
More information about the Elephant-cvs
mailing list