| // Copyright 2018 The etcd Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package balancer |
| |
| import ( |
| "fmt" |
| "net/url" |
| "sort" |
| "sync/atomic" |
| "time" |
| |
| "google.golang.org/grpc/balancer" |
| "google.golang.org/grpc/resolver" |
| ) |
| |
| func scToString(sc balancer.SubConn) string { |
| return fmt.Sprintf("%p", sc) |
| } |
| |
| func scsToStrings(scs map[balancer.SubConn]resolver.Address) (ss []string) { |
| ss = make([]string, 0, len(scs)) |
| for sc, a := range scs { |
| ss = append(ss, fmt.Sprintf("%s (%s)", a.Addr, scToString(sc))) |
| } |
| sort.Strings(ss) |
| return ss |
| } |
| |
| func addrsToStrings(addrs []resolver.Address) (ss []string) { |
| ss = make([]string, len(addrs)) |
| for i := range addrs { |
| ss[i] = addrs[i].Addr |
| } |
| sort.Strings(ss) |
| return ss |
| } |
| |
| func epsToAddrs(eps ...string) (addrs []resolver.Address) { |
| addrs = make([]resolver.Address, 0, len(eps)) |
| for _, ep := range eps { |
| u, err := url.Parse(ep) |
| if err != nil { |
| addrs = append(addrs, resolver.Address{Addr: ep, Type: resolver.Backend}) |
| continue |
| } |
| addrs = append(addrs, resolver.Address{Addr: u.Host, Type: resolver.Backend}) |
| } |
| return addrs |
| } |
| |
| var genN = new(uint32) |
| |
| func genName() string { |
| now := time.Now().UnixNano() |
| return fmt.Sprintf("%X%X", now, atomic.AddUint32(genN, 1)) |
| } |