mirror of https://github.com/v2ray/v2ray-core
condition session history
parent
520e3ea9e6
commit
0d83330ced
|
@ -17,6 +17,7 @@ import (
|
||||||
"v2ray.com/core/common/net"
|
"v2ray.com/core/common/net"
|
||||||
"v2ray.com/core/common/protocol"
|
"v2ray.com/core/common/protocol"
|
||||||
"v2ray.com/core/common/serial"
|
"v2ray.com/core/common/serial"
|
||||||
|
"v2ray.com/core/common/signal"
|
||||||
"v2ray.com/core/proxy/vmess"
|
"v2ray.com/core/proxy/vmess"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -29,19 +30,29 @@ type sessionId struct {
|
||||||
type SessionHistory struct {
|
type SessionHistory struct {
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
cache map[sessionId]time.Time
|
cache map[sessionId]time.Time
|
||||||
|
token *signal.Semaphore
|
||||||
|
ctx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSessionHistory(ctx context.Context) *SessionHistory {
|
func NewSessionHistory(ctx context.Context) *SessionHistory {
|
||||||
h := &SessionHistory{
|
h := &SessionHistory{
|
||||||
cache: make(map[sessionId]time.Time, 128),
|
cache: make(map[sessionId]time.Time, 128),
|
||||||
|
token: signal.NewSemaphore(1),
|
||||||
|
ctx: ctx,
|
||||||
}
|
}
|
||||||
go h.run(ctx)
|
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *SessionHistory) add(session sessionId) {
|
func (h *SessionHistory) add(session sessionId) {
|
||||||
h.Lock()
|
h.Lock()
|
||||||
h.cache[session] = time.Now().Add(time.Minute * 3)
|
h.cache[session] = time.Now().Add(time.Minute * 3)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-h.token.Wait():
|
||||||
|
go h.run()
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
h.Unlock()
|
h.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,16 +66,22 @@ func (h *SessionHistory) has(session sessionId) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *SessionHistory) run(ctx context.Context) {
|
func (h *SessionHistory) run() {
|
||||||
|
defer h.token.Signal()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-h.ctx.Done():
|
||||||
return
|
return
|
||||||
case <-time.After(time.Second * 30):
|
case <-time.After(time.Second * 30):
|
||||||
}
|
}
|
||||||
session2Remove := make([]sessionId, 0, 16)
|
session2Remove := make([]sessionId, 0, 16)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
h.Lock()
|
h.Lock()
|
||||||
|
if len(h.cache) == 0 {
|
||||||
|
h.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
for session, expire := range h.cache {
|
for session, expire := range h.cache {
|
||||||
if expire.Before(now) {
|
if expire.Before(now) {
|
||||||
session2Remove = append(session2Remove, session)
|
session2Remove = append(session2Remove, session)
|
||||||
|
|
Loading…
Reference in New Issue