Author: hhubner Date: 2007-11-12 01:38:32 -0500 (Mon, 12 Nov 2007) New Revision: 2267
Removed: branches/trunk-reorg/bknr/datastore/src/data/random-mixin.lisp Modified: branches/trunk-reorg/bknr/datastore/src/bknr-datastore.asd branches/trunk-reorg/bknr/datastore/src/data/package.lisp branches/trunk-reorg/bknr/datastore/src/data/txn.lisp Log: Integrated store random state maintenance into the baseline store code, as the API does not allow for clean implementation as a subsystem.
Modified: branches/trunk-reorg/bknr/datastore/src/bknr-datastore.asd =================================================================== --- branches/trunk-reorg/bknr/datastore/src/bknr-datastore.asd 2007-11-11 21:35:49 UTC (rev 2266) +++ branches/trunk-reorg/bknr/datastore/src/bknr-datastore.asd 2007-11-12 06:38:32 UTC (rev 2267) @@ -26,5 +26,4 @@ (:file "encoding" :depends-on ("package")) (:file "txn" :depends-on ("encoding" "package")) (:file "object" :depends-on ("txn" "package")) - (:file "blob" :depends-on ("txn" "object" "package")) - (:file "random-mixin" :depends-on ("package" "txn")))))) + (:file "blob" :depends-on ("txn" "object" "package"))))))
Modified: branches/trunk-reorg/bknr/datastore/src/data/package.lisp =================================================================== --- branches/trunk-reorg/bknr/datastore/src/data/package.lisp 2007-11-11 21:35:49 UTC (rev 2266) +++ branches/trunk-reorg/bknr/datastore/src/data/package.lisp 2007-11-12 06:38:32 UTC (rev 2267) @@ -15,7 +15,6 @@ ;; store #:store #:mp-store - #:random-store-mixin #:store-guard #:store-state #:open-store @@ -103,6 +102,5 @@
#:store-object-subsystem #:blob-subsystem - #:random-mixin-subsystem
#:find-refs))
Deleted: branches/trunk-reorg/bknr/datastore/src/data/random-mixin.lisp =================================================================== --- branches/trunk-reorg/bknr/datastore/src/data/random-mixin.lisp 2007-11-11 21:35:49 UTC (rev 2266) +++ branches/trunk-reorg/bknr/datastore/src/data/random-mixin.lisp 2007-11-12 06:38:32 UTC (rev 2267) @@ -1,70 +0,0 @@ -(in-package :bknr.datastore) - -;; The intended use of this mixin class -;; is something like this: - -;; (in-package :bknr.user) - -;; (defclass mystore (mp-store random-store-mixin) -;; ()) - -;; (open-store "/tmp/db_123/" :class-name 'mystore -;; :subsystems (list (make-instance 'store-object-subsystem) -;; (make-instance 'random-mixin-subsystem))) - -(defclass random-store-mixin () - ((random-state :accessor random-state-of :initform (make-random-state t)))) - -(defun random-subsystem-pathname (store) - (make-pathname :name "random-state" :defaults (ensure-store-current-directory store))) - -(defmethod initialize-instance :after ((store random-store-mixin) &rest initargs) - (declare (ignore initargs)) - (let ((random-mixin-subsystem (find 'random-mixin-subsystem - (store-subsystems store) - :key #'type-of))) - (assert random-mixin-subsystem nil "Store ~S needs to have a random-mixin-subsystem." - store) - (unless (probe-file (random-subsystem-pathname store)) - (snapshot-subsystem store random-mixin-subsystem)))) - -(defmethod restore-store :after ((store random-store-mixin) &key until) - (declare (ignore until)) - ;; During restore, we use the random state of the store (see - ;; restore-subsystem below). Once finished with the restore, we - ;; save the current random state to be the store's random state: - (setf (random-state-of store) *random-state*)) - -(defmethod execute-transaction :around ((executor random-store-mixin) transaction) - (declare (ignore transaction)) - (let ((*random-state* (random-state-of executor))) - (call-next-method))) - -(defclass random-mixin-subsystem () - ()) - -(defmethod snapshot-subsystem ((store random-store-mixin) - (subsystem random-mixin-subsystem)) - (with-open-file (s (random-subsystem-pathname store) - :direction :output - :if-exists :supersede) - (with-standard-io-syntax - (prin1 (random-state-of store) s)))) - -(defmethod restore-subsystem ((store random-store-mixin) - (subsystem random-mixin-subsystem) &key - until) - (declare (ignore until)) - (let* ((random-state-pathname (random-subsystem-pathname store))) - (prog1 - (if (probe-file random-state-pathname) - (with-open-file (s random-state-pathname :direction :input) - (let ((random-state (read s))) - (setf (random-state-of store) random-state))) - (progn - (format *trace-output* "Initializing random state of store.~%") - (setf (random-state-of store) (make-random-state t)))) - ;; Set global random state to the state of the store, so that - ;; the transactions that are restored afterwards are in the - ;; correct random context. - (setf *random-state* (random-state-of store)))))
Modified: branches/trunk-reorg/bknr/datastore/src/data/txn.lisp =================================================================== --- branches/trunk-reorg/bknr/datastore/src/data/txn.lisp 2007-11-11 21:35:49 UTC (rev 2266) +++ branches/trunk-reorg/bknr/datastore/src/data/txn.lisp 2007-11-12 06:38:32 UTC (rev 2267) @@ -5,6 +5,9 @@ (defvar *store-debug* nil "Trace and time execution of transactions")
+(defvar *store-random-state* nil + "Random state of the store") + ;;; conditions
(define-condition not-in-transaction (error) @@ -28,6 +31,8 @@ :initform :closed :documentation "State of the datastore, can be either :closed, :opened or :read-only") (transaction-log-stream :accessor store-transaction-log-stream :initform nil) + (random-state :accessor store-random-state + :initform nil) (guard :reader store-guard :initarg :guard) (log-guard :reader store-log-guard @@ -77,6 +82,7 @@ (setf *store* store) (let ((store-existed-p (probe-file (store-current-directory store)))) (ensure-store-current-directory store) + (ensure-store-random-state store) (dolist (subsystem (store-subsystems store)) (when *store-debug* (format *trace-output* "Initializing subsystem ~A of ~A~%" subsystem store)) @@ -126,6 +132,25 @@ (defmethod ensure-store-current-directory ((store store)) (ensure-directories-exist (store-current-directory store)))
+(defmethod store-random-state-pathname ((store store)) + (merge-pathnames #P"random-state" (store-current-directory store))) + +(defmethod ensure-store-random-state ((store store)) + (if (probe-file (store-random-state-pathname store)) + (with-open-file (f (store-random-state-pathname store)) + (format t "reading store random state~%") + (setf (store-random-state store) (read f))) + (with-open-file (f (store-random-state-pathname store) :direction :output :if-does-not-exist :create) + (format t "initializing store random state~%") + (with-standard-io-syntax + (prin1 (setf (store-random-state store) (make-random-state t)) f))))) + +(defmethod update-store-random-state ((store store)) + (format t "saving store random state~%") + (with-open-file (f (store-random-state-pathname store) :direction :output :if-does-not-exist :create) + (with-standard-io-syntax + (prin1 (store-random-state store) f)))) + (defgeneric store-transaction-log-pathname (store-or-directory) (:documentation "Return the pathname of the current transaction log of STORE"))
@@ -273,7 +298,8 @@ (tagbody again (restart-case - (let ((start-time (get-internal-run-time))) + (let ((start-time (get-internal-run-time)) + (*random-state* (store-random-state *store*))) (setf retval (call-next-method)) (setf execution-time (- (get-internal-run-time) start-time))) (retry-transaction () @@ -448,14 +474,16 @@ (let ((error t)) (unwind-protect (with-store-state (:snapshot) - (dolist (subsystem (store-subsystems store)) - (when *store-debug* - (format *trace-output* "Snapshotting subsystem ~A of ~A~%" subsystem store)) - (snapshot-subsystem store subsystem) - (when *store-debug* - (format *trace-output* "Successfully snapshotted ~A of ~A~%" subsystem store))) - (setf (store-transaction-run-time store) 0) - (setf error nil)) + (let ((*random-state* (store-random-state store))) + (dolist (subsystem (store-subsystems store)) + (when *store-debug* + (format *trace-output* "Snapshotting subsystem ~A of ~A~%" subsystem store)) + (snapshot-subsystem store subsystem) + (when *store-debug* + (format *trace-output* "Successfully snapshotted ~A of ~A~%" subsystem store))) + (setf (store-transaction-run-time store) 0) + (setf error nil)) + (update-store-random-state store)) (when error (warn "Restoring backup ~A to current." backup-directory) @@ -510,6 +538,7 @@ (restore-store *store* :until until))
(defmethod restore-store ((store store) &key until) + (ensure-store-random-state store) (format *trace-output* "restoring ~A~%" store) (let ((*store* store)) (setf (store-state store) :opened)