History

allow decommission to continue when healing (#15312)

Bonus: - heal buckets in-case during startup the new pools have bucket missing.

Harshavardhana committed 4 years ago

Commit e7ac1ea1 parent 5ac6d912 files · +21 −16Browse files

Unified · Split

2 files
  1. cmd/background-newdisks-heal-ops.go +12 −9
  2. cmd/erasure-server-pool-decom.go +9 −7
cmd/background-newdisks-heal-ops.go+12−9
@@ -94,7 +94,7 @@ func loadHealingTracker(ctx context.Context, disk StorageAPI) (*healingTracker, · 93 unmodified lines
9494 return nil, err
9595 }
9696 b, err := disk.ReadAll(ctx, minioMetaBucket,
97− pathJoin(bucketMetaPrefix, slashSeparator, healingTrackerFilename))
97+ pathJoin(bucketMetaPrefix, healingTrackerFilename))
9898 if err != nil {
9999 return nil, err
100100 }
@@ -155,14 +155,14 @@ func (h *healingTracker) save(ctx context.Context) error { · 54 unmodified lines
155155 }
156156 globalBackgroundHealState.updateHealStatus(h)
157157 return h.disk.WriteAll(ctx, minioMetaBucket,
158− pathJoin(bucketMetaPrefix, slashSeparator, healingTrackerFilename),
158+ pathJoin(bucketMetaPrefix, healingTrackerFilename),
159159 htrackerBytes)
160160 }
161161
162162 // delete the tracker on disk.
163163 func (h *healingTracker) delete(ctx context.Context) error {
164164 return h.disk.Delete(ctx, minioMetaBucket,
165− pathJoin(bucketMetaPrefix, slashSeparator, healingTrackerFilename),
165+ pathJoin(bucketMetaPrefix, healingTrackerFilename),
166166 DeleteOptions{
167167 Recursive: false,
168168 Force: false,
@@ -365,12 +365,15 @@ func healFreshDisk(ctx context.Context, z *erasureServerPools, endpoint Endpoint · 196 unmodified lines
365365 }
366366
367367 // Start or resume healing of this erasure set
368− err = z.serverPools[poolIdx].sets[setIdx].healErasureSet(ctx, tracker.QueuedBuckets, tracker)
369− if err != nil {
368+ if err = z.serverPools[poolIdx].sets[setIdx].healErasureSet(ctx, tracker.QueuedBuckets, tracker); err != nil {
370369 return err
371370 }
372371
373− logger.Info("Healing disk '%s' is complete (healed: %d, failed: %d).", disk, tracker.ItemsHealed, tracker.ItemsFailed)
372+ if tracker.ItemsFailed > 0 {
373+ logger.Info("Healing disk '%s' failed (healed: %d, failed: %d).", disk, tracker.ItemsHealed, tracker.ItemsFailed)
374+ } else {
375+ logger.Info("Healing disk '%s' complete (healed: %d, failed: %d).", disk, tracker.ItemsHealed, tracker.ItemsFailed)
376+ }
374377
375378 if serverDebugLog {
376379 tracker.printTo(os.Stdout)
@@ -378,6 +381,7 @@ func healFreshDisk(ctx context.Context, z *erasureServerPools, endpoint Endpoint · 1 unmodified line
378381 }
379382
380383 logger.LogIf(ctx, tracker.delete(ctx))
384+
381385 return nil
382386 }
383387
@@ -394,12 +398,11 @@ func monitorLocalDisksAndHeal(ctx context.Context, z *erasureServerPools) { · 10 unmodified lines
394398 case <-ctx.Done():
395399 return
396400 case <-diskCheckTimer.C:
397−
398401 healDisks := globalBackgroundHealState.getHealLocalDiskEndpoints()
399402 if len(healDisks) == 0 {
400403 // Reset for next interval.
401404 diskCheckTimer.Reset(defaultMonitorNewDiskInterval)
402− break
405+ continue
403406 }
404407
405408 // Reformat disks immediately
@@ -408,7 +411,7 @@ func monitorLocalDisksAndHeal(ctx context.Context, z *erasureServerPools) { · 2 unmodified lines
408411 logger.LogIf(ctx, err)
409412 // Reset for next interval.
410413 diskCheckTimer.Reset(defaultMonitorNewDiskInterval)
411− break
414+ continue
412415 }
413416
414417 for _, disk := range healDisks {
cmd/erasure-server-pool-decom.go+9−7
@@ -31,6 +31,7 @@ import ( · 30 unmodified lines
3131 "time"
3232
3333 "github.com/dustin/go-humanize"
34+ "github.com/minio/madmin-go"
3435 "github.com/minio/minio/internal/bucket/lifecycle"
3536 "github.com/minio/minio/internal/hash"
3637 "github.com/minio/minio/internal/logger"
@@ -967,15 +968,9 @@ func (z *erasureServerPools) getDecommissionPoolSpaceInfo(idx int) (pi poolSpace · 930 unmodified lines
967968 if idx+1 > len(z.serverPools) {
968969 return pi, errInvalidArgument
969970 }
971+
970972 info, _ := z.serverPools[idx].StorageInfo(context.Background())
971973 info.Backend = z.BackendInfo()
972− for _, disk := range info.Disks {
973− if disk.Healing {
974− return pi, decomError{
975− Err: fmt.Sprintf("%s drive is healing, decommission will not be started", disk.Endpoint),
976− }
977− }
978− }
979974
980975 usableTotal := int64(GetTotalUsableCapacity(info.Disks, info))
981976 usableFree := int64(GetTotalUsableCapacityFree(info.Disks, info))
@@ -1112,6 +1107,13 @@ func (z *erasureServerPools) StartDecommission(ctx context.Context, idx int) (er · 130 unmodified lines
11121107 return err
11131108 }
11141109
1110+ // Make sure to heal the buckets to ensure the new
1111+ // pool has the new buckets, this is to avoid
1112+ // failures later.
1113+ for _, bucket := range buckets {
1114+ z.HealBucket(ctx, bucket.Name, madmin.HealOpts{})
1115+ }
1116+
11151117 decomBuckets := make([]decomBucketInfo, len(buckets))
11161118 for i := range buckets {
11171119 decomBuckets[i] = decomBucketInfo{

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t