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