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 | 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 | 5 | ;; a minimal Lisp implementation of TAO. |
6 | ||
35
f54f7cc7458b
cl-simple-example implemented, init db/tao.lisp
ellis <ellis@rwest.io>
parents:
diff
changeset
|
7 | ;;; Code: |
37 | 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 | 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")) |