From 0e70bddaa94be67d8b38bcf524dd5b7249deecda Mon Sep 17 00:00:00 2001 From: Kuiba Date: Wed, 21 Jul 2021 15:58:43 +0800 Subject: [PATCH] fix(config): load env and file source order bug (#1220) * fix config load env & file order bug * fix watch issue * return empty as each update can be resolved --- config/config.go | 16 ++++++++++++---- config/env/env_test.go | 2 +- config/reader.go | 8 +++++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/config/config.go b/config/config.go index c6f5677d4..9c1fccb03 100644 --- a/config/config.go +++ b/config/config.go @@ -67,11 +67,15 @@ func (c *config) watch(w Watcher) { kvs, err := w.Next() if err != nil { time.Sleep(time.Second) - c.log.Errorf("Failed to watch next config: %v", err) + c.log.Errorf("failed to watch next config: %v", err) continue } if err := c.reader.Merge(kvs...); err != nil { - c.log.Errorf("Failed to merge next config: %v", err) + c.log.Errorf("failed to merge next config: %v", err) + continue + } + if err := c.reader.Resolve(); err != nil { + c.log.Errorf("failed to resolve next config: %v", err) continue } c.cached.Range(func(key, value interface{}) bool { @@ -95,16 +99,20 @@ func (c *config) Load() error { return err } if err := c.reader.Merge(kvs...); err != nil { - c.log.Errorf("Failed to merge config source: %v", err) + c.log.Errorf("failed to merge config source: %v", err) return err } w, err := src.Watch() if err != nil { - c.log.Errorf("Failed to watch config source: %v", err) + c.log.Errorf("failed to watch config source: %v", err) return err } go c.watch(w) } + if err := c.reader.Resolve(); err != nil { + c.log.Errorf("failed to resolve config source: %v", err) + return err + } return nil } diff --git a/config/env/env_test.go b/config/env/env_test.go index 49d8e1816..db5ec6d5d 100644 --- a/config/env/env_test.go +++ b/config/env/env_test.go @@ -58,8 +58,8 @@ func TestEnvWithPrefix(t *testing.T) { } c := config.New(config.WithSource( - NewSource(prefix1, prefix2), file.NewSource(path), + NewSource(prefix1, prefix2), )) if err := c.Load(); err != nil { diff --git a/config/reader.go b/config/reader.go index 833508b40..f76f6a5f7 100644 --- a/config/reader.go +++ b/config/reader.go @@ -17,6 +17,7 @@ type Reader interface { Merge(...*KeyValue) error Value(string) (Value, bool) Source() ([]byte, error) + Resolve() error } type reader struct { @@ -45,9 +46,6 @@ func (r *reader) Merge(kvs ...*KeyValue) error { return err } } - if err := r.opts.resolver(merged); err != nil { - return err - } r.values = merged return nil } @@ -60,6 +58,10 @@ func (r *reader) Source() ([]byte, error) { return marshalJSON(convertMap(r.values)) } +func (r *reader) Resolve() error { + return r.opts.resolver(r.values) +} + func cloneMap(src map[string]interface{}) (map[string]interface{}, error) { // https://gist.github.com/soroushjp/0ec92102641ddfc3ad5515ca76405f4d var buf bytes.Buffer