seaweedfs/weed/mount/page_writer/chunk_interval_list.go

112 lines
2.6 KiB
Go
Raw Normal View History

2022-02-14 06:50:44 +00:00
package page_writer
2022-08-22 05:54:56 +00:00
import (
"math"
)
2022-02-14 06:50:44 +00:00
// ChunkWrittenInterval mark one written interval within one page chunk
type ChunkWrittenInterval struct {
StartOffset int64
stopOffset int64
2022-12-25 08:28:36 +00:00
TsNs int64
2022-02-14 06:50:44 +00:00
prev *ChunkWrittenInterval
next *ChunkWrittenInterval
}
func (interval *ChunkWrittenInterval) Size() int64 {
return interval.stopOffset - interval.StartOffset
}
func (interval *ChunkWrittenInterval) isComplete(chunkSize int64) bool {
return interval.stopOffset-interval.StartOffset == chunkSize
}
// ChunkWrittenIntervalList mark written intervals within one page chunk
type ChunkWrittenIntervalList struct {
head *ChunkWrittenInterval
tail *ChunkWrittenInterval
}
func newChunkWrittenIntervalList() *ChunkWrittenIntervalList {
list := &ChunkWrittenIntervalList{
head: &ChunkWrittenInterval{
StartOffset: -1,
stopOffset: -1,
},
tail: &ChunkWrittenInterval{
StartOffset: math.MaxInt64,
stopOffset: math.MaxInt64,
},
}
list.head.next = list.tail
list.tail.prev = list.head
return list
}
2022-12-25 08:28:36 +00:00
func (list *ChunkWrittenIntervalList) MarkWritten(startOffset, stopOffset, tsNs int64) {
2022-02-14 06:50:44 +00:00
interval := &ChunkWrittenInterval{
StartOffset: startOffset,
stopOffset: stopOffset,
2022-12-25 08:28:36 +00:00
TsNs: tsNs,
2022-02-14 06:50:44 +00:00
}
list.addInterval(interval)
}
func (list *ChunkWrittenIntervalList) IsComplete(chunkSize int64) bool {
return list.size() == 1 && list.head.next.isComplete(chunkSize)
}
func (list *ChunkWrittenIntervalList) WrittenSize() (writtenByteCount int64) {
for t := list.head; t != nil; t = t.next {
writtenByteCount += t.Size()
}
return
}
func (list *ChunkWrittenIntervalList) addInterval(interval *ChunkWrittenInterval) {
2022-12-25 20:11:53 +00:00
//t := list.head
//for ; t.next != nil; t = t.next {
// if t.TsNs > interval.TsNs {
// println("writes is out of order", t.TsNs-interval.TsNs, "ns")
// }
//}
2022-02-14 06:50:44 +00:00
p := list.head
2022-12-25 08:28:36 +00:00
for ; p.next != nil && p.next.stopOffset <= interval.StartOffset; p = p.next {
2022-02-14 06:50:44 +00:00
}
q := list.tail
2022-12-25 08:28:36 +00:00
for ; q.prev != nil && q.prev.StartOffset >= interval.stopOffset; q = q.prev {
2022-02-14 06:50:44 +00:00
}
2022-12-25 08:28:36 +00:00
// left side
// interval after p.next start
if p.next.StartOffset < interval.StartOffset {
p.next.stopOffset = interval.StartOffset
p.next.next = interval
interval.prev = p.next
} else {
p.next = interval
interval.prev = p
2022-02-14 06:50:44 +00:00
}
2022-12-25 08:28:36 +00:00
// right side
// interval ends before p.prev
if q.prev.stopOffset > interval.stopOffset {
q.prev.StartOffset = interval.stopOffset
q.prev.prev = interval
interval.next = q.prev
} else {
q.prev = interval
interval.next = q
2022-02-14 06:50:44 +00:00
}
2022-12-25 08:28:36 +00:00
2022-02-14 06:50:44 +00:00
}
func (list *ChunkWrittenIntervalList) size() int {
var count int
for t := list.head; t != nil; t = t.next {
count++
}
return count - 2
}