TiDB 源码阅读中关于 helper 包下的 requestPD 方法一点疑问

关于TiDB中hepler包下的这个方法有一些疑问?

req := new(http.Request)
	for _, host := range pdHosts {
		req, err = http.NewRequest(method, util.InternalHTTPSchema()+"://"+host+uri, body)
		if err != nil {
			// Try to request from another PD node when some nodes may down.
			if strings.Contains(err.Error(), "connection refused") {
				continue
			}
			return errors.Trace(err)
		}
	}

感觉这一段代码仅仅是将所有的host的地址循环了一遍,然后采用最后一个host的地址。似乎并没有太多作用,希望得到大佬讲解这一段代码的作用是什么?

// request PD API, decode the response body into res
func (h *Helper) requestPD(method, uri string, body io.Reader, res interface{}) error {
	etcd, ok := h.Store.(kv.EtcdBackend)
	if !ok {
		return errors.WithStack(errors.New("not implemented"))
	}
	pdHosts, err := etcd.EtcdAddrs()
	if err != nil {
		return err
	}
	if len(pdHosts) == 0 {
		return errors.New("pd unavailable")
	}
	logutil.BgLogger().Debug("RequestPD URL", zap.String("url", util.InternalHTTPSchema()+"://"+pdHosts[0]+uri))
	req := new(http.Request)
	for _, host := range pdHosts {
		req, err = http.NewRequest(method, util.InternalHTTPSchema()+"://"+host+uri, body)
		if err != nil {
			// Try to request from another PD node when some nodes may down.
			if strings.Contains(err.Error(), "connection refused") {
				continue
			}
			return errors.Trace(err)
		}
	}
	if err != nil {
		return err
	}
	resp, err := util.InternalHTTPClient().Do(req)
	if err != nil {
		return errors.Trace(err)
	}

	defer func() {
		err = resp.Body.Close()
		if err != nil {
			logutil.BgLogger().Error("close body failed", zap.Error(err))
		}
	}()

	err = json.NewDecoder(resp.Body).Decode(res)
	if err != nil {
		return errors.Trace(err)
	}

	return nil
}

附上方法的所有代码

感谢提问,AskTUG 主要用于解决 TiDB 使用上的用户问题,关于内核及生态的开发问题,欢迎转到 https://internals.tidb.io/ 进行讨论。

类似的源码问题以前有过 https://internals.tidb.io/t/topic/331