{"record":{"id":"7f0dcfbbf6b51c17","repo":"hibiken/asynq","slug":"asynq-no-scheduler-entry-found","errorCode":null,"errorMessage":"asynq: no scheduler entry found","messagePattern":"asynq: no scheduler entry found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scheduler.go","lineNumber":239,"sourceCode":"\t}\n\tcronID, err := s.cron.AddJob(cronspec, job)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\ts.mu.Lock()\n\ts.idmap[job.id.String()] = cronID\n\ts.mu.Unlock()\n\treturn job.id.String(), nil\n}\n\n// Unregister removes a registered entry by entry ID.\n// Unregister returns a non-nil error if no entries were found for the given entryID.\nfunc (s *Scheduler) Unregister(entryID string) error {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\tcronID, ok := s.idmap[entryID]\n\tif !ok {\n\t\treturn fmt.Errorf(\"asynq: no scheduler entry found\")\n\t}\n\tdelete(s.idmap, entryID)\n\ts.cron.Remove(cronID)\n\treturn nil\n}\n\n// Run starts the scheduler until an os signal to exit the program is received.\n// It returns an error if scheduler is already running or has been shutdown.\nfunc (s *Scheduler) Run() error {\n\tif err := s.Start(); err != nil {\n\t\treturn err\n\t}\n\ts.waitForSignals()\n\ts.Shutdown()\n\treturn nil\n}\n\n// Start starts the scheduler.","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/hibiken/asynq/blob/d135f1439bee74e989b7f9b41ecd542cc87f024a/scheduler.go#L221-L257","documentation":"Scheduler.Unregister returns this error when no entry with the given entryID exists in the scheduler's idmap. Unregister only removes known entries; deleting an unknown ID is treated as a caller mistake and reported instead of being silently ignored.","triggerScenarios":"Calling s.Unregister(id) for an ID that was never Register-ed, was already unregistered, or whose registration failed; ID mismatch due to formatting (whitespace, case).","commonSituations":"Unregistering tasks from a config store when the entry was deleted elsewhere first; duplicate cleanup paths unregistering the same ID twice; restart wiping in-memory entries while callers still hold old IDs.","solutions":["Only call Unregister for IDs previously returned/accepted by Register","Ignore or special-case this error if best-effort removal is intended (idempotent delete)","Track registered IDs in your own set and check membership before Unregister"],"exampleFix":"// before\nif err := s.Unregister(id); err != nil { return err }\n// after\nif err := s.Unregister(id); err != nil && !strings.Contains(err.Error(), \"no scheduler entry found\") {\n    return err\n}","handlingStrategy":"type-guard","validationCode":"if !registered[id] {\n    return nil // nothing to unregister\n}","typeGuard":"func canUnregister(s *asynq.Scheduler, id string) bool {\n    return s != nil && registeredEntries[id]\n}","tryCatchPattern":"if err := s.Unregister(id); err != nil {\n    if strings.Contains(err.Error(), \"no scheduler entry found\") {\n        return nil // already gone; treat as idempotent success\n    }\n    return err\n}","preventionTips":["Keep your own set of successfully Register-ed IDs and only Unregister those","Make removal paths idempotent by tolerating the not-found error","Use a single owner for registration/unregistration to avoid double deletes"],"tags":["asynq","scheduler","not-found"],"backgroundTag":"resource-not-found","analyzedSha":"d135f1439bee74e989b7f9b41ecd542cc87f024a","analyzedAt":"2026-09-07T19:02:34.660Z","contentChangedAt":"2026-09-07T19:02:34.660Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}