diff options
Diffstat (limited to 'weed/filesys/dirty_pages_temp_interval.go')
| -rw-r--r-- | weed/filesys/dirty_pages_temp_interval.go | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/weed/filesys/dirty_pages_temp_interval.go b/weed/filesys/dirty_pages_temp_interval.go index f423b0e85..2d22845e2 100644 --- a/weed/filesys/dirty_pages_temp_interval.go +++ b/weed/filesys/dirty_pages_temp_interval.go @@ -1,8 +1,8 @@ package filesys import ( - "github.com/chrislusf/seaweedfs/weed/glog" "io" + "log" "os" ) @@ -20,8 +20,9 @@ type WrittenIntervalLinkedList struct { } type WrittenContinuousIntervals struct { - tempFile *os.File - lists []*WrittenIntervalLinkedList + tempFile *os.File + lastOffset int64 + lists []*WrittenIntervalLinkedList } func (list *WrittenIntervalLinkedList) Offset() int64 { @@ -95,6 +96,21 @@ func (list *WrittenIntervalLinkedList) subList(start, stop int64) *WrittenInterv } } +func (c *WrittenContinuousIntervals) debug() { + log.Printf("++") + for _, l := range c.lists { + log.Printf("++++") + for t := l.Head; ; t = t.Next { + log.Printf("[%d,%d) => [%d,%d) %d", t.DataOffset, t.DataOffset+t.Size, t.TempOffset, t.TempOffset+t.Size, t.Size) + if t.Next == nil { + break + } + } + log.Printf("----") + } + log.Printf("--") +} + func (c *WrittenContinuousIntervals) AddInterval(tempOffset int64, dataSize int, dataOffset int64) { interval := &WrittenIntervalNode{DataOffset: dataOffset, TempOffset: tempOffset, Size: int64(dataSize)} @@ -223,6 +239,7 @@ func (l *WrittenIntervalLinkedList) ToReader(start int64, stop int64) io.Reader for t := l.Head; ; t = t.Next { startOffset, stopOffset := max(t.DataOffset, start), min(t.DataOffset+t.Size, stop) if startOffset < stopOffset { + // log.Printf("ToReader read [%d,%d) from [%d,%d) %d", t.DataOffset, t.DataOffset+t.Size, t.TempOffset, t.TempOffset+t.Size, t.Size) readers = append(readers, newFileSectionReader(l.tempFile, startOffset-t.DataOffset+t.TempOffset, startOffset, stopOffset-startOffset)) } if t.Next == nil { @@ -236,29 +253,32 @@ func (l *WrittenIntervalLinkedList) ToReader(start int64, stop int64) io.Reader } type FileSectionReader struct { - file *os.File - Offset int64 - dataStart int64 - dataStop int64 + file *os.File + tempStartOffset int64 + Offset int64 + dataStart int64 + dataStop int64 } var _ = io.Reader(&FileSectionReader{}) func newFileSectionReader(tempfile *os.File, offset int64, dataOffset int64, size int64) *FileSectionReader { return &FileSectionReader{ - file: tempfile, - Offset: offset, - dataStart: dataOffset, - dataStop: dataOffset + size, + file: tempfile, + tempStartOffset: offset, + Offset: offset, + dataStart: dataOffset, + dataStop: dataOffset + size, } } func (f *FileSectionReader) Read(p []byte) (n int, err error) { - dataLen := min(f.dataStop-f.Offset, int64(len(p))) - if dataLen < 0 { + remaining := (f.dataStop - f.dataStart) - (f.Offset - f.tempStartOffset) + if remaining <= 0 { return 0, io.EOF } - glog.V(4).Infof("reading %v [%d,%d)", f.file.Name(), f.Offset, f.Offset+dataLen) + dataLen := min(remaining, int64(len(p))) + // glog.V(4).Infof("reading [%d,%d) from %v [%d,%d)/[%d,%d) %d", f.Offset-f.tempStartOffset+f.dataStart, f.Offset-f.tempStartOffset+f.dataStart+dataLen, f.file.Name(), f.Offset, f.Offset+dataLen, f.tempStartOffset, f.tempStartOffset+f.dataStop-f.dataStart, f.dataStop-f.dataStart) n, err = f.file.ReadAt(p[:dataLen], f.Offset) if n > 0 { f.Offset += int64(n) |
