in router/router.go [138:187]
func (r *router) getClientByHost(dest string) (client interface{}, isRemote bool, err error) {
r.rw.RLock()
cachedEntry, ok := r.clientCache[dest]
r.rw.RUnlock()
if ok {
client = cachedEntry.client
isRemote = cachedEntry.isRemote
return client, isRemote, nil
}
// no match so far, get a complete lock for creation
r.rw.Lock()
defer r.rw.Unlock()
// double check it is not created between read and complete lock
cachedEntry, ok = r.clientCache[dest]
if ok {
client = cachedEntry.client
isRemote = cachedEntry.isRemote
return client, isRemote, nil
}
me, err := r.ringpop.WhoAmI()
if err != nil {
return nil, false, err
}
// use the ClientFactory to get the client
if dest == me {
isRemote = false
client = r.factory.GetLocalClient()
} else {
isRemote = true
thriftClient := thrift.NewClient(
r.channel,
r.channel.ServiceName(),
&thrift.ClientOptions{
HostPort: dest,
},
)
client = r.factory.MakeRemoteClient(thriftClient)
}
// cache the client
r.clientCache[dest] = cacheEntry{
client: client,
isRemote: isRemote,
}
return client, isRemote, nil
}