Tencent/WeKnora · critical · PartialFetchError

all feeds failed: %s

Error message

all feeds failed: %s

What it means

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.

Source

Thrown at internal/datasource/connector/rss/connector.go:279

			resolved := c.resolveItem(ctx, cli, feed, item, feedURL, itemID, feedContent)
			newCursor.FeedItems[feedURL][itemID] = resolved.fingerprint
			newCursor.FeedSignals[feedURL][itemID] = feedSig

			if incremental && prevItems != nil && prevItems[itemID] == resolved.fingerprint {
				skipped++
				continue
			}
			kept++
			out = append(out, resolved.item)
		}

		logger.Infof(ctx, "[RSS] feed %s: items=%d fetched=%d skipped=%d",
			feedURL, len(feed.Items), kept, skipped)
	}

	if len(feedErrors) > 0 {
		if len(out) == 0 && len(feedErrors) == len(feedURLs) {
			return nil, newCursor, fmt.Errorf("all feeds failed: %s", strings.Join(feedErrors, "; "))
		}
		return out, newCursor, &datasource.PartialFetchError{Details: feedErrors}
	}

	return out, newCursor, nil
}

type resolvedFeedItem struct {
	item        types.FetchedItem
	fingerprint string
}

// resolveItem assembles a FetchedItem for a single feed entry, resolving the
// best available content (full-text article > feed content) and converting it
// to Markdown.
func (c *Connector) resolveItem(
	ctx context.Context,
	cli *client,

View on GitHub (pinned to 988cbb0330)

Solutions

  1. 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.
  2. Retry the sync after restoring connectivity; this error is usually transient infrastructure-wide.
  3. If auth headers expired across all feeds, update the datasource config credentials.
  4. Reduce polling frequency or add jitter if rate limiting caused a synchronized ban across feeds.

Example fix

// before
res, cur, err := connector.Walk(ctx, cfg, oldCursor)
if err != nil {
    return err
}
// after
res, cur, err := connector.Walk(ctx, cfg, oldCursor)
var pfe *datasource.PartialFetchError
if errors.As(err, &pfe) {
    log.Warnf("partial sync: %v", err) // keep partial results
}
if err != nil && !errors.As(err, &pfe) {
    scheduleRetryWithBackoff(err)
}
Defensive patterns

Strategy: try-catch

Try / catch

out, cursor, err := connector.Walk(ctx, cfg, prevCursor)
var pfe *datasource.PartialFetchError
switch {
case err == nil:
    commit(out, cursor)
case errors.As(err, &pfe):
    log.Warnf("partial sync, some feeds failed: %v", err)
    commit(out, cursor) // keep what we got
default:
    log.Errorf("full sync failure: %v", err)
    scheduleRetryWithBackoff(5*time.Minute)
}

Prevention

When it happens

Trigger: 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 "; ".

Common situations: 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.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/11c896fe8f60d074. Report an issue: GitHub.