84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
|
|
package txlog
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
payloadSize = 24
|
|||
|
|
recordSize = 4 + 4 // timestamp + pageNo
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
type Page struct {
|
|||
|
|
//Head []byte
|
|||
|
|
//Tail []byte
|
|||
|
|
Data []byte
|
|||
|
|
PageNo uint32
|
|||
|
|
LowerTimestamp uint32
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type Level struct {
|
|||
|
|
// вже записані дані (лише для першої в списку індексної сторінки, беремо із _metric)
|
|||
|
|
// дані потрібні, якщо сторінка буде заповнена і піде на запис в .index файл
|
|||
|
|
AlreadyWritten int // (заповнені одразу)
|
|||
|
|
Unfilled []byte // поточні дані index сторінки (заповнені одразу)
|
|||
|
|
LowerTimestamp uint32 // (заповнені одразу)
|
|||
|
|
PageNo uint32 // пусто
|
|||
|
|
Filled []Page // пусто
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type Pager interface {
|
|||
|
|
GetPageNumber() uint32
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func xxx(pager Pager, levels []*Level, dataPages []*Page) {
|
|||
|
|
var (
|
|||
|
|
//upTimestamp uint32
|
|||
|
|
lastDataIdx = len(dataPages) - 1
|
|||
|
|
)
|
|||
|
|
for idx, d := range dataPages {
|
|||
|
|
d.PageNo = pager.GetPageNumber()
|
|||
|
|
if idx < lastDataIdx {
|
|||
|
|
// setPrevPageNo(dataPages[idx+1], d.PageNo)
|
|||
|
|
// calc CRC32
|
|||
|
|
} else {
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
var (
|
|||
|
|
upTimestamp = d.LowerTimestamp
|
|||
|
|
upPageNo uint32 = d.PageNo
|
|||
|
|
levelIdx = 0
|
|||
|
|
)
|
|||
|
|
for {
|
|||
|
|
if levelIdx == len(levels) {
|
|||
|
|
//
|
|||
|
|
newRoot := &Level{
|
|||
|
|
Unfilled: nil,
|
|||
|
|
//LowerTimestamp: prevPage . LowerTimestamp,
|
|||
|
|
PageNo: pager.GetPageNumber(),
|
|||
|
|
}
|
|||
|
|
// encode prev page record + up*
|
|||
|
|
levels = append(levels, newRoot)
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
level := levels[levelIdx]
|
|||
|
|
if len(level.Unfilled)+recordSize <= payloadSize {
|
|||
|
|
// append
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
level.Filled = append(level.Filled, Page{
|
|||
|
|
Data: level.Unfilled,
|
|||
|
|
LowerTimestamp: level.LowerTimestamp,
|
|||
|
|
PageNo: level.PageNo,
|
|||
|
|
})
|
|||
|
|
//
|
|||
|
|
level.Unfilled = nil
|
|||
|
|
// fix - pack record
|
|||
|
|
level.PageNo = pager.GetPageNumber()
|
|||
|
|
level.LowerTimestamp = upTimestamp
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
upPageNo = level.PageNo
|
|||
|
|
upTimestamp = level.LowerTimestamp
|
|||
|
|
levelIdx++
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|