From 582d5d526c2dcec70835a668933bab425229c188 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 2 Jul 2016 23:50:58 -0700 Subject: [PATCH] refactoring --- weed/storage/volume.go | 50 +--------------------------- weed/storage/volume_checking.go | 59 +++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 49 deletions(-) create mode 100644 weed/storage/volume_checking.go diff --git a/weed/storage/volume.go b/weed/storage/volume.go index baea18b46..5ec441f05 100644 --- a/weed/storage/volume.go +++ b/weed/storage/volume.go @@ -11,7 +11,6 @@ import ( "time" "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/util" ) type Volume struct { @@ -47,53 +46,6 @@ func loadVolumeWithoutIndex(dirname string, collection string, id VolumeId, need e = v.load(false, false, needleMapKind) return } -func verifyIndexFileIntegrity(indexFile *os.File) (indexSize int64, err error) { - if indexSize, err = util.GetFileSize(indexFile); err == nil { - if indexSize%NeedleIndexSize != 0 { - err = fmt.Errorf("index file's size is %d bytes, maybe corrupted", indexSize) - } - } - return -} -func readIndexEntryAtOffset(indexFile *os.File, offset int64) (bytes []byte, err error) { - if offset < 0 { - err = fmt.Errorf("offset %d for index file is invalid", offset) - return - } - bytes = make([]byte, NeedleIndexSize) - _, err = indexFile.ReadAt(bytes, offset) - return -} -func verifyNeedleIntegrity(datFile *os.File, v Version, offset int64, key uint64, size uint32) error { - n := new(Needle) - err := n.ReadData(datFile, offset, size, v) - if err != nil { - return err - } - if n.Id != key { - return fmt.Errorf("index key %#x does not match needle's Id %#x", key, n.Id) - } - return nil -} -func volumeDataIntegrityChecking(v *Volume, indexFile *os.File) error { - var indexSize int64 - var e error - if indexSize, e = verifyIndexFileIntegrity(indexFile); e != nil { - return fmt.Errorf("verifyIndexFileIntegrity %s failed: %v", indexFile.Name(), e) - } - if indexSize == 0 { - return nil - } - var lastIdxEntry []byte - if lastIdxEntry, e = readIndexEntryAtOffset(indexFile, indexSize-NeedleIndexSize); e != nil { - return fmt.Errorf("readLastIndexEntry %s failed: %v", indexFile.Name(), e) - } - key, offset, size := idxFileEntry(lastIdxEntry) - if e = verifyNeedleIntegrity(v.dataFile, v.Version(), int64(offset)*NeedlePaddingSize, key, size); e != nil { - return fmt.Errorf("verifyNeedleIntegrity %s failed: %v", indexFile.Name(), e) - } - return nil -} func (v *Volume) FileName() (fileName string) { if v.Collection == "" { fileName = path.Join(v.dir, v.Id.String()) @@ -153,7 +105,7 @@ func (v *Volume) load(alsoLoadIndex bool, createDatIfMissing bool, needleMapKind return fmt.Errorf("cannot write Volume Index %s.idx: %v", fileName, e) } } - if e = volumeDataIntegrityChecking(v, indexFile); e != nil { + if e = CheckVolumeDataIntegrity(v, indexFile); e != nil { v.readOnly = true glog.V(0).Infof("volumeDataIntegrityChecking failed %v", e) } diff --git a/weed/storage/volume_checking.go b/weed/storage/volume_checking.go new file mode 100644 index 000000000..00ce0aab1 --- /dev/null +++ b/weed/storage/volume_checking.go @@ -0,0 +1,59 @@ +package storage + +import ( + "fmt" + "os" + + "github.com/chrislusf/seaweedfs/weed/util" +) + +func CheckVolumeDataIntegrity(v *Volume, indexFile *os.File) error { + var indexSize int64 + var e error + if indexSize, e = verifyIndexFileIntegrity(indexFile); e != nil { + return fmt.Errorf("verifyIndexFileIntegrity %s failed: %v", indexFile.Name(), e) + } + if indexSize == 0 { + return nil + } + var lastIdxEntry []byte + if lastIdxEntry, e = readIndexEntryAtOffset(indexFile, indexSize-NeedleIndexSize); e != nil { + return fmt.Errorf("readLastIndexEntry %s failed: %v", indexFile.Name(), e) + } + key, offset, size := idxFileEntry(lastIdxEntry) + if e = verifyNeedleIntegrity(v.dataFile, v.Version(), int64(offset)*NeedlePaddingSize, key, size); e != nil { + return fmt.Errorf("verifyNeedleIntegrity %s failed: %v", indexFile.Name(), e) + } + return nil +} + +func verifyIndexFileIntegrity(indexFile *os.File) (indexSize int64, err error) { + if indexSize, err = util.GetFileSize(indexFile); err == nil { + if indexSize%NeedleIndexSize != 0 { + err = fmt.Errorf("index file's size is %d bytes, maybe corrupted", indexSize) + } + } + return +} + +func readIndexEntryAtOffset(indexFile *os.File, offset int64) (bytes []byte, err error) { + if offset < 0 { + err = fmt.Errorf("offset %d for index file is invalid", offset) + return + } + bytes = make([]byte, NeedleIndexSize) + _, err = indexFile.ReadAt(bytes, offset) + return +} + +func verifyNeedleIntegrity(datFile *os.File, v Version, offset int64, key uint64, size uint32) error { + n := new(Needle) + err := n.ReadData(datFile, offset, size, v) + if err != nil { + return err + } + if n.Id != key { + return fmt.Errorf("index key %#x does not match needle's Id %#x", key, n.Id) + } + return nil +}