Skip to content

Commit d8b4561

Browse files
committed
Add basic cache purge by prefix
1 parent 89c1b5e commit d8b4561

File tree

6 files changed

+106
-14
lines changed

6 files changed

+106
-14
lines changed

‎lib/cache.go‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import (
2424
"strings"
2525
"time"
2626

27+
"github.com/boltdb/bolt"
28+
2729
"github.com/asdine/storm"
2830
)
2931

@@ -96,7 +98,7 @@ func (c *cacheHandler) handleRequest(rw http.ResponseWriter, req *http.Request)
9698
}
9799

98100
if meta != nil {
99-
c.logger.Debug("fileMeta", meta.Filename, "status", meta.StatusCode, "header", meta.Header)
101+
c.logger.Debug("area", "cache", "filename", meta.Filename, "status", meta.StatusCode, "header", meta.Header)
100102

101103
f, err := c.getFile(relPath)
102104
if err != nil {
@@ -201,7 +203,7 @@ func (c *cacheHandler) doWithDB(f func(db *storm.DB) error) error {
201203
}
202204

203205
func (c *cacheHandler) openDB() (*storm.DB, error) {
204-
return storm.Open(c.cfg.DBFilename)
206+
return storm.Open(c.cfg.DBFilename, storm.BoltOptions(0600, &bolt.Options{Timeout: 5 * time.Second}))
205207
}
206208

207209
// Plans:

‎lib/cache_maintenance.go‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright © 2017 Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package lib
16+
17+
import (
18+
"github.com/asdine/storm"
19+
"github.com/asdine/storm/q"
20+
)
21+
22+
func (c *cacheHandler) purgePrefix(prefix string) error {
23+
db, err := c.openDB()
24+
if err != nil {
25+
return err
26+
}
27+
defer db.Close()
28+
29+
// TODO(bep) remove
30+
var all []fileMeta
31+
db.All(&all)
32+
for _, a := range all {
33+
c.logger.Debug("file", a.Filename)
34+
}
35+
36+
// TODO(bep) a way to do this with an index.
37+
q := db.Select(q.Re("Filename", "^"+prefix))
38+
39+
var files []fileMeta
40+
41+
if err := q.Find(&files); err != nil && err != storm.ErrNotFound {
42+
return err
43+
}
44+
45+
c.logger.Info("area", "cache", "tag", "purge", "prefix", prefix, "count", len(files))
46+
47+
for _, file := range files {
48+
if err := db.DeleteStruct(&file); err != nil && err != storm.ErrNotFound {
49+
return err
50+
}
51+
}
52+
53+
return nil
54+
}
55+
56+
func (c *cacheHandler) shrinkTo(bytes int64) error {
57+
return nil
58+
}

‎lib/config.go‎

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/BurntSushi/toml"
2626
"github.com/go-kit/kit/log"
2727
"github.com/go-kit/kit/log/level"
28+
"github.com/go-kit/kit/log/term"
2829
)
2930

3031
type Config struct {
@@ -95,9 +96,32 @@ func LoadConfig(filename string) (Config, error) {
9596

9697
func (c Config) CreateLogger() *Logger {
9798
// TODO(bep) configure
98-
logger := log.NewLogfmtLogger(os.Stdout)
99-
logger = level.NewFilter(logger, level.AllowAll())
99+
//logger := log.NewLogfmtLogger(os.Stdout)
100+
colorFn := func(keyvals ...interface{}) term.FgBgColor {
101+
for i := 0; i < len(keyvals)-1; i += 2 {
102+
if keyvals[i] != "level" {
103+
continue
104+
}
105+
switch keyvals[i+1] {
106+
case "debug":
107+
return term.FgBgColor{Fg: term.DarkGray}
108+
case "info":
109+
return term.FgBgColor{Fg: term.Gray}
110+
case "warn":
111+
return term.FgBgColor{Fg: term.Yellow}
112+
case "error":
113+
return term.FgBgColor{Fg: term.Red}
114+
case "crit":
115+
return term.FgBgColor{Fg: term.Gray, Bg: term.DarkRed}
116+
default:
117+
return term.FgBgColor{}
118+
}
119+
}
120+
return term.FgBgColor{}
121+
}
100122

123+
logger := term.NewLogger(os.Stdout, log.NewLogfmtLogger, colorFn)
124+
logger = level.NewFilter(logger, level.AllowAll())
101125
l := NewLogger(logger)
102126

103127
return l

‎lib/s3.go‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ func (s s3Client) getAndWrite(path string, host Host,
103103
CreatedAt: now,
104104
}
105105

106-
s.logger.Debug("newFileMeta", fm.Filename, "status", fm.StatusCode, "header", fm.Header)
107-
108106
for k, v := range fm.Header {
109107
for _, vv := range v {
110108
rw.Header().Add(k, vv)
@@ -113,7 +111,7 @@ func (s s3Client) getAndWrite(path string, host Host,
113111

114112
rw.WriteHeader(resp.StatusCode)
115113

116-
s.logger.Debug("s3StreamFrom", path, "status", resp.StatusCode)
114+
s.logger.Debug("area", "s3", "filename", fm.Filename, "status", resp.StatusCode)
117115

118116
var content io.Reader
119117

‎lib/server.go‎

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,26 @@ type Server struct {
3434
}
3535

3636
type httpHandlers struct {
37-
cfg Config
38-
logger *Logger
37+
c *cacheHandler
3938
}
4039

4140
func NewServer(cfg Config, logger *Logger) (*Server, error) {
4241
// TODO(bep) validate config
4342

4443
h := http.NewServeMux()
45-
mw := &httpHandlers{cfg: cfg, logger: logger}
44+
c := newCacheHandler(cfg, logger)
45+
mw := &httpHandlers{c: c}
46+
47+
var purger http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) {
48+
prefix := r.FormValue("prefix")
49+
if prefix != "" {
50+
if err := c.purgePrefix(prefix); err != nil {
51+
c.logger.Error("area", "cache", "tag", "purge", "prefix", prefix, "error", err)
52+
}
53+
}
54+
}
4655

56+
h.Handle("/purge", mw.secure(purger))
4757
h.Handle("/", mw.secure(mw.serveFile()))
4858

4959
tlsEnabled, err := cfg.isTLSConfigured()
@@ -87,12 +97,12 @@ func (s *Server) Shutdown(ctx context.Context) error {
8797
}
8898

8999
func (m *httpHandlers) serveFile() http.HandlerFunc {
90-
c := newCacheHandler(m.cfg, m.logger)
100+
91101
return func(w http.ResponseWriter, r *http.Request) {
92102
// TODO containsDotDot https://github.com/golang/go/blob/f9cf8e5ab11c7ea3f1b9fde302c0a325df020b1a/src/net/http/fs.go#L665
93-
err := c.handleRequest(w, r)
103+
err := m.c.handleRequest(w, r)
94104
if err != nil {
95-
m.logger.Error("handleRequest", err)
105+
m.c.logger.Error("handleRequest", err)
96106
// TODO(bep) status code/err handling
97107
}
98108
}

‎lib/server_secure.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
func (m *httpHandlers) secure(h http.Handler) http.Handler {
2424
// TODO(bep) => config
2525
return secure.New(secure.Options{
26-
AllowedHosts: m.cfg.hostNames(),
26+
AllowedHosts: m.c.cfg.hostNames(),
2727
HostsProxyHeaders: []string{"X-Forwarded-Host"},
2828
SSLRedirect: true,
2929
SSLHost: "",

0 commit comments

Comments
 (0)