|
126 | 126 |
|
127 | 127 | (defn restore-impl [storage opts] |
128 | 128 | (locking storage |
129 | | - (let [root (-restore storage root-addr) |
130 | | - tail (-restore storage tail-addr) |
131 | | - {:keys [schema eavt aevt avet max-eid max-tx max-addr]} root |
132 | | - _ (vswap! *max-addr max max-addr) |
133 | | - opts (merge root opts) |
134 | | - adapter (make-storage-adapter storage opts) |
135 | | - db (db/restore-db |
136 | | - {:schema schema |
137 | | - :eavt (set/restore-by db/cmp-datoms-eavt eavt adapter opts) |
138 | | - :aevt (set/restore-by db/cmp-datoms-aevt aevt adapter opts) |
139 | | - :avet (set/restore-by db/cmp-datoms-avet avet adapter opts) |
140 | | - :max-eid max-eid |
141 | | - :max-tx max-tx})] |
142 | | - (remember-db db) |
143 | | - [db (mapv #(mapv (fn [[e a v tx]] (db/datom e a v tx)) %) tail)]))) |
| 129 | + (when-some [root (-restore storage root-addr)] |
| 130 | + (let [tail (-restore storage tail-addr) |
| 131 | + {:keys [schema eavt aevt avet max-eid max-tx max-addr]} root |
| 132 | + _ (vswap! *max-addr max max-addr) |
| 133 | + opts (merge root opts) |
| 134 | + adapter (make-storage-adapter storage opts) |
| 135 | + db (db/restore-db |
| 136 | + {:schema schema |
| 137 | + :eavt (set/restore-by db/cmp-datoms-eavt eavt adapter opts) |
| 138 | + :aevt (set/restore-by db/cmp-datoms-aevt aevt adapter opts) |
| 139 | + :avet (set/restore-by db/cmp-datoms-avet avet adapter opts) |
| 140 | + :max-eid max-eid |
| 141 | + :max-tx max-tx})] |
| 142 | + (remember-db db) |
| 143 | + [db (mapv #(mapv (fn [[e a v tx]] (db/datom e a v tx)) %) tail)])))) |
144 | 144 |
|
145 | 145 | (defn db-with-tail [db tail] |
146 | 146 | (reduce |
|
162 | 162 | (.walkAddresses ^PersistentSortedSet (:aevt db) visit-fn) |
163 | 163 | (.walkAddresses ^PersistentSortedSet (:avet db) visit-fn))) |
164 | 164 |
|
165 | | -(defn ^HashSet addresses [dbs] |
166 | | - (let [set (HashSet.) |
167 | | - visit-fn #(.add set %)] |
168 | | - (.add set root-addr) |
169 | | - (.add set tail-addr) |
| 165 | +(defn addresses [dbs] |
| 166 | + (let [*set (volatile! (transient #{})) |
| 167 | + visit-fn #(vswap! *set conj! %)] |
| 168 | + (visit-fn root-addr) |
| 169 | + (visit-fn tail-addr) |
170 | 170 | (doseq [db dbs] |
171 | 171 | (addresses-impl db visit-fn)) |
172 | | - set)) |
| 172 | + (persistent! @*set))) |
173 | 173 |
|
174 | 174 | (defn- read-stored-dbs [storage'] |
175 | 175 | (let [iter ^Iterator (.iterator stored-dbs)] |
|
198 | 198 | (restore storage')) ;; make sure we won’t gc currently stored db |
199 | 199 | used (addresses dbs) |
200 | 200 | all (-list-addresses storage') |
201 | | - unused (into [] (remove #(.contains used %)) all)] |
| 201 | + unused (into [] (remove used) all)] |
202 | 202 | (util/log "GC: found" (count dbs) "alive db refs," (count used) "used addrs," (count all) "total addrs," (count unused) "unused") |
203 | 203 | (-delete storage' unused)))) |
204 | 204 |
|
|
0 commit comments