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++
|
||
|
||
}
|
||
}
|
||
}
|