mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-09-19 10:17:56 +08:00
read from volume index file directly instead of open a separate file
fix https://github.com/chrislusf/seaweedfs/issues/1640 read from volume index file directly instead of open a separate file, to ensure reading latest index entries.
This commit is contained in:
@@ -2,9 +2,11 @@ package storage
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"github.com/chrislusf/seaweedfs/weed/storage/idx"
|
||||
"github.com/chrislusf/seaweedfs/weed/storage/needle_map"
|
||||
. "github.com/chrislusf/seaweedfs/weed/storage/types"
|
||||
)
|
||||
@@ -31,6 +33,7 @@ type NeedleMapper interface {
|
||||
MaxFileKey() NeedleId
|
||||
IndexFileSize() uint64
|
||||
Sync() error
|
||||
ReadIndexEntry(n int64) (key NeedleId, offset Offset, size Size, err error)
|
||||
}
|
||||
|
||||
type baseNeedleMapper struct {
|
||||
@@ -64,3 +67,20 @@ func (nm *baseNeedleMapper) appendToIndexFile(key NeedleId, offset Offset, size
|
||||
func (nm *baseNeedleMapper) Sync() error {
|
||||
return nm.indexFile.Sync()
|
||||
}
|
||||
|
||||
func (nm *baseNeedleMapper) ReadIndexEntry(n int64) (key NeedleId, offset Offset, size Size, err error) {
|
||||
bytes := make([]byte, NeedleMapEntrySize)
|
||||
var readCount int
|
||||
if readCount, err = nm.indexFile.ReadAt(bytes, n*NeedleMapEntrySize); err != nil {
|
||||
if err == io.EOF {
|
||||
if readCount == NeedleMapEntrySize {
|
||||
err = nil
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
key, offset, size = idx.IdxFileEntry(bytes)
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user