wp
This commit is contained in:
@@ -15,23 +15,11 @@ import (
|
||||
// fix - reduce leves
|
||||
|
||||
type PagePreparer struct {
|
||||
dataChecksumIdx int
|
||||
maxRecordsOnIndexPage int
|
||||
indexPageIncSize int // кратно indexPageSize
|
||||
timestampsSizeIdx int
|
||||
valuesSizeIdx int
|
||||
prevPageIdx int
|
||||
indexRecordsCountIdx int
|
||||
isZeroLevelIdx int
|
||||
indexChecksumIdx int
|
||||
getDataPageNumber func() (uint32, bool, error)
|
||||
getIndexPageNumber func() (uint32, bool, error)
|
||||
getDataPageNumber func() (uint32, bool, error)
|
||||
getIndexPageNumber func() (uint32, bool, error)
|
||||
}
|
||||
|
||||
type PagePreparerOptions struct {
|
||||
IndexPageSize int
|
||||
IndexPageIncSize int
|
||||
DataPageSize int
|
||||
GetDataPageNumber func() (uint32, bool, error)
|
||||
GetIndexPageNumber func() (uint32, bool, error)
|
||||
}
|
||||
@@ -43,22 +31,10 @@ func NewPagePreparer(opt PagePreparerOptions) (*PagePreparer, error) {
|
||||
if opt.GetDataPageNumber == nil {
|
||||
return nil, errors.New("missing required option: GetDataPageNumber")
|
||||
}
|
||||
if (opt.IndexPageSize % opt.IndexPageIncSize) != 0 {
|
||||
return nil, errors.New("IndexPageIncSize must multiple of IndexPageSize")
|
||||
}
|
||||
s := &PagePreparer{
|
||||
dataChecksumIdx: opt.DataPageSize - 4,
|
||||
indexPageIncSize: opt.IndexPageIncSize,
|
||||
timestampsSizeIdx: opt.DataPageSize - 6,
|
||||
valuesSizeIdx: opt.DataPageSize - 8,
|
||||
prevPageIdx: opt.DataPageSize - 12,
|
||||
indexRecordsCountIdx: opt.IndexPageSize - 6,
|
||||
isZeroLevelIdx: opt.IndexPageSize - 7,
|
||||
indexChecksumIdx: opt.IndexPageSize - 4,
|
||||
getIndexPageNumber: opt.GetIndexPageNumber,
|
||||
getDataPageNumber: opt.GetDataPageNumber,
|
||||
getIndexPageNumber: opt.GetIndexPageNumber,
|
||||
getDataPageNumber: opt.GetDataPageNumber,
|
||||
}
|
||||
s.maxRecordsOnIndexPage = (opt.IndexPageSize - 7) / indexRecordSize
|
||||
return s, nil
|
||||
}
|
||||
|
||||
@@ -70,7 +46,7 @@ type appendIndexRecordIn struct {
|
||||
}
|
||||
|
||||
func (s *PagePreparer) appendIndexRecord(in appendIndexRecordIn) []byte {
|
||||
if in.RecordsCount < s.maxRecordsOnIndexPage {
|
||||
if in.RecordsCount < maxRecordsOnIndexPage {
|
||||
var (
|
||||
pos int
|
||||
buf = in.Records
|
||||
@@ -78,7 +54,7 @@ func (s *PagePreparer) appendIndexRecord(in appendIndexRecordIn) []byte {
|
||||
if in.RecordsCount > 0 {
|
||||
pos = in.RecordsCount * indexRecordSize
|
||||
} else {
|
||||
buf = make([]byte, s.indexPageIncSize)
|
||||
buf = make([]byte, IndexPageSize) // IndexPageIncSize
|
||||
}
|
||||
bin.PutUint32(buf[pos:], in.Timestamp)
|
||||
bin.PutUint32(buf[pos+4:], in.PageNo)
|
||||
@@ -88,39 +64,6 @@ func (s *PagePreparer) appendIndexRecord(in appendIndexRecordIn) []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
type sealDataPageIn struct {
|
||||
Content []byte
|
||||
PrevPageNo uint32
|
||||
TimestampsSize int
|
||||
ValuesSize int
|
||||
}
|
||||
|
||||
func (s *PagePreparer) sealDataPage(in sealDataPageIn) (checksum uint32) {
|
||||
bin.PutUint16(in.Content[s.timestampsSizeIdx:], uint16(in.TimestampsSize))
|
||||
bin.PutUint16(in.Content[s.valuesSizeIdx:], uint16(in.ValuesSize))
|
||||
bin.PutUint32(in.Content[s.prevPageIdx:], in.PrevPageNo)
|
||||
|
||||
checksum = util.CalcChecksum(in.Content[:s.dataChecksumIdx])
|
||||
bin.PutUint32(in.Content[s.dataChecksumIdx:], checksum)
|
||||
return
|
||||
}
|
||||
|
||||
type sealIndexPageIn struct {
|
||||
Content []byte
|
||||
RecordsCount int
|
||||
LastLevel bool
|
||||
}
|
||||
|
||||
func (s *PagePreparer) sealIndexPage(in sealIndexPageIn) (checksum uint32) {
|
||||
bin.PutUint16(in.Content[s.indexRecordsCountIdx:], uint16(in.RecordsCount))
|
||||
if in.LastLevel {
|
||||
in.Content[s.isZeroLevelIdx] = 1
|
||||
}
|
||||
checksum = util.CalcChecksum(in.Content[:s.indexChecksumIdx])
|
||||
bin.PutUint32(in.Content[s.indexChecksumIdx:], checksum)
|
||||
return
|
||||
}
|
||||
|
||||
type IndexLevelTail struct {
|
||||
Buffer []byte // розмір більший за кількість
|
||||
RecordsCount int
|
||||
@@ -210,7 +153,7 @@ func (s *PagePreparer) SealPages(in SealPagesIn) (result SealResult) {
|
||||
PrevPageNo: prevPageNo,
|
||||
PageNo: pageNo,
|
||||
Reused: reused,
|
||||
Checksum: s.sealDataPage(sealDataPageIn{
|
||||
Checksum: SealDataPage(SealDataPageIn{
|
||||
Content: d.Content,
|
||||
PrevPageNo: prevPageNo,
|
||||
TimestampsSize: d.TimestampsSize,
|
||||
@@ -232,7 +175,7 @@ func (s *PagePreparer) SealPages(in SealPagesIn) (result SealResult) {
|
||||
break
|
||||
}
|
||||
level := sealedIndexLevels[levelIdx]
|
||||
if level.TailRecordsCount < s.maxRecordsOnIndexPage {
|
||||
if level.TailRecordsCount < maxRecordsOnIndexPage {
|
||||
level.TailRecords = s.appendIndexRecord(appendIndexRecordIn{
|
||||
Records: level.TailRecords,
|
||||
Timestamp: upTimestamp,
|
||||
@@ -252,10 +195,10 @@ func (s *PagePreparer) SealPages(in SealPagesIn) (result SealResult) {
|
||||
Content: level.TailRecords,
|
||||
PageNo: pageNo,
|
||||
Reused: reused,
|
||||
Checksum: s.sealIndexPage(sealIndexPageIn{
|
||||
Checksum: SealIndexPage(SealIndexPageIn{
|
||||
Content: level.TailRecords,
|
||||
RecordsCount: level.TailRecordsCount,
|
||||
LastLevel: levelIdx == 0,
|
||||
ZeroLevel: levelIdx == 0,
|
||||
}),
|
||||
}
|
||||
level.IndexPages = append(level.IndexPages, filled)
|
||||
@@ -288,12 +231,12 @@ type SealDataPageIn struct {
|
||||
}
|
||||
|
||||
func SealDataPage(in SealDataPageIn) (checksum uint32) {
|
||||
// bin.PutUint16(in.Content[s.timestampsSizeIdx:], uint16(in.TimestampsSize))
|
||||
// bin.PutUint16(in.Content[s.valuesSizeIdx:], uint16(in.ValuesSize))
|
||||
// bin.PutUint32(in.Content[s.prevPageIdx:], in.PrevPageNo)
|
||||
bin.PutUint16(in.Content[timestampsSizeIdx:], uint16(in.TimestampsSize))
|
||||
bin.PutUint16(in.Content[valuesSizeIdx:], uint16(in.ValuesSize))
|
||||
bin.PutUint32(in.Content[prevPageIdx:], in.PrevPageNo)
|
||||
|
||||
// checksum = util.CalcChecksum(in.Content[:s.dataChecksumIdx])
|
||||
// bin.PutUint32(in.Content[s.dataChecksumIdx:], checksum)
|
||||
checksum = util.CalcChecksum(in.Content[:dataCRC32Idx])
|
||||
bin.PutUint32(in.Content[dataCRC32Idx:], checksum)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -304,11 +247,11 @@ type SealIndexPageIn struct {
|
||||
}
|
||||
|
||||
func SealIndexPage(in SealIndexPageIn) (checksum uint32) {
|
||||
// bin.PutUint16(in.Content[s.indexRecordsCountIdx:], uint16(in.RecordsCount))
|
||||
// if in.LastLevel {
|
||||
// in.Content[s.isZeroLevelIdx] = 1
|
||||
// }
|
||||
// checksum = util.CalcChecksum(in.Content[:s.indexChecksumIdx])
|
||||
// bin.PutUint32(in.Content[s.indexChecksumIdx:], checksum)
|
||||
bin.PutUint16(in.Content[indexRecordsCountIdx:], uint16(in.RecordsCount))
|
||||
if in.ZeroLevel {
|
||||
in.Content[isZeroLevelIdx] = 1
|
||||
}
|
||||
checksum = util.CalcChecksum(in.Content[:indexCRC32Idx])
|
||||
bin.PutUint32(in.Content[indexCRC32Idx:], checksum)
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user