You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

135 lines
3.5 KiB

  1. from __future__ import unicode_literals, print_function
  2. import frappe.utils
  3. from collections import defaultdict
  4. from rq import Worker, Connection
  5. from frappe.utils.background_jobs import get_redis_conn, get_queue, get_queue_list
  6. from frappe.utils.scheduler import is_scheduler_disabled
  7. def get_workers():
  8. with Connection(get_redis_conn()):
  9. workers = Worker.all()
  10. return workers
  11. def purge_pending_jobs(event=None, site=None, queue=None):
  12. """
  13. Purge tasks of the event event type. Passing 'all' will not purge all
  14. events but of the all event type, ie. the ones that are enqueued every five
  15. mintues and would any leave daily, hourly and weekly tasks
  16. """
  17. purged_task_count = 0
  18. for queue in get_queue_list(queue):
  19. q = get_queue(queue)
  20. for job in q.jobs:
  21. if (site and event):
  22. if job.kwargs['site'] == site and job.kwargs['event'] == event:
  23. job.delete()
  24. purged_task_count+=1
  25. elif site:
  26. if job.kwargs['site'] == site:
  27. job.delete()
  28. purged_task_count+=1
  29. elif event:
  30. if job.kwargs['event'] == event:
  31. job.delete()
  32. purged_task_count+=1
  33. else:
  34. purged_task_count += q.count
  35. q.empty()
  36. return purged_task_count
  37. def get_jobs_by_queue(site=None):
  38. jobs_per_queue = defaultdict(list)
  39. job_count = consolidated_methods = {}
  40. for queue in get_queue_list():
  41. q = get_queue(queue)
  42. for job in q.jobs:
  43. if not site:
  44. jobs_per_queue[queue].append(job.kwargs.get('method') or job.description)
  45. elif job.kwargs['site'] == site:
  46. jobs_per_queue[queue].append(job.kwargs.get('method') or job.description)
  47. consolidated_methods = {}
  48. for method in jobs_per_queue[queue]:
  49. if method not in consolidated_methods.keys():
  50. consolidated_methods[method] = 1
  51. else:
  52. consolidated_methods[method] += 1
  53. job_count[queue] = len(jobs_per_queue[queue])
  54. jobs_per_queue[queue] = consolidated_methods
  55. return jobs_per_queue, job_count
  56. def get_pending_jobs(site=None):
  57. jobs_per_queue = defaultdict(list)
  58. for queue in get_queue_list():
  59. q = get_queue(queue)
  60. for job in q.jobs:
  61. method_kwargs = job.kwargs['kwargs'] if job.kwargs['kwargs'] else ""
  62. if job.kwargs['site'] == site:
  63. jobs_per_queue[queue].append("{0} {1}".
  64. format(job.kwargs['method'], method_kwargs))
  65. return jobs_per_queue
  66. def check_number_of_workers():
  67. return len(get_workers())
  68. def get_running_tasks():
  69. for worker in get_workers():
  70. return worker.get_current_job()
  71. def doctor(site=None):
  72. """
  73. Prints diagnostic information for the scheduler
  74. """
  75. with frappe.init_site(site):
  76. workers_online = check_number_of_workers()
  77. jobs_per_queue, job_count = get_jobs_by_queue(site)
  78. print("-----Checking scheduler status-----")
  79. if site:
  80. sites = [site]
  81. else:
  82. sites = frappe.utils.get_sites()
  83. for s in sites:
  84. frappe.init(s)
  85. frappe.connect()
  86. if is_scheduler_disabled():
  87. print("Scheduler disabled for", s)
  88. frappe.destroy()
  89. # TODO improve this
  90. print("Workers online:", workers_online)
  91. print("-----{0} Jobs-----".format(site))
  92. for queue in get_queue_list():
  93. if jobs_per_queue[queue]:
  94. print("Queue:", queue)
  95. print("Number of Jobs: ", job_count[queue])
  96. print("Methods:")
  97. for method, count in jobs_per_queue[queue].iteritems():
  98. print("{0} : {1}".format(method, count))
  99. print("------------")
  100. return True
  101. def pending_jobs(site=None):
  102. print("-----Pending Jobs-----")
  103. pending_jobs = get_pending_jobs(site)
  104. for queue in get_queue_list():
  105. if(pending_jobs[queue]):
  106. print("-----Queue :{0}-----".format(queue))
  107. print("\n".join(pending_jobs[queue]))