Files
weave-scope/render/memoise.go
Paul Bellamy 2c6b6e6707 Refactoring rendering to remove RenderableNode
Squash of:
- use detailed.Summaries to render topology nodes
- ban merging nodes of different topologies (they should be mapped)
- need to prune parents when mapping node types
- render container images by id if they have no name
- remove separate render ids and prune parents in NewDerived*
- don't render metrics/metadata for groups of nodes
- fixing up tests
- removing pending unit tests (for mapping.go, for now)
- updating experimental dir for RenderableNode removal
2016-03-29 14:13:03 +01:00

44 lines
916 B
Go

package render
import (
"fmt"
"math/rand"
"github.com/bluele/gcache"
"github.com/weaveworks/scope/report"
)
var renderCache = gcache.New(100).LRU().Build()
type memoise struct {
Renderer
id string
}
// Memoise wraps the renderer in a loving embrace of caching
func Memoise(r Renderer) Renderer {
return &memoise{
Renderer: r,
id: fmt.Sprintf("%x", rand.Int63()),
}
}
// Render produces a set of Nodes given a Report.
// Ideally, it just retrieves it from the cache, otherwise it calls through to
// `r` and stores the result.
func (m *memoise) Render(rpt report.Report) report.Nodes {
key := fmt.Sprintf("%s-%s", rpt.ID, m.id)
if result, err := renderCache.Get(key); err == nil {
return result.(report.Nodes)
}
output := m.Renderer.Render(rpt)
renderCache.Set(key, output)
return output
}
// ResetCache blows away the rendered node cache.
func ResetCache() {
renderCache.Purge()
}