mirror of
https://github.com/minio/minio.git
synced 2025-04-17 01:10:29 -04:00
honor maxWait heal config when maxIO hits (#11338)
This commit is contained in:
parent
0bf2d84f96
commit
82f0471d1b
@ -750,16 +750,19 @@ func (h *healSequence) healItemsFromSourceCh() error {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var itemType madmin.HealItemType
|
var itemType madmin.HealItemType
|
||||||
switch {
|
switch source.bucket {
|
||||||
case source.bucket == nopHeal:
|
case nopHeal:
|
||||||
continue
|
continue
|
||||||
case source.bucket == SlashSeparator:
|
case SlashSeparator:
|
||||||
itemType = madmin.HealItemMetadata
|
itemType = madmin.HealItemMetadata
|
||||||
case source.bucket != "" && source.object == "":
|
|
||||||
itemType = madmin.HealItemBucket
|
|
||||||
default:
|
default:
|
||||||
itemType = madmin.HealItemObject
|
if source.object == "" {
|
||||||
|
itemType = madmin.HealItemBucket
|
||||||
|
} else {
|
||||||
|
itemType = madmin.HealItemObject
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := h.queueHealTask(source, itemType); err != nil {
|
if err := h.queueHealTask(source, itemType); err != nil {
|
||||||
|
@ -61,7 +61,6 @@ func waitForLowHTTPReq(maxIO int, maxWait time.Duration) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// At max 10 attempts to wait with 100 millisecond interval before proceeding
|
// At max 10 attempts to wait with 100 millisecond interval before proceeding
|
||||||
waitCount := 10
|
|
||||||
waitTick := 100 * time.Millisecond
|
waitTick := 100 * time.Millisecond
|
||||||
|
|
||||||
// Bucket notification and http trace are not costly, it is okay to ignore them
|
// Bucket notification and http trace are not costly, it is okay to ignore them
|
||||||
@ -70,14 +69,21 @@ func waitForLowHTTPReq(maxIO int, maxWait time.Duration) {
|
|||||||
return maxIO + int(globalHTTPListen.NumSubscribers()) + int(globalHTTPTrace.NumSubscribers())
|
return maxIO + int(globalHTTPListen.NumSubscribers()) + int(globalHTTPTrace.NumSubscribers())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tmpMaxWait := maxWait
|
||||||
if httpServer := newHTTPServerFn(); httpServer != nil {
|
if httpServer := newHTTPServerFn(); httpServer != nil {
|
||||||
// Any requests in progress, delay the heal.
|
// Any requests in progress, delay the heal.
|
||||||
for httpServer.GetRequestCount() >= maxIOFn() {
|
for httpServer.GetRequestCount() >= maxIOFn() {
|
||||||
time.Sleep(waitTick)
|
if tmpMaxWait > 0 {
|
||||||
waitCount--
|
if tmpMaxWait < waitTick {
|
||||||
if waitCount == 0 {
|
time.Sleep(tmpMaxWait)
|
||||||
|
} else {
|
||||||
|
time.Sleep(waitTick)
|
||||||
|
}
|
||||||
|
tmpMaxWait = tmpMaxWait - waitTick
|
||||||
|
}
|
||||||
|
if tmpMaxWait <= 0 {
|
||||||
if intDataUpdateTracker.debug {
|
if intDataUpdateTracker.debug {
|
||||||
logger.Info("waitForLowHTTPReq: waited %d times, resuming", waitCount)
|
logger.Info("waitForLowHTTPReq: waited max %s, resuming", maxWait)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -91,20 +97,22 @@ func (h *healRoutine) run(ctx context.Context, objAPI ObjectLayer) {
|
|||||||
select {
|
select {
|
||||||
case task, ok := <-h.tasks:
|
case task, ok := <-h.tasks:
|
||||||
if !ok {
|
if !ok {
|
||||||
break
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var res madmin.HealResultItem
|
var res madmin.HealResultItem
|
||||||
var err error
|
var err error
|
||||||
switch {
|
switch task.bucket {
|
||||||
case task.bucket == nopHeal:
|
case nopHeal:
|
||||||
continue
|
continue
|
||||||
case task.bucket == SlashSeparator:
|
case SlashSeparator:
|
||||||
res, err = healDiskFormat(ctx, objAPI, task.opts)
|
res, err = healDiskFormat(ctx, objAPI, task.opts)
|
||||||
case task.bucket != "" && task.object == "":
|
default:
|
||||||
res, err = objAPI.HealBucket(ctx, task.bucket, task.opts)
|
if task.object == "" {
|
||||||
case task.bucket != "" && task.object != "":
|
res, err = objAPI.HealBucket(ctx, task.bucket, task.opts)
|
||||||
res, err = objAPI.HealObject(ctx, task.bucket, task.object, task.versionID, task.opts)
|
} else {
|
||||||
|
res, err = objAPI.HealObject(ctx, task.bucket, task.object, task.versionID, task.opts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
task.responseCh <- healResult{result: res, err: err}
|
task.responseCh <- healResult{result: res, err: err}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user