diff --git a/persistence/sql/persister.go b/persistence/sql/persister.go index f222660e006e..9f58f98db9c1 100644 --- a/persistence/sql/persister.go +++ b/persistence/sql/persister.go @@ -196,6 +196,12 @@ func (p *Persister) CleanupDatabase(ctx context.Context, wait time.Duration, old } time.Sleep(wait) + p.r.Logger().Println("Cleaning up inactive sessions") + if err := p.DeleteInactiveSessions(ctx, currentTime, batchSize); err != nil { + return err + } + time.Sleep(wait) + p.r.Logger().Println("Cleaning up expired continuity containers") if err := p.DeleteExpiredContinuitySessions(ctx, currentTime, batchSize); err != nil { return err diff --git a/persistence/sql/persister_session.go b/persistence/sql/persister_session.go index e0e14bcf5378..49820a69ae22 100644 --- a/persistence/sql/persister_session.go +++ b/persistence/sql/persister_session.go @@ -503,7 +503,7 @@ func (p *Persister) DeleteExpiredSessions(ctx context.Context, expiresAt time.Ti //#nosec G201 -- TableName is static err = p.GetConnection(ctx).RawQuery(fmt.Sprintf( - "DELETE FROM %s WHERE id in (SELECT id FROM (SELECT id FROM %s c WHERE (expires_at <= ? or active = false) and nid = ? ORDER BY expires_at ASC LIMIT %d ) AS s )", + "DELETE FROM %s WHERE id in (SELECT id FROM (SELECT id FROM %s c WHERE expires_at <= ? and nid = ? ORDER BY expires_at ASC LIMIT %d ) AS s )", new(session.Session).TableName(ctx), new(session.Session).TableName(ctx), limit, @@ -516,3 +516,22 @@ func (p *Persister) DeleteExpiredSessions(ctx context.Context, expiresAt time.Ti } return nil } + +func (p *Persister) DeleteInactiveSessions(ctx context.Context, expiresAt time.Time, limit int) (err error) { + ctx, span := p.r.Tracer(ctx).Tracer().Start(ctx, "persistence.sql.DeleteInactiveSessions") + defer otelx.End(span, &err) + + //#nosec G201 -- TableName is static + err = p.GetConnection(ctx).RawQuery(fmt.Sprintf( + "DELETE FROM %s WHERE id in (SELECT id FROM (SELECT id FROM %s c WHERE active = false and nid = ? ORDER BY expires_at ASC LIMIT %d ) AS s )", + new(session.Session).TableName(ctx), + new(session.Session).TableName(ctx), + limit, + ), + p.NetworkID(ctx), + ).Exec() + if err != nil { + return sqlcon.HandleError(err) + } + return nil +} diff --git a/session/persistence.go b/session/persistence.go index ab5ec0a47735..b9bd5e522af0 100644 --- a/session/persistence.go +++ b/session/persistence.go @@ -53,6 +53,9 @@ type Persister interface { // DeleteExpiredSessions deletes sessions that expired before the given time. DeleteExpiredSessions(context.Context, time.Time, int) error + // DeleteInactiveSessions deletes sessions that have been marked inactive. + DeleteInactiveSessions(context.Context, time.Time, int) error + // DeleteSessionByToken deletes a session associated with the given token. // // Functionality is similar to DeleteSession but accepts a session token