Skip to content

Commit ae787ad

Browse files
authored
Fix deletion of node with active queries (#11)
We keep track of the number of active queries for each node and will sleep until they are all finished before deleting node files. Fixes #9
1 parent 7f73286 commit ae787ad

File tree

1 file changed

+31
-7
lines changed

1 file changed

+31
-7
lines changed

src/xtdb_http_multinode/core.clj

+31-7
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@
299299
(io/file (or (System/getenv "XTDB_DATA_DIR") "/var/lib/xtdb")))
300300

301301
(def nodes (atom {}))
302+
(def active-queries-per-node (atom {}))
303+
302304
(defn- atom-add-node [nodes name]
303305
(if (get nodes name)
304306
;; Node was already added, so we can just return nodes
@@ -350,26 +352,48 @@
350352
;; Node is not there, so nothing to delete
351353
nodes
352354
(do
353-
(.close node)
354-
(run! io/delete-file (reverse (file-seq (io/file node-dir name))))
355355
(dissoc nodes name)))))
356356

357357
(defn- delete-node [request]
358-
(let [name (get-in request [:parameters :body :node])]
359-
(if (get @nodes name)
358+
(let [name (get-in request [:parameters :body :node])
359+
node (get @nodes name)]
360+
(if node
360361
(do
362+
;; We first remove the node so no new queries can be started
361363
(swap! nodes atom-delete-node name)
362-
(log/info "Deleted node" name)
363-
{:status 200, :body {:deleted true}})
364+
(log/info "Removed node" name "from the list of nodes")
365+
(.close node)
366+
(loop []
367+
(let [num-queries (get @active-queries-per-node name 0)]
368+
(if (= num-queries 0)
369+
(do
370+
;; No queries are running anymore so we can delete the files.
371+
(run! io/delete-file (reverse (file-seq (io/file node-dir name))))
372+
(log/info "Deleted files for node" name)
373+
{:status 200, :body {:deleted true}})
374+
(do
375+
(log/info "Sleeping 100 ms because of" num-queries "active queries for node" name)
376+
(Thread/sleep 100)
377+
(recur))))))
364378
{:status 404, :body {:error "Node not found"}})))
365379

380+
(defn- active-query-inc [active-queries name]
381+
(assoc active-queries name (inc (get active-queries name 0))))
382+
383+
(defn- active-query-dec [active-queries name]
384+
(assoc active-queries name (dec (get active-queries name))))
385+
366386
(defn- lookup-node [handler]
367387
(fn [request]
368388
(let [node-name (get-in request [:path-params :node])]
369389
(if node-name
370390
(let [node (get @nodes node-name)]
371391
(if node
372-
(handler (assoc request :xtdb-node node))
392+
(do
393+
(swap! active-queries-per-node active-query-inc node-name)
394+
(let [ret (handler (assoc request :xtdb-node node))]
395+
(swap! active-queries-per-node active-query-dec node-name)
396+
ret))
373397
{:status 404, :body {:error "Node not found"}}))
374398
(handler request)))))
375399

0 commit comments

Comments
 (0)