This commit is contained in:
2026-06-15 01:20:30 +03:00
parent b32279deaf
commit 80309aab99
20 changed files with 149 additions and 40 deletions

View File

@@ -53,6 +53,7 @@ func (s *WALReader) NextPacket() (_ []any, _ bool, err error) {
} else {
current, err = s.readPacket()
if err != nil {
err = fmt.Errorf("readPacket: %s", err)
return
}
if current == nil {
@@ -61,6 +62,7 @@ func (s *WALReader) NextPacket() (_ []any, _ bool, err error) {
}
s.next, err = s.readPacket()
if err != nil {
err = fmt.Errorf("readPacket: %s", err)
return
}
return current, s.next == nil, nil
@@ -85,9 +87,12 @@ func (s *WALReader) readPacket() (_ []any, err error) {
}
calculatedCRC := util.CalculateCRC32(body)
if calculatedCRC != writtenCRC {
//fmt.Printf("bodySize: %d\n", bodySize)
//fmt.Printf("body: % x\n", body)
return nil, fmt.Errorf("written CRC %d != calculated CRC %d",
writtenCRC, calculatedCRC)
}
//fmt.Println("SAME CRC")
return s.parseRecords(body)
}

View File

@@ -49,6 +49,7 @@ type PreparedData struct {
// )
func (s *WritePreparer) Prepare(input []any) PreparedData {
s.w.Reset()
s.w.Write([]byte{
0, 0, 0, 0, 0, 0, 0, 0, 0, // size (max 9 byte)
})
@@ -249,7 +250,7 @@ func (s *WritePreparer) Reset() {
}
func getIndexRecords(buf []byte, count int) (list []IndexRecord) {
fmt.Printf("ipage: % x\n", buf)
//fmt.Printf("ipage: % x\n", buf)
i := 0
for range count {
var rec IndexRecord
@@ -268,5 +269,11 @@ func finalizePacket(w *bytes.Buffer, checksum uint32) []byte {
// cut empty bytes at start
start := 9 - bin.CountVarSize(bodySize)
bin.PutVarSize(packet[start:], bodySize)
fmt.Printf("checksum: %d\n", checksum)
fmt.Printf("bodySize: %d\n", bodySize)
//fmt.Printf("start: %d\n", start)
fmt.Printf("body: % x\n", packet[9:len(packet)-4])
return packet[start:]
}

View File

@@ -89,6 +89,8 @@ type WriterOptions struct {
WAL string
DataFreeList *freelist.FreeList
IndexFreeList *freelist.FreeList
DataFile *os.File
IndexFile *os.File
//Atree *atree.Atree
ExitCh chan struct{}
WaitGroup *sync.WaitGroup
@@ -122,9 +124,12 @@ func NewWriter(opt WriterOptions) (*Writer, error) {
if opt.IndexFreeList == nil {
return nil, errors.New("IndexFreeList option is required")
}
// if opt.Atree == nil {
// return nil, errors.New("Atree option is required")
// }
if opt.DataFile == nil {
return nil, errors.New("DataFile option is required")
}
if opt.IndexFile == nil {
return nil, errors.New("IndexFile option is required")
}
if opt.ExitCh == nil {
return nil, errors.New("ExitCh option is required")
}
@@ -162,6 +167,8 @@ func NewWriter(opt WriterOptions) (*Writer, error) {
workerInbox: opt.WorkerInbox,
dir: opt.Dir,
databaseName: opt.DatabaseName,
dataFile: opt.DataFile,
indexFile: opt.IndexFile,
dataFreeList: opt.DataFreeList,
indexFreeList: opt.IndexFreeList,
writePreparer: writePreparer,
@@ -184,6 +191,7 @@ func NewWriter(opt WriterOptions) (*Writer, error) {
return nil, err
}
}
return s, nil
}
@@ -220,28 +228,33 @@ func (s *Writer) packAndWrite() (err error) {
prepared := s.writePreparer.Prepare(input)
//fmt.Printf("prepared: %#v\n", prepared)
fmt.Println("prepared")
// 3. Пишу на диск WAL (append)
n, err := s.wal.Write(prepared.Packet)
if err != nil {
return
}
//fmt.Printf("written to wal: % x\n", prepared.Packet)
if n != len(prepared.Packet) {
return fmt.Errorf("written %d != packet size %d", n, len(prepared.Packet))
}
if err = s.wal.Sync(); err != nil {
return
}
fmt.Println("synced to wal")
// 4. Пишу в atree сторінки
err = WriteDataPages(s.dataFile, prepared.WriteToData)
if err != nil {
return
}
fmt.Println("written to data")
err = WriteIndexPages(s.indexFile, prepared.WriteToIndex)
if err != nil {
return
}
fmt.Println("written to index")
// 6. відправляю input - worker-у
@@ -300,6 +313,7 @@ func (s *Writer) packAndWrite() (err error) {
s.workerInbox.Push(Changes{
Commits: prepared.Commits,
})
fmt.Println("pushed commits")
}
return nil
}
@@ -345,6 +359,9 @@ type PageToWrite struct {
func WriteDataPages(file *os.File, pages []PageToWrite) (err error) {
for _, p := range pages {
fmt.Println("pageNo: %d\n", p.PageNo)
}
for _, p := range pages {
if len(p.Content) != DataPageSize {
return fmt.Errorf("wrong data page size: %d", len(p.Content))
}
@@ -354,7 +371,7 @@ func WriteDataPages(file *os.File, pages []PageToWrite) (err error) {
)
n, err = file.WriteAt(p.Content, int64(off))
if err != nil {
return
return fmt.Errorf("file.WriteAt: %s; off=%d", err, off)
}
if n != DataPageSize {
return fmt.Errorf("write %d instead of %d", n, DataPageSize)