diff --git a/cmd/prepare-storage.go b/cmd/prepare-storage.go index 23e5afd01..17cf3f7f4 100644 --- a/cmd/prepare-storage.go +++ b/cmd/prepare-storage.go @@ -132,13 +132,14 @@ func prepForInitXL(firstDisk bool, sErrs []error, diskCount int) InitActions { } quorum := diskCount/2 + 1 + readQuorum := diskCount / 2 disksOffline := errMap[errDiskNotFound] disksFormatted := errMap[nil] disksUnformatted := errMap[errUnformattedDisk] disksCorrupted := errMap[errCorruptedFormat] // No Quorum lots of offline disks, wait for quorum. - if disksOffline >= quorum { + if disksOffline > readQuorum { return WaitForQuorum } @@ -168,7 +169,7 @@ func prepForInitXL(firstDisk bool, sErrs []error, diskCount int) InitActions { } // Already formatted and in quorum, proceed to initialization of object layer. - if disksFormatted >= quorum { + if disksFormatted >= readQuorum { if disksFormatted+disksOffline == diskCount { return InitObjectLayer } @@ -293,7 +294,7 @@ func initStorageDisks(endpoints []*url.URL) ([]StorageAPI, error) { return storageDisks, nil } -// Format disks before initialization object layer. +// Format disks before initialization of object layer. func waitForFormatXLDisks(firstDisk bool, endpoints []*url.URL, storageDisks []StorageAPI) (formattedDisks []StorageAPI, err error) { if len(endpoints) == 0 { return nil, errInvalidArgument diff --git a/cmd/xl-v1.go b/cmd/xl-v1.go index d0cd53bed..83b319181 100644 --- a/cmd/xl-v1.go +++ b/cmd/xl-v1.go @@ -155,6 +155,16 @@ func newXLObjects(storageDisks []StorageAPI) (ObjectLayer, error) { xl.readQuorum = readQuorum xl.writeQuorum = writeQuorum + // If the number of offline servers is equal to the readQuorum + // (i.e. the number of online servers also equals the + // readQuorum), we cannot perform quick-heal (no + // write-quorum). However reads may still be possible, so we + // skip quick-heal in this case, and continue. + offlineCount := len(newStorageDisks) - diskCount(newStorageDisks) + if offlineCount == readQuorum { + return xl, nil + } + // Do a quick heal on the buckets themselves for any discrepancies. return xl, quickHeal(xl.storageDisks, xl.writeQuorum, xl.readQuorum) }