scheduler.lua 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. -- SPDX-License-Identifier: AGPL-3.0-or-later
  2. --
  3. -- This script is not a string in scheduler.py, so editors can provide syntax highlighting.
  4. -- The Redis KEY is defined here and not in Python on purpose:
  5. -- only this LUA script can read and update this key to avoid lock and concurrency issues.
  6. local redis_key = 'SearXNG_checker_next_call_ts'
  7. local now = redis.call('TIME')[1]
  8. local start_after_from = ARGV[1]
  9. local start_after_to = ARGV[2]
  10. local every_from = ARGV[3]
  11. local every_to = ARGV[4]
  12. local next_call_ts = redis.call('GET', redis_key)
  13. if (next_call_ts == false or next_call_ts == nil) then
  14. -- the scheduler has never run on this Redis instance, so:
  15. -- 1/ the scheduler does not run now
  16. -- 2/ the next call is a random time between start_after_from and start_after_to
  17. local initial_delay = math.random(start_after_from, start_after_to)
  18. redis.call('SET', redis_key, now + initial_delay)
  19. return { false, initial_delay }
  20. end
  21. -- next_call_ts is defined
  22. -- --> if now is lower than next_call_ts then we don't run the embedded checker
  23. -- --> if now is higher then we update next_call_ts and ask to run the embedded checker now.
  24. local call_now = next_call_ts <= now
  25. if call_now then
  26. -- the checker runs now, define the timestamp of the next call:
  27. -- this is a random delay between every_from and every_to
  28. local periodic_delay = math.random(every_from, every_to)
  29. next_call_ts = redis.call('INCRBY', redis_key, periodic_delay)
  30. end
  31. return { call_now, next_call_ts - now }