diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-01-22 13:42:03 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-01-22 13:42:03 -0800 |
| commit | 6b48d246a5d7943527d1948e352c9906e9d01a17 (patch) | |
| tree | 03e8547f1d86ed54a47d7fde4a1bb484f4e1f6a8 /weed/filesys/dirty_page.go | |
| parent | 09f4ceef3a5b3eca457fd74382f0391a1db4283e (diff) | |
| download | seaweedfs-6b48d246a5d7943527d1948e352c9906e9d01a17.tar.xz seaweedfs-6b48d246a5d7943527d1948e352c9906e9d01a17.zip | |
mount: read data that is just written
able read on data not flushed
multiple file open shares the same file handle
fix https://github.com/chrislusf/seaweedfs/issues/1182 on linux
Diffstat (limited to 'weed/filesys/dirty_page.go')
| -rw-r--r-- | weed/filesys/dirty_page.go | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/weed/filesys/dirty_page.go b/weed/filesys/dirty_page.go index f83944678..7a466b506 100644 --- a/weed/filesys/dirty_page.go +++ b/weed/filesys/dirty_page.go @@ -222,3 +222,26 @@ func max(x, y int64) int64 { } return y } +func min(x, y int64) int64 { + if x < y { + return x + } + return y +} + +func (pages *ContinuousDirtyPages) ReadDirtyData(ctx context.Context, data []byte, startOffset int64) (offset int64, size int, err error) { + bufSize := int64(len(data)) + if startOffset+bufSize < pages.Offset { + return + } + if startOffset >= pages.Offset+pages.Size { + return + } + + offset = max(pages.Offset, startOffset) + stopOffset := min(pages.Offset+pages.Size, startOffset+bufSize) + size = int(stopOffset - offset) + copy(data[offset-startOffset:], pages.Data[offset-pages.Offset:stopOffset-pages.Offset]) + + return +} |
