mirror of
https://github.com/kopia/kopia.git
synced 2025-12-23 22:57:50 -05:00
141 lines
4.5 KiB
Go
141 lines
4.5 KiB
Go
package cli
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/alecthomas/kingpin/v2"
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/kopia/kopia/internal/units"
|
|
"github.com/kopia/kopia/repo"
|
|
"github.com/kopia/kopia/repo/content"
|
|
)
|
|
|
|
type cacheSizeFlags struct {
|
|
contentCacheSizeMB int64
|
|
contentCacheSizeLimitMB int64
|
|
contentMinSweepAge time.Duration
|
|
|
|
metadataCacheSizeMB int64
|
|
metadataCacheSizeLimitMB int64
|
|
metadataMinSweepAge time.Duration
|
|
|
|
maxListCacheDuration time.Duration
|
|
indexMinSweepAge time.Duration
|
|
}
|
|
|
|
func (c *cacheSizeFlags) setup(cmd *kingpin.CmdClause) {
|
|
// do not use Defaults here, since this structure is shared between connect/create/set commands
|
|
// each command will set their default values in code.
|
|
cmd.Flag("content-cache-size-mb", "Desired size of local content cache (soft limit)").PlaceHolder("MB").Int64Var(&c.contentCacheSizeMB)
|
|
cmd.Flag("content-cache-size-limit-mb", "Maximum size of local content cache (hard limit)").PlaceHolder("MB").Int64Var(&c.contentCacheSizeLimitMB)
|
|
cmd.Flag("content-min-sweep-age", "Minimal age of content cache item to be subject to sweeping").DurationVar(&c.contentMinSweepAge)
|
|
cmd.Flag("metadata-cache-size-mb", "Desired size of local metadata cache (soft limit)").PlaceHolder("MB").Int64Var(&c.metadataCacheSizeMB)
|
|
cmd.Flag("metadata-cache-size-limit-mb", "Maximum size of local metadata cache (hard limit)").PlaceHolder("MB").Int64Var(&c.metadataCacheSizeLimitMB)
|
|
cmd.Flag("metadata-min-sweep-age", "Minimal age of metadata cache item to be subject to sweeping").DurationVar(&c.metadataMinSweepAge)
|
|
cmd.Flag("index-min-sweep-age", "Minimal age of index cache item to be subject to sweeping").DurationVar(&c.indexMinSweepAge)
|
|
cmd.Flag("max-list-cache-duration", "Duration of index cache").DurationVar(&c.maxListCacheDuration)
|
|
}
|
|
|
|
type commandCacheSetParams struct {
|
|
directory string
|
|
|
|
cacheSizeFlags
|
|
|
|
svc appServices
|
|
}
|
|
|
|
func (c *commandCacheSetParams) setup(svc appServices, parent commandParent) {
|
|
cmd := parent.Command("set", "Sets parameters local caching of repository data")
|
|
|
|
c.contentMinSweepAge = -1
|
|
c.metadataMinSweepAge = -1
|
|
c.indexMinSweepAge = -1
|
|
c.maxListCacheDuration = -1
|
|
c.contentCacheSizeLimitMB = -1
|
|
c.contentCacheSizeMB = -1
|
|
c.metadataCacheSizeLimitMB = -1
|
|
c.metadataCacheSizeMB = -1
|
|
c.cacheSizeFlags.setup(cmd)
|
|
|
|
cmd.Flag("cache-directory", "Directory where to store cache files").StringVar(&c.directory)
|
|
|
|
cmd.Action(svc.repositoryWriterAction(c.run))
|
|
c.svc = svc
|
|
}
|
|
|
|
func (c *commandCacheSetParams) run(ctx context.Context, _ repo.RepositoryWriter) error {
|
|
opts, err := repo.GetCachingOptions(ctx, c.svc.repositoryConfigFileName())
|
|
if err != nil {
|
|
return errors.Wrap(err, "error getting caching options")
|
|
}
|
|
|
|
changed := 0
|
|
|
|
if v := c.directory; v != "" {
|
|
log(ctx).Infof("setting cache directory to %v", v)
|
|
opts.CacheDirectory = v
|
|
changed++
|
|
}
|
|
|
|
if v := c.contentCacheSizeMB; v != -1 {
|
|
v *= 1e6 // convert MB to bytes
|
|
log(ctx).Infof("changing content cache size to %v", units.BytesString(v))
|
|
opts.ContentCacheSizeBytes = v
|
|
changed++
|
|
}
|
|
|
|
if v := c.contentCacheSizeLimitMB; v != -1 {
|
|
v *= 1e6 // convert MB to bytes
|
|
log(ctx).Infof("changing content cache size limit to %v", units.BytesString(v))
|
|
opts.ContentCacheSizeLimitBytes = v
|
|
changed++
|
|
}
|
|
|
|
if v := c.metadataCacheSizeMB; v != -1 {
|
|
v *= 1e6 // convert MB to bytes
|
|
log(ctx).Infof("changing metadata cache size to %v", units.BytesString(v))
|
|
opts.MetadataCacheSizeBytes = v
|
|
changed++
|
|
}
|
|
|
|
if v := c.metadataCacheSizeLimitMB; v != -1 {
|
|
v *= 1e6 // convert MB to bytes
|
|
log(ctx).Infof("changing metadata cache size limit to %v", units.BytesString(v))
|
|
opts.MetadataCacheSizeLimitBytes = v
|
|
changed++
|
|
}
|
|
|
|
if v := c.maxListCacheDuration; v != -1 {
|
|
log(ctx).Infof("changing list cache duration to %v", v)
|
|
opts.MaxListCacheDuration = content.DurationSeconds(v.Seconds())
|
|
changed++
|
|
}
|
|
|
|
if v := c.metadataMinSweepAge; v != -1 {
|
|
log(ctx).Infof("changing minimum metadata sweep age to %v", v)
|
|
opts.MinMetadataSweepAge = content.DurationSeconds(v.Seconds())
|
|
changed++
|
|
}
|
|
|
|
if v := c.contentMinSweepAge; v != -1 {
|
|
log(ctx).Infof("changing minimum content sweep age to %v", v)
|
|
opts.MinContentSweepAge = content.DurationSeconds(v.Seconds())
|
|
changed++
|
|
}
|
|
|
|
if v := c.indexMinSweepAge; v != -1 {
|
|
log(ctx).Infof("changing minimum index sweep age to %v", v)
|
|
opts.MinIndexSweepAge = content.DurationSeconds(v.Seconds())
|
|
changed++
|
|
}
|
|
|
|
if changed == 0 {
|
|
return errors.New("no changes")
|
|
}
|
|
|
|
//nolint:wrapcheck
|
|
return repo.SetCachingOptions(ctx, c.svc.repositoryConfigFileName(), opts)
|
|
}
|