type ClientOption = option.Option[*client]
type AddressProvider interface {
- GetAddrs(context.Context) ([]sd.ServiceAddress, error)
+ GetAddrs(context.Context) (sd.AddressUpdate, error)
}
type client struct {
}
type staticAddressProvider struct {
- addresses []sd.ServiceAddress
+ addresses sd.AddressUpdate
}
-func (s *staticAddressProvider) GetAddrs(_ context.Context) ([]sd.ServiceAddress, error) {
+func (s *staticAddressProvider) GetAddrs(_ context.Context) (sd.AddressUpdate, error) {
return s.addresses, nil
}
var _ AddressProvider = &dnsSrvAddressProvider{}
-func (d *dnsSrvAddressProvider) GetAddrs(context.Context) ([]sd.ServiceAddress, error) {
+func (d *dnsSrvAddressProvider) GetAddrs(context.Context) (sd.AddressUpdate, error) {
results, err := dns.ResolveSRV(d.serverId.Name(), "grpc", constants.SDDomain)
if err != nil {
return nil, err
}
- var sdAddrs []sd.ServiceAddress
+ var sdAddrs sd.AddressUpdate
for _, r := range results {
sdAddrs = append(sdAddrs, sd.ServiceAddress{
Hostname: r.Hostname,
lock *sync.RWMutex
wg *sync.WaitGroup
results []ServiceAddress
- watchers chan []ServiceAddress
+ watchers chan AddressUpdate
watcherCount int
}
key string
}
+type AddressUpdate []ServiceAddress
+
func (w *SDWatcher) init() error {
if w.Region == "" {
w.Region = "dns"
}
if w.lock == nil {
- w.watchers = make(chan []ServiceAddress, 10)
+ w.watchers = make(chan AddressUpdate, 10)
w.starter = &sync.Once{}
w.lock = &sync.RWMutex{}
w.wg = &sync.WaitGroup{}
return nil
}
-func (w *SDWatcher) GetAddrs(ctx context.Context) ([]ServiceAddress, error) {
+func (w *SDWatcher) GetAddrs(ctx context.Context) (AddressUpdate, error) {
err := w.init()
if err != nil {
return nil, err
}
}
-func (w *SDWatcher) WatchUpdates(ctx context.Context) chan []ServiceAddress {
+func (w *SDWatcher) WatchUpdates(ctx context.Context) chan AddressUpdate {
w.watcherCount++
- och := make(chan []ServiceAddress)
+ och := make(chan AddressUpdate)
go (func() {
defer func() { w.watcherCount-- }()
Path: fmt.Sprintf("/%s", sa.Protocol.String()),
}
}
+
+func (au AddressUpdate) String() string {
+ out := fmt.Sprintf("%d addrs:\n", len(au))
+ for i, a := range au {
+ out += fmt.Sprintf(" addr %d: hostname=%q ip4=%q ip6=%q node=%q port=%d protocol=%q service=%q shard=%q\n", i, a.Hostname, a.IP4, a.IP6, a.Node, a.Port, a.Protocol, a.Service, a.Shard)
+ }
+ return strings.TrimSpace(out)
+}