mirror of
https://github.com/minio/minio.git
synced 2025-11-20 01:50:24 -05:00
Xl layer selfheal quorum2
* xl/selfheal: selfheal based on read quorum on GET * xl: getReadableDisks() also returns whether self-heal is needed so that this info can be used by ReadFile/SelfHeal/StatFile. * xl: trigger selfheal from StatFile.
This commit is contained in:
committed by
Harshavardhana
parent
9bd9441107
commit
becc814531
62
xl-v1.go
62
xl-v1.go
@@ -21,10 +21,8 @@ import (
|
||||
"os"
|
||||
slashpath "path"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/klauspost/reedsolomon"
|
||||
)
|
||||
@@ -46,9 +44,6 @@ type XL struct {
|
||||
nameSpaceLockMapMutex *sync.Mutex
|
||||
readQuorum int
|
||||
writeQuorum int
|
||||
|
||||
// Heal input/output channel.
|
||||
selfHealCh chan selfHeal
|
||||
}
|
||||
|
||||
// lockNS - locks the given resource, using a previously allocated
|
||||
@@ -155,9 +150,6 @@ func newXL(disks ...string) (StorageAPI, error) {
|
||||
xl.writeQuorum = len(xl.storageDisks)
|
||||
}
|
||||
|
||||
// Start self heal go routine, taking inputs over self heal channel.
|
||||
xl.selfHealRoutine()
|
||||
|
||||
// Return successfully initialized.
|
||||
return xl, nil
|
||||
}
|
||||
@@ -300,23 +292,6 @@ func (xl XL) isLeafDirectory(volume, leafPath string) (isLeaf bool) {
|
||||
return isLeaf
|
||||
}
|
||||
|
||||
// Returns file size from the metadata.
|
||||
func getFileSize(metadata fileMetadata) (int64, error) {
|
||||
size := metadata.Get("file.size")
|
||||
if size == nil {
|
||||
return 0, errFileSize
|
||||
}
|
||||
return strconv.ParseInt(size[0], 10, 64)
|
||||
}
|
||||
|
||||
func getModTime(metadata fileMetadata) (time.Time, error) {
|
||||
modTime := metadata.Get("file.modTime")
|
||||
if modTime == nil {
|
||||
return time.Time{}, errModTime
|
||||
}
|
||||
return time.Parse(timeFormatAMZ, modTime[0])
|
||||
}
|
||||
|
||||
// extractMetadata - extract file metadata.
|
||||
func (xl XL) extractMetadata(volume, path string) (fileMetadata, error) {
|
||||
metadataFilePath := slashpath.Join(path, metadataFile)
|
||||
@@ -348,11 +323,11 @@ func (xl XL) extractFileInfo(volume, path string) (FileInfo, error) {
|
||||
if err != nil {
|
||||
return FileInfo{}, err
|
||||
}
|
||||
fileSize, err := getFileSize(metadata)
|
||||
fileSize, err := metadata.GetSize()
|
||||
if err != nil {
|
||||
return FileInfo{}, err
|
||||
}
|
||||
fileModTime, err := getModTime(metadata)
|
||||
fileModTime, err := metadata.GetModTime()
|
||||
if err != nil {
|
||||
return FileInfo{}, err
|
||||
}
|
||||
@@ -438,14 +413,39 @@ func (xl XL) StatFile(volume, path string) (FileInfo, error) {
|
||||
return FileInfo{}, errInvalidArgument
|
||||
}
|
||||
|
||||
// Extract metadata.
|
||||
fileInfo, err := xl.extractFileInfo(volume, path)
|
||||
// Acquire read lock.
|
||||
readLock := true
|
||||
xl.lockNS(volume, path, readLock)
|
||||
_, metadata, doSelfHeal, err := xl.getReadableDisks(volume, path)
|
||||
xl.unlockNS(volume, path, readLock)
|
||||
if err != nil {
|
||||
return FileInfo{}, err
|
||||
}
|
||||
|
||||
// Return fileinfo.
|
||||
return fileInfo, nil
|
||||
if doSelfHeal {
|
||||
if err = xl.selfHeal(volume, path); err != nil {
|
||||
return FileInfo{}, err
|
||||
}
|
||||
}
|
||||
|
||||
// Extract metadata.
|
||||
size, err := metadata.GetSize()
|
||||
if err != nil {
|
||||
return FileInfo{}, err
|
||||
}
|
||||
modTime, err := metadata.GetModTime()
|
||||
if err != nil {
|
||||
return FileInfo{}, err
|
||||
}
|
||||
|
||||
// Return file info.
|
||||
return FileInfo{
|
||||
Volume: volume,
|
||||
Name: path,
|
||||
Size: size,
|
||||
ModTime: modTime,
|
||||
Mode: os.FileMode(0644),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// DeleteFile - delete a file
|
||||
|
||||
Reference in New Issue
Block a user