[BUG] ResultWriter.Write 在任务不再存在时会创建孤立的任务哈希
作者: IceLocke创建于 2026年7月15日更新于 2026年7月16日
标签bug
Create result_writer_test.go under the repo root:
package asynq
import (
"context"
"errors"
"testing"
"time"
"GitHub.com/google/uuid"
"GitHub.com/hibiken/asynq/internal/base"
"GitHub.com/hibiken/asynq/internal/rdb"
)
func TestResultWriterWriteRejectsMissingTask(t *testing.T) {
redisClient := setup(t)
defer redisClient.Close()
const queue = "default"
taskID := uuid.NewString()
if err := redisClient.SAdd(context.Background(), base.AllQueues, queue).Err(); err != nil {
t.Fatalf("failed to register queue: %v", err)
}
writer := &ResultWriter{
id: taskID,
qname: queue,
broker: rdb.NewRDB(redisClient),
ctx: context.Background(),
}
n, err := writer.Write([]byte("result"))
if !errors.Is(err, ErrTaskNotFound) {
t.Errorf("ResultWriter.Write error = %v, want ErrTaskNotFound", err)
}
if n != 0 {
t.Errorf("ResultWriter.Write returned %d, want 0", n)
}
if got := redisClient.Exists(context.Background(), base.TaskKey(queue, taskID)).Val(); got != 0 {
t.Errorf("missing task key exists after failed result write: got %d, want 0", got)
}
inspector := NewInspectorFromRedisClient(redisClient)
if _, err := inspector.GetTaskInfo(queue, taskID); !errors.Is(err, ErrTaskNotFound) {
t.Errorf("Inspector.GetTaskInfo error = %v, want ErrTaskNotFound", err)
}
if err := inspector.DeleteTask(queue, taskID); !errors.Is(err, ErrTaskNotFound) {
t.Errorf("Inspector.DeleteTask error = %v, want ErrTaskNotFound", err)
}
client := NewClientFromRedisClient(redisClient)
if _, err := client.Enqueue(
NewTask("task", nil),
Queue(queue),
TaskID(taskID),
Unique(time.Minute),
); err != nil {
…内容来源: hibiken/asynq