wp
This commit is contained in:
167
atree/io.go
167
atree/io.go
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user