mirror of
https://github.com/minio/minio.git
synced 2025-11-07 12:52:58 -05:00
do not panic on rebalance during server restarts (#19563)
This PR makes a feasible approach to handle all the scenarios that we must face to avoid returning "panic." Instead, we must return "errServerNotInitialized" when a bucketMetadataSys.Get() is called, allowing the caller to retry their operation and wait. Bonus fix the way data-usage-cache stores the object. Instead of storing usage-cache.bin with the bucket as `.minio.sys/buckets`, the `buckets` must be relative to the bucket `.minio.sys` as part of the object name. Otherwise, there is no way to decommission entries at `.minio.sys/buckets` and their final erasure set positions. A bucket must never have a `/` in it. Adds code to read() from existing data-usage.bin upon upgrade.
This commit is contained in:
@@ -108,6 +108,16 @@ func reliableMkdirAll(dirPath string, mode os.FileMode, baseDir string) (err err
|
||||
// Retry only for the first retryable error.
|
||||
if osIsNotExist(err) && i == 0 {
|
||||
i++
|
||||
// Determine if os.NotExist error is because of
|
||||
// baseDir's parent being present, retry it once such
|
||||
// that the MkdirAll is retried once for the parent
|
||||
// of dirPath.
|
||||
// Because it is worth a retry to skip a different
|
||||
// baseDir which is slightly higher up the depth.
|
||||
nbaseDir := path.Dir(baseDir)
|
||||
if baseDir != "" && nbaseDir != "" && nbaseDir != SlashSeparator {
|
||||
baseDir = nbaseDir
|
||||
}
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user