Skip to content

Commit 9d36602

Browse files
committed
fix: preserve queue_name when adding jobs to DLQ
1 parent a64d891 commit 9d36602

3 files changed

Lines changed: 52 additions & 30 deletions

File tree

docs/implementation/incomplete-features.md

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -124,30 +124,7 @@ QueueStatus {
124124

125125
## Low Priority - Known Limitations/Workarounds
126126

127-
### 8. DLQ queue_name tracking
128-
**Location:** `src/client/dlq.rs:443-446`
129-
130-
**Current State:** Uses hardcoded "default" queue name when adding jobs to DLQ
131-
132-
**Issue:** `Job` struct from graphile_worker doesn't expose queue_name field
133-
134-
**Code:**
135-
```rust
136-
// Note: Job doesn't have queue_name field, so we'll use "default" for now
137-
// In production, this would need to be tracked elsewhere or passed as a
138-
// parameter
139-
let queue_name = "default";
140-
```
141-
142-
**Affects:** `add_to_dlq()` method
143-
144-
**Possible Solutions:**
145-
- Add queue_name parameter to `add_to_dlq()`
146-
- Track queue_name in application state
147-
- Query GraphileWorker schema to get queue info
148-
- Check if newer graphile_worker versions expose this field
149-
150-
### 9. DLQ pagination optimization
127+
### 8. DLQ pagination optimization
151128
**Location:** `src/client/dlq.rs:238`
152129

153130
**Current State:** Uses separate COUNT query for pagination, could be more efficient
@@ -231,8 +208,8 @@ pub(crate) struct JobHandlerConfig {
231208
- All feature-gated, so not blocking main library use
232209

233210
**Low Priority (workarounds exist):**
234-
- 2 known limitations with acceptable workarounds
211+
- 1 known limitation with acceptable workaround
235212
- 2 documentation TODOs
236213
- 1 dead code cleanup
237214

238-
**Total Items:** 12
215+
**Total Items:** 11

src/client/dlq.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -465,10 +465,20 @@ impl BackfillClient {
465465
) -> Result<DlqJob, BackfillError> {
466466
let start = std::time::Instant::now();
467467

468-
// Note: Job doesn't have queue_name field, so we'll use "default" for now
469-
// In production, this would need to be tracked elsewhere or passed as a
470-
// parameter
471-
let queue_name = "default";
468+
// Query queue_name from job_queue_id
469+
let queue_name = if let Some(queue_id) = original_job.job_queue_id() {
470+
let query = format!(
471+
"SELECT queue_name FROM {}._private_job_queues WHERE id = $1",
472+
self.schema
473+
);
474+
sqlx::query_scalar::<_, String>(&query)
475+
.bind(queue_id)
476+
.fetch_optional(&self.pool)
477+
.await?
478+
.unwrap_or_else(|| "default".to_string())
479+
} else {
480+
"default".to_string()
481+
};
472482

473483
let insert_query = format!(
474484
r#"

tests/dlq_tests.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,41 @@ async fn test_process_failed_jobs_preserves_payload() {
255255
assert_eq!(recovered.number, 12345);
256256
}
257257

258+
#[tokio::test]
259+
async fn test_add_to_dlq_preserves_queue_name() {
260+
let client = setup_test_client("dlq_queue_name").await;
261+
client.init_dlq().await.expect("DLQ init should work");
262+
263+
let test_job = TestJob {
264+
message: "queue name test".to_string(),
265+
number: 999,
266+
};
267+
268+
// Enqueue to "fast" queue
269+
let outcome = client
270+
.enqueue(
271+
"test_job",
272+
&test_job,
273+
JobSpec {
274+
queue: Queue::Fast,
275+
..Default::default()
276+
},
277+
)
278+
.await
279+
.expect("should enqueue");
280+
281+
let job = outcome.unwrap();
282+
283+
// Add to DLQ
284+
let dlq_job = client
285+
.add_to_dlq(&job, "Test failure", None)
286+
.await
287+
.expect("should add to DLQ");
288+
289+
// Verify queue_name was preserved
290+
assert_eq!(dlq_job.queue_name, "fast");
291+
}
292+
258293
#[tokio::test]
259294
async fn test_dlq_list_with_filtering() {
260295
let client = setup_test_client("dlq_list_filter").await;

0 commit comments

Comments
 (0)