changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate examples/db/tao.lisp

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