aboutsummaryrefslogtreecommitdiff
path: root/go/storage/volume.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2013-07-11 22:44:59 -0700
committerChris Lu <chris.lu@gmail.com>2013-07-11 22:44:59 -0700
commit4c1bc99366831718fdbf6a02ed3fb5a81cce0e77 (patch)
tree1e4d9dd965d7caabd8d889ca0a1b0e772a5c8950 /go/storage/volume.go
parentdb46565d18008f9640d1d26324f926cc497d6551 (diff)
downloadseaweedfs-4c1bc99366831718fdbf6a02ed3fb5a81cce0e77.tar.xz
seaweedfs-4c1bc99366831718fdbf6a02ed3fb5a81cce0e77.zip
avoid writing the same file
Diffstat (limited to 'go/storage/volume.go')
-rw-r--r--go/storage/volume.go25
1 files changed, 25 insertions, 0 deletions
diff --git a/go/storage/volume.go b/go/storage/volume.go
index 0ec24d7d1..5b7487580 100644
--- a/go/storage/volume.go
+++ b/go/storage/volume.go
@@ -158,6 +158,27 @@ func (v *Volume) NeedToReplicate() bool {
return v.ReplicaType.GetCopyCount() > 1
}
+func (v *Volume) isFileUnchanged(n *Needle) bool {
+ nv, ok := v.nm.Get(n.Id)
+ if ok && nv.Offset > 0 {
+ if _, err := v.dataFile.Seek(int64(nv.Offset)*NeedlePaddingSize, 0); err != nil {
+ return false
+ }
+ oldNeedle := new(Needle)
+ oldNeedle.Read(v.dataFile, nv.Size, v.Version())
+ if len(oldNeedle.Data) == len(n.Data) && oldNeedle.Checksum == n.Checksum {
+ length := len(n.Data)
+ for i := 0; i < length; i++ {
+ if n.Data[i] != oldNeedle.Data[i] {
+ return false
+ }
+ }
+ n.Size = oldNeedle.Size
+ return true
+ }
+ }
+ return false
+}
func (v *Volume) write(n *Needle) (size uint32, err error) {
if v.readOnly {
err = fmt.Errorf("%s is read-only", v.dataFile)
@@ -165,6 +186,10 @@ func (v *Volume) write(n *Needle) (size uint32, err error) {
}
v.accessLock.Lock()
defer v.accessLock.Unlock()
+ if v.isFileUnchanged(n) {
+ size = n.Size
+ return
+ }
var offset int64
if offset, err = v.dataFile.Seek(0, 2); err != nil {
return