summaryrefslogtreecommitdiffstats
path: root/modules/queue
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2020-10-15 22:40:03 +0100
committerGitHub <noreply@github.com>2020-10-15 17:40:03 -0400
commitc8f7a6b7742cf42057b6d220ef93ff7f939bb94f (patch)
treea84d4a1758c70d297ae4576d1cd6750a5ac59e89 /modules/queue
parente374bb7e2dede03eeacaec376c8fbb3c05d07a25 (diff)
downloadgitea-c8f7a6b7742cf42057b6d220ef93ff7f939bb94f.tar.gz
gitea-c8f7a6b7742cf42057b6d220ef93ff7f939bb94f.zip
Slightly simplify the queue settings code to help reduce the risk of problems (#12976)
Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'modules/queue')
-rw-r--r--modules/queue/helper.go39
-rw-r--r--modules/queue/setting.go25
2 files changed, 39 insertions, 25 deletions
diff --git a/modules/queue/helper.go b/modules/queue/helper.go
index e6fb1b94f9..751e0cfadc 100644
--- a/modules/queue/helper.go
+++ b/modules/queue/helper.go
@@ -9,25 +9,56 @@ import (
"reflect"
)
+// Mappable represents an interface that can MapTo another interface
+type Mappable interface {
+ MapTo(v interface{}) error
+}
+
// toConfig will attempt to convert a given configuration cfg into the provided exemplar type.
//
// It will tolerate the cfg being passed as a []byte or string of a json representation of the
// exemplar or the correct type of the exemplar itself
func toConfig(exemplar, cfg interface{}) (interface{}, error) {
+
+ // First of all check if we've got the same type as the exemplar - if so it's all fine.
if reflect.TypeOf(cfg).AssignableTo(reflect.TypeOf(exemplar)) {
return cfg, nil
}
+ // Now if not - does it provide a MapTo function we can try?
+ if mappable, ok := cfg.(Mappable); ok {
+ newVal := reflect.New(reflect.TypeOf(exemplar))
+ if err := mappable.MapTo(newVal.Interface()); err == nil {
+ return newVal.Elem().Interface(), nil
+ }
+ // MapTo has failed us ... let's try the json route ...
+ }
+
+ // OK we've been passed a byte array right?
configBytes, ok := cfg.([]byte)
if !ok {
- configStr, ok := cfg.(string)
- if !ok {
- return nil, ErrInvalidConfiguration{cfg: cfg}
- }
+ // oh ... it's a string then?
+ var configStr string
+
+ configStr, ok = cfg.(string)
configBytes = []byte(configStr)
}
+ if !ok {
+ // hmm ... can we marshal it to json?
+ var err error
+
+ configBytes, err = json.Marshal(cfg)
+ ok = (err == nil)
+ }
+ if !ok {
+ // no ... we've tried hard enough at this point - throw an error!
+ return nil, ErrInvalidConfiguration{cfg: cfg}
+ }
+
+ // OK unmarshal the byte array into a new copy of the exemplar
newVal := reflect.New(reflect.TypeOf(exemplar))
if err := json.Unmarshal(configBytes, newVal.Interface()); err != nil {
+ // If we can't unmarshal it then return an error!
return nil, ErrInvalidConfiguration{cfg: cfg, err: err}
}
return newVal.Elem().Interface(), nil
diff --git a/modules/queue/setting.go b/modules/queue/setting.go
index 35c33aeac2..9ee1af8c7d 100644
--- a/modules/queue/setting.go
+++ b/modules/queue/setting.go
@@ -27,27 +27,10 @@ func validType(t string) (Type, error) {
func getQueueSettings(name string) (setting.QueueSettings, []byte) {
q := setting.GetQueueSettings(name)
- opts := make(map[string]interface{})
- opts["Name"] = name
- opts["QueueLength"] = q.Length
- opts["BatchLength"] = q.BatchLength
- opts["DataDir"] = q.DataDir
- opts["Addresses"] = q.Addresses
- opts["Network"] = q.Network
- opts["Password"] = q.Password
- opts["DBIndex"] = q.DBIndex
- opts["QueueName"] = q.QueueName
- opts["SetName"] = q.SetName
- opts["Workers"] = q.Workers
- opts["MaxWorkers"] = q.MaxWorkers
- opts["BlockTimeout"] = q.BlockTimeout
- opts["BoostTimeout"] = q.BoostTimeout
- opts["BoostWorkers"] = q.BoostWorkers
- opts["ConnectionString"] = q.ConnectionString
- cfg, err := json.Marshal(opts)
+ cfg, err := json.Marshal(q)
if err != nil {
- log.Error("Unable to marshall generic options: %v Error: %v", opts, err)
+ log.Error("Unable to marshall generic options: %v Error: %v", q, err)
log.Error("Unable to create queue for %s", name, err)
return q, []byte{}
}
@@ -75,7 +58,7 @@ func CreateQueue(name string, handle HandlerFunc, exemplar interface{}) Queue {
Timeout: q.Timeout,
MaxAttempts: q.MaxAttempts,
Config: cfg,
- QueueLength: q.Length,
+ QueueLength: q.QueueLength,
Name: name,
}, exemplar)
}
@@ -114,7 +97,7 @@ func CreateUniqueQueue(name string, handle HandlerFunc, exemplar interface{}) Un
Timeout: q.Timeout,
MaxAttempts: q.MaxAttempts,
Config: cfg,
- QueueLength: q.Length,
+ QueueLength: q.QueueLength,
}, exemplar)
}
if err != nil {