aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/volume_checking.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2017-01-06 10:22:20 -0800
committerChris Lu <chris.lu@gmail.com>2017-01-06 10:22:20 -0800
commit13e7069eb9cd72f94e72acb8fbbc9dd0307da703 (patch)
treea093cbe0df8c2d06ea335e616bb5246f9c45ea04 /weed/storage/volume_checking.go
parent54dd925283f443b09db77717c86eea5bf0f9d740 (diff)
downloadseaweedfs-13e7069eb9cd72f94e72acb8fbbc9dd0307da703.tar.xz
seaweedfs-13e7069eb9cd72f94e72acb8fbbc9dd0307da703.zip
keep track of total data file size
Diffstat (limited to 'weed/storage/volume_checking.go')
-rw-r--r--weed/storage/volume_checking.go22
1 files changed, 14 insertions, 8 deletions
diff --git a/weed/storage/volume_checking.go b/weed/storage/volume_checking.go
index 48f707594..6d4011f27 100644
--- a/weed/storage/volume_checking.go
+++ b/weed/storage/volume_checking.go
@@ -7,27 +7,33 @@ import (
"github.com/chrislusf/seaweedfs/weed/util"
)
-func CheckVolumeDataIntegrity(v *Volume, indexFile *os.File) error {
+func getActualSize(size uint32) int64 {
+ padding := NeedlePaddingSize - ((NeedleHeaderSize + size + NeedleChecksumSize) % NeedlePaddingSize)
+ return NeedleHeaderSize + int64(size) + NeedleChecksumSize + int64(padding)
+}
+
+func CheckVolumeDataIntegrity(v *Volume, indexFile *os.File) (int64, error) {
var indexSize int64
var e error
if indexSize, e = verifyIndexFileIntegrity(indexFile); e != nil {
- return fmt.Errorf("verifyIndexFileIntegrity %s failed: %v", indexFile.Name(), e)
+ return 0, fmt.Errorf("verifyIndexFileIntegrity %s failed: %v", indexFile.Name(), e)
}
if indexSize == 0 {
- return nil
+ return int64(SuperBlockSize), nil
}
var lastIdxEntry []byte
if lastIdxEntry, e = readIndexEntryAtOffset(indexFile, indexSize-NeedleIndexSize); e != nil {
- return fmt.Errorf("readLastIndexEntry %s failed: %v", indexFile.Name(), e)
+ return 0, fmt.Errorf("readLastIndexEntry %s failed: %v", indexFile.Name(), e)
}
key, offset, size := idxFileEntry(lastIdxEntry)
- if offset == 0 {
- return nil
+ if offset == 0 || size == TombstoneFileSize {
+ return 0, nil
}
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 0, fmt.Errorf("verifyNeedleIntegrity %s failed: %v", indexFile.Name(), e)
}
- return nil
+
+ return int64(offset)*int64(NeedlePaddingSize) + getActualSize(size), nil
}
func verifyIndexFileIntegrity(indexFile *os.File) (indexSize int64, err error) {