projects
/
arvados.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
11809: Prune collection cache asynchronously.
[arvados.git]
/
services
/
keep-web
/
handler.go
diff --git
a/services/keep-web/handler.go
b/services/keep-web/handler.go
index a79973b975486b92e4b2d2349b7613df29ff4943..42c37b8eebf947bea060ef2ace9a68b1fcca67ad 100644
(file)
--- a/
services/keep-web/handler.go
+++ b/
services/keep-web/handler.go
@@
-1,6
+1,7
@@
package main
import (
package main
import (
+ "encoding/json"
"fmt"
"html"
"io"
"fmt"
"html"
"io"
@@
-64,6
+65,16
@@
func parseCollectionIDFromURL(s string) string {
func (h *handler) setup() {
h.clientPool = arvadosclient.MakeClientPool()
func (h *handler) setup() {
h.clientPool = arvadosclient.MakeClientPool()
+ keepclient.RefreshServiceDiscoveryOnSIGHUP()
+}
+
+func (h *handler) serveStatus(w http.ResponseWriter, r *http.Request) {
+ status := struct {
+ cacheStats
+ }{
+ cacheStats: h.Config.Cache.Stats(),
+ }
+ json.NewEncoder(w).Encode(status)
}
// ServeHTTP implements http.Handler.
}
// ServeHTTP implements http.Handler.
@@
-150,6
+161,9
@@
func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
// http://ID.collections.example/PATH...
credentialsOK = true
targetPath = pathParts
// http://ID.collections.example/PATH...
credentialsOK = true
targetPath = pathParts
+ } else if r.URL.Path == "/status.json" {
+ h.serveStatus(w, r)
+ return
} else if len(pathParts) >= 2 && strings.HasPrefix(pathParts[0], "c=") {
// /c=ID/PATH...
targetID = parseCollectionIDFromURL(pathParts[0][2:])
} else if len(pathParts) >= 2 && strings.HasPrefix(pathParts[0], "c=") {
// /c=ID/PATH...
targetID = parseCollectionIDFromURL(pathParts[0][2:])
@@
-157,17
+171,19
@@
func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
} else if len(pathParts) >= 3 && pathParts[0] == "collections" {
if len(pathParts) >= 5 && pathParts[1] == "download" {
// /collections/download/ID/TOKEN/PATH...
} else if len(pathParts) >= 3 && pathParts[0] == "collections" {
if len(pathParts) >= 5 && pathParts[1] == "download" {
// /collections/download/ID/TOKEN/PATH...
- targetID = pa
thParts[2]
+ targetID = pa
rseCollectionIDFromURL(pathParts[2])
tokens = []string{pathParts[3]}
targetPath = pathParts[4:]
pathToken = true
} else {
// /collections/ID/PATH...
tokens = []string{pathParts[3]}
targetPath = pathParts[4:]
pathToken = true
} else {
// /collections/ID/PATH...
- targetID = pa
thParts[1]
+ targetID = pa
rseCollectionIDFromURL(pathParts[1])
tokens = h.Config.AnonymousTokens
targetPath = pathParts[2:]
}
tokens = h.Config.AnonymousTokens
targetPath = pathParts[2:]
}
- } else {
+ }
+
+ if targetID == "" {
statusCode = http.StatusNotFound
return
}
statusCode = http.StatusNotFound
return
}
@@
-272,11
+288,17
@@
func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
targetPath = targetPath[1:]
}
targetPath = targetPath[1:]
}
+ forceReload := false
+ if cc := r.Header.Get("Cache-Control"); strings.Contains(cc, "no-cache") || strings.Contains(cc, "must-revalidate") {
+ forceReload = true
+ }
+
+ var collection map[string]interface{}
tokenResult := make(map[string]int)
tokenResult := make(map[string]int)
- collection := make(map[string]interface{})
found := false
for _, arv.ApiToken = range tokens {
found := false
for _, arv.ApiToken = range tokens {
- err := arv.Get("collections", targetID, nil, &collection)
+ var err error
+ collection, err = h.Config.Cache.Get(arv, targetID, forceReload)
if err == nil {
// Success
found = true
if err == nil {
// Success
found = true
@@
-333,12
+355,6
@@
func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
statusCode, statusText = http.StatusInternalServerError, err.Error()
return
}
statusCode, statusText = http.StatusInternalServerError, err.Error()
return
}
- if kc.Client != nil && kc.Client.Transport != nil {
- // Workaround for https://dev.arvados.org/issues/9005
- if t, ok := kc.Client.Transport.(*http.Transport); ok {
- defer t.CloseIdleConnections()
- }
- }
rdr, err := kc.CollectionFileReader(collection, filename)
if os.IsNotExist(err) {
statusCode = http.StatusNotFound
rdr, err := kc.CollectionFileReader(collection, filename)
if os.IsNotExist(err) {
statusCode = http.StatusNotFound