|
@@ -29,23 +29,25 @@ type TimedUserValidator struct {
|
|
|
sync.RWMutex
|
|
sync.RWMutex
|
|
|
ctx context.Context
|
|
ctx context.Context
|
|
|
validUsers []*protocol.User
|
|
validUsers []*protocol.User
|
|
|
- userHash map[[16]byte]*indexTimePair
|
|
|
|
|
|
|
+ userHash map[[16]byte]indexTimePair
|
|
|
ids []*idEntry
|
|
ids []*idEntry
|
|
|
hasher protocol.IDHash
|
|
hasher protocol.IDHash
|
|
|
|
|
+ baseTime protocol.Timestamp
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
type indexTimePair struct {
|
|
type indexTimePair struct {
|
|
|
index int
|
|
index int
|
|
|
- timeSec protocol.Timestamp
|
|
|
|
|
|
|
+ timeInc uint32
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func NewTimedUserValidator(ctx context.Context, hasher protocol.IDHash) protocol.UserValidator {
|
|
func NewTimedUserValidator(ctx context.Context, hasher protocol.IDHash) protocol.UserValidator {
|
|
|
tus := &TimedUserValidator{
|
|
tus := &TimedUserValidator{
|
|
|
ctx: ctx,
|
|
ctx: ctx,
|
|
|
validUsers: make([]*protocol.User, 0, 16),
|
|
validUsers: make([]*protocol.User, 0, 16),
|
|
|
- userHash: make(map[[16]byte]*indexTimePair, 512),
|
|
|
|
|
|
|
+ userHash: make(map[[16]byte]indexTimePair, 512),
|
|
|
ids: make([]*idEntry, 0, 512),
|
|
ids: make([]*idEntry, 0, 512),
|
|
|
hasher: hasher,
|
|
hasher: hasher,
|
|
|
|
|
+ baseTime: protocol.Timestamp(time.Now().Unix() - cacheDurationSec*3),
|
|
|
}
|
|
}
|
|
|
go tus.updateUserHash(updateIntervalSec * time.Second)
|
|
go tus.updateUserHash(updateIntervalSec * time.Second)
|
|
|
return tus
|
|
return tus
|
|
@@ -65,7 +67,10 @@ func (v *TimedUserValidator) generateNewHashes(nowSec protocol.Timestamp, idx in
|
|
|
idHash.Reset()
|
|
idHash.Reset()
|
|
|
|
|
|
|
|
delete(v.userHash, hashValueRemoval)
|
|
delete(v.userHash, hashValueRemoval)
|
|
|
- v.userHash[hashValue] = &indexTimePair{idx, entry.lastSec}
|
|
|
|
|
|
|
+ v.userHash[hashValue] = indexTimePair{
|
|
|
|
|
+ index: idx,
|
|
|
|
|
+ timeInc: uint32(entry.lastSec - v.baseTime),
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
entry.lastSec++
|
|
entry.lastSec++
|
|
|
entry.lastSecRemoval++
|
|
entry.lastSecRemoval++
|
|
@@ -132,7 +137,7 @@ func (v *TimedUserValidator) Get(userHash []byte) (*protocol.User, protocol.Time
|
|
|
copy(fixedSizeHash[:], userHash)
|
|
copy(fixedSizeHash[:], userHash)
|
|
|
pair, found := v.userHash[fixedSizeHash]
|
|
pair, found := v.userHash[fixedSizeHash]
|
|
|
if found {
|
|
if found {
|
|
|
- return v.validUsers[pair.index], pair.timeSec, true
|
|
|
|
|
|
|
+ return v.validUsers[pair.index], protocol.Timestamp(pair.timeInc) + v.baseTime, true
|
|
|
}
|
|
}
|
|
|
return nil, 0, false
|
|
return nil, 0, false
|
|
|
}
|
|
}
|