This commit is contained in:
2026-06-10 06:18:45 +03:00
parent 4089ca40c9
commit 9ec86282ad
47 changed files with 3493 additions and 4502 deletions

View File

@@ -1,12 +1,11 @@
package freelist
import (
"bytes"
"fmt"
"io"
"os"
"gordenko.dev/dima/qb/bin"
bin "gordenko.dev/dima/bin/little"
"gordenko.dev/dima/qb/util"
)
@@ -158,12 +157,13 @@ func (s *FreeList) loadLastPage() error {
return fmt.Errorf("read size %d bytes not equal page size %d", n, s.pageSize)
}
// check crc
checksum := bin.GetUint32(buf[0:])
checksum, _ := bin.GetUint32(buf[0:])
if util.CalcChecksum(buf[crcSize:]) != checksum {
return fmt.Errorf("page %d is corrupted", s.basePagesCount)
}
for i := crcSize; i < len(buf); i += ptrSize {
s.free = append(s.free, bin.GetUint32(buf[i:]))
pageNo, _ := bin.GetUint32(buf[i:])
s.free = append(s.free, pageNo)
}
if s.deltaPagesCount > 0 {
s.deltaPagesCount--
@@ -207,25 +207,25 @@ func (s *FreeList) GetPageNumber() (pageNo uint32, err error) {
}
// для відновлення недозаповненнох сторінки із снапшота
func (s *FreeList) Restore(serialized []byte) error {
if (len(serialized) % ptrSize) != 0 {
return fmt.Errorf("wrong size")
}
for i := 0; i < len(serialized); i += ptrSize {
s.free = append(s.free, bin.GetUint32(serialized[i:]))
}
fmt.Println(s.free)
return nil
}
// func (s *FreeList) Restore(serialized []byte) error {
// if (len(serialized) % ptrSize) != 0 {
// return fmt.Errorf("wrong size")
// }
// for i := 0; i < len(serialized); i += ptrSize {
// s.free = append(s.free, bin.GetUint32(serialized[i:]))
// }
// fmt.Println(s.free)
// return nil
// }
// для запису в snapshot
func (s *FreeList) Serialize() ([]byte, error) {
w := bytes.NewBuffer(nil)
for _, pageNo := range s.free {
bin.WriteUint32(w, pageNo)
}
return w.Bytes(), nil
}
// func (s *FreeList) Serialize() ([]byte, error) {
// w := bytes.NewBuffer(nil)
// for _, pageNo := range s.free {
// bin.WriteUint32(w, pageNo)
// }
// return w.Bytes(), nil
// }
func (s *FreeList) Cached() []uint32 {
return s.free

View File

@@ -58,46 +58,46 @@ func TestSave(t *testing.T) {
// }
}
func TestDelta(t *testing.T) {
freeList, err := createFreeList()
if err != nil {
t.Fatal(err)
}
// func TestDelta(t *testing.T) {
// freeList, err := createFreeList()
// if err != nil {
// t.Fatal(err)
// }
serialized := []byte{9, 0, 0, 0, 10, 0, 0, 0}
// serialized := []byte{9, 0, 0, 0, 10, 0, 0, 0}
err = freeList.Restore(serialized)
if err != nil {
t.Fatal(err)
}
// err = freeList.Restore(serialized)
// if err != nil {
// t.Fatal(err)
// }
for range 3 {
pageNo, err := freeList.GetPageNumber()
fmt.Println(pageNo, err)
}
// for range 3 {
// pageNo, err := freeList.GetPageNumber()
// fmt.Println(pageNo, err)
// }
err = freeList.AddPageNumbers([]uint32{20, 21, 22})
if err != nil {
t.Fatal(err)
}
// err = freeList.AddPageNumbers([]uint32{20, 21, 22})
// if err != nil {
// t.Fatal(err)
// }
err = freeList.AddPageNumbers([]uint32{23, 24, 25, 26})
if err != nil {
t.Fatal(err)
}
// err = freeList.AddPageNumbers([]uint32{23, 24, 25, 26})
// if err != nil {
// t.Fatal(err)
// }
serialized, err = freeList.Serialize()
if err != nil {
t.Fatal(err)
}
// serialized, err = freeList.Serialize()
// if err != nil {
// t.Fatal(err)
// }
fmt.Println("free serialized:", serialized)
// fmt.Println("free serialized:", serialized)
err = freeList.Merge()
if err != nil {
t.Fatal(err)
}
}
// err = freeList.Merge()
// if err != nil {
// t.Fatal(err)
// }
// }
// func TestGetFromFreeList(t *testing.T) {
// freeList, err := createFreeList()