diff options
| author | Chris Lu <chris.lu@gmail.com> | 2021-08-13 02:09:35 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2021-08-13 02:09:35 -0700 |
| commit | 78e8ddf910ed055d39f720f035f458edebafbd50 (patch) | |
| tree | 7ecbd6161e8ad9794a331ab4292e58167fc6dd41 /weed/storage/volume_write.go | |
| parent | a8617c1a39f78f43f546755e87d895ccbcafc0fb (diff) | |
| download | seaweedfs-78e8ddf910ed055d39f720f035f458edebafbd50.tar.xz seaweedfs-78e8ddf910ed055d39f720f035f458edebafbd50.zip | |
Only when tailing volume, the zero-ed cookie should skip checking.
This only happens when checkCookie == false and fsync == false.
Diffstat (limited to 'weed/storage/volume_write.go')
| -rw-r--r-- | weed/storage/volume_write.go | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/weed/storage/volume_write.go b/weed/storage/volume_write.go index ad3dad388..794b1c125 100644 --- a/weed/storage/volume_write.go +++ b/weed/storage/volume_write.go @@ -91,7 +91,7 @@ func (v *Volume) asyncRequestAppend(request *needle.AsyncRequest) { v.asyncRequestsChan <- request } -func (v *Volume) syncWrite(n *needle.Needle) (offset uint64, size Size, isUnchanged bool, err error) { +func (v *Volume) syncWrite(n *needle.Needle, checkCookie bool) (offset uint64, size Size, isUnchanged bool, err error) { // glog.V(4).Infof("writing needle %s", needle.NewFileIdFromNeedle(v.Id, n).String()) actualSize := needle.GetActualSize(Size(len(n.Data)), v.Version()) @@ -103,10 +103,10 @@ func (v *Volume) syncWrite(n *needle.Needle) (offset uint64, size Size, isUnchan return } - return v.doWriteRequest(n) + return v.doWriteRequest(n, checkCookie) } -func (v *Volume) writeNeedle2(n *needle.Needle, fsync bool) (offset uint64, size Size, isUnchanged bool, err error) { +func (v *Volume) writeNeedle2(n *needle.Needle, checkCookie bool, fsync bool) (offset uint64, size Size, isUnchanged bool, err error) { // glog.V(4).Infof("writing needle %s", needle.NewFileIdFromNeedle(v.Id, n).String()) if n.Ttl == needle.EMPTY_TTL && v.Ttl != needle.EMPTY_TTL { n.SetHasTtl() @@ -114,7 +114,7 @@ func (v *Volume) writeNeedle2(n *needle.Needle, fsync bool) (offset uint64, size } if !fsync { - return v.syncWrite(n) + return v.syncWrite(n, checkCookie) } else { asyncRequest := needle.NewAsyncRequest(n, true) // using len(n.Data) here instead of n.Size before n.Size is populated in n.Append() @@ -127,7 +127,7 @@ func (v *Volume) writeNeedle2(n *needle.Needle, fsync bool) (offset uint64, size } } -func (v *Volume) doWriteRequest(n *needle.Needle) (offset uint64, size Size, isUnchanged bool, err error) { +func (v *Volume) doWriteRequest(n *needle.Needle, checkCookie bool) (offset uint64, size Size, isUnchanged bool, err error) { // glog.V(4).Infof("writing needle %s", needle.NewFileIdFromNeedle(v.Id, n).String()) if v.isFileUnchanged(n) { size = Size(n.DataSize) @@ -143,10 +143,12 @@ func (v *Volume) doWriteRequest(n *needle.Needle) (offset uint64, size Size, isU err = fmt.Errorf("reading existing needle: %v", existingNeedleReadErr) return } - if n.Cookie == 0 { + if n.Cookie == 0 && !checkCookie { // this is from batch deletion, and read back again when tailing a remote volume + // which only happens when checkCookie == false and fsync == false n.Cookie = existingNeedle.Cookie - } else if existingNeedle.Cookie != n.Cookie { + } + if existingNeedle.Cookie != n.Cookie { glog.V(0).Infof("write cookie mismatch: existing %s, new %s", needle.NewFileIdFromNeedle(v.Id, existingNeedle), needle.NewFileIdFromNeedle(v.Id, n)) err = fmt.Errorf("mismatching cookie %x", n.Cookie) @@ -274,7 +276,7 @@ func (v *Volume) startWorker() { for i := 0; i < len(currentRequests); i++ { if currentRequests[i].IsWriteRequest { - offset, size, isUnchanged, err := v.doWriteRequest(currentRequests[i].N) + offset, size, isUnchanged, err := v.doWriteRequest(currentRequests[i].N, true) currentRequests[i].UpdateResult(offset, uint64(size), isUnchanged, err) } else { size, err := v.doDeleteRequest(currentRequests[i].N) |
