forked from mystiq/dex
Merge pull request #587 from ericchiang/dev-sql-enable-gc
storage/sql: enable garbage collection
This commit is contained in:
commit
3681a57abd
2 changed files with 43 additions and 5 deletions
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/coreos/dex/storage"
|
||||||
)
|
)
|
||||||
|
@ -17,7 +18,11 @@ type SQLite3 struct {
|
||||||
|
|
||||||
// Open creates a new storage implementation backed by SQLite3
|
// Open creates a new storage implementation backed by SQLite3
|
||||||
func (s *SQLite3) Open() (storage.Storage, error) {
|
func (s *SQLite3) Open() (storage.Storage, error) {
|
||||||
return s.open()
|
conn, err := s.open()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return withGC(conn, time.Now), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SQLite3) open() (*conn, error) {
|
func (s *SQLite3) open() (*conn, error) {
|
||||||
|
@ -67,7 +72,11 @@ type Postgres struct {
|
||||||
|
|
||||||
// Open creates a new storage implementation backed by Postgres.
|
// Open creates a new storage implementation backed by Postgres.
|
||||||
func (p *Postgres) Open() (storage.Storage, error) {
|
func (p *Postgres) Open() (storage.Storage, error) {
|
||||||
return p.open()
|
conn, err := p.open()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return withGC(conn, time.Now), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Postgres) open() (*conn, error) {
|
func (p *Postgres) open() (*conn, error) {
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
package sql
|
package sql
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/coreos/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
type gc struct {
|
type gc struct {
|
||||||
|
@ -10,10 +14,8 @@ type gc struct {
|
||||||
conn *conn
|
conn *conn
|
||||||
}
|
}
|
||||||
|
|
||||||
var tablesWithGC = []string{"auth_request", "auth_code"}
|
|
||||||
|
|
||||||
func (gc gc) run() error {
|
func (gc gc) run() error {
|
||||||
for _, table := range tablesWithGC {
|
for _, table := range []string{"auth_request", "auth_code"} {
|
||||||
_, err := gc.conn.Exec(`delete from `+table+` where expiry < $1`, gc.now())
|
_, err := gc.conn.Exec(`delete from `+table+` where expiry < $1`, gc.now())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gc %s: %v", table, err)
|
return fmt.Errorf("gc %s: %v", table, err)
|
||||||
|
@ -22,3 +24,30 @@ func (gc gc) run() error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type withCancel struct {
|
||||||
|
storage.Storage
|
||||||
|
cancel context.CancelFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withCancel) Close() error {
|
||||||
|
w.cancel()
|
||||||
|
return w.Storage.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func withGC(conn *conn, now func() time.Time) storage.Storage {
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
run := (gc{now, conn}).run
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-time.After(time.Second * 30):
|
||||||
|
if err := run(); err != nil {
|
||||||
|
log.Printf("gc failed: %v", err)
|
||||||
|
}
|
||||||
|
case <-ctx.Done():
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return withCancel{conn, cancel}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue