From f45277b4d5ff3ea039528e270fb510c1a80ca2b9 Mon Sep 17 00:00:00 2001 From: weloe <1345895607@qq.com> Date: Tue, 9 May 2023 15:28:27 +0800 Subject: [PATCH] feat: improve defaultAdapter to add clean timer --- enforcer.go | 20 ++++++++++++++++++-- enforcer_test.go | 18 ++++++++++-------- log/default_logger.go | 4 ++++ log/logger.go | 3 +++ persist/default_adapter.go | 25 +++++++++++++++++++++++++ persist/default_adapter_test.go | 2 ++ 6 files changed, 62 insertions(+), 10 deletions(-) diff --git a/enforcer.go b/enforcer.go index 6ff3f0b..ea227d1 100644 --- a/enforcer.go +++ b/enforcer.go @@ -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) { diff --git a/enforcer_test.go b/enforcer_test.go index e9fdf37..65bd126 100644 --- a/enforcer_test.go +++ b/enforcer_test.go @@ -36,14 +36,15 @@ func TestNewEnforcer(t *testing.T) { t.Errorf("NewHttpContext failed: %v", ctx) } tokenConfig := &config.TokenConfig{ - TokenName: "testToken", - Timeout: 60, - IsReadCookie: true, - IsReadHeader: true, - IsReadBody: false, - IsConcurrent: false, - IsShare: false, - MaxLoginCount: -1, + TokenName: "testToken", + Timeout: 60, + IsReadCookie: true, + IsReadHeader: true, + IsReadBody: false, + 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 diff --git a/log/default_logger.go b/log/default_logger.go index 2c15f00..588f707 100644 --- a/log/default_logger.go +++ b/log/default_logger.go @@ -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 } diff --git a/log/logger.go b/log/logger.go index 9a2dfc3..dc3beee 100644 --- a/log/logger.go +++ b/log/logger.go @@ -10,4 +10,7 @@ type Logger interface { // IsEnabled return if logger is enabled IsEnabled() bool + + // StartCleanTimer log after start clean timer + StartCleanTimer(period int64) } diff --git a/persist/default_adapter.go b/persist/default_adapter.go index d409add..bd9d570 100644 --- a/persist/default_adapter.go +++ b/persist/default_adapter.go @@ -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 + }) + } +} diff --git a/persist/default_adapter_test.go b/persist/default_adapter_test.go index f469409..31b3554 100644 --- a/persist/default_adapter_test.go +++ b/persist/default_adapter_test.go @@ -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) }