mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
package cluster
|
|
|
|
import (
|
|
"container/list"
|
|
"time"
|
|
)
|
|
|
|
type nodeTTL struct {
|
|
nodeId string
|
|
refreshTime time.Time
|
|
}
|
|
|
|
type nodeSetTTL struct {
|
|
l *list.List
|
|
mapElement map[string]*list.Element
|
|
ttl time.Duration
|
|
}
|
|
|
|
func (ns *nodeSetTTL) init(ttl time.Duration) {
|
|
ns.ttl = ttl
|
|
ns.mapElement = make(map[string]*list.Element, 32)
|
|
ns.l = list.New()
|
|
}
|
|
|
|
func (ns *nodeSetTTL) removeNode(nodeId string) {
|
|
ele, ok := ns.mapElement[nodeId]
|
|
if ok == false {
|
|
return
|
|
}
|
|
|
|
ns.l.Remove(ele)
|
|
delete(ns.mapElement, nodeId)
|
|
}
|
|
|
|
func (ns *nodeSetTTL) addAndRefreshNode(nodeId string) {
|
|
ele, ok := ns.mapElement[nodeId]
|
|
if ok == false {
|
|
ele = ns.l.PushBack(nodeId)
|
|
ele.Value = &nodeTTL{nodeId, time.Now()}
|
|
ns.mapElement[nodeId] = ele
|
|
return
|
|
}
|
|
|
|
ele.Value.(*nodeTTL).refreshTime = time.Now()
|
|
ns.l.MoveToBack(ele)
|
|
}
|
|
|
|
func (ns *nodeSetTTL) checkTTL(cb func(nodeIdList []string)) {
|
|
var nodeIdList []string
|
|
for {
|
|
f := ns.l.Front()
|
|
if f == nil {
|
|
break
|
|
}
|
|
|
|
nt := f.Value.(*nodeTTL)
|
|
if time.Now().Sub(nt.refreshTime) > ns.ttl {
|
|
nodeIdList = append(nodeIdList, nt.nodeId)
|
|
} else {
|
|
break
|
|
}
|
|
|
|
//删除结点
|
|
ns.l.Remove(f)
|
|
delete(ns.mapElement, nt.nodeId)
|
|
}
|
|
|
|
if len(nodeIdList) > 0 {
|
|
cb(nodeIdList)
|
|
}
|
|
}
|