diff --git a/cmd/erasure-server-pool-decom.go b/cmd/erasure-server-pool-decom.go index 4985944f8..30f1fe132 100644 --- a/cmd/erasure-server-pool-decom.go +++ b/cmd/erasure-server-pool-decom.go @@ -182,7 +182,9 @@ func (p *poolMeta) returnResumablePools() []PoolStatus { } func (p *poolMeta) DecommissionComplete(idx int) bool { - if p.Pools[idx].Decommission != nil && !p.Pools[idx].Decommission.Complete { + if p.Pools[idx].Decommission != nil && + !p.Pools[idx].Decommission.Complete && + !p.Pools[idx].Decommission.Canceled { p.Pools[idx].LastUpdate = UTCNow() p.Pools[idx].Decommission.Complete = true p.Pools[idx].Decommission.Failed = false @@ -193,7 +195,9 @@ func (p *poolMeta) DecommissionComplete(idx int) bool { } func (p *poolMeta) DecommissionFailed(idx int) bool { - if p.Pools[idx].Decommission != nil && !p.Pools[idx].Decommission.Failed { + if p.Pools[idx].Decommission != nil && + !p.Pools[idx].Decommission.Failed && + !p.Pools[idx].Decommission.Canceled { p.Pools[idx].LastUpdate = UTCNow() p.Pools[idx].Decommission.StartTime = time.Time{} p.Pools[idx].Decommission.Complete = false diff --git a/cmd/erasure-server-pool-decom_test.go b/cmd/erasure-server-pool-decom_test.go index b1312bba0..6bdee7d74 100644 --- a/cmd/erasure-server-pool-decom_test.go +++ b/cmd/erasure-server-pool-decom_test.go @@ -197,3 +197,29 @@ func TestPoolMetaValidate(t *testing.T) { }) } } + +func TestPoolMetaDecommissionCancellationIsTerminal(t *testing.T) { + t.Parallel() + + canceled := poolMeta{Pools: []PoolStatus{{Decommission: &PoolDecommissionInfo{}}}} + if !canceled.DecommissionCancel(0) { + t.Fatal("failed to record cancellation") + } + if canceled.DecommissionFailed(0) { + t.Fatal("a canceled decommission was changed to failed") + } + if canceled.DecommissionComplete(0) { + t.Fatal("a canceled decommission was changed to complete") + } + if got := canceled.returnResumablePools(); len(got) != 0 { + t.Fatalf("canceled decommission is resumable: %+v", got) + } + + failed := poolMeta{Pools: []PoolStatus{{Decommission: &PoolDecommissionInfo{}}}} + if !failed.DecommissionFailed(0) { + t.Fatal("failed to record failure") + } + if got := failed.returnResumablePools(); len(got) != 1 { + t.Fatalf("failed decommission is not resumable: %+v", got) + } +}