{"record":{"id":"a9c2f2253d5a8585","repo":"kopia/kopia","slug":"epoch-manager-parameters","errorCode":null,"errorMessage":"epoch manager parameters","messagePattern":"epoch manager parameters","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/epoch/epoch_manager.go","lineNumber":460,"sourceCode":"\t\tDeletedTotalSize:   deletedTotalSize,\n\t}, nil\n}\n\nfunc blobSetWrittenEarlyEnough(replacementSet []blob.Metadata, maxReplacementTime time.Time) bool {\n\tmaxTime := blob.MaxTimestamp(replacementSet)\n\tif maxTime.IsZero() {\n\t\treturn false\n\t}\n\n\t// compaction set was written sufficiently long ago to be reliably discovered by all\n\t// other clients - we can delete uncompacted blobs for this epoch.\n\treturn blob.MaxTimestamp(replacementSet).Before(maxReplacementTime)\n}\n\nfunc (e *Manager) getParameters(ctx context.Context) (*Parameters, error) {\n\temp, err := e.paramProvider.GetParameters(ctx)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"epoch manager parameters\")\n\t}\n\n\treturn emp, nil\n}\n\nfunc (e *Manager) refreshLocked(ctx context.Context) error {\n\tif ctx.Err() != nil {\n\t\treturn errors.Wrap(ctx.Err(), \"refreshLocked\")\n\t}\n\n\tp, err := e.getParameters(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tnextDelayTime := initialRefreshAttemptSleep\n\n\tif !p.Enabled {","sourceCodeStart":442,"sourceCodeEnd":478,"githubUrl":"https://github.com/kopia/kopia/blob/82495e54b584c1ef6073c9e1be048f57f8aef078/internal/epoch/epoch_manager.go#L442-L478","documentation":"This error wraps a failure from the epoch manager's configured paramProvider (e.getParameters calling e.paramProvider.GetParameters). The epoch manager cannot obtain its runtime Parameters (e.g. Enabled flag, timing windows, retention settings) from the provider, so any refresh or cleanup operation is aborted. It is a pass-through wrapper preserving the provider's underlying cause (context cancellation, network/backend error, etc.).","triggerScenarios":"Any call to CleanupMarkers, CleanupSupersededIndexes, refreshLocked, MaybeGenerateRangeCheckpoint, refreshAttemptLocked, or MaybeAdvanceWriteEpoch when paramProvider.GetParameters(ctx) returns an error — e.g. ctx cancelled, backing store unreachable, or provider misconfigured.","commonSituations":"Parameter store (blob storage / database) temporarily unavailable or credentials expired; context deadline exceeded during long-running maintenance; provider implementation returning errors after a version upgrade changed the parameters source.","solutions":["Inspect the wrapped cause ('error loading ...' underneath) and fix the paramProvider's backend connectivity or credentials.","Verify the context passed to the epoch manager is not cancelled or timing out prematurely; extend the deadline if maintenance runs long.","Confirm the parameter provider implementation is registered and returns valid Parameters (Enabled, retention, timing fields).","Retry the operation — getParameters is called repeatedly and succeeds once the provider recovers."],"exampleFix":"// before: short-lived context for maintenance\nctx, cancel := context.WithTimeout(parent, 2*time.Second)\nerr := epochMgr.CleanupMarkers(ctx)\n\n// after: adequate deadline + retry on parameter provider errors\nctx, cancel := context.WithTimeout(parent, 5*time.Minute)\nif err := epochMgr.CleanupMarkers(ctx); err != nil && strings.Contains(err.Error(), \"epoch manager parameters\") {\n    time.Sleep(time.Second)\n    err = epochMgr.CleanupMarkers(ctx)\n}","handlingStrategy":"try-catch","validationCode":"if ctx.Err() != nil { return fmt.Errorf(\"context invalid before epoch manager call: %w\", ctx.Err()) }","typeGuard":null,"tryCatchPattern":"if err := mgr.MaybeAdvanceWriteEpoch(ctx); err != nil {\n    if strings.Contains(err.Error(), \"epoch manager parameters\") {\n        // underlying param provider failure; check provider backend health, retry with backoff\n    }\n    return err\n}","preventionTips":["Health-check the parameter provider backend before scheduling epoch maintenance.","Use contexts with deadlines long enough for full refresh/cleanup cycles.","Monitor the 'epoch manager parameters' wrapped error as a provider-health signal.","Keep paramProvider credentials valid and rotated ahead of expiry."],"tags":["epoch-manager","parameter-provider","wrapped-error"],"backgroundTag":"upstream-api-error","analyzedSha":"82495e54b584c1ef6073c9e1be048f57f8aef078","analyzedAt":"2026-09-07T20:35:21.689Z","contentChangedAt":"2026-09-07T20:35:21.689Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}