mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-09-19 09:57:56 +08:00
volume: use sorted index map for readonly volumes
This commit is contained in:
@@ -21,16 +21,16 @@ const (
|
||||
ErasureCodingSmallBlockSize = 1024 * 1024 // 1MB
|
||||
)
|
||||
|
||||
// WriteSortedEcxFile generates .ecx file from existing .idx file
|
||||
// WriteSortedFileFromIdx generates .ecx file from existing .idx file
|
||||
// all keys are sorted in ascending order
|
||||
func WriteSortedEcxFile(baseFileName string) (e error) {
|
||||
func WriteSortedFileFromIdx(baseFileName string, ext string) (e error) {
|
||||
|
||||
cm, err := readCompactMap(baseFileName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("readCompactMap: %v", err)
|
||||
}
|
||||
|
||||
ecxFile, err := os.OpenFile(baseFileName+".ecx", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
ecxFile, err := os.OpenFile(baseFileName+ext, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open ecx file: %v", err)
|
||||
}
|
||||
@@ -43,7 +43,7 @@ func WriteSortedEcxFile(baseFileName string) (e error) {
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to visit ecx file: %v", err)
|
||||
return fmt.Errorf("failed to visit idx file: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@@ -26,14 +26,14 @@ func TestEncodingDecoding(t *testing.T) {
|
||||
t.Logf("generateEcFiles: %v", err)
|
||||
}
|
||||
|
||||
err = WriteSortedEcxFile(baseFileName)
|
||||
err = WriteSortedFileFromIdx(baseFileName, ".ecx")
|
||||
if err != nil {
|
||||
t.Logf("WriteSortedEcxFile: %v", err)
|
||||
t.Logf("WriteSortedFileFromIdx: %v", err)
|
||||
}
|
||||
|
||||
err = validateFiles(baseFileName)
|
||||
if err != nil {
|
||||
t.Logf("WriteSortedEcxFile: %v", err)
|
||||
t.Logf("WriteSortedFileFromIdx: %v", err)
|
||||
}
|
||||
|
||||
removeGeneratedFiles(baseFileName)
|
||||
|
@@ -186,10 +186,10 @@ func (ev *EcVolume) LocateEcShardNeedle(needleId types.NeedleId, version needle.
|
||||
}
|
||||
|
||||
func (ev *EcVolume) FindNeedleFromEcx(needleId types.NeedleId) (offset types.Offset, size uint32, err error) {
|
||||
return searchNeedleFromEcx(ev.ecxFile, ev.ecxFileSize, needleId, nil)
|
||||
return SearchNeedleFromSortedIndex(ev.ecxFile, ev.ecxFileSize, needleId, nil)
|
||||
}
|
||||
|
||||
func searchNeedleFromEcx(ecxFile *os.File, ecxFileSize int64, needleId types.NeedleId, processNeedleFn func(file *os.File, offset int64) error) (offset types.Offset, size uint32, err error) {
|
||||
func SearchNeedleFromSortedIndex(ecxFile *os.File, ecxFileSize int64, needleId types.NeedleId, processNeedleFn func(file *os.File, offset int64) error) (offset types.Offset, size uint32, err error) {
|
||||
var key types.NeedleId
|
||||
buf := make([]byte, types.NeedleMapEntrySize)
|
||||
l, h := int64(0), ecxFileSize/types.NeedleMapEntrySize
|
||||
|
@@ -10,15 +10,15 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
markNeedleDeleted = func(file *os.File, offset int64) error {
|
||||
MarkNeedleDeleted = func(file *os.File, offset int64) error {
|
||||
b := make([]byte, types.SizeSize)
|
||||
util.Uint32toBytes(b, types.TombstoneFileSize)
|
||||
n, err := file.WriteAt(b, offset+types.NeedleIdSize+types.OffsetSize)
|
||||
if err != nil {
|
||||
return fmt.Errorf("ecx write error: %v", err)
|
||||
return fmt.Errorf("sorted needle write error: %v", err)
|
||||
}
|
||||
if n != types.SizeSize {
|
||||
return fmt.Errorf("ecx written %d bytes, expecting %d", n, types.SizeSize)
|
||||
return fmt.Errorf("sorted needle written %d bytes, expecting %d", n, types.SizeSize)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -26,7 +26,7 @@ var (
|
||||
|
||||
func (ev *EcVolume) DeleteNeedleFromEcx(needleId types.NeedleId) (err error) {
|
||||
|
||||
_, _, err = searchNeedleFromEcx(ev.ecxFile, ev.ecxFileSize, needleId, markNeedleDeleted)
|
||||
_, _, err = SearchNeedleFromSortedIndex(ev.ecxFile, ev.ecxFileSize, needleId, MarkNeedleDeleted)
|
||||
|
||||
if err != nil {
|
||||
if err == NotFoundError {
|
||||
@@ -81,7 +81,7 @@ func RebuildEcxFile(baseFileName string) error {
|
||||
|
||||
needleId := types.BytesToNeedleId(buf)
|
||||
|
||||
_, _, err = searchNeedleFromEcx(ecxFile, ecxFileSize, needleId, markNeedleDeleted)
|
||||
_, _, err = SearchNeedleFromSortedIndex(ecxFile, ecxFileSize, needleId, MarkNeedleDeleted)
|
||||
|
||||
if err != nil && err != NotFoundError {
|
||||
ecxFile.Close()
|
||||
|
Reference in New Issue
Block a user