func()

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
}