Idempotent execution for repair and excess-replica cleanup jobs.
Job payloads are hints only. Every attempt strongly reloads the descriptor, membership, and locations and recomputes placement before touching bytes.
Summary
Functions
@spec perform(ExStorageService.Metadata.Models.Job.t(), ExStorageService.Context.t()) :: :ok | {:error, term()}
@spec perform( ExStorageService.Metadata.Models.Job.t(), ExStorageService.Context.t(), keyword() ) :: :ok | {:error, term()}