upstream_availability.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package cron
  2. import (
  3. "time"
  4. "github.com/0xJacky/Nginx-UI/internal/upstream"
  5. "github.com/go-co-op/gocron/v2"
  6. "github.com/uozi-tech/cosy/logger"
  7. )
  8. // upstreamAvailabilityJob holds the job instance
  9. var upstreamAvailabilityJob gocron.Job
  10. // setupUpstreamAvailabilityJob initializes the upstream availability testing job
  11. func setupUpstreamAvailabilityJob(scheduler gocron.Scheduler) (gocron.Job, error) {
  12. job, err := scheduler.NewJob(
  13. gocron.DurationJob(30*time.Second),
  14. gocron.NewTask(executeUpstreamAvailabilityTest),
  15. gocron.WithSingletonMode(gocron.LimitModeWait),
  16. gocron.WithName("upstream_availability_test"),
  17. gocron.JobOption(gocron.WithStartImmediately()),
  18. )
  19. if err != nil {
  20. logger.Errorf("UpstreamAvailability Job: Err: %v\n", err)
  21. return nil, err
  22. }
  23. upstreamAvailabilityJob = job
  24. logger.Info("Upstream availability testing job started with 30s interval")
  25. return job, nil
  26. }
  27. // executeUpstreamAvailabilityTest performs the upstream availability test
  28. func executeUpstreamAvailabilityTest() {
  29. service := upstream.GetUpstreamService()
  30. targetCount := service.GetTargetCount()
  31. if targetCount == 0 {
  32. logger.Debug("No upstream targets to test")
  33. return
  34. }
  35. start := time.Now()
  36. logger.Debug("Starting scheduled upstream availability test for", targetCount, "targets")
  37. service.PerformAvailabilityTest()
  38. duration := time.Since(start)
  39. logger.Debug("Upstream availability test completed in", duration)
  40. }
  41. // RestartUpstreamAvailabilityJob restarts the upstream availability job
  42. func RestartUpstreamAvailabilityJob() error {
  43. logger.Info("Restarting upstream availability job...")
  44. // Remove existing job if it exists
  45. if upstreamAvailabilityJob != nil {
  46. err := s.RemoveJob(upstreamAvailabilityJob.ID())
  47. if err != nil {
  48. logger.Error("Failed to remove existing upstream availability job:", err)
  49. }
  50. upstreamAvailabilityJob = nil
  51. }
  52. // Create new job
  53. job, err := setupUpstreamAvailabilityJob(s)
  54. if err != nil {
  55. return err
  56. }
  57. upstreamAvailabilityJob = job
  58. logger.Info("Upstream availability job restarted successfully")
  59. return nil
  60. }