add timeout for http client

This commit is contained in:
kkkkun 2022-03-01 11:11:09 +08:00
parent af7154c1f4
commit 59f7764772
3 changed files with 13 additions and 11 deletions

View File

@ -68,7 +68,7 @@ func (s *serverVersionAdapter) GetDowngradeInfo() *serverversion.DowngradeInfo {
} }
func (s *serverVersionAdapter) GetMembersVersions() map[string]*version.Versions { 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 { func (s *serverVersionAdapter) GetStorageVersion() *semver.Version {

View File

@ -298,7 +298,7 @@ func bootstrapExistingClusterNoWAL(cfg config.ServerConfig, prt http.RoundTrippe
if err := membership.ValidateClusterAndAssignIDs(cfg.Logger, cl, existingCluster); err != nil { if err := membership.ValidateClusterAndAssignIDs(cfg.Logger, cl, existingCluster); err != nil {
return nil, fmt.Errorf("error validating peerURLs %s: %v", existingCluster, err) 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") return nil, fmt.Errorf("incompatible with current running cluster")
} }
scaleUpLearners := false scaleUpLearners := false

View File

@ -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 // 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. // is the semver versions string, including server and cluster.
// If it fails to get the version of a member, the key will be nil. // 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() members := cl.Members()
vers := make(map[string]*version.Versions) vers := make(map[string]*version.Versions)
for _, m := range members { 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} vers[m.ID.String()] = &version.Versions{Server: version.Version, Cluster: cv}
continue continue
} }
ver, err := getVersion(lg, m, rt) ver, err := getVersion(lg, m, rt, timeout)
if err != nil { if err != nil {
lg.Warn("failed to get version", zap.String("remote-member-id", m.ID.String()), zap.Error(err)) lg.Warn("failed to get version", zap.String("remote-member-id", m.ID.String()), zap.Error(err))
vers[m.ID.String()] = nil 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 // cluster version in the range of [MinV, MaxV] and no known members has a cluster version
// out of the range. // out of the range.
// We set this rule since when the local member joins, another member might be offline. // 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 { func isCompatibleWithCluster(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper, timeout time.Duration) bool {
vers := getMembersVersions(lg, cl, local, rt) vers := getMembersVersions(lg, cl, local, rt, timeout)
minV, maxV := allowedVersionRange(getDowngradeEnabledFromRemotePeers(lg, cl, local, rt)) minV, maxV := allowedVersionRange(getDowngradeEnabledFromRemotePeers(lg, cl, local, rt, timeout))
return isCompatibleWithVers(lg, vers, local, minV, maxV) 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 // getVersion returns the Versions of the given member via its
// peerURLs. Returns the last error if it fails to get the version. // 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{ cc := &http.Client{
Transport: rt, Transport: rt,
Timeout: timeout,
} }
var ( var (
err error 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. // 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() members := cl.Members()
for _, m := range members { for _, m := range members {
if m.ID == local { if m.ID == local {
continue continue
} }
enable, err := getDowngradeEnabled(lg, m, rt) enable, err := getDowngradeEnabled(lg, m, rt, timeout)
if err != nil { if err != nil {
lg.Warn("failed to get downgrade enabled status", zap.String("remote-member-id", m.ID.String()), zap.Error(err)) lg.Warn("failed to get downgrade enabled status", zap.String("remote-member-id", m.ID.String()), zap.Error(err))
} else { } else {
@ -352,9 +353,10 @@ func getDowngradeEnabledFromRemotePeers(lg *zap.Logger, cl *membership.RaftClust
// getDowngradeEnabled returns the downgrade enabled status of the given member // getDowngradeEnabled returns the downgrade enabled status of the given member
// via its peerURLs. Returns the last error if it fails to get it. // 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{ cc := &http.Client{
Transport: rt, Transport: rt,
Timeout: timeout,
} }
var ( var (
err error err error