diff --git a/cmd/format-xl.go b/cmd/format-xl.go index 18d936378..9d96674ea 100644 --- a/cmd/format-xl.go +++ b/cmd/format-xl.go @@ -314,6 +314,11 @@ func shouldInitXLDisks(errs []error) bool { return countErrs(errs, errUnformattedDisk) == len(errs) } +// Check if unformatted disks are equal to write quorum. +func quorumUnformattedDisks(errs []error) bool { + return countErrs(errs, errUnformattedDisk) >= (len(errs)/2)+1 +} + // loadFormatXLAll - load all format config from all input disks in parallel. func loadFormatXLAll(storageDisks []StorageAPI) ([]*formatXLV3, []error) { // Initialize sync waitgroup. diff --git a/cmd/prepare-storage.go b/cmd/prepare-storage.go index 87d80ceca..16440c09f 100644 --- a/cmd/prepare-storage.go +++ b/cmd/prepare-storage.go @@ -145,13 +145,23 @@ func connectLoadInitFormats(firstDisk bool, endpoints EndpointList, setCount, dr } } - if shouldInitXLDisks(sErrs) { - if !firstDisk { - return nil, errNotFirstDisk - } + // All disks report unformatted we should initialized everyone. + if shouldInitXLDisks(sErrs) && firstDisk { return initFormatXL(context.Background(), storageDisks, setCount, drivesPerSet) } + // Return error when quorum unformatted disks - indicating we are + // waiting for first server to be online. + if quorumUnformattedDisks(sErrs) && !firstDisk { + return nil, errNotFirstDisk + } + + // Return error when quorum unformatted disks but waiting for rest + // of the servers to be online. + if quorumUnformattedDisks(sErrs) && firstDisk { + return nil, errFirstDiskWait + } + // Following function is added to fix a regressions which was introduced // in release RELEASE.2018-03-16T22-52-12Z after migrating v1 to v2 to v3. // This migration failed to capture '.This' field properly which indicates @@ -219,6 +229,10 @@ func waitForFormatXL(ctx context.Context, firstDisk bool, endpoints EndpointList // Fresh setup, wait for first server to be up. logger.Info("Waiting for the first server to format the disks.") continue + case errFirstDiskWait: + // Fresh setup, wait for other servers to come up. + logger.Info("Waiting for all other servers to be online to format the disks.") + continue case errXLReadQuorum: // no quorum available continue to wait for minimum number of servers. logger.Info("Waiting for a minimum of %d disks to come online (elapsed %s)\n", len(endpoints)/2, getElapsedTime()) diff --git a/cmd/typed-errors.go b/cmd/typed-errors.go index b2cb978ab..60ecab559 100644 --- a/cmd/typed-errors.go +++ b/cmd/typed-errors.go @@ -62,3 +62,6 @@ var errInvalidRangeSource = errors.New("Range specified exceeds source object si // error returned by disks which are to be initialized are waiting for the // first server to initialize them in distributed set to initialize them. var errNotFirstDisk = errors.New("Not first disk") + +// error returned by first disk waiting to initialize other servers. +var errFirstDiskWait = errors.New("Waiting on other disks")