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

@@ -7,8 +7,8 @@ import (
"math"
"os"
bin "gordenko.dev/dima/bin/little"
"gordenko.dev/dima/qb"
"gordenko.dev/dima/qb/bin"
"gordenko.dev/dima/qb/util"
)
@@ -35,55 +35,58 @@ func (s *Atree) DeletePages(pageNumbers []uint32) {
}
func (s *Atree) fetchIndexPage(pageNo uint32) ([]byte, error) {
buf, err := s.fetchPage(pageNo)
if err != nil {
return nil, err
}
if buf[pageTypeIdx] != PageTypeIndex {
return nil, fmt.Errorf("wrong pageType %d instead of %d", buf[pageTypeIdx], PageTypeIndex)
}
return buf, nil
// buf, err := s.fetchPage(pageNo)
// if err != nil {
// return nil, err
// }
// if buf[pageTypeIdx] != PageTypeIndex {
// return nil, fmt.Errorf("wrong pageType %d instead of %d", buf[pageTypeIdx], PageTypeIndex)
// }
// return buf, nil
return nil, nil
}
func (s *Atree) fetchDataPage(pageNo uint32) ([]byte, error) {
buf, err := s.fetchPage(pageNo)
if err != nil {
return nil, err
}
if buf[pageTypeIdx] != PageTypeIndex {
return nil, fmt.Errorf("wrong pageType %d instead of %d", buf[pageTypeIdx], PageTypeIndex)
}
return buf, nil
// buf, err := s.fetchPage(pageNo)
// if err != nil {
// return nil, err
// }
// if buf[pageTypeIdx] != PageTypeIndex {
// return nil, fmt.Errorf("wrong pageType %d instead of %d", buf[pageTypeIdx], PageTypeIndex)
// }
// return buf, nil
return nil, nil
}
func (s *Atree) fetchPage(pageNo uint32) ([]byte, error) {
s.mutex.Lock()
p, ok := s.pages[pageNo]
if ok {
p.ReferenceCount++
s.mutex.Unlock()
return p.Buf, nil
}
// s.mutex.Lock()
// p, ok := s.pages[pageNo]
// if ok {
// p.ReferenceCount++
// s.mutex.Unlock()
// return p.Buf, nil
// }
resultCh := make(chan readResult, 1)
s.pageWaits[pageNo] = append(s.pageWaits[pageNo], resultCh)
if len(s.pageWaits[pageNo]) == 1 {
s.pagesToRead = append(s.pagesToRead, pageNo)
s.mutex.Unlock()
// resultCh := make(chan readResult, 1)
// s.pageWaits[pageNo] = append(s.pageWaits[pageNo], resultCh)
// if len(s.pageWaits[pageNo]) == 1 {
// s.pagesToRead = append(s.pagesToRead, pageNo)
// s.mutex.Unlock()
select {
case s.readSignalCh <- struct{}{}:
default:
}
} else {
s.mutex.Unlock()
}
// select {
// case s.readSignalCh <- struct{}{}:
// default:
// }
// } else {
// s.mutex.Unlock()
// }
result := <-resultCh
if result.Err == nil {
result.Err = s.verifyCRC(result.Data, PageSize)
}
return result.Data, result.Err
// result := <-resultCh
// if result.Err == nil {
// result.Err = s.verifyCRC(result.Data, PageSize)
// }
// return result.Data, result.Err
return nil, nil
}
func (s *Atree) releasePage(pageNo uint32) {
@@ -211,49 +214,49 @@ func (s *Atree) pageReader() {
}
func (s *Atree) readPages() {
s.mutex.Lock()
if len(s.pagesToRead) == 0 {
s.mutex.Unlock()
return
}
pagesToRead := s.pagesToRead
s.pagesToRead = nil
s.mutex.Unlock()
// s.mutex.Lock()
// if len(s.pagesToRead) == 0 {
// s.mutex.Unlock()
// return
// }
// pagesToRead := s.pagesToRead
// s.pagesToRead = nil
// s.mutex.Unlock()
for _, pageNo := range pagesToRead {
buf := make([]byte, PageSize)
off := (pageNo - 1) * PageSize
n, err := s.file.ReadAt(buf, int64(off))
if n != PageSize {
err = fmt.Errorf("read %d instead of %d", n, PageSize)
}
// for _, pageNo := range pagesToRead {
// buf := make([]byte, PageSize)
// off := (pageNo - 1) * PageSize
// n, err := s.file.ReadAt(buf, int64(off))
// if n != PageSize {
// err = fmt.Errorf("read %d instead of %d", n, PageSize)
// }
s.mutex.Lock()
resultChannels := s.pageWaits[pageNo]
delete(s.pageWaits, pageNo)
// s.mutex.Lock()
// resultChannels := s.pageWaits[pageNo]
// delete(s.pageWaits, pageNo)
if err != nil {
s.mutex.Unlock()
for _, resultCh := range resultChannels {
resultCh <- readResult{
Err: err,
}
}
} else {
s.pages[pageNo] = &_page{
// fix - page type
PageNo: pageNo,
Buf: buf,
ReferenceCount: len(resultChannels),
}
s.mutex.Unlock()
for _, resultCh := range resultChannels {
resultCh <- readResult{
Data: buf,
}
}
}
}
// if err != nil {
// s.mutex.Unlock()
// for _, resultCh := range resultChannels {
// resultCh <- readResult{
// Err: err,
// }
// }
// } else {
// s.pages[pageNo] = &_page{
// // fix - page type
// PageNo: pageNo,
// Buf: buf,
// ReferenceCount: len(resultChannels),
// }
// s.mutex.Unlock()
// for _, resultCh := range resultChannels {
// resultCh <- readResult{
// Data: buf,
// }
// }
// }
// }
}
// WRITE
@@ -364,7 +367,7 @@ func (s *Atree) verifyCRC(data []byte, pageSize int) error {
var (
pos = pageSize - 4
calculatedCRC = util.CalcChecksum(data[:pos])
storedCRC = bin.GetUint32(data[pos:])
storedCRC, _ = bin.GetUint32(data[pos:])
)
if calculatedCRC != storedCRC {
return fmt.Errorf("calculatedCRC %d not equal storedCRC %d",