refactor Offset into a struct of bytes
This commit is contained in:
@@ -110,7 +110,7 @@ func (v *Volume) findLastAppendAtNs() (uint64, error) {
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if offset == 0 {
|
||||
if offset.IsZero() {
|
||||
return 0, nil
|
||||
}
|
||||
return v.readAppendAtNs(offset)
|
||||
@@ -119,26 +119,26 @@ func (v *Volume) findLastAppendAtNs() (uint64, error) {
|
||||
func (v *Volume) locateLastAppendEntry() (Offset, error) {
|
||||
indexFile, e := os.OpenFile(v.FileName()+".idx", os.O_RDONLY, 0644)
|
||||
if e != nil {
|
||||
return 0, fmt.Errorf("cannot read %s.idx: %v", v.FileName(), e)
|
||||
return Offset{}, fmt.Errorf("cannot read %s.idx: %v", v.FileName(), e)
|
||||
}
|
||||
defer indexFile.Close()
|
||||
|
||||
fi, err := indexFile.Stat()
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("file %s stat error: %v", indexFile.Name(), err)
|
||||
return Offset{}, fmt.Errorf("file %s stat error: %v", indexFile.Name(), err)
|
||||
}
|
||||
fileSize := fi.Size()
|
||||
if fileSize%NeedleEntrySize != 0 {
|
||||
return 0, fmt.Errorf("unexpected file %s size: %d", indexFile.Name(), fileSize)
|
||||
return Offset{}, fmt.Errorf("unexpected file %s size: %d", indexFile.Name(), fileSize)
|
||||
}
|
||||
if fileSize == 0 {
|
||||
return 0, nil
|
||||
return Offset{}, nil
|
||||
}
|
||||
|
||||
bytes := make([]byte, NeedleEntrySize)
|
||||
n, e := indexFile.ReadAt(bytes, fileSize-NeedleEntrySize)
|
||||
if n != NeedleEntrySize {
|
||||
return 0, fmt.Errorf("file %s read error: %v", indexFile.Name(), e)
|
||||
return Offset{}, fmt.Errorf("file %s read error: %v", indexFile.Name(), e)
|
||||
}
|
||||
_, offset, _ := IdxFileEntry(bytes)
|
||||
|
||||
@@ -147,13 +147,13 @@ func (v *Volume) locateLastAppendEntry() (Offset, error) {
|
||||
|
||||
func (v *Volume) readAppendAtNs(offset Offset) (uint64, error) {
|
||||
|
||||
n, bodyLength, err := ReadNeedleHeader(v.dataFile, v.SuperBlock.version, int64(offset)*NeedlePaddingSize)
|
||||
n, bodyLength, err := ReadNeedleHeader(v.dataFile, v.SuperBlock.version, offset.ToAcutalOffset())
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("ReadNeedleHeader: %v", err)
|
||||
}
|
||||
err = n.ReadNeedleBody(v.dataFile, v.SuperBlock.version, int64(offset)*NeedlePaddingSize+int64(NeedleEntrySize), bodyLength)
|
||||
err = n.ReadNeedleBody(v.dataFile, v.SuperBlock.version, offset.ToAcutalOffset()+int64(NeedleEntrySize), bodyLength)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("ReadNeedleBody offset %d, bodyLength %d: %v", int64(offset)*NeedlePaddingSize, bodyLength, err)
|
||||
return 0, fmt.Errorf("ReadNeedleBody offset %d, bodyLength %d: %v", offset.ToAcutalOffset(), bodyLength, err)
|
||||
}
|
||||
return n.AppendAtNs, nil
|
||||
|
||||
@@ -189,7 +189,7 @@ func (v *Volume) BinarySearchByAppendAtNs(sinceNs uint64) (offset Offset, isLast
|
||||
m := (l + h) / 2
|
||||
|
||||
if m == entryCount {
|
||||
return 0, true, nil
|
||||
return Offset{}, true, nil
|
||||
}
|
||||
|
||||
// read the appendAtNs for entry m
|
||||
@@ -214,7 +214,7 @@ func (v *Volume) BinarySearchByAppendAtNs(sinceNs uint64) (offset Offset, isLast
|
||||
}
|
||||
|
||||
if l == entryCount {
|
||||
return 0, true, nil
|
||||
return Offset{}, true, nil
|
||||
}
|
||||
|
||||
offset, err = v.readAppendAtNsForIndexEntry(indexFile, bytes, l)
|
||||
@@ -226,7 +226,7 @@ func (v *Volume) BinarySearchByAppendAtNs(sinceNs uint64) (offset Offset, isLast
|
||||
// bytes is of size NeedleEntrySize
|
||||
func (v *Volume) readAppendAtNsForIndexEntry(indexFile *os.File, bytes []byte, m int64) (Offset, error) {
|
||||
if _, readErr := indexFile.ReadAt(bytes, m*NeedleEntrySize); readErr != nil && readErr != io.EOF {
|
||||
return 0, readErr
|
||||
return Offset{}, readErr
|
||||
}
|
||||
_, offset, _ := IdxFileEntry(bytes)
|
||||
return offset, nil
|
||||
@@ -247,7 +247,7 @@ func (scanner *VolumeFileScanner4GenIdx) ReadNeedleBody() bool {
|
||||
|
||||
func (scanner *VolumeFileScanner4GenIdx) VisitNeedle(n *Needle, offset int64) error {
|
||||
if n.Size > 0 && n.Size != TombstoneFileSize {
|
||||
return scanner.v.nm.Put(n.Id, Offset(offset/NeedlePaddingSize), n.Size)
|
||||
return scanner.v.nm.Put(n.Id, ToOffset(offset), n.Size)
|
||||
}
|
||||
return scanner.v.nm.Delete(n.Id, Offset(offset/NeedlePaddingSize))
|
||||
return scanner.v.nm.Delete(n.Id, ToOffset(offset))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user