1.1--- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2+++ b/lisp/ffi/rocksdb/checkpoint.lisp Tue Apr 09 22:09:52 2024 -0400
1.3@@ -0,0 +1,34 @@
1.4+;;; rocksdb/checkpoint.lisp --- RocksDB Checkpoints
1.5+
1.6+;;
1.7+
1.8+;;; Code:
1.9+(in-package :rocksdb)
1.10+
1.11+(export '(rocksdb-checkpoint-object-destroy))
1.12+
1.13+(def-with-errptr rocksdb-checkpoint-object-create (* rocksdb-checkpoint)
1.14+ (db (* rocksdb)))
1.15+
1.16+(def-with-errptr rocksdb-checkpoint-create void
1.17+ (checkpoint (* rocksdb-checkpoint))
1.18+ (checkpoint-dir c-string)
1.19+ (log-size-for-flush (unsigned 64)))
1.20+
1.21+(define-alien-routine rocksdb-checkpoint-object-destroy void
1.22+ (* rocksdb-checkpoint))
1.23+
1.24+;; rocksdb-open-and-trim-history
1.25+(def-with-errptr rocksdb-open-as-secondary-column-families (* rocksdb)
1.26+ (opts (* rocksdb-options))
1.27+ (name c-string)
1.28+ (secondary-path c-string)
1.29+ (num-cfs int)
1.30+ (cf-names (array c-string))
1.31+ (cf-opts (array (* rocksdb-options)))
1.32+ (cf-handles (array (* rocksdb-column-family-handle))))
1.33+
1.34+(def-with-errptr rocksdb-open-as-secondary (* rocksdb)
1.35+ (opts (* rocksdb-options))
1.36+ (name c-string)
1.37+ (secondary-path c-string))
2.1--- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2+++ b/lisp/ffi/rocksdb/compaction.lisp Tue Apr 09 22:09:52 2024 -0400
2.3@@ -0,0 +1,29 @@
2.4+;;; rocksdb/compaction.lisp --- RocksDB Compaction
2.5+
2.6+;;
2.7+
2.8+;;; Code:
2.9+(in-package :rocksdb)
2.10+;; (define-alien-routine rocksdb-compactionfilter-create (* rocksdb-compactionfilter)
2.11+;; (state (* void))
2.12+;; (destructor (* void))
2.13+;; (filter (* unsigned-char))
2.14+;; (name (* unsigned-char)))
2.15+
2.16+(define-alien-routine rocksdb-compactionfilter-set-ignore-snapshots void
2.17+ (self (* rocksdb-compactionfilter)) (val unsigned-char))
2.18+
2.19+(define-alien-routine rocksdb-compactionfilter-destroy void
2.20+ (self (* rocksdb-compactionfilter)))
2.21+
2.22+;;; Compaction Filter Context
2.23+(define-alien-routine rocksdb-compactionfiltercontext-is-full-compaction unsigned-char
2.24+ (context (* rocksdb-compactionfiltercontext)))
2.25+
2.26+(define-alien-routine rocksdb-compactionfiltercontext-is-manual-compaction unsigned-char
2.27+ (context (* rocksdb-compactionfiltercontext)))
2.28+
2.29+(export '(rocksdb-compactionfilter-set-ignore-snapshots rocksdb-compactionfilter-destroy
2.30+ rocksdb-compactionfiltercontext-is-full-compaction rocksdb-compactionfiltercontext-is-manual-compaction))
2.31+
2.32+;;; Compaction Filter Factory
3.1--- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2+++ b/lisp/ffi/rocksdb/comparator.lisp Tue Apr 09 22:09:52 2024 -0400
3.3@@ -0,0 +1,24 @@
3.4+;;; rocksdb/comparator.lisp --- RocksDB Comparators
3.5+
3.6+;;
3.7+
3.8+;;; Code:
3.9+(in-package :rocksdb)
3.10+;; TODO 2023-12-11:
3.11+;; (define-alien-routine rocksdb-comparator-create (* rocksdb-comparator)
3.12+;; (state (* void))
3.13+;; (destructor (* void))
3.14+;; (compare (* int))
3.15+;; (name (* unsigned-char)))
3.16+
3.17+(define-alien-routine rocksdb-comparator-destroy void (self (* rocksdb-comparator)))
3.18+
3.19+;; (define-alien-routine rocksdb-comparator-with-ts-create (* rocksdb-comparator)
3.20+;; (state (* void))
3.21+;; (destructor (* void))
3.22+;; (compare (* int))
3.23+;; (compare-ts (* int))
3.24+;; (compare-without-ts (* int))
3.25+;; (name (* unsigned-char)))
3.26+
3.27+(export '(rocksdb-comparator-destroy))
4.1--- a/lisp/ffi/rocksdb/db.lisp Mon Apr 08 22:55:30 2024 -0400
4.2+++ b/lisp/ffi/rocksdb/db.lisp Tue Apr 09 22:09:52 2024 -0400
4.3@@ -219,16 +219,16 @@
4.4 (list (array rocksdb-column-family-handle)))
4.5
4.6 (define-alien-routine rocksdb-column-family-handle-destroy void
4.7- (* rocksdb-column-family-handle))
4.8+ (cf (* rocksdb-column-family-handle)))
4.9
4.10 (define-alien-routine rocksdb-column-family-handle-get-id unsigned-int
4.11- (* rocksdb-column-family-handle))
4.12+ (cf (* rocksdb-column-family-handle)))
4.13
4.14 (define-alien-routine rocksdb-column-family-handle-get-name c-string
4.15 (handle (* rocksdb-column-family-handle))
4.16 (name-len (* size-t)))
4.17
4.18-(export '(rocksdb-create-column-families-destroy rocksdb-create-column-family-handle-destroy
4.19+(export '(rocksdb-create-column-families-destroy rocksdb-column-family-handle-destroy
4.20 rocksdb-column-family-handle-get-id rocksdb-column-family-handle-get-name))
4.21
4.22 (def-with-errptr rocksdb-drop-column-family
4.23@@ -567,51 +567,6 @@
4.24 (export '(rocksdb-perfcontext-reset rocksdb-perfcontext-report
4.25 rocksdb-perfcontext-metric rocksdb-perfcontext-destroy rocksdb-set-perf-level))
4.26
4.27-;;; Compaction Filter
4.28-;; (define-alien-routine rocksdb-compactionfilter-create (* rocksdb-compactionfilter)
4.29-;; (state (* void))
4.30-;; (destructor (* void))
4.31-;; (filter (* unsigned-char))
4.32-;; (name (* unsigned-char)))
4.33-
4.34-(define-alien-routine rocksdb-compactionfilter-set-ignore-snapshots void
4.35- (self (* rocksdb-compactionfilter)) (val unsigned-char))
4.36-
4.37-(define-alien-routine rocksdb-compactionfilter-destroy void
4.38- (self (* rocksdb-compactionfilter)))
4.39-
4.40-;;; Compaction Filter Context
4.41-(define-alien-routine rocksdb-compactionfiltercontext-is-full-compaction unsigned-char
4.42- (context (* rocksdb-compactionfiltercontext)))
4.43-
4.44-(define-alien-routine rocksdb-compactionfiltercontext-is-manual-compaction unsigned-char
4.45- (context (* rocksdb-compactionfiltercontext)))
4.46-
4.47-(export '(rocksdb-compactionfilter-set-ignore-snapshots rocksdb-compactionfilter-destroy
4.48- rocksdb-compactionfiltercontext-is-full-compaction rocksdb-compactionfiltercontext-is-manual-compaction))
4.49-
4.50-;;; Compaction Filter Factory
4.51-
4.52-;;; Comparator
4.53-;; TODO 2023-12-11:
4.54-;; (define-alien-routine rocksdb-comparator-create (* rocksdb-comparator)
4.55-;; (state (* void))
4.56-;; (destructor (* void))
4.57-;; (compare (* int))
4.58-;; (name (* unsigned-char)))
4.59-
4.60-(define-alien-routine rocksdb-comparator-destroy void (self (* rocksdb-comparator)))
4.61-
4.62-;; (define-alien-routine rocksdb-comparator-with-ts-create (* rocksdb-comparator)
4.63-;; (state (* void))
4.64-;; (destructor (* void))
4.65-;; (compare (* int))
4.66-;; (compare-ts (* int))
4.67-;; (compare-without-ts (* int))
4.68-;; (name (* unsigned-char)))
4.69-
4.70-(export '(rocksdb-comparator-destroy))
4.71-
4.72 ;;; Filter Policy
4.73 (define-alien-routine rocksdb-filterpolicy-destroy void (self (* rocksdb-filterpolicy)))
4.74
4.75@@ -630,3 +585,13 @@
4.76
4.77 (export '(rocksdb-filterpolicy-destroy rocksdb-filterpolicy-create-bloom rocksdb-filterpolicy-create-bloom-full
4.78 rocksdb-filterpolicy-create-ribbon rocksdb-filterpolicy-create-ribbon-hybrid))
4.79+
4.80+;;; Snapshot
4.81+(define-alien-routine rocksdb-create-snapshot (* rocksdb-snapshot)
4.82+ (db (* rocksdb)))
4.83+
4.84+(define-alien-routine rocksdb-release-snapshot void
4.85+ (db (* rocksdb))
4.86+ (snapshot (* rocksdb-snapshot)))
4.87+
4.88+(export '(rocksdb-create-snapshot rocksdb-release-snapshot))
5.1--- a/lisp/ffi/rocksdb/rocksdb.asd Mon Apr 08 22:55:30 2024 -0400
5.2+++ b/lisp/ffi/rocksdb/rocksdb.asd Tue Apr 09 22:09:52 2024 -0400
5.3@@ -18,6 +18,8 @@
5.4 (:file "slice")
5.5 (:file "db")
5.6 (:file "metadata")
5.7+ (:file "compaction")
5.8+ (:file "comparator")
5.9 (:file "merge")
5.10 (:file "stats")
5.11 (:file "vars"))
6.1--- a/lisp/lib/rdb/err.lisp Mon Apr 08 22:55:30 2024 -0400
6.2+++ b/lisp/lib/rdb/err.lisp Tue Apr 09 22:09:52 2024 -0400
6.3@@ -31,6 +31,14 @@
6.4 ()
6.5 (:documentation "Error signaled while destroying a database."))
6.6
6.7+(define-condition flush-db-error (rocksdb-error)
6.8+ ()
6.9+ (:documentation "Error signaled while flushing a database."))
6.10+
6.11+(define-condition repair-db-error (rocksdb-error)
6.12+ ()
6.13+ (:documentation "Error signaled while repairing a database."))
6.14+
6.15 (define-condition destroy-backup-engine-error (rocksdb-error)
6.16 ()
6.17 (:documentation "Error signaled while destroying a backup engine."))
7.1--- a/lisp/lib/rdb/macs.lisp Mon Apr 08 22:55:30 2024 -0400
7.2+++ b/lisp/lib/rdb/macs.lisp Tue Apr 09 22:09:52 2024 -0400
7.3@@ -31,6 +31,25 @@
7.4 (format nil "WITH-DB signaled: ~A" condition)))))
7.5 ,@body)))
7.6
7.7+(defvar *temp-db-path-generator*
7.8+ (lambda (&optional (name "temp-db"))
7.9+ (make-pathname :directory "tmp" :name (symbol-name (gensym name))))
7.10+ "A single arg function returning the absolute path to a temp-db path.")
7.11+
7.12+(defmacro with-temp-db ((db-var (&rest cf-vars) &key destroy) &body body)
7.13+ "Bind DB-VAR to a temporary RDB object, arranging for CF-VARS to be
7.14+created as column-families and destroying the database after executing
7.15+the forms in BODY."
7.16+ (with-gensyms (cf-names)
7.17+ (log:debug! (setf cf-names (mapcar #'symbol-name cf-vars)))
7.18+ `(with-db (,db-var (make-rdb (namestring (funcall ,*temp-db-path-generator* ,(symbol-name db-var))) (default-rdb-opts)))
7.19+ (prog1
7.20+ (progn ,@body)
7.21+ ,(if destroy
7.22+ `(destroy-db ,db-var)
7.23+ `(shutdown-db ,db-var))))))
7.24+
7.25+
7.26 (defmacro with-cf ((cf-var cf) &body body)
7.27 "Bind CF to CF-VAR for the lifetime of BODY."
7.28 `(let ((,cf-var ,cf))
8.1--- a/lisp/lib/rdb/obj.lisp Mon Apr 08 22:55:30 2024 -0400
8.2+++ b/lisp/lib/rdb/obj.lisp Tue Apr 09 22:09:52 2024 -0400
8.3@@ -131,7 +131,9 @@
8.4 (name "" :type string)
8.5 (opts (default-rdb-opts) :type rdb-opts)
8.6 (cfs (make-array 0 :element-type 'rdb-cf :adjustable t :fill-pointer 0) :type (array rdb-cf))
8.7- (db nil :type (or null alien)))
8.8+ (db nil :type (or null alien))
8.9+ (backup nil :type (or null alien))
8.10+ (snapshots #() :type (array alien)))
8.11
8.12 ;; (defvar *default-rdb-opts* (default-rdb-opts))
8.13
8.14@@ -160,7 +162,7 @@
8.15 (or (when cfs
8.16 (typecase cfs
8.17 (list (coerce cfs 'vector))
8.18- (vector cfs)
8.19+ ((array rdb-cf) cfs)
8.20 (rdb-cf (vector cfs))
8.21 (t (log:warn! "invalid CF passed to create-db"))))
8.22 (make-array 0 :element-type 'rdb-cf :fill-pointer 0)))))
8.23@@ -175,34 +177,98 @@
8.24 ;; TODO: fix
8.25 (defmethod create-cf ((db rdb) (cf rdb-cf))
8.26 (setf (rdb-cf-sap cf)
8.27- (create-cf-raw (rdb-db db) (rdb-cf-name cf))))
8.28+ (create-cf-raw (rdb-db db) (rdb-cf-name cf) (rdb-opts-sap (rdb-opts db)))))
8.29
8.30-(defmethod close-cf ((cf rdb-cf))
8.31+(defmacro unless-null-db (slots self &body body)
8.32+ `(with-slots (db ,@slots) ,self
8.33+ (unless (null db)
8.34+ ,@body)))
8.35+
8.36+(defmethod destroy-cf ((cf rdb-cf))
8.37 (with-slots (sap) cf
8.38 (unless (null sap)
8.39- (free-alien sap))))
8.40+ (setf sap (destroy-cf-raw sap)))))
8.41
8.42 (defmethod open-db ((self rdb))
8.43 (with-slots (name db opts) self
8.44- (setq db (open-db-raw name (rdb-opts-sap opts)))))
8.45+ (if db
8.46+ (rdb-error "DB already opened - close before re-opening")
8.47+ (setf db (open-db-raw name (rdb-opts-sap opts))))))
8.48+
8.49+(defmethod get-prop ((self rdb) (propname string))
8.50+ (unless-null-db () self
8.51+ (get-property-raw db propname)))
8.52+
8.53+(defmethod repair-db ((self rdb) &key)
8.54+ (repair-db-raw (rdb-name self)))
8.55+
8.56+(defmethod open-backup-db ((self rdb) &key path)
8.57+ (with-slots (opts) self
8.58+ (setf (rdb-backup self) (open-backup-engine-raw path (rdb-opts-sap opts)))))
8.59+
8.60+(defmethod close-backup-db ((self rdb))
8.61+ (with-slots (backup) self
8.62+ (unless (null backup)
8.63+ (close-backup-engine-raw backup))))
8.64+
8.65+(defmethod backup-db ((self rdb) &key path)
8.66+ (unless-null-db (opts backup) self
8.67+ (when (null backup)
8.68+ (if (null path)
8.69+ (error 'open-backup-engine-error :db db)
8.70+ (open-backup-db self :path path)))
8.71+ (create-new-backup-raw backup db)))
8.72+
8.73+(defmethod restore-db ((self rdb) (from string) &key id opts)
8.74+ (unless-null-db (name backup) self
8.75+ (when (null backup)
8.76+ (open-backup-db self :path from))
8.77+ (restore-from-backup-raw backup name from id opts)))
8.78+
8.79+(defmethod snapshot-db ((self rdb))
8.80+ (unless-null-db (snapshots) self
8.81+ (vector-push-extend (create-snapshot-raw db) snapshots)))
8.82+
8.83+(defmethod get-metadata ((self rdb) &optional cf)
8.84+ (get-metadata-raw (rdb-db self) cf))
8.85+
8.86+(defmethod get-stats ((self rdb) &optional (htype 0))
8.87+ (get-stats-raw (rdb-db self) htype))
8.88+
8.89+(defmethod flush-db ((self rdb) &key) ;; todo flushopts
8.90+ (flush-db-raw (rdb-db self)))
8.91+
8.92+(defmethod sync-db ((self rdb) (other null) &key)
8.93+ (flush-db self))
8.94+
8.95+(defmethod shutdown-db ((self rdb) &key wait)
8.96+ (log:debug! "shutting down database" (rdb-name self))
8.97+ (when-let ((db (rdb-db self)))
8.98+ (rocksdb-cancel-all-background-work db wait)
8.99+ (close-db self)))
8.100
8.101 (defmethod create-cfs ((self rdb) &key &allow-other-keys)
8.102 (loop for cf across (rdb-cfs self)
8.103 do (create-cf self cf)))
8.104
8.105-(defmethod close-cfs ((self rdb) &key &allow-other-keys)
8.106+(defmethod destroy-cfs ((self rdb) &key &allow-other-keys)
8.107 (with-slots (cfs) self
8.108 (declare (type (array rdb-cf) cfs))
8.109 (loop for cf across cfs
8.110- do (setf cf (close-cf cf)))))
8.111+ do (setf cf (destroy-cf cf)))))
8.112
8.113 (defmethod close-db ((self rdb) &key &allow-other-keys)
8.114- (with-slots (db cfs) self
8.115+ (with-slots (db cfs backup snapshots) self
8.116+ (close-backup-db self)
8.117+ (unless (zerop (length snapshots))
8.118+ (loop for s across snapshots do (release-snapshot-raw db s)))
8.119+ (destroy-cfs self)
8.120 (unless (null db)
8.121- (close-cfs self)
8.122- (setf db (close-db-raw db)))))
8.123+ (close-db-raw db))))
8.124
8.125 (defmethod destroy-db ((self rdb))
8.126+ ;; close all handles before destruction ensues
8.127+ (close-db self)
8.128 (destroy-db-raw (rdb-name self)))
8.129
8.130 (defmethod put-key ((self rdb) key val)
9.1--- a/lisp/lib/rdb/pkg.lisp Mon Apr 08 22:55:30 2024 -0400
9.2+++ b/lisp/lib/rdb/pkg.lisp Tue Apr 09 22:09:52 2024 -0400
9.3@@ -52,6 +52,14 @@
9.4 :create-cf :create-cfs
9.5 :insert-kv :insert-key
9.6 :open-db :close-db :destroy-db
9.7+ :get-prop :get-metadata
9.8+ :multi-get :delete-key
9.9+ :make-transaction :commit-transaction
9.10+ :flush-db :flush-cf
9.11+ :repair-db :write-db
9.12+ :backup-db :restore-db
9.13+ :get-stats :snapshot-db
9.14+ :shutdown-db
9.15 ;; sst
9.16 :sst-file
9.17 :sst-stream
9.18@@ -65,7 +73,9 @@
9.19 :rdb-cf :make-rdb-cf :create-cf
9.20 :rdb-cf-sap :rdb-cf-name
9.21 ;; macs
9.22+ :with-errptr
9.23 :with-db
9.24+ :with-temp-db
9.25 :do-db
9.26 :with-cf
9.27 :do-cf
10.1--- a/lisp/lib/rdb/proto.lisp Mon Apr 08 22:55:30 2024 -0400
10.2+++ b/lisp/lib/rdb/proto.lisp Tue Apr 09 22:09:52 2024 -0400
10.3@@ -46,12 +46,28 @@
10.4 (:documentation "Commit transaction object SELF."))
10.5 (defgeneric flush-db (self &key)
10.6 (:documentation "Flush the database SELF."))
10.7+(defgeneric sync-db (self other &key) ;;nyi
10.8+ (:documentation "Perform a synchronization on SELF using OTHER."))
10.9 (defgeneric flush-cf (self cf &key)
10.10 (:documentation "Flush the column-family CF in SELF."))
10.11 (defgeneric repair-db (self &key)
10.12 (:documentation "Attempt to repair the database SELF."))
10.13+(defgeneric backup-db (self &key)
10.14+ (:documentation "Create a new backup for database SELF."))
10.15+(defgeneric restore-db (self from &key)
10.16+ (:documentation "Restore database SELF from object FROM."))
10.17+(defgeneric snapshot-db (self)
10.18+ (:documentation "Create a new snapshot for database SELF."))
10.19 (defgeneric write-db (self batch &key)
10.20 (:documentation "Write BATCH to database SELF."))
10.21+(defgeneric shutdown-db (self &key)
10.22+ (:documentation "Shutdown database SELF."))
10.23+(defgeneric get-prop (self propname)
10.24+ (:documentation "Get the property-value of PROPNAME from SELF."))
10.25+(defgeneric get-stats (self &optional htype)
10.26+ (:documentation "Get stats modulo HTYPE from SELF."))
10.27+(defgeneric get-metadata (self &optional cf)
10.28+ (:documentation "Get metadata from SELF."))
10.29 (defgeneric make-val (val)
10.30 (:documentation "Coerce VAL into an OCTET-VECTOR.")
10.31 (:method ((val null))
11.1--- a/lisp/lib/rdb/raw.lisp Mon Apr 08 22:55:30 2024 -0400
11.2+++ b/lisp/lib/rdb/raw.lisp Tue Apr 09 22:09:52 2024 -0400
11.3@@ -54,6 +54,14 @@
11.4 (rocksdb-get-column-family-metadata-cf db cf)
11.5 (rocksdb-get-column-family-metadata db)))
11.6
11.7+(defun flush-db-raw (db &optional (opts (rocksdb-flushoptions-create)))
11.8+ (with-errptr (err 'flush-db-error (list :db db))
11.9+ (rocksdb-flush db opts err)))
11.10+
11.11+(defun repair-db-raw (name &optional (opts (rocksdb-options-create)))
11.12+ (with-errptr (err 'repair-db-error (list :name name))
11.13+ (rocksdb-repair-db opts name err)))
11.14+
11.15 ;;; KVs
11.16 (defun put-kv-raw (db key val &optional (opts (rocksdb-writeoptions-create)))
11.17 (let ((klen (length key))
11.18@@ -103,6 +111,9 @@
11.19 (with-errptr (err 'rocksdb-cf-error (list :db db :cf name))
11.20 (rocksdb-create-column-family db opt name err)))
11.21
11.22+(defun destroy-cf-raw (cf)
11.23+ (rocksdb-column-family-handle-destroy cf))
11.24+
11.25 (defun get-cf-raw (db cf key &optional (opt (rocksdb-readoptions-create)))
11.26 (let ((klen (length key)))
11.27 (with-errptr (err 'get-kv-error (list :db db :key key))
11.28@@ -150,6 +161,9 @@
11.29 (defun create-iter-raw (db &optional (opt (rocksdb-readoptions-create)))
11.30 (rocksdb-create-iterator db opt))
11.31
11.32+(defun destroy-iter-raw (iter)
11.33+ (rocksdb-iter-destroy iter))
11.34+
11.35 (defun iter-key-raw (iter)
11.36 (with-alien ((klen-ptr (* size-t) (make-alien size-t 0)))
11.37 (let* ((key-ptr (rocksdb-iter-key iter klen-ptr))
11.38@@ -177,7 +191,7 @@
11.39 (defmacro with-iter-raw ((iter-var db &optional (opt (rocksdb-readoptions-create))) &body body)
11.40 `(let ((,iter-var (create-iter-raw ,db ,opt)))
11.41 (unwind-protect (progn ,@body)
11.42- (rocksdb-iter-destroy ,iter-var))))
11.43+ (destroy-iter-raw ,iter-var))))
11.44
11.45 ;;; Backup Engine
11.46 (defun open-backup-engine-raw (be-path &optional (opts (rocksdb-options-create)))
11.47@@ -194,12 +208,23 @@
11.48 (with-errptr (err 'rocksdb-error)
11.49 (rocksdb-backup-engine-create-new-backup be db err)))
11.50
11.51-(defun restore-from-latest-backup-raw (be db-path be-path &optional (opt (rocksdb-restore-options-create)))
11.52+(defun restore-from-latest-backup-raw (be db-path backup-path &optional (opt (rocksdb-restore-options-create)))
11.53 (with-errptr (err 'rocksdb-error)
11.54- (rocksdb-backup-engine-restore-db-from-latest-backup be db-path be-path opt err)))
11.55+ (rocksdb-backup-engine-restore-db-from-latest-backup be db-path backup-path opt err)))
11.56+
11.57+(defun restore-from-backup-raw (be db-path backup-path backup-id &optional (opt (rocksdb-restore-options-create)))
11.58+ (with-errptr (err 'rocksdb-error)
11.59+ (rocksdb-backup-engine-restore-db-from-backup be db-path backup-path opt backup-id err)))
11.60
11.61 (defmacro with-open-backup-engine-raw ((be-var be-path &optional (opt (rocksdb-options-create)))
11.62 &body body)
11.63 `(let ((,be-var (open-backup-engine-raw ,be-path ,opt)))
11.64 (unwind-protect (progn ,@body)
11.65 (rocksdb-backup-engine-close ,be-var))))
11.66+
11.67+;;; Snapshot
11.68+(defun create-snapshot-raw (db)
11.69+ (rocksdb-create-snapshot db))
11.70+
11.71+(defun release-snapshot-raw (db snapshot)
11.72+ (rocksdb-release-snapshot db snapshot))
12.1--- a/lisp/lib/rdb/tests.lisp Mon Apr 08 22:55:30 2024 -0400
12.2+++ b/lisp/lib/rdb/tests.lisp Tue Apr 09 22:09:52 2024 -0400
12.3@@ -8,8 +8,6 @@
12.4
12.5 (rocksdb:load-rocksdb)
12.6
12.7-(init-log-timestamp)
12.8-
12.9 (deftest minimal ()
12.10 "Test minimal functionality (open/close/put/get)."
12.11 (let ((db-path (format nil "/tmp/rdb-minimal-~a" (gensym))))
12.12@@ -55,7 +53,7 @@
12.13 (is (not (rocksdb:rocksdb-iter-valid iter)))))
12.14 (destroy-db-raw path)))
12.15
12.16-(deftest rdb (:disabled nil)
12.17+(deftest rdb ()
12.18 "Test RDB struct and methods."
12.19 ;; NOTE: passing a directory with trailing slash causes segfault - guess we gotta handle tht
12.20 (with-db (db (debug! (create-db "/tmp/rdb" :open t)))
12.21@@ -79,3 +77,18 @@
12.22 ;; cleanup
12.23 (destroy-db db)
12.24 (close-db db)))
12.25+
12.26+(deftest temp-db ()
12.27+ "Test WITH-TEMP-DB macro."
12.28+ (time
12.29+ (with-temp-db (tmp (cf1 cf2 cf3 cf4) :destroy t)
12.30+ (open-db tmp)
12.31+ (rocksdb-options-increase-parallelism (rdb-opts-sap (rdb-opts tmp)) 4)
12.32+ (dotimes (i 10000)
12.33+ (insert-key tmp (format nil "foo~A" i) (format nil "bar~A" i)))
12.34+ (flush-db tmp)
12.35+ (dotimes (i 10000)
12.36+ (debug! (get-key tmp (format nil "foo~A" i))))
12.37+ (debug! ;; some info about our db
12.38+ (rdb-name tmp)
12.39+ (get-prop tmp "rocksdb.dbstats")))))