changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > demo / examples/db/tao.lisp

changeset 39: 1ef551e24009
parent: c6d0a37a046a
author: Richard Westhaver <ellis@rwest.io>
date: Thu, 11 Apr 2024 18:58:35 -0400
permissions: -rw-r--r--
description: added musicbrainz db example
1 ;;; examples/db/tao.lisp --- Common Lisp implementation of the TAO data model
2 
3 ;; https://research.facebook.com/publications/tao-facebooks-distributed-data-store-for-the-social-graph/
4 
5 ;; a minimal Lisp implementation of TAO.
6 
7 ;;; Code:
8 (defpackage :examples/tao
9  (:use :cl :std :rdb :log :obj/db :obj/graph :obj/id)
10  (:export :run-tao))
11 
12 (in-package :examples/tao)
13 
14 (rdb::load-rocksdb)
15 
16 (defvar *tao-directory* "/tmp/tao/")
17 
18 (defvar *tao-log-dir*)
19 (defvar *tao-db-dir*)
20 (defvar *tao-cfs*
21  (vector (make-rdb-cf "nodes")
22  (make-rdb-cf "edges")))
23 
24 (defun tao-path (path &optional (root *tao-directory*))
25  (merge-pathnames path root))
26 
27 (defclass tao-node (id)
28  (key val))
29 
30 (defclass tao-edge (edge) ())
31 
32 (defclass tao-graph (graph) ())
33 
34 (defclass tao-db (database)
35  ((db :type rdb)))
36 
37 (defclass tao (tao-db tao-graph)
38  ((dir :initarg :dir)))
39 
40 (defun ensure-tao-directories (&optional (root *tao-directory*))
41  (setf *tao-log-dir* (ensure-directories-exist (tao-path "log/" root) :verbose t))
42  root)
43 
44 (defun init-tao-db (&optional (root *tao-directory*))
45  (let ((db-dir (tao-path "db/" root)))
46  (setf *tao-db-dir* db-dir)
47  (create-db db-dir :cfs *tao-cfs*)))
48 
49 (defun make-tao (&key (dir *tao-directory*))
50  (make-instance 'tao
51  :dir (setf *tao-directory* (ensure-tao-directories dir))
52  :db (init-tao-db dir)))
53 
54 (defun run-tao ()
55  (let ((opts (default-rdb-opts))) ;; configure database options
56  (set-opt opts "error-if-exists" 0)
57  (set-opt opts "db-log-dir" "/tmp/log")
58  (push-sap* opts)
59  (let ((db (create-db "tao"
60  :opts opts
61  ;; :cfs (vector (make-rdb-cf "nodes")
62  ;; (make-rdb-cf "edges"))
63  :open t)))
64  (with-db (db db)
65  (flush-db db)
66  (let ((metadata (get-metadata db)))
67  (info!
68  (rdb::rocksdb-column-family-metadata-get-name metadata)
69  (rdb::rocksdb-column-family-metadata-get-size metadata)
70  (rdb::rocksdb-column-family-metadata-get-file-count metadata)
71  (rdb::rocksdb-column-family-metadata-get-level-count metadata))
72  (let ((lmeta (rdb::rocksdb-column-family-metadata-get-level-metadata metadata 0)))
73  (info!
74  (rdb::rocksdb-level-metadata-get-level lmeta)
75  (rdb::rocksdb-level-metadata-get-size lmeta)
76  (rdb::rocksdb-level-metadata-get-file-count lmeta))
77  ;; TODO: requires file-count > 0
78  ;; (let ((smeta (rdb::rocksdb-level-metadata-get-sst-file-metadata lmeta 0)))
79  ;; (info!
80  ;; (rdb::rocksdb-sst-file-metadata-get-directory smeta)
81  ;; (rdb::rocksdb-sst-file-metadata-get-relative-filename smeta)
82  ;; (rdb::rocksdb-sst-file-metadata-get-size smeta)
83  ;; (rdb::rocksdb-sst-file-metadata-get-smallestkey smeta)
84  ;; (rdb::rocksdb-sst-file-metadata-get-largestkey smeta))
85  ;; (rdb::rocksdb-sst-file-metadata-destroy smeta))
86  (rdb::rocksdb-level-metadata-destroy lmeta))
87  (rdb::rocksdb-column-family-metadata-destroy metadata))
88  (info! (get-prop db "rocksdb.stats"))
89  (close-db db))))
90  (info! "TAO OK"))