feat: improve defaultAdapter to add clean timer

This commit is contained in:
weloe
2023-05-09 15:28:27 +08:00
parent 4a14a250dc
commit f45277b4d5
6 changed files with 62 additions and 10 deletions

View File

@@ -100,13 +100,29 @@ func InitWithConfig(tokenConfig *config.TokenConfig, adapter persist.Adapter) (*
if tokenConfig == nil || adapter == nil {
return nil, errors.New("InitWithConfig() failed: parameters cannot be nil")
}
return &Enforcer{
e := &Enforcer{
loginType: "user",
config: *tokenConfig,
generateFunc: fm,
adapter: adapter,
logger: &log.DefaultLogger{},
}, nil
}
e.startCleanTimer()
return e, nil
}
// if e.adapter.(type) == *persist.DefaultAdapter, can start cleanTimer
func (e *Enforcer) startCleanTimer() {
defaultAdapter, ok := e.adapter.(*persist.DefaultAdapter)
if ok {
dataRefreshPeriod := e.config.DataRefreshPeriod
if period := dataRefreshPeriod; period >= 0 {
defaultAdapter.StartCleanTimer(dataRefreshPeriod)
e.logger.StartCleanTimer(dataRefreshPeriod)
}
}
}
func (e *Enforcer) SetType(t string) {

View File

@@ -44,6 +44,7 @@ func TestNewEnforcer(t *testing.T) {
IsConcurrent: false,
IsShare: false,
MaxLoginCount: -1,
DataRefreshPeriod: -1,
}
logger := &log.DefaultLogger{}
@@ -131,6 +132,7 @@ func NewTestNotConcurrentEnforcer(t *testing.T) (error, *Enforcer, ctx.Context)
tokenConfig := config.DefaultTokenConfig()
tokenConfig.IsConcurrent = false
tokenConfig.IsShare = false
tokenConfig.DataRefreshPeriod = 30
enforcer, err := NewEnforcer(tokenConfig, adapter)
return err, enforcer, ctx

View File

@@ -11,6 +11,10 @@ type DefaultLogger struct {
enable bool
}
func (d *DefaultLogger) StartCleanTimer(period int64) {
log.Printf("timer period = %v, timer start", period)
}
func (d *DefaultLogger) Enable(bool bool) {
d.enable = bool
}

View File

@@ -10,4 +10,7 @@ type Logger interface {
// IsEnabled return if logger is enabled
IsEnabled() bool
// StartCleanTimer log after start clean timer
StartCleanTimer(period int64)
}

View File

@@ -12,6 +12,7 @@ import (
type DefaultAdapter struct {
dataMap *sync.Map
expireMap *sync.Map
once sync.Once
}
var _ Adapter = (*DefaultAdapter)(nil)
@@ -168,3 +169,27 @@ func (d *DefaultAdapter) getTimeout(key string) int64 {
}
return timeout
}
func (d *DefaultAdapter) StartCleanTimer(period int64) {
d.once.Do(func() {
go d.CleanTask(period)
})
}
func (d *DefaultAdapter) CleanTask(period int64) {
if period < 0 {
return
}
duration := period
// create timer
ticker := time.NewTicker(time.Duration(duration) * time.Second)
defer ticker.Stop()
for range ticker.C {
d.expireMap.Range(func(key, value any) bool {
_ = d.getExpireAndDelete(key.(string))
return true
})
}
}

View File

@@ -181,6 +181,7 @@ func TestDefaultAdapter_InterfaceOperation(t *testing.T) {
func TestDefaultAdapter_DeleteBatchFilteredValue(t *testing.T) {
adapter := NewTestDefaultAdapter()
adapter.(*DefaultAdapter).StartCleanTimer(2)
if err := adapter.SetStr("k_1", "v", -1); err != nil {
t.Errorf("SetStr() failed: %v", err)
}
@@ -198,4 +199,5 @@ func TestDefaultAdapter_DeleteBatchFilteredValue(t *testing.T) {
if str != "" {
t.Errorf("DeleteBatchFilteredKey() failed")
}
time.Sleep(5 * time.Second)
}