{"record":{"id":"0cbdcd059f305c82","repo":"crowdsecurity/crowdsec","slug":"expired-decisions-w","errorCode":null,"errorMessage":"expired decisions: %w","messagePattern":"expired decisions: %w","errorType":"exception","errorClass":"QueryFail","httpStatus":null,"severity":"error","filePath":"pkg/database/decisions.go","lineNumber":97,"sourceCode":"\t\t\tdecision.UntilLT(now),\n\t\t)\n\t// Allow a bouncer to ask for non-deduplicated results\n\tif v, ok := filter[\"dedup\"]; !ok || v[0] != \"false\" {\n\t\tquery = query.Where(longestDecisionForScopeTypeValue)\n\t}\n\n\tquery, err := applyDecisionFilter(query, filter)\n\tif err != nil {\n\t\tc.Log.Warningf(\"QueryExpiredDecisionsWithFilters : %s\", err)\n\t\treturn []*ent.Decision{}, fmt.Errorf(\"get expired decisions with filters: %w\", QueryFail)\n\t}\n\n\tquery = query.Order(ent.Asc(decision.FieldID))\n\n\tdata, err := query.All(ctx)\n\tif err != nil {\n\t\tc.Log.Warningf(\"QueryExpiredDecisionsWithFilters : %s\", err)\n\t\treturn []*ent.Decision{}, fmt.Errorf(\"expired decisions: %w\", QueryFail)\n\t}\n\n\treturn data, nil\n}\n\nfunc (c *Client) QueryDecisionCountByScenario(ctx context.Context) ([]*DecisionsByScenario, error) {\n\tquery := c.Ent.Decision.Query().Where(\n\t\tdecision.UntilGT(time.Now().UTC()),\n\t)\n\n\tquery, err := applyDecisionFilter(query, make(map[string][]string))\n\tif err != nil {\n\t\tc.Log.Warningf(\"QueryDecisionCountByScenario : %s\", err)\n\t\treturn nil, fmt.Errorf(\"count all decisions with filters: %w\", QueryFail)\n\t}\n\n\tvar r []*DecisionsByScenario\n","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/database/decisions.go#L79-L115","documentation":"Returned by QueryExpiredDecisionsWithFilters when the final .All(ctx) SELECT of expired decisions fails. Wraps QueryFail (\"unable to query\"); the raw DB error is logged as 'QueryExpiredDecisionsWithFilters : <err>' right before return.","triggerScenarios":"Database-level failure while reading expired decisions: connection lost, SQLite lock/corruption, schema mismatch after upgrade, or storage backend outage.","commonSituations":"CrowdSec upgraded but the decisions table lacks a column expected by the new ent schema; DB disk full; concurrent vacuum/backup holds the SQLite write lock.","solutions":["Inspect CrowdSec logs for the driver error above the warning line","Verify schema is up to date after upgrades (`cscli db migrate` or fresh container start performs migrations)","Free disk space / check the DB server health if MySQL/Postgres reports I/O errors","For SQLite contention, move to a MySQL/Postgres backend or stagger backups"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"data, err := client.QueryExpiredDecisionsWithFilters(ctx, now, filter)\nif err != nil {\n    // transient DB failure likely; retry with backoff\n    return backoff.Retry(func() error { _, err = client.QueryExpiredDecisionsWithFilters(ctx, now, filter); return err }, expBackoff)\n}","preventionTips":["Alert on DB disk usage and connection errors","Run migrations after every CrowdSec upgrade","Prefer a client/server DB to avoid SQLite lock contention"],"tags":["database","crowdsec","ent","query"],"backgroundTag":"database-query-failed","analyzedSha":"909b5157986a2b2c2163300fdaef5ed01289f7d2","analyzedAt":"2026-09-06T12:27:26.012Z","contentChangedAt":"2026-09-06T12:27:26.012Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}