From 59f7764772f1663b4d2e4e3399f4687ab2e09cf7 Mon Sep 17 00:00:00 2001 From: kkkkun Date: Tue, 1 Mar 2022 11:11:09 +0800 Subject: [PATCH] add timeout for http client --- server/etcdserver/adapters.go | 2 +- server/etcdserver/bootstrap.go | 2 +- server/etcdserver/cluster_util.go | 20 +++++++++++--------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/server/etcdserver/adapters.go b/server/etcdserver/adapters.go index bc4b68645..110abd7e9 100644 --- a/server/etcdserver/adapters.go +++ b/server/etcdserver/adapters.go @@ -68,7 +68,7 @@ func (s *serverVersionAdapter) GetDowngradeInfo() *serverversion.DowngradeInfo { } func (s *serverVersionAdapter) GetMembersVersions() map[string]*version.Versions { - return getMembersVersions(s.lg, s.cluster, s.id, s.peerRt) + return getMembersVersions(s.lg, s.cluster, s.id, s.peerRt, s.Cfg.ReqTimeout()) } func (s *serverVersionAdapter) GetStorageVersion() *semver.Version { diff --git a/server/etcdserver/bootstrap.go b/server/etcdserver/bootstrap.go index e0b747f1d..857e7afa6 100644 --- a/server/etcdserver/bootstrap.go +++ b/server/etcdserver/bootstrap.go @@ -298,7 +298,7 @@ func bootstrapExistingClusterNoWAL(cfg config.ServerConfig, prt http.RoundTrippe if err := membership.ValidateClusterAndAssignIDs(cfg.Logger, cl, existingCluster); err != nil { return nil, fmt.Errorf("error validating peerURLs %s: %v", existingCluster, err) } - if !isCompatibleWithCluster(cfg.Logger, cl, cl.MemberByName(cfg.Name).ID, prt) { + if !isCompatibleWithCluster(cfg.Logger, cl, cl.MemberByName(cfg.Name).ID, prt, cfg.ReqTimeout()) { return nil, fmt.Errorf("incompatible with current running cluster") } scaleUpLearners := false diff --git a/server/etcdserver/cluster_util.go b/server/etcdserver/cluster_util.go index 2f22568bc..d4feaf9a2 100644 --- a/server/etcdserver/cluster_util.go +++ b/server/etcdserver/cluster_util.go @@ -138,7 +138,7 @@ func getRemotePeerURLs(cl *membership.RaftCluster, local string) []string { // The key of the returned map is the member's ID. The value of the returned map // is the semver versions string, including server and cluster. // If it fails to get the version of a member, the key will be nil. -func getMembersVersions(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper) map[string]*version.Versions { +func getMembersVersions(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper, timeout time.Duration) map[string]*version.Versions { members := cl.Members() vers := make(map[string]*version.Versions) for _, m := range members { @@ -150,7 +150,7 @@ func getMembersVersions(lg *zap.Logger, cl *membership.RaftCluster, local types. vers[m.ID.String()] = &version.Versions{Server: version.Version, Cluster: cv} continue } - ver, err := getVersion(lg, m, rt) + ver, err := getVersion(lg, m, rt, timeout) if err != nil { lg.Warn("failed to get version", zap.String("remote-member-id", m.ID.String()), zap.Error(err)) vers[m.ID.String()] = nil @@ -183,9 +183,9 @@ func allowedVersionRange(downgradeEnabled bool) (minV *semver.Version, maxV *sem // cluster version in the range of [MinV, MaxV] and no known members has a cluster version // out of the range. // We set this rule since when the local member joins, another member might be offline. -func isCompatibleWithCluster(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper) bool { - vers := getMembersVersions(lg, cl, local, rt) - minV, maxV := allowedVersionRange(getDowngradeEnabledFromRemotePeers(lg, cl, local, rt)) +func isCompatibleWithCluster(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper, timeout time.Duration) bool { + vers := getMembersVersions(lg, cl, local, rt, timeout) + minV, maxV := allowedVersionRange(getDowngradeEnabledFromRemotePeers(lg, cl, local, rt, timeout)) return isCompatibleWithVers(lg, vers, local, minV, maxV) } @@ -234,9 +234,10 @@ func isCompatibleWithVers(lg *zap.Logger, vers map[string]*version.Versions, loc // getVersion returns the Versions of the given member via its // peerURLs. Returns the last error if it fails to get the version. -func getVersion(lg *zap.Logger, m *membership.Member, rt http.RoundTripper) (*version.Versions, error) { +func getVersion(lg *zap.Logger, m *membership.Member, rt http.RoundTripper, timeout time.Duration) (*version.Versions, error) { cc := &http.Client{ Transport: rt, + Timeout: timeout, } var ( err error @@ -331,14 +332,14 @@ func promoteMemberHTTP(ctx context.Context, url string, id uint64, peerRt http.R } // getDowngradeEnabledFromRemotePeers will get the downgrade enabled status of the cluster. -func getDowngradeEnabledFromRemotePeers(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper) bool { +func getDowngradeEnabledFromRemotePeers(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper, timeout time.Duration) bool { members := cl.Members() for _, m := range members { if m.ID == local { continue } - enable, err := getDowngradeEnabled(lg, m, rt) + enable, err := getDowngradeEnabled(lg, m, rt, timeout) if err != nil { lg.Warn("failed to get downgrade enabled status", zap.String("remote-member-id", m.ID.String()), zap.Error(err)) } else { @@ -352,9 +353,10 @@ func getDowngradeEnabledFromRemotePeers(lg *zap.Logger, cl *membership.RaftClust // getDowngradeEnabled returns the downgrade enabled status of the given member // via its peerURLs. Returns the last error if it fails to get it. -func getDowngradeEnabled(lg *zap.Logger, m *membership.Member, rt http.RoundTripper) (bool, error) { +func getDowngradeEnabled(lg *zap.Logger, m *membership.Member, rt http.RoundTripper, timeout time.Duration) (bool, error) { cc := &http.Client{ Transport: rt, + Timeout: timeout, } var ( err error