aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2021-02-20 12:39:25 -0800
committerChris Lu <chris.lu@gmail.com>2021-02-20 12:39:25 -0800
commit1ad3200094bc08affd0bb640b24b83f15fedcebd (patch)
tree3a8a0d427caa618778a7c515efd8b1aa52330559
parent98c93ca46587795fa03a0c52bea5be31a886be87 (diff)
downloadseaweedfs-1ad3200094bc08affd0bb640b24b83f15fedcebd.tar.xz
seaweedfs-1ad3200094bc08affd0bb640b24b83f15fedcebd.zip
skip seek() when index file writes
-rw-r--r--weed/storage/needle/needle_read_write.go10
-rw-r--r--weed/storage/needle_map.go9
-rw-r--r--weed/storage/needle_map_leveldb.go5
-rw-r--r--weed/storage/needle_map_memory.go5
4 files changed, 23 insertions, 6 deletions
diff --git a/weed/storage/needle/needle_read_write.go b/weed/storage/needle/needle_read_write.go
index e758a6fee..0f72bc0bb 100644
--- a/weed/storage/needle/needle_read_write.go
+++ b/weed/storage/needle/needle_read_write.go
@@ -161,7 +161,15 @@ func ReadNeedleBlob(r backend.BackendStorageFile, offset int64, size Size, versi
dataSize := GetActualSize(size, version)
dataSlice = make([]byte, int(dataSize))
- _, err = r.ReadAt(dataSlice, offset)
+ var n int
+ n, err = r.ReadAt(dataSlice, offset)
+ if err != nil && int64(n) == dataSize {
+ err = nil
+ }
+ if err != nil {
+ fileSize, _, _ := r.GetStat()
+ println("n",n, "dataSize", dataSize, "offset", offset, "fileSize", fileSize)
+ }
return dataSlice, err
}
diff --git a/weed/storage/needle_map.go b/weed/storage/needle_map.go
index 5b41286ea..d35391f66 100644
--- a/weed/storage/needle_map.go
+++ b/weed/storage/needle_map.go
@@ -1,7 +1,6 @@
package storage
import (
- "fmt"
"io"
"os"
"sync"
@@ -41,6 +40,7 @@ type baseNeedleMapper struct {
indexFile *os.File
indexFileAccessLock sync.Mutex
+ indexFileOffset int64
}
func (nm *baseNeedleMapper) IndexFileSize() uint64 {
@@ -56,11 +56,10 @@ func (nm *baseNeedleMapper) appendToIndexFile(key NeedleId, offset Offset, size
nm.indexFileAccessLock.Lock()
defer nm.indexFileAccessLock.Unlock()
- if _, err := nm.indexFile.Seek(0, 2); err != nil {
- return fmt.Errorf("cannot seek end of indexfile %s: %v",
- nm.indexFile.Name(), err)
+ written, err := nm.indexFile.WriteAt(bytes, nm.indexFileOffset)
+ if err == nil {
+ nm.indexFileOffset += int64(written)
}
- _, err := nm.indexFile.Write(bytes)
return err
}
diff --git a/weed/storage/needle_map_leveldb.go b/weed/storage/needle_map_leveldb.go
index 415cd14dd..9716e9729 100644
--- a/weed/storage/needle_map_leveldb.go
+++ b/weed/storage/needle_map_leveldb.go
@@ -31,6 +31,11 @@ func NewLevelDbNeedleMap(dbFileName string, indexFile *os.File, opts *opt.Option
generateLevelDbFile(dbFileName, indexFile)
glog.V(1).Infof("Finished Generating %s from %s", dbFileName, indexFile.Name())
}
+ if stat, err := indexFile.Stat(); err != nil {
+ glog.Fatalf("stat file %s: %v", indexFile.Name(), err)
+ } else {
+ m.indexFileOffset = stat.Size()
+ }
glog.V(1).Infof("Opening %s...", dbFileName)
if m.db, err = leveldb.OpenFile(dbFileName, opts); err != nil {
diff --git a/weed/storage/needle_map_memory.go b/weed/storage/needle_map_memory.go
index d0891dc98..1b58708c6 100644
--- a/weed/storage/needle_map_memory.go
+++ b/weed/storage/needle_map_memory.go
@@ -19,6 +19,11 @@ func NewCompactNeedleMap(file *os.File) *NeedleMap {
m: needle_map.NewCompactMap(),
}
nm.indexFile = file
+ stat, err := file.Stat()
+ if err != nil {
+ glog.Fatalf("stat file %s: %v", file.Name(), err)
+ }
+ nm.indexFileOffset = stat.Size()
return nm
}