add cache update on time

This commit is contained in:
Samir Patel 2021-05-20 20:17:53 -05:00 committed by Samir Patel
parent 713ffb723b
commit d71da09db2
2 changed files with 26 additions and 18 deletions

24
api.go
View file

@ -32,6 +32,7 @@ import (
"strconv"
"strings"
"sync"
"syscall"
"time"
"github.com/pilosa/pilosa/v2/disco"
@ -919,10 +920,11 @@ type IndexUsage struct {
// FieldUsage represents the storage space used on disk by one field, on one node
type FieldUsage struct {
Total uint64 `json:"total"`
Fragments uint64 `json:"fragments"`
Keys uint64 `json:"keys"`
Metadata uint64 `json:"metadata"`
Total uint64 `json:"total"`
Fragments uint64 `json:"fragments"`
Keys uint64 `json:"keys"`
Metadata uint64 `json:"metadata"`
ChangeTime syscall.Timespec
}
// MemoryUsage represents the memory used by one node.
@ -936,9 +938,17 @@ func (api *API) Usage(ctx context.Context, remote bool) (map[string]NodeUsage, e
span, _ := tracing.StartSpanFromContext(ctx, "API.Usage")
defer span.Finish()
//initialize cache
if api.usageCache == nil {
api.usageCache = make(map[string]NodeUsage)
}
if api.usageCache[api.server.nodeID].Disk.IndexUsage == nil {
api.usageCache[api.server.nodeID] = NodeUsage{
Disk: DiskUsage{
IndexUsage: make(map[string]IndexUsage),
},
}
}
indexDetails, nodeMetadataBytes, err := api.holder.Txf().IndexUsageDetails(api.usageCache[api.server.nodeID].Disk.IndexUsage)
if err != nil {
@ -977,7 +987,7 @@ func (api *API) Usage(ctx context.Context, remote bool) (map[string]NodeUsage, e
TotalUse: memoryUse,
},
}
nodeUsages[api.server.nodeID] = nodeUsage
api.usageCache[api.server.nodeID] = nodeUsage
// Collect usage from remote nodes
if !remote {
@ -990,10 +1000,10 @@ func (api *API) Usage(ctx context.Context, remote bool) (map[string]NodeUsage, e
if err != nil {
return nil, errors.Wrapf(err, "collecting disk usage from %s", node.URI)
}
nodeUsages[node.ID] = nodeUsage[node.ID]
api.usageCache[node.ID] = nodeUsage[node.ID]
}
}
return nodeUsages, nil
return api.usageCache, nil
}
// RecalculateCaches forces all TopN caches to be updated.

View file

@ -599,18 +599,15 @@ func (f *TxFactory) IndexUsageDetails(indexUsage map[string]IndexUsage) (map[str
flds := idx.Fields()
for _, fld := range flds {
field := fld.Name()
_, found := indexUsage[index].Fields[field]
var valid bool
if found {
fieldPath := path.Join(indexPath, FieldsDir, field)
fstat, err := os.Stat(fieldPath)
if err != nil {
return indexUsage, 0, errors.Wrap(err, "getting field path")
}
valid = indexUsage[index].Fields[field].ChangeTime == fstat.Sys().(*syscall.Stat_t).Ctimespec
fieldPath := path.Join(indexPath, FieldsDir, field)
fstat, err := os.Stat(fieldPath)
if err != nil {
return indexUsage, 0, errors.Wrap(err, "getting field path")
}
if !found || !valid {
changeTime := fstat.Sys().(*syscall.Stat_t).Ctimespec
_, found := indexUsage[index].Fields[field]
if !found || (indexUsage[index].Fields[field].ChangeTime != changeTime) {
if field == "_keys" {
continue
}
@ -644,6 +641,7 @@ func (f *TxFactory) IndexUsageDetails(indexUsage map[string]IndexUsage) (map[str
// add non-roaring to roaring
fUsage.Fragments += fragmentUsage
fUsage.Total += fragmentUsage
fUsage.ChangeTime = changeTime
indexUsage[index].Fields[field] = fUsage
}