From a74e2bed2cb1b98c2791c2a9ea5819e482ff7cb0 Mon Sep 17 00:00:00 2001 From: tnextday Date: Sat, 5 Dec 2015 21:59:05 +0800 Subject: [PATCH] go imports `Needle.ReadNeedleBody` add CRC check and warning --- go/filer/flat_namespace/flat_namespace_store.go | 2 -- go/storage/needle.go | 2 +- go/storage/needle_read_write.go | 8 ++++++++ go/storage/volume_info.go | 3 ++- go/storage/volume_sync.go | 3 +++ 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/go/filer/flat_namespace/flat_namespace_store.go b/go/filer/flat_namespace/flat_namespace_store.go index 832b70e40..068201adf 100644 --- a/go/filer/flat_namespace/flat_namespace_store.go +++ b/go/filer/flat_namespace/flat_namespace_store.go @@ -1,7 +1,5 @@ package flat_namespace -import () - type FlatNamespaceStore interface { Put(fullFileName string, fid string) (err error) Get(fullFileName string) (fid string, err error) diff --git a/go/storage/needle.go b/go/storage/needle.go index 32ebdae7d..c9124a681 100644 --- a/go/storage/needle.go +++ b/go/storage/needle.go @@ -14,8 +14,8 @@ import ( "github.com/chrislusf/seaweedfs/go/glog" "github.com/chrislusf/seaweedfs/go/images" - "github.com/chrislusf/seaweedfs/go/util" "github.com/chrislusf/seaweedfs/go/operation" + "github.com/chrislusf/seaweedfs/go/util" ) const ( diff --git a/go/storage/needle_read_write.go b/go/storage/needle_read_write.go index 9d7af600a..eb7989884 100644 --- a/go/storage/needle_read_write.go +++ b/go/storage/needle_read_write.go @@ -238,6 +238,10 @@ func (n *Needle) ReadNeedleBody(r *os.File, version Version, offset int64, bodyL } n.Data = bytes[:n.Size] n.Checksum = NewCRC(n.Data) + checksum := util.BytesToUint32(bytes[n.Size : n.Size+NeedleChecksumSize]) + if n.Checksum.Value() != checksum { + glog.V(0).Infof("CRC error! Data On Disk Corrupted, needle id = %x", n.Id) + } case Version2: bytes := make([]byte, bodyLength) if _, err = r.ReadAt(bytes, offset); err != nil { @@ -245,6 +249,10 @@ func (n *Needle) ReadNeedleBody(r *os.File, version Version, offset int64, bodyL } n.readNeedleDataVersion2(bytes[0:n.Size]) n.Checksum = NewCRC(n.Data) + checksum := util.BytesToUint32(bytes[n.Size : n.Size+NeedleChecksumSize]) + if n.Checksum.Value() != checksum { + glog.V(0).Infof("CRC error! Data On Disk Corrupted, needle id = %x", n.Id) + } default: err = fmt.Errorf("Unsupported Version! (%d)", version) } diff --git a/go/storage/volume_info.go b/go/storage/volume_info.go index a2f139c89..e4979c790 100644 --- a/go/storage/volume_info.go +++ b/go/storage/volume_info.go @@ -2,8 +2,9 @@ package storage import ( "fmt" - "github.com/chrislusf/seaweedfs/go/operation" "sort" + + "github.com/chrislusf/seaweedfs/go/operation" ) type VolumeInfo struct { diff --git a/go/storage/volume_sync.go b/go/storage/volume_sync.go index 2c72d62f0..01d59d6ae 100644 --- a/go/storage/volume_sync.go +++ b/go/storage/volume_sync.go @@ -202,6 +202,9 @@ func (v *Volume) fetchNeedle(volumeDataContentHandlerUrl string, if err != nil { return fmt.Errorf("Reading from %s error: %v", volumeDataContentHandlerUrl, err) } + if needleValue.Size != uint32(len(b)) { + return fmt.Errorf("Reading from %s error: size incorrect", volumeDataContentHandlerUrl) + } offset, err := v.AppendBlob(b) if err != nil { return fmt.Errorf("Appending volume %d error: %v", v.Id, err)