Skip to content

Commit

Permalink
Log etag & size when flushed, prevent race with Attributes.Size in co…
Browse files Browse the repository at this point in the history
…mpleteMPU
  • Loading branch information
vitalif committed Oct 27, 2021
1 parent e047218 commit 1dcb229
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 8 deletions.
11 changes: 6 additions & 5 deletions internal/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -1614,7 +1614,7 @@ func (inode *Inode) FlushSmallObject() {
inode.userMetadataDirty = 2
}
} else {
log.Debugf("Flushed small file %v", key)
log.Debugf("Flushed small file %v: etag=%v, size=%v", key, NilStr(resp.ETag), sz)
stillDirty := inode.userMetadataDirty != 0 || inode.oldParent != nil
for i := 0; i < len(inode.buffers); i++ {
b := inode.buffers[i]
Expand Down Expand Up @@ -1829,9 +1829,10 @@ func (inode *Inode) FlushPart(part uint64) {
// LOCKS_REQUIRED(inode.mu)
func (inode *Inode) completeMultipart() {
// Server-size copy unmodified parts
numParts := inode.fs.partNum(inode.Attributes.Size)
finalSize := inode.Attributes.Size
numParts := inode.fs.partNum(finalSize)
numPartOffset, _ := inode.fs.partRange(numParts)
if numPartOffset < inode.Attributes.Size {
if numPartOffset < finalSize {
numParts++
}
err := inode.copyUnmodifiedParts(numParts)
Expand Down Expand Up @@ -1869,12 +1870,12 @@ func (inode *Inode) completeMultipart() {
inode.userMetadataDirty = 2
}
} else {
log.Debugf("Finalized multi-part upload of object %v", key)
log.Debugf("Finalized multi-part upload of object %v: etag=%v, size=%v", key, NilStr(resp.ETag), finalSize)
if inode.mpu.Metadata != nil && inode.userMetadataDirty == 1 {
inode.userMetadataDirty = 0
}
inode.mpu = nil
inode.updateFromFlush(inode.Attributes.Size, resp.ETag, resp.LastModified, resp.StorageClass)
inode.updateFromFlush(finalSize, resp.ETag, resp.LastModified, resp.StorageClass)
stillDirty := inode.userMetadataDirty != 0 || inode.oldParent != nil
for i := 0; i < len(inode.buffers); {
if inode.buffers[i].state == BUF_FL_CLEARED {
Expand Down
8 changes: 5 additions & 3 deletions internal/handles.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,9 +192,11 @@ func (inode *Inode) SetFromBlobItem(item *BlobItemOutput) {
// It's the simplest method of conflict resolution
// Otherwise we may not be able to make a correct object version
if item.ETag != nil && inode.knownETag != *item.ETag || item.Size != inode.knownSize {
s3Log.Warnf("Conflict detected: server-side ETag or size of %v"+
" (%v, %v) differ from local (%v, %v). File is changed remotely, dropping cache",
NilStr(item.ETag), item.Size, inode.knownETag, inode.knownSize)
if inode.knownETag != "" || inode.knownSize > 0 {
s3Log.Warnf("Conflict detected: server-side ETag or size of %v"+
" (%v, %v) differ from local (%v, %v). File is changed remotely, dropping cache",
inode.FullName(), NilStr(item.ETag), item.Size, inode.knownETag, inode.knownSize)
}
inode.resetCache()
inode.ResizeUnlocked(item.Size, false)
inode.knownSize = item.Size
Expand Down

0 comments on commit 1dcb229

Please sign in to comment.