diff --git a/attributes/attributes.go b/attributes/attributes.go index 15178a1a2b2e..ee5c51e6cdb0 100644 --- a/attributes/attributes.go +++ b/attributes/attributes.go @@ -51,7 +51,7 @@ func New(kvs ...interface{}) *Attributes { // remove an existing key, use a nil value. func (a *Attributes) WithValues(kvs ...interface{}) *Attributes { if a == nil { - a = New() + return New(kvs...) } if len(kvs)%2 != 0 { panic(fmt.Sprintf("attributes.New called with unexpected input: len(kvs) = %v", len(kvs))) @@ -69,5 +69,8 @@ func (a *Attributes) WithValues(kvs ...interface{}) *Attributes { // Value returns the value associated with these attributes for key, or nil if // no value is associated with key. func (a *Attributes) Value(key interface{}) interface{} { + if a == nil { + return nil + } return a.m[key] } diff --git a/balancer/weightedroundrobin/weightedroundrobin.go b/balancer/weightedroundrobin/weightedroundrobin.go index b68addc6882c..dcc000fbed38 100644 --- a/balancer/weightedroundrobin/weightedroundrobin.go +++ b/balancer/weightedroundrobin/weightedroundrobin.go @@ -37,22 +37,24 @@ type AddrInfo struct { } // SetAddrInfo sets addInfo in the Attributes field of addr. -func SetAddrInfo(addrInfo *AddrInfo, addr *resolver.Address) { +// This is an EXPERIMENTAL API. +func SetAddrInfo(addrInfo AddrInfo, addr *resolver.Address) { addr.Attributes = addr.Attributes.WithValues(attributeKey{}, addrInfo) } // GetAddrInfo returns the AddrInfo stored in the Attributes fields of addr. // Returns nil if no AddrInfo is present. -func GetAddrInfo(addr *resolver.Address) *AddrInfo { +// This is an EXPERIMENTAL API. +func GetAddrInfo(addr *resolver.Address) AddrInfo { if addr == nil || addr.Attributes == nil { - return nil + return AddrInfo{} } ai := addr.Attributes.Value(attributeKey{}) if ai == nil { - return nil + return AddrInfo{} } - if _, ok := ai.(*AddrInfo); !ok { - return nil + if _, ok := ai.(AddrInfo); !ok { + return AddrInfo{} } - return ai.(*AddrInfo) + return ai.(AddrInfo) } diff --git a/balancer/weightedroundrobin/weightedwoundrobin_test.go b/balancer/weightedroundrobin/weightedwoundrobin_test.go index f14d48f0471d..a337251c4a1e 100644 --- a/balancer/weightedroundrobin/weightedwoundrobin_test.go +++ b/balancer/weightedroundrobin/weightedwoundrobin_test.go @@ -29,33 +29,33 @@ import ( func TestAddAddrInfoToAndFromAttributes(t *testing.T) { tests := []struct { desc string - inputAddrInfo *AddrInfo + inputAddrInfo AddrInfo inputAttributes *attributes.Attributes - wantAddrInfo *AddrInfo + wantAddrInfo AddrInfo }{ { desc: "empty attributes", - inputAddrInfo: &AddrInfo{Weight: 100}, + inputAddrInfo: AddrInfo{Weight: 100}, inputAttributes: nil, - wantAddrInfo: &AddrInfo{Weight: 100}, + wantAddrInfo: AddrInfo{Weight: 100}, }, { desc: "non-empty attributes", - inputAddrInfo: &AddrInfo{Weight: 100}, + inputAddrInfo: AddrInfo{Weight: 100}, inputAttributes: attributes.New("foo", "bar"), - wantAddrInfo: &AddrInfo{Weight: 100}, + wantAddrInfo: AddrInfo{Weight: 100}, }, { desc: "addrInfo not present in empty attributes", - inputAddrInfo: nil, + inputAddrInfo: AddrInfo{}, inputAttributes: nil, - wantAddrInfo: nil, + wantAddrInfo: AddrInfo{}, }, { desc: "addrInfo not present in non-empty attributes", - inputAddrInfo: nil, + inputAddrInfo: AddrInfo{}, inputAttributes: attributes.New("foo", "bar"), - wantAddrInfo: nil, + wantAddrInfo: AddrInfo{}, }, }