refresh_feeds.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package cli // import "miniflux.app/v2/internal/cli"
  4. import (
  5. "log/slog"
  6. "sync"
  7. "time"
  8. "miniflux.app/v2/internal/config"
  9. "miniflux.app/v2/internal/model"
  10. feedHandler "miniflux.app/v2/internal/reader/handler"
  11. "miniflux.app/v2/internal/storage"
  12. )
  13. func refreshFeeds(store *storage.Storage) {
  14. var wg sync.WaitGroup
  15. startTime := time.Now()
  16. jobs, err := store.NewBatch(config.Opts.BatchSize())
  17. if err != nil {
  18. slog.Error("Unable to fetch jobs from database", slog.Any("error", err))
  19. }
  20. nbJobs := len(jobs)
  21. slog.Info("Created a batch of feeds",
  22. slog.Int("nb_jobs", nbJobs),
  23. slog.Int("batch_size", config.Opts.BatchSize()),
  24. )
  25. var jobQueue = make(chan model.Job, nbJobs)
  26. slog.Info("Starting a pool of workers",
  27. slog.Int("nb_workers", config.Opts.WorkerPoolSize()),
  28. )
  29. for i := 0; i < config.Opts.WorkerPoolSize(); i++ {
  30. wg.Add(1)
  31. go func(workerID int) {
  32. defer wg.Done()
  33. for job := range jobQueue {
  34. slog.Info("Refreshing feed",
  35. slog.Int64("feed_id", job.FeedID),
  36. slog.Int64("user_id", job.UserID),
  37. slog.Int("worker_id", workerID),
  38. )
  39. if err := feedHandler.RefreshFeed(store, job.UserID, job.FeedID, false); err != nil {
  40. slog.Error("Unable to refresh feed",
  41. slog.Int64("feed_id", job.FeedID),
  42. slog.Int64("user_id", job.UserID),
  43. slog.Any("error", err),
  44. )
  45. }
  46. }
  47. }(i)
  48. }
  49. for _, job := range jobs {
  50. jobQueue <- job
  51. }
  52. close(jobQueue)
  53. wg.Wait()
  54. slog.Info("Refreshed a batch of feeds",
  55. slog.Int("nb_feeds", nbJobs),
  56. slog.String("duration", time.Since(startTime).String()),
  57. )
  58. }