Ver Fonte

prepare for remove function

Darien Raymond há 7 anos atrás
pai
commit
0273b36027
1 ficheiros alterados com 13 adições e 10 exclusões
  1. 13 10
      proxy/vmess/vmess.go

+ 13 - 10
proxy/vmess/vmess.go

@@ -25,7 +25,6 @@ type idEntry struct {
 	id             *protocol.ID
 	userIdx        int
 	lastSec        protocol.Timestamp
-	lastSecRemoval protocol.Timestamp
 }
 
 type TimedUserValidator struct {
@@ -56,25 +55,26 @@ func NewTimedUserValidator(ctx context.Context, hasher protocol.IDHash) protocol
 
 func (v *TimedUserValidator) generateNewHashes(nowSec protocol.Timestamp, idx int, entry *idEntry) {
 	var hashValue [16]byte
-	var hashValueRemoval [16]byte
 	idHash := v.hasher(entry.id.Bytes())
 	for entry.lastSec <= nowSec {
 		common.Must2(idHash.Write(entry.lastSec.Bytes(nil)))
 		idHash.Sum(hashValue[:0])
 		idHash.Reset()
 
-		common.Must2(idHash.Write(entry.lastSecRemoval.Bytes(nil)))
-		idHash.Sum(hashValueRemoval[:0])
-		idHash.Reset()
-
-		delete(v.userHash, hashValueRemoval)
 		v.userHash[hashValue] = indexTimePair{
 			index:   idx,
 			timeInc: uint32(entry.lastSec - v.baseTime),
 		}
 
 		entry.lastSec++
-		entry.lastSecRemoval++
+	}
+}
+
+func (v *TimedUserValidator) removeExpiredHashes(expire uint32) {
+	for key, pair := range v.userHash {
+		if pair.timeInc < expire {
+			delete(v.userHash, key)
+		}
 	}
 }
 
@@ -87,6 +87,11 @@ func (v *TimedUserValidator) updateUserHash(ctx context.Context, interval time.D
 			for _, entry := range v.ids {
 				v.generateNewHashes(nowSec, entry.userIdx, entry)
 			}
+
+			expire := protocol.Timestamp(now.Unix() - cacheDurationSec*3)
+			if expire > v.baseTime {
+				v.removeExpiredHashes(uint32(expire - v.baseTime))
+			}
 			v.Unlock()
 		case <-ctx.Done():
 			return
@@ -112,7 +117,6 @@ func (v *TimedUserValidator) Add(user *protocol.User) error {
 		id:             account.ID,
 		userIdx:        idx,
 		lastSec:        protocol.Timestamp(nowSec - cacheDurationSec),
-		lastSecRemoval: protocol.Timestamp(nowSec - cacheDurationSec*3),
 	}
 	v.generateNewHashes(protocol.Timestamp(nowSec+cacheDurationSec), idx, entry)
 	v.ids = append(v.ids, entry)
@@ -121,7 +125,6 @@ func (v *TimedUserValidator) Add(user *protocol.User) error {
 			id:             alterid,
 			userIdx:        idx,
 			lastSec:        protocol.Timestamp(nowSec - cacheDurationSec),
-			lastSecRemoval: protocol.Timestamp(nowSec - cacheDurationSec*3),
 		}
 		v.generateNewHashes(protocol.Timestamp(nowSec+cacheDurationSec), idx, entry)
 		v.ids = append(v.ids, entry)