Skip to content

Commit 4c659b3

Browse files
authored
修改死锁bug以及增加WriteTo接口 (#138)
1. 修改Set方法的死锁问题 2. 增加WriteTo方法,获取所有配置项
1 parent c7ddc0e commit 4c659b3

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

archaius.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package archaius
55
import (
66
"errors"
77
"fmt"
8+
"io"
89

910
filesource "github.com/go-chassis/go-archaius/source/file"
1011

@@ -183,6 +184,11 @@ func UnmarshalConfig(obj interface{}) error {
183184
return manager.Unmarshal(obj)
184185
}
185186

187+
// WriteTo write the config to writer by yaml
188+
func WriteTo(w io.Writer) error {
189+
return manager.Marshal(w)
190+
}
191+
186192
// GetBool is gives the key value in the form of bool
187193
func GetBool(key string, defaultValue bool) bool {
188194
b, err := GetValue(key).ToBool()

archaius_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package archaius_test
22

33
import (
4+
"bytes"
45
"fmt"
56
"io"
67
"os"
@@ -227,6 +228,51 @@ infos_ptr:
227228
assert.Equal(t, "123", p.MD["name"])
228229
})
229230
}
231+
232+
func TestMarshalConfig(t *testing.T) {
233+
b := []byte(`
234+
info:
235+
address: a
236+
metadata_str:
237+
key01: "value01"
238+
metadata_int:
239+
key01: 1
240+
metadata_struct:
241+
key01: {address: "addr03",number: 1230}
242+
metadata_ptr:
243+
key01: {address: "addr05",number: 1232}
244+
str_arr:
245+
- "list01"
246+
int_arr:
247+
- 1
248+
infos:
249+
- address: "addr01"
250+
users:
251+
- name: "yourname"
252+
infos_ptr:
253+
- number: 123
254+
users:
255+
- name: "yourname1"
256+
age: 22
257+
`)
258+
d, _ := os.Getwd()
259+
filename1 := filepath.Join(d, "f4.yaml")
260+
f1, err := os.Create(filename1)
261+
assert.NoError(t, err)
262+
err = archaius.Init(archaius.WithMemorySource())
263+
assert.NoError(t, err)
264+
defer f1.Close()
265+
defer os.Remove(filename1)
266+
_, err = io.WriteString(f1, string(b))
267+
assert.NoError(t, err)
268+
err = archaius.AddFile(filename1)
269+
assert.NoError(t, err)
270+
buf := bytes.NewBuffer(nil)
271+
err = archaius.WriteTo(buf)
272+
assert.NoError(t, err)
273+
t.Logf("%s", buf.String())
274+
}
275+
230276
func TestInitConfigCenter(t *testing.T) {
231277
err := archaius.EnableRemoteSource("fake", nil)
232278
assert.Error(t, err)

source/manager.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ package source
2424
import (
2525
"errors"
2626
"fmt"
27+
"gopkg.in/yaml.v3"
28+
"io"
2729
"reflect"
2830
"regexp"
2931
"sync"
@@ -36,6 +38,7 @@ import (
3638
var (
3739
ErrKeyNotExist = errors.New("key does not exist")
3840
ErrIgnoreChange = errors.New("ignore key changed")
41+
ErrWriterInvalid = errors.New("writer is invalid")
3942
)
4043

4144
//const
@@ -82,7 +85,7 @@ func (m *Manager) Cleanup() error {
8285
//Set call set of all sources
8386
func (m *Manager) Set(k string, v interface{}) error {
8487
m.sourceMapMux.RLock()
85-
defer m.sourceMapMux.RLock()
88+
defer m.sourceMapMux.RUnlock()
8689
var err error
8790
for _, s := range m.Sources {
8891
err = s.Set(k, v)
@@ -128,6 +131,28 @@ func (m *Manager) Unmarshal(obj interface{}) error {
128131
return m.unmarshal(rv, doNotConsiderTag)
129132
}
130133

134+
// Marshal function is used to write all configuration by yaml
135+
func (m *Manager) Marshal(w io.Writer) error {
136+
if w == nil {
137+
openlog.Error("invalid writer")
138+
return ErrWriterInvalid
139+
}
140+
allConfig := make(map[string]map[string]interface{})
141+
for name, source := range m.Sources {
142+
config, err := source.GetConfigurations()
143+
if err != nil {
144+
openlog.Error("get source " + name + " error " + err.Error())
145+
continue
146+
}
147+
if len(config) == 0 {
148+
continue
149+
}
150+
allConfig[name] = config
151+
}
152+
encode := yaml.NewEncoder(w)
153+
return encode.Encode(allConfig)
154+
}
155+
131156
// AddSource adds a source to configurationManager
132157
func (m *Manager) AddSource(source ConfigSource) error {
133158
if source == nil || source.GetSourceName() == "" {

0 commit comments

Comments
 (0)