{"record":{"id":"11c896fe8f60d074","repo":"Tencent/WeKnora","slug":"all-feeds-failed-s","errorCode":null,"errorMessage":"all feeds failed: %s","messagePattern":"all feeds failed: (.+?)","errorType":"exception","errorClass":"PartialFetchError","httpStatus":null,"severity":"critical","filePath":"internal/datasource/connector/rss/connector.go","lineNumber":279,"sourceCode":"\t\t\tresolved := c.resolveItem(ctx, cli, feed, item, feedURL, itemID, feedContent)\n\t\t\tnewCursor.FeedItems[feedURL][itemID] = resolved.fingerprint\n\t\t\tnewCursor.FeedSignals[feedURL][itemID] = feedSig\n\n\t\t\tif incremental && prevItems != nil && prevItems[itemID] == resolved.fingerprint {\n\t\t\t\tskipped++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tkept++\n\t\t\tout = append(out, resolved.item)\n\t\t}\n\n\t\tlogger.Infof(ctx, \"[RSS] feed %s: items=%d fetched=%d skipped=%d\",\n\t\t\tfeedURL, len(feed.Items), kept, skipped)\n\t}\n\n\tif len(feedErrors) > 0 {\n\t\tif len(out) == 0 && len(feedErrors) == len(feedURLs) {\n\t\t\treturn nil, newCursor, fmt.Errorf(\"all feeds failed: %s\", strings.Join(feedErrors, \"; \"))\n\t\t}\n\t\treturn out, newCursor, &datasource.PartialFetchError{Details: feedErrors}\n\t}\n\n\treturn out, newCursor, nil\n}\n\ntype resolvedFeedItem struct {\n\titem        types.FetchedItem\n\tfingerprint string\n}\n\n// resolveItem assembles a FetchedItem for a single feed entry, resolving the\n// best available content (full-text article > feed content) and converting it\n// to Markdown.\nfunc (c *Connector) resolveItem(\n\tctx context.Context,\n\tcli *client,","sourceCodeStart":261,"sourceCodeEnd":297,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/datasource/connector/rss/connector.go#L261-L297","documentation":"Returned by the connector's walk when every configured feed failed to fetch or parse during a sync AND no items were produced. If only some feeds failed, the walk returns a PartialFetchError with the per-feed details instead; this hard error fires only when the entire feed list failed and output is empty, indicating a systemic problem rather than individual bad feeds.","triggerScenarios":"All feed URLs in the config fail on the same walk: the network egress is down, a shared proxy/DNS is broken, all feeds share one host that is down, or configured auth headers expired and every token-gated feed now returns 401. It is joined with per-feed error strings separated by \"; \".","commonSituations":"Corporate proxy or firewall change blocking egress from the connector host; certificate expiry on a single host serving all feeds; synchronized rate-limit bans after too-aggressive polling; an infrastructure outage affecting all monitored blogs at once.","solutions":["Inspect the joined per-feed messages — if every error is identical (e.g. all DNS failures), fix the shared root cause (DNS, proxy, egress rules) rather than individual feeds.","Retry the sync after restoring connectivity; this error is usually transient infrastructure-wide.","If auth headers expired across all feeds, update the datasource config credentials.","Reduce polling frequency or add jitter if rate limiting caused a synchronized ban across feeds."],"exampleFix":"// before\nres, cur, err := connector.Walk(ctx, cfg, oldCursor)\nif err != nil {\n    return err\n}\n// after\nres, cur, err := connector.Walk(ctx, cfg, oldCursor)\nvar pfe *datasource.PartialFetchError\nif errors.As(err, &pfe) {\n    log.Warnf(\"partial sync: %v\", err) // keep partial results\n}\nif err != nil && !errors.As(err, &pfe) {\n    scheduleRetryWithBackoff(err)\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"out, cursor, err := connector.Walk(ctx, cfg, prevCursor)\nvar pfe *datasource.PartialFetchError\nswitch {\ncase err == nil:\n    commit(out, cursor)\ncase errors.As(err, &pfe):\n    log.Warnf(\"partial sync, some feeds failed: %v\", err)\n    commit(out, cursor) // keep what we got\ndefault:\n    log.Errorf(\"full sync failure: %v\", err)\n    scheduleRetryWithBackoff(5*time.Minute)\n}","preventionTips":["Distinguish PartialFetchError from total failure and keep partial results whenever possible.","Monitor egress connectivity (DNS, proxy) from the connector host — total failures are usually environmental.","Rotate feed credentials proactively so all feeds don't 401 at once.","Add jitter and backoff to polling so rate-limit bans don't hit every feed simultaneously."],"tags":["network","sync","rss","availability"],"backgroundTag":"http-request-failed","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}