-
Notifications
You must be signed in to change notification settings - Fork 160
/
standalone.clj
67 lines (61 loc) · 3.18 KB
/
standalone.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(ns crux.bootstrap.standalone
(:require [clojure.spec.alpha :as s]
[clojure.tools.logging :as log]
[clojure.java.io :as io]
[crux.backup :as backup]
[crux.bootstrap :as b]
[crux.codec :as c]
[crux.db :as db]
[crux.io :as cio]
[crux.index :as idx]
[crux.kv :as kv]
[crux.lru :as lru]
[crux.query :as q]
[crux.tx :as tx])
(:import java.io.Closeable
crux.api.ICruxAPI
crux.bootstrap.CruxNode))
(s/def ::standalone-options (s/keys :req-un [:crux.kv/db-dir :crux.tx/event-log-dir :crux.kv/kv-backend]
:opt-un [:crux.kv/sync? :crux.db/object-store :crux.lru/doc-cache-size]
:opt [:crux.tx/event-log-sync-interval-ms
:crux.tx/event-log-kv-backend]))
(defn start-standalone-node ^ICruxAPI [options]
(s/assert ::standalone-options options)
(let [{:keys [db-dir sync? kv-backend event-log-dir doc-cache-size
crux.tx/event-log-kv-backend crux.tx/event-log-sync-interval-ms] :as options}
(merge b/default-options options)
started (atom [])]
(try
(let [kv-store (doto (b/start-kv-store
(merge (when-not event-log-dir
{:sync? true})
options))
(->> (swap! started conj)))
event-log-sync? (boolean (or sync? (not event-log-sync-interval-ms)))
event-log-kv-store (doto (b/start-kv-store
{:db-dir event-log-dir
:kv-backend (or event-log-kv-backend kv-backend)
:sync? event-log-sync?
:crux.index/check-and-store-index-version false})
(->> (swap! started conj)))
object-store (lru/->CachedObjectStore (lru/new-cache doc-cache-size)
(b/start-object-store {:kv kv-store} options))
tx-log (doto (tx/->EventTxLog event-log-kv-store)
(->> (swap! started conj)))
indexer (tx/->KvIndexer kv-store tx-log object-store)
event-log-consumer (when event-log-kv-store
(doto (tx/start-event-log-consumer event-log-kv-store indexer (when-not sync?
event-log-sync-interval-ms))
(->> (swap! started conj))))]
(b/map->CruxNode {:kv-store kv-store
:tx-log tx-log
:object-store object-store
:indexer indexer
:options options
:close-fn (fn []
(doseq [c [event-log-consumer tx-log kv-store]]
(cio/try-close c)))}))
(catch Throwable t
(doseq [c (reverse @started)]
(cio/try-close c))
(throw t)))))