Skip to content

Commit

Permalink
Configurable Kopia Maintenance Interval
Browse files Browse the repository at this point in the history
Signed-off-by: Tiger Kaovilai <[email protected]>
  • Loading branch information
kaovilai committed Jan 15, 2025
1 parent 3eaa739 commit 14200ad
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 11 deletions.
1 change: 1 addition & 0 deletions changelogs/unreleased/8581-kaovilai
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Configurable Kopia Maintenance Interval. repo-maintenance-job-configmap adds an option for `fullMaintenanceInterval` where fastGC (12 hours), and eagerGC (6 hours).
3 changes: 3 additions & 0 deletions pkg/repository/maintenance.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"

velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo"
"github.com/vmware-tanzu/velero/pkg/util/kube"
)

Expand All @@ -48,6 +49,8 @@ type JobConfigs struct {

// PodResources is the config for the CPU and memory resources setting.
PodResources *kube.PodResources `json:"podResources,omitempty"`
// FullMaintenanceInterval defines how often Full Maintenance Tasks are due on the repository.
FullMaintenanceInterval udmrepo.FullMaintenanceIntervalOptions `json:"fullMaintenanceInterval,omitempty"`
}

func GenerateJobName(repo string) string {
Expand Down
16 changes: 14 additions & 2 deletions pkg/repository/manager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -348,9 +348,21 @@ func (m *manager) assembleRepoParam(repo *velerov1api.BackupRepository) (provide
if err := m.client.Get(context.Background(), client.ObjectKey{Namespace: m.namespace, Name: repo.Spec.BackupStorageLocation}, bsl); err != nil {
return provider.RepoParam{}, errors.WithStack(err)
}
jobConfig, err := repository.GetMaintenanceJobConfig(
context.Background(),
m.client,
m.log,
m.namespace,
m.repoMaintenanceJobConfig,
repo,
)
if err != nil {
return provider.RepoParam{}, err
}

Check warning on line 361 in pkg/repository/manager/manager.go

View check run for this annotation

Codecov / codecov/patch

pkg/repository/manager/manager.go#L351-L361

Added lines #L351 - L361 were not covered by tests
return provider.RepoParam{
BackupLocation: bsl,
BackupRepo: repo,
BackupLocation: bsl,
BackupRepo: repo,
FullMaintenanceInterval: jobConfig.FullMaintenanceInterval,

Check warning on line 365 in pkg/repository/manager/manager.go

View check run for this annotation

Codecov / codecov/patch

pkg/repository/manager/manager.go#L363-L365

Added lines #L363 - L365 were not covered by tests
}, nil
}

Expand Down
6 changes: 4 additions & 2 deletions pkg/repository/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ import (
"time"

velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo"
)

// RepoParam includes the parameters to manipulate a backup repository
type RepoParam struct {
BackupLocation *velerov1api.BackupStorageLocation
BackupRepo *velerov1api.BackupRepository
BackupLocation *velerov1api.BackupStorageLocation
BackupRepo *velerov1api.BackupRepository
FullMaintenanceInterval udmrepo.FullMaintenanceIntervalOptions
}

// Provider defines the methods to manipulate a backup repository
Expand Down
7 changes: 7 additions & 0 deletions pkg/repository/provider/unified_repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ func (urp *unifiedRepoProvider) InitRepo(ctx context.Context, param RepoParam) e
),
udmrepo.WithStoreOptions(urp, param),
udmrepo.WithDescription(repoConnectDesc),
udmrepo.WithFullMaintenanceInterval(param.FullMaintenanceInterval),
)

if err != nil {
Expand Down Expand Up @@ -142,6 +143,7 @@ func (urp *unifiedRepoProvider) ConnectToRepo(ctx context.Context, param RepoPar
),
udmrepo.WithStoreOptions(urp, param),
udmrepo.WithDescription(repoConnectDesc),
udmrepo.WithFullMaintenanceInterval(param.FullMaintenanceInterval),
)

if err != nil {
Expand Down Expand Up @@ -178,6 +180,7 @@ func (urp *unifiedRepoProvider) PrepareRepo(ctx context.Context, param RepoParam
),
udmrepo.WithStoreOptions(urp, param),
udmrepo.WithDescription(repoConnectDesc),
udmrepo.WithFullMaintenanceInterval(param.FullMaintenanceInterval),
)

if err != nil {
Expand Down Expand Up @@ -216,6 +219,7 @@ func (urp *unifiedRepoProvider) BoostRepoConnect(ctx context.Context, param Repo
udmrepo.WithPassword(urp, param),
udmrepo.WithConfigFile(urp.workPath, string(param.BackupRepo.UID)),
udmrepo.WithDescription(repoConnectDesc),
udmrepo.WithFullMaintenanceInterval(param.FullMaintenanceInterval),
)

if err != nil {
Expand Down Expand Up @@ -247,6 +251,7 @@ func (urp *unifiedRepoProvider) PruneRepo(ctx context.Context, param RepoParam)
udmrepo.WithPassword(urp, param),
udmrepo.WithConfigFile(urp.workPath, string(param.BackupRepo.UID)),
udmrepo.WithDescription(repoOpDescMaintain),
udmrepo.WithFullMaintenanceInterval(param.FullMaintenanceInterval),
)

if err != nil {
Expand Down Expand Up @@ -281,6 +286,7 @@ func (urp *unifiedRepoProvider) Forget(ctx context.Context, snapshotID string, p
udmrepo.WithPassword(urp, param),
udmrepo.WithConfigFile(urp.workPath, string(param.BackupRepo.UID)),
udmrepo.WithDescription(repoOpDescForget),
udmrepo.WithFullMaintenanceInterval(param.FullMaintenanceInterval),
)

if err != nil {
Expand Down Expand Up @@ -328,6 +334,7 @@ func (urp *unifiedRepoProvider) BatchForget(ctx context.Context, snapshotIDs []s
udmrepo.WithPassword(urp, param),
udmrepo.WithConfigFile(urp.workPath, string(param.BackupRepo.UID)),
udmrepo.WithDescription(repoOpDescForget),
udmrepo.WithFullMaintenanceInterval(param.FullMaintenanceInterval),
)

if err != nil {
Expand Down
9 changes: 8 additions & 1 deletion pkg/repository/udmrepo/kopialib/lib_repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,14 @@ func writeInitParameters(ctx context.Context, repoOption udmrepo.RepoOptions, lo
logger.Infof("Quick maintenance interval change from %v to %v", p.QuickCycle.Interval, overwriteQuickMaintainInterval)
p.QuickCycle.Interval = overwriteQuickMaintainInterval
}

if repoOption.FullMaintenanceInterval == udmrepo.FastGC {
logger.Infof("Full maintenance interval change from %v to %v", p.FullCycle.Interval, udmrepo.FastGCInterval)
p.FullCycle.Interval = udmrepo.FastGCInterval
}

Check warning on line 606 in pkg/repository/udmrepo/kopialib/lib_repo.go

View check run for this annotation

Codecov / codecov/patch

pkg/repository/udmrepo/kopialib/lib_repo.go#L604-L606

Added lines #L604 - L606 were not covered by tests
if repoOption.FullMaintenanceInterval == udmrepo.EagerGC {
logger.Infof("Full maintenance interval change from %v to %v", p.FullCycle.Interval, udmrepo.EagerGCInterval)
p.FullCycle.Interval = udmrepo.EagerGCInterval
}

Check warning on line 610 in pkg/repository/udmrepo/kopialib/lib_repo.go

View check run for this annotation

Codecov / codecov/patch

pkg/repository/udmrepo/kopialib/lib_repo.go#L608-L610

Added lines #L608 - L610 were not covered by tests
p.Owner = r.ClientOptions().UsernameAtHost()

if err := maintenance.SetParams(ctx, w, &p); err != nil {
Expand Down
28 changes: 23 additions & 5 deletions pkg/repository/udmrepo/repo_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"os"
"path/filepath"
"strings"
"time"
)

const (
Expand Down Expand Up @@ -65,13 +66,19 @@ const (

StoreOptionCacheLimit = "cacheLimitMB"

ThrottleOptionReadOps = "readOPS"
ThrottleOptionWriteOps = "writeOPS"
ThrottleOptionListOps = "listOPS"
ThrottleOptionUploadBytes = "uploadBytes"
ThrottleOptionDownloadBytes = "downloadBytes"
ThrottleOptionReadOps = "readOPS"
ThrottleOptionWriteOps = "writeOPS"
ThrottleOptionListOps = "listOPS"
ThrottleOptionUploadBytes = "uploadBytes"
ThrottleOptionDownloadBytes = "downloadBytes"
FastGC FullMaintenanceIntervalOptions = "fastGC"
FastGCInterval time.Duration = 12 * time.Hour
EagerGC FullMaintenanceIntervalOptions = "eagerGC"
EagerGCInterval time.Duration = 6 * time.Hour
)

type FullMaintenanceIntervalOptions string

const (
defaultUsername = "default"
defaultDomain = "default"
Expand All @@ -88,6 +95,9 @@ type RepoOptions struct {
GeneralOptions map[string]string
// StorageOptions takes storage specific options
StorageOptions map[string]string
// FullMaintenanceInterval will overwrite kopia maintenance interval
// options are fastGC for 12 hours, eagerGC for 6 hours
FullMaintenanceInterval FullMaintenanceIntervalOptions

// Description is a description of the backup repository/backup repository operation.
// It is for logging/debugging purpose only and doesn't control any behavior of the backup repository.
Expand Down Expand Up @@ -156,6 +166,14 @@ func WithGenOptions(genOptions map[string]string) func(*RepoOptions) error {
}
}

// WithFullMaintenanceInterval
func WithFullMaintenanceInterval(interval FullMaintenanceIntervalOptions) func(*RepoOptions) error {
return func(options *RepoOptions) error {
options.FullMaintenanceInterval = interval
return nil
}
}

// WithStoreOptions sets the StorageOptions to RepoOptions, the store options are acquired through
// the provided interface
func WithStoreOptions(getter StoreOptionsGetter, param interface{}) func(*RepoOptions) error {
Expand Down
17 changes: 16 additions & 1 deletion site/content/docs/main/repository-maintenance.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,23 @@ velero install --default-repo-maintain-frequency <DURATION>
```
For Kopia the default maintenance frequency is 1 hour, and Restic is 7 * 24 hours.

### Full Maintenance Interval customization
The full maintenance interval defaults to kopia defaults of 24 hours. Velero provide two override options under `fullMaintenanceInterval` configuration.
- fastGC: 12 hours
- eagerGC: 6 hours

Example of the ```repo-maintenance-job-configmap``` ConfigMap for the above scenario is as below:
```bash
cat <<EOF > repo-maintenance-job-config.json
{
"global": {
fullMaintenanceInterval: "fastGC"
}
}
```

### Others
Maintenance jobs will inherit the labels, annotations, toleration, nodeSelector, service account, image, environment variables, cloud-credentials etc. from Velero deployment.

[1]: velero-install.md#usage
[2]: node-agent-concurrency.md
[2]: node-agent-concurrency.md

0 comments on commit 14200ad

Please sign in to comment.