changelog shortlog graph tags branches files raw help

Mercurial > core / changeset: db protocol stuff, prep for tao, tests, with-temp-db

changeset 272: 0a5e37693fdf
parent 271: 4a1a21ff46ee
child 273: 6d56c4950fa2
author: Richard Westhaver <ellis@rwest.io>
date: Tue, 09 Apr 2024 22:09:52 -0400
files: lisp/ffi/rocksdb/checkpoint.lisp lisp/ffi/rocksdb/compaction.lisp lisp/ffi/rocksdb/comparator.lisp lisp/ffi/rocksdb/db.lisp lisp/ffi/rocksdb/rocksdb.asd lisp/lib/rdb/err.lisp lisp/lib/rdb/macs.lisp lisp/lib/rdb/obj.lisp lisp/lib/rdb/pkg.lisp lisp/lib/rdb/proto.lisp lisp/lib/rdb/raw.lisp lisp/lib/rdb/tests.lisp
description: db protocol stuff, prep for tao, tests, with-temp-db
     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")))))