ha: change dialer when there's a forwarder enabled with higher priority

This commit is contained in:
nadoo 2018-08-24 00:57:55 +08:00
parent b9017ff70a
commit 4f69372656
3 changed files with 16 additions and 16 deletions

View File

@ -6,7 +6,7 @@ import (
"github.com/nadoo/glider/proxy"
)
// high availability forwarder
// high availability dialer
type haDialer struct{ *rrDialer }
// newHADialer .
@ -15,8 +15,8 @@ func newHADialer(dialers []*proxy.Forwarder, webhost string, duration int) proxy
}
func (ha *haDialer) nextDialer(dstAddr string) *proxy.Forwarder {
d := ha.fwdrs[ha.index]
if !d.Enabled() {
d := ha.fwdrs[ha.Index()]
if !d.Enabled() || d.Priority() < ha.Priority() {
d = ha.nextDialer(dstAddr)
}
return d

View File

@ -6,7 +6,7 @@ import (
"github.com/nadoo/glider/proxy"
)
// latency based high availability forwarder
// latency based high availability dialer
type lhaDialer struct{ *rrDialer }
// newLHADialer .

View File

@ -95,6 +95,18 @@ func (rr *rrDialer) nextDialer(dstAddr string) *proxy.Forwarder {
return rr.fwdrs[idx]
}
// Index returns the active forwarder's Index of rrDialer
func (rr *rrDialer) Index() int32 { return atomic.LoadInt32(&rr.index) }
// SetIndex sets the active forwarder's Index of rrDialer
func (rr *rrDialer) SetIndex(p int32) { atomic.StoreInt32(&rr.index, p) }
// Priority returns the active priority of rrDialer
func (rr *rrDialer) Priority() uint32 { return atomic.LoadUint32(&rr.priority) }
// SetPriority sets the active priority of rrDialer
func (rr *rrDialer) SetPriority(p uint32) { atomic.StoreUint32(&rr.priority, p) }
// Check implements the Checker interface
func (rr *rrDialer) Check() {
for i := 0; i < len(rr.fwdrs); i++ {
@ -147,15 +159,3 @@ func (rr *rrDialer) check(i int) {
rc.Close()
}
}
// Index returns the active forwarder's Index of rrDialer
func (rr *rrDialer) Index() int32 { return atomic.LoadInt32(&rr.index) }
// SetIndex sets the active forwarder's Index of rrDialer
func (rr *rrDialer) SetIndex(p int32) { atomic.StoreInt32(&rr.index, p) }
// Priority returns the active priority of rrDialer
func (rr *rrDialer) Priority() uint32 { return atomic.LoadUint32(&rr.priority) }
// SetPriority sets the active priority of rrDialer
func (rr *rrDialer) SetPriority(p uint32) { atomic.StoreUint32(&rr.priority, p) }