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.

setting.go 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package queue
  5. import (
  6. "fmt"
  7. "strings"
  8. "code.gitea.io/gitea/modules/json"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/setting"
  11. )
  12. func validType(t string) (Type, error) {
  13. if len(t) == 0 {
  14. return PersistableChannelQueueType, nil
  15. }
  16. for _, typ := range RegisteredTypes() {
  17. if t == string(typ) {
  18. return typ, nil
  19. }
  20. }
  21. return PersistableChannelQueueType, fmt.Errorf("Unknown queue type: %s defaulting to %s", t, string(PersistableChannelQueueType))
  22. }
  23. func getQueueSettings(name string) (setting.QueueSettings, []byte) {
  24. q := setting.GetQueueSettings(name)
  25. cfg, err := json.Marshal(q)
  26. if err != nil {
  27. log.Error("Unable to marshall generic options: %v Error: %v", q, err)
  28. log.Error("Unable to create queue for %s", name, err)
  29. return q, []byte{}
  30. }
  31. return q, cfg
  32. }
  33. // CreateQueue for name with provided handler and exemplar
  34. func CreateQueue(name string, handle HandlerFunc, exemplar interface{}) Queue {
  35. q, cfg := getQueueSettings(name)
  36. if len(cfg) == 0 {
  37. return nil
  38. }
  39. typ, err := validType(q.Type)
  40. if err != nil {
  41. log.Error("Invalid type %s provided for queue named %s defaulting to %s", q.Type, name, string(typ))
  42. }
  43. returnable, err := NewQueue(typ, handle, cfg, exemplar)
  44. if q.WrapIfNecessary && err != nil {
  45. log.Warn("Unable to create queue for %s: %v", name, err)
  46. log.Warn("Attempting to create wrapped queue")
  47. returnable, err = NewQueue(WrappedQueueType, handle, WrappedQueueConfiguration{
  48. Underlying: typ,
  49. Timeout: q.Timeout,
  50. MaxAttempts: q.MaxAttempts,
  51. Config: cfg,
  52. QueueLength: q.QueueLength,
  53. Name: name,
  54. }, exemplar)
  55. }
  56. if err != nil {
  57. log.Error("Unable to create queue for %s: %v", name, err)
  58. return nil
  59. }
  60. return returnable
  61. }
  62. // CreateUniqueQueue for name with provided handler and exemplar
  63. func CreateUniqueQueue(name string, handle HandlerFunc, exemplar interface{}) UniqueQueue {
  64. q, cfg := getQueueSettings(name)
  65. if len(cfg) == 0 {
  66. return nil
  67. }
  68. if len(q.Type) > 0 && q.Type != "dummy" && q.Type != "immediate" && !strings.HasPrefix(q.Type, "unique-") {
  69. q.Type = "unique-" + q.Type
  70. }
  71. typ, err := validType(q.Type)
  72. if err != nil || typ == PersistableChannelQueueType {
  73. typ = PersistableChannelUniqueQueueType
  74. if err != nil {
  75. log.Error("Invalid type %s provided for queue named %s defaulting to %s", q.Type, name, string(typ))
  76. }
  77. }
  78. returnable, err := NewQueue(typ, handle, cfg, exemplar)
  79. if q.WrapIfNecessary && err != nil {
  80. log.Warn("Unable to create unique queue for %s: %v", name, err)
  81. log.Warn("Attempting to create wrapped queue")
  82. returnable, err = NewQueue(WrappedUniqueQueueType, handle, WrappedUniqueQueueConfiguration{
  83. Underlying: typ,
  84. Timeout: q.Timeout,
  85. MaxAttempts: q.MaxAttempts,
  86. Config: cfg,
  87. QueueLength: q.QueueLength,
  88. }, exemplar)
  89. }
  90. if err != nil {
  91. log.Error("Unable to create unique queue for %s: %v", name, err)
  92. return nil
  93. }
  94. return returnable.(UniqueQueue)
  95. }