Tencent/WeKnora · error
failed to get FAQ import progress from Redis: %w
Error message
failed to get FAQ import progress from Redis: %w
What it means
GetFAQImportProgress wraps errors from reading the FAQ import progress document in Redis (keyed by taskID), except for redis.Nil which is converted to a NotFoundError. Any other Redis failure (connection refused, timeout, cluster error) is wrapped here, so callers cannot fetch task status.
Source
Thrown at internal/application/service/knowledge_faq_import.go:2771
}
return s.redisClient.Set(ctx, key, data, faqImportProgressTTL).Err()
}
// GetFAQImportProgress retrieves the progress of an FAQ import task
func (s *knowledgeService) GetFAQImportProgress(ctx context.Context, taskID string) (*types.FAQImportProgress, error) {
if s.redisClient == nil {
if v, ok := s.memFAQProgress.Load(taskID); ok {
return v.(*types.FAQImportProgress), nil
}
return nil, werrors.NewNotFoundError("FAQ import task not found")
}
key := getFAQImportProgressKey(taskID)
data, err := s.redisClient.Get(ctx, key).Bytes()
if err != nil {
if errors.Is(err, redis.Nil) {
return nil, werrors.NewNotFoundError("FAQ import task not found")
}
return nil, fmt.Errorf("failed to get FAQ import progress from Redis: %w", err)
}
var progress types.FAQImportProgress
if err := json.Unmarshal(data, &progress); err != nil {
return nil, fmt.Errorf("failed to unmarshal FAQ import progress: %w", err)
}
// If task is completed, enrich with persisted result fields from database
if progress.Status == types.FAQImportStatusCompleted && progress.KnowledgeID != "" {
tenantID := ctx.Value(types.TenantIDContextKey).(uint64)
knowledge, err := s.repo.GetKnowledgeByID(ctx, tenantID, progress.KnowledgeID)
if err == nil && knowledge != nil {
if result, err := knowledge.GetLastFAQImportResult(); err == nil && result != nil {
progress.SuccessCount = result.SuccessCount
progress.FailedCount = result.FailedCount
progress.PartialFailedCount = result.PartialFailedCount
progress.SkippedCount = result.SkippedCount
progress.MergedCount = result.MergedCountView on GitHub (pinned to 988cbb0330)
Solutions
- Check Redis health and connectivity from the service (PING, logs)
- Verify REDIS_URL/password configuration for the environment
- Retry the progress query; transient Redis errors usually clear after failover
- If the task also vanished (redis.Nil -> 404), re-run the import or check task TTL settings
Example fix
// before
data, err := s.redisClient.Get(ctx, key).Bytes()
if err != nil {
if errors.Is(err, redis.Nil) {
return nil, werrors.NewNotFoundError("FAQ import task not found")
}
return nil, fmt.Errorf("failed to get FAQ import progress from Redis: %w", err)
}
// after
data, err := s.redisClient.Get(ctx, key).Bytes()
if err != nil {
if errors.Is(err, redis.Nil) {
return nil, werrors.NewNotFoundError("FAQ import task not found")
}
return nil, fmt.Errorf("failed to get FAQ import progress from Redis (task %s): %w", taskID, err)
} Defensive patterns
Strategy: retry
Validate before calling
// Polling client: check Redis reachability before querying task progress
if err := redisClient.Ping(ctx).Err(); err != nil {
return nil, fmt.Errorf("progress store unavailable: %w", err)
} Try / catch
progress, err := svc.GetFAQImportProgress(ctx, taskID)
if err != nil {
if strings.Contains(err.Error(), "failed to get FAQ import progress from Redis") {
// transient Redis error: retry with backoff, then surface 503
if p, rerr := retryWithBackoff(3, svc.GetFAQImportProgress, ctx, taskID); rerr == nil {
return p, nil
}
return nil, statusServiceUnavailable("progress store temporarily unavailable")
}
if isNotFound(err) {
return nil, statusNotFound("FAQ import task not found")
}
return nil, err
} Prevention
- Configure Redis client retries and sane timeouts for status reads
- Use Redis Sentinel/Cluster with automatic failover for the progress store
- Distinguish redis.Nil (task expired/missing -> 404) from transport errors (503)
- Monitor Redis errors and maxmemory; set progress key TTLs long enough for slow imports
When it happens
Trigger: Client polls GET progress for a task; Redis GET fails due to connection loss, read-only replica, OOM, or timeout. A missing key deliberately returns the NotFoundError instead of this error.
Common situations: Redis restart/failover mid-import; wrong REDIS_URL or auth in env; progress key expired (TTL) would be redis.Nil -> 404, but network errors produce this message; Redis maxmemory evictions breaking reads.
Related errors
- failed to unmarshal FAQ import progress: %w
- WEKNORA_REDIS_NAMESPACE must not contain braces
- WEKNORA_REDIS_NAMESPACE must not contain control characters
- failed to list existing FAQ chunks: %w
- failed to get knowledge: %w
AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02).
Data as JSON: /api/errors/c487e2a70100f3c7.
Report an issue: GitHub.