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.

manager.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package queue
  4. import (
  5. "context"
  6. "sync"
  7. "time"
  8. "code.gitea.io/gitea/modules/log"
  9. "code.gitea.io/gitea/modules/setting"
  10. )
  11. // Manager is a manager for the queues created by "CreateXxxQueue" functions, these queues are called "managed queues".
  12. type Manager struct {
  13. mu sync.Mutex
  14. qidCounter int64
  15. Queues map[int64]ManagedWorkerPoolQueue
  16. }
  17. type ManagedWorkerPoolQueue interface {
  18. GetName() string
  19. GetType() string
  20. GetItemTypeName() string
  21. GetWorkerNumber() int
  22. GetWorkerActiveNumber() int
  23. GetWorkerMaxNumber() int
  24. SetWorkerMaxNumber(num int)
  25. GetQueueItemNumber() int
  26. // FlushWithContext tries to make the handler process all items in the queue synchronously.
  27. // It is for testing purpose only. It's not designed to be used in a cluster.
  28. FlushWithContext(ctx context.Context, timeout time.Duration) error
  29. // RemoveAllItems removes all items in the base queue (on-the-fly items are not affected)
  30. RemoveAllItems(ctx context.Context) error
  31. }
  32. var manager *Manager
  33. func init() {
  34. manager = &Manager{
  35. Queues: make(map[int64]ManagedWorkerPoolQueue),
  36. }
  37. }
  38. func GetManager() *Manager {
  39. return manager
  40. }
  41. func (m *Manager) AddManagedQueue(managed ManagedWorkerPoolQueue) {
  42. m.mu.Lock()
  43. defer m.mu.Unlock()
  44. m.qidCounter++
  45. m.Queues[m.qidCounter] = managed
  46. }
  47. func (m *Manager) GetManagedQueue(qid int64) ManagedWorkerPoolQueue {
  48. m.mu.Lock()
  49. defer m.mu.Unlock()
  50. return m.Queues[qid]
  51. }
  52. func (m *Manager) ManagedQueues() map[int64]ManagedWorkerPoolQueue {
  53. m.mu.Lock()
  54. defer m.mu.Unlock()
  55. queues := make(map[int64]ManagedWorkerPoolQueue, len(m.Queues))
  56. for k, v := range m.Queues {
  57. queues[k] = v
  58. }
  59. return queues
  60. }
  61. // FlushAll tries to make all managed queues process all items synchronously, until timeout or the queue is empty.
  62. // It is for testing purpose only. It's not designed to be used in a cluster.
  63. func (m *Manager) FlushAll(ctx context.Context, timeout time.Duration) error {
  64. var finalErr error
  65. qs := m.ManagedQueues()
  66. for _, q := range qs {
  67. if err := q.FlushWithContext(ctx, timeout); err != nil {
  68. finalErr = err // TODO: in Go 1.20: errors.Join
  69. }
  70. }
  71. return finalErr
  72. }
  73. // CreateSimpleQueue creates a simple queue from global setting config provider by name
  74. func CreateSimpleQueue[T any](ctx context.Context, name string, handler HandlerFuncT[T]) *WorkerPoolQueue[T] {
  75. return createWorkerPoolQueue(ctx, name, setting.CfgProvider, handler, false)
  76. }
  77. // CreateUniqueQueue creates a unique queue from global setting config provider by name
  78. func CreateUniqueQueue[T any](ctx context.Context, name string, handler HandlerFuncT[T]) *WorkerPoolQueue[T] {
  79. return createWorkerPoolQueue(ctx, name, setting.CfgProvider, handler, true)
  80. }
  81. func createWorkerPoolQueue[T any](ctx context.Context, name string, cfgProvider setting.ConfigProvider, handler HandlerFuncT[T], unique bool) *WorkerPoolQueue[T] {
  82. queueSetting, err := setting.GetQueueSettings(cfgProvider, name)
  83. if err != nil {
  84. log.Error("Failed to get queue settings for %q: %v", name, err)
  85. return nil
  86. }
  87. w, err := NewWorkerPoolQueueWithContext(ctx, name, queueSetting, handler, unique)
  88. if err != nil {
  89. log.Error("Failed to create queue %q: %v", name, err)
  90. return nil
  91. }
  92. GetManager().AddManagedQueue(w)
  93. return w
  94. }