mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
add cache update on time
This commit is contained in:
parent
713ffb723b
commit
d71da09db2
2 changed files with 26 additions and 18 deletions
24
api.go
24
api.go
|
|
@ -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.
|
||||
|
|
|
|||
20
txfactory.go
20
txfactory.go
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue