Skip to content

Commit 2d7c81c

Browse files
committed
fixes #30 by adding delete-queue! and delete-all!
and deprecating delete! as dangerous Signed-off-by: Sean Corfield <[email protected]>
1 parent d146c06 commit 2d7c81c

File tree

4 files changed

+50
-17
lines changed

4 files changed

+50
-17
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
v0.2.0 in progress
44
* Deprecated single-segment `durable-queue` ns; use `clj-commons.durable-queue` instead
5+
* Deprecate `delete!` because it is dangerous: it leaves queues in a corrupted state (because it deletes files without cleaning up in-memory state).
6+
* Address [#30](https://github.com/clj-commons/durable-queue/issues/30) by adding `delete-queue!` and `delete-all!` to safely delete an individual queue (and its files) and safely delete all queues (and their files).
57
* Clean up lint issues; export clj-kondo config
68
* Add a changelog!
79

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,20 @@ To get a description of the current state of the queue, we can use `stats`, whic
7070
| `:num-slabs` | the number of underlying files which are being used to store tasks |
7171
| `:num-active-slabs` | the number of underlying files which are currently open and mapped into memory |
7272

73+
As of version 0.2.0, you can delete an entire queue using `delete-queue!`, which will remove all tasks and delete all files associated with the queue:
74+
75+
```clj
76+
> (dq/delete-queue! q :foo)
77+
{}
78+
```
79+
80+
As of version 0.2.0, you can also delete all queues using `delete-all!`, which will remove all tasks and delete all files associated with all queues:
81+
82+
```clj
83+
> (dq/delete-all! q)
84+
nil
85+
```
86+
7387
### configuring the queues
7488

7589
`queues` can be given a number of different options, which can affect its performance and correctness.

src/clj_commons/durable_queue.clj

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -424,20 +424,24 @@
424424
(^:private mark-complete! [_ q-name])
425425
(^:private mark-retry! [_ q-name])
426426
(delete! [_]
427-
"Deletes all files associated with the queues.")
427+
"DEPRECATED: Deletes all files associated with all queues. Dangerous!")
428+
(delete-queue! [_ q-name]
429+
"Deletes the specific queue, including all associated files.")
430+
(delete-all! [_]
431+
"Deletes all queues, including all associated files.")
428432
(stats [_]
429433
"Returns a map of queue names onto information about the immediate state of the queue.")
430434
(fsync [_]
431435
"Forces an fsync on all modified files.")
432436
(take!
433437
[_ q-name]
434438
[_ q-name timeout timeout-val]
435-
"A blocking dequeue from `name`. If `timeout` is specified, returns `timeout-val` if
439+
"A blocking dequeue from `q-name`. If `timeout` is specified, returns `timeout-val` if
436440
no task is available within `timeout` milliseconds.")
437441
(put!
438442
[_ q-name task-descriptor]
439443
[_ q-name task-descriptor timeout]
440-
"A blocking enqueue to `name`. If `timeout` is specified, returns `false` if unable to
444+
"A blocking enqueue to `q-name`. If `timeout` is specified, returns `false` if unable to
441445
enqueue within `timeout` milliseconds, `true` otherwise."))
442446

443447
(defn queues
@@ -613,11 +617,25 @@
613617

614618
IQueues
615619

616-
(delete! [_]
620+
(delete! [_] ; DEPRECATED and dangerous since it breaks the queues
617621
(doseq [s (->> @queue-name->slabs vals (apply concat))]
618622
(unmap s)
619623
(delete-slab s)))
620624

625+
(delete-queue! [_ q-name]
626+
(let [q-name (munge (name q-name))]
627+
(doseq [s (get @queue-name->slabs q-name)]
628+
(unmap s)
629+
(delete-slab s))
630+
(.clear (queue q-name))
631+
(swap! queue-name->stats dissoc q-name)
632+
(swap! queue-name->slabs dissoc q-name)
633+
(swap! queue-name->current-slab dissoc q-name)))
634+
635+
(delete-all! [this]
636+
(doseq [q (keys @queue-name->stats )]
637+
(delete-queue! this q)))
638+
621639
(fsync [_]
622640
(doseq [slab (->> @queue-name->slabs vals (apply concat))]
623641
(sync! slab)))
@@ -637,15 +655,15 @@
637655
(stats [_]
638656
(let [ks (keys @queue-name->stats)]
639657
(zipmap ks
640-
(map
641-
(fn [q-name]
642-
(merge
643-
{:num-slabs (-> @queue-name->slabs (get q-name) count)
644-
:num-active-slabs (->> (get @queue-name->slabs q-name)
645-
(filter mapped?)
646-
count)}
647-
(immediate-stats (queue q-name) (get @queue-name->stats q-name))))
648-
ks))))
658+
(map
659+
(fn [q-name]
660+
(merge
661+
{:num-slabs (-> @queue-name->slabs (get q-name) count)
662+
:num-active-slabs (->> (get @queue-name->slabs q-name)
663+
(filter mapped?)
664+
count)}
665+
(immediate-stats (queue q-name) (get @queue-name->stats q-name))))
666+
ks))))
649667

650668
(take! [_ q-name timeout timeout-val]
651669
(let [q-name (munge (name q-name))
@@ -663,8 +681,8 @@
663681
(when-not (= slab old-slab)
664682
(swap! queue-name->current-slab assoc q-name slab)
665683
(doseq [s (->> (get @queue-name->slabs q-name)
666-
butlast
667-
(remove #(= slab %)))]
684+
butlast
685+
(remove #(= slab %)))]
668686
(unmap s))))
669687

670688
(status! t :in-progress)

test/clj_commons/durable_queue_test.clj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
tasks (range 1e4)]
1818
(doseq [t tasks]
1919
(dq/put! q :foo t))
20-
(is (= tasks (map deref (dq/immediate-task-seq q :foo))))
21-
(dq/delete! q)))
20+
(is (= tasks (map deref (dq/immediate-task-seq q :foo))))))
2221

2322
(deftest test-partial-slab-writes
2423
(clear-tmp-directory)

0 commit comments

Comments
 (0)