From 18f55d156995371bfb06ca8cd91da5a922d2a937 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Sat, 16 Dec 2017 18:48:17 -0800 Subject: Add scheduler to clean old sessions --- config/config.go | 23 ++++++++++++----------- main.go | 4 +++- scheduler/scheduler.go | 22 +++++++++++++++++----- storage/session.go | 14 ++++++++++++++ storage/user_session.go | 14 ++++++++++++++ 5 files changed, 60 insertions(+), 17 deletions(-) diff --git a/config/config.go b/config/config.go index 493e4ea..b1169e7 100644 --- a/config/config.go +++ b/config/config.go @@ -11,17 +11,18 @@ import ( // Default config parameters values const ( - DefaultBaseURL = "http://localhost" - DefaultDatabaseURL = "postgres://postgres:postgres@localhost/miniflux2?sslmode=disable" - DefaultWorkerPoolSize = 5 - DefaultPollingFrequency = 60 - DefaultBatchSize = 10 - DefaultDatabaseMaxConns = 20 - DefaultListenAddr = "127.0.0.1:8080" - DefaultCertFile = "" - DefaultKeyFile = "" - DefaultCertDomain = "" - DefaultCertCache = "/tmp/cert_cache" + DefaultBaseURL = "http://localhost" + DefaultDatabaseURL = "postgres://postgres:postgres@localhost/miniflux2?sslmode=disable" + DefaultWorkerPoolSize = 5 + DefaultPollingFrequency = 60 + DefaultBatchSize = 10 + DefaultDatabaseMaxConns = 20 + DefaultListenAddr = "127.0.0.1:8080" + DefaultCertFile = "" + DefaultKeyFile = "" + DefaultCertDomain = "" + DefaultCertCache = "/tmp/cert_cache" + DefaultSessionCleanupFrequency = 24 ) // Config manages configuration parameters. diff --git a/main.go b/main.go index 02f53c0..a252c61 100644 --- a/main.go +++ b/main.go @@ -47,13 +47,15 @@ func run(cfg *config.Config, store *storage.Storage) { pool := scheduler.NewWorkerPool(feedHandler, cfg.GetInt("WORKER_POOL_SIZE", config.DefaultWorkerPoolSize)) server := server.NewServer(cfg, store, pool, feedHandler) - scheduler.NewScheduler( + scheduler.NewFeedScheduler( store, pool, cfg.GetInt("POLLING_FREQUENCY", config.DefaultPollingFrequency), cfg.GetInt("BATCH_SIZE", config.DefaultBatchSize), ) + scheduler.NewSessionScheduler(store, config.DefaultSessionCleanupFrequency) + <-stop logger.Info("Shutting down the server...") ctx, _ := context.WithTimeout(context.Background(), 5*time.Second) diff --git a/scheduler/scheduler.go b/scheduler/scheduler.go index 3eac0d1..cc3de6a 100644 --- a/scheduler/scheduler.go +++ b/scheduler/scheduler.go @@ -11,18 +11,30 @@ import ( "github.com/miniflux/miniflux/storage" ) -// NewScheduler starts a new scheduler that push jobs to a pool of workers. -func NewScheduler(store *storage.Storage, workerPool *WorkerPool, frequency, batchSize int) { +// NewFeedScheduler starts a new scheduler that push jobs to a pool of workers. +func NewFeedScheduler(store *storage.Storage, workerPool *WorkerPool, frequency, batchSize int) { go func() { c := time.Tick(time.Duration(frequency) * time.Minute) - for now := range c { + for _ = range c { jobs, err := store.NewBatch(batchSize) if err != nil { - logger.Error("[Scheduler] %v", err) + logger.Error("[FeedScheduler] %v", err) } else { - logger.Debug("[Scheduler:%v] => Pushing %d jobs", now, len(jobs)) + logger.Debug("[FeedScheduler] Pushing %d jobs", len(jobs)) workerPool.Push(jobs) } } }() } + +// NewSessionScheduler starts a new scheduler that clean old sessions. +func NewSessionScheduler(store *storage.Storage, frequency int) { + go func() { + c := time.Tick(time.Duration(frequency) * time.Hour) + for _ = range c { + nbSessions := store.CleanOldSessions() + nbUserSessions := store.CleanOldUserSessions() + logger.Debug("[SessionScheduler] cleaned %d sessions and %d user sessions", nbSessions, nbUserSessions) + } + }() +} diff --git a/storage/session.go b/storage/session.go index 17a63e2..106d618 100644 --- a/storage/session.go +++ b/storage/session.go @@ -75,3 +75,17 @@ func (s *Storage) FlushAllSessions() (err error) { return nil } + +// CleanOldSessions removes sessions older than 30 days. +func (s *Storage) CleanOldSessions() int64 { + query := `DELETE FROM sessions + WHERE id IN (SELECT id FROM sessions WHERE created_at < now() - interval '30 days')` + + result, err := s.db.Exec(query) + if err != nil { + return 0 + } + + n, _ := result.RowsAffected() + return n +} diff --git a/storage/user_session.go b/storage/user_session.go index ffb82fc..63e25e0 100644 --- a/storage/user_session.go +++ b/storage/user_session.go @@ -127,3 +127,17 @@ func (s *Storage) RemoveUserSessionByID(userID, sessionID int64) error { return nil } + +// CleanOldUserSessions removes user sessions older than 30 days. +func (s *Storage) CleanOldUserSessions() int64 { + query := `DELETE FROM user_sessions + WHERE id IN (SELECT id FROM user_sessions WHERE created_at < now() - interval '30 days')` + + result, err := s.db.Exec(query) + if err != nil { + return 0 + } + + n, _ := result.RowsAffected() + return n +} -- cgit v1.2.3