summaryrefslogtreecommitdiffstats
path: root/modules
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
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')
-rw-r--r--modules/queue/helper.go39
-rw-r--r--modules/queue/setting.go25
-rw-r--r--modules/setting/queue.go10
3 files changed, 46 insertions, 28 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 {
diff --git a/modules/setting/queue.go b/modules/setting/queue.go
index fc43978610..2365604562 100644
--- a/modules/setting/queue.go
+++ b/modules/setting/queue.go
@@ -16,8 +16,9 @@ import (
// QueueSettings represent the settings for a queue from the ini
type QueueSettings struct {
+ Name string
DataDir string
- Length int
+ QueueLength int `ini:"LENGTH"`
BatchLength int
ConnectionString string
Type string
@@ -44,6 +45,8 @@ var Queue = QueueSettings{}
func GetQueueSettings(name string) QueueSettings {
q := QueueSettings{}
sec := Cfg.Section("queue." + name)
+ q.Name = name
+
// DataDir is not directly inheritable
q.DataDir = filepath.Join(Queue.DataDir, name)
// QueueName is not directly inheritable either
@@ -65,8 +68,9 @@ func GetQueueSettings(name string) QueueSettings {
q.DataDir = filepath.Join(AppDataPath, q.DataDir)
}
_, _ = sec.NewKey("DATADIR", q.DataDir)
+
// The rest are...
- q.Length = sec.Key("LENGTH").MustInt(Queue.Length)
+ q.QueueLength = sec.Key("LENGTH").MustInt(Queue.QueueLength)
q.BatchLength = sec.Key("BATCH_LENGTH").MustInt(Queue.BatchLength)
q.ConnectionString = sec.Key("CONN_STR").MustString(Queue.ConnectionString)
q.Type = sec.Key("TYPE").MustString(Queue.Type)
@@ -91,7 +95,7 @@ func NewQueueService() {
if !filepath.IsAbs(Queue.DataDir) {
Queue.DataDir = filepath.Join(AppDataPath, Queue.DataDir)
}
- Queue.Length = sec.Key("LENGTH").MustInt(20)
+ Queue.QueueLength = sec.Key("LENGTH").MustInt(20)
Queue.BatchLength = sec.Key("BATCH_LENGTH").MustInt(20)
Queue.ConnectionString = sec.Key("CONN_STR").MustString("")
Queue.Type = sec.Key("TYPE").MustString("persistable-channel")