github.com/qiniu/go-sdk/v7@v7.27.0/internal/hostprovider/host_provider.go (about) 1 package hostprovider 2 3 import ( 4 "errors" 5 "time" 6 7 "github.com/qiniu/go-sdk/v7/internal/freezer" 8 ) 9 10 var ( 11 ErrNoHostFound = errors.New("no host found") 12 ErrAllHostsFrozen = errors.New("all hosts are frozen") 13 ) 14 15 type ( 16 HostProvider interface { 17 Provider() (string, error) 18 Freeze(host string, cause error, duration time.Duration) error 19 } 20 21 arrayHostProvider struct { 22 hosts []string 23 freezer freezer.Freezer 24 lastFreezeErr error 25 } 26 ) 27 28 func NewWithHosts(hosts []string) HostProvider { 29 return &arrayHostProvider{ 30 hosts: hosts, 31 freezer: freezer.New(), 32 } 33 } 34 35 func (a *arrayHostProvider) Provider() (string, error) { 36 if len(a.hosts) == 0 { 37 return "", ErrNoHostFound 38 } 39 40 for _, host := range a.hosts { 41 if a.freezer.Available(host) { 42 return host, nil 43 } 44 } 45 46 if a.lastFreezeErr != nil { 47 return "", a.lastFreezeErr 48 } else { 49 return "", ErrAllHostsFrozen 50 } 51 } 52 53 func (a *arrayHostProvider) Freeze(host string, cause error, duration time.Duration) error { 54 if duration <= 0 { 55 return nil 56 } 57 58 a.lastFreezeErr = cause 59 return a.freezer.Freeze(host, duration) 60 }