aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/needle_map_memory.go
diff options
context:
space:
mode:
authorGuo Lei <snipergg@163.com>2022-08-24 14:53:35 +0800
committerGitHub <noreply@github.com>2022-08-23 23:53:35 -0700
commitc57c79a0ab2cb2b83c2f7ebf90a0d86c621f4d9f (patch)
tree2cddc63784b0d5b5f97a47a91cadeba78e8a9030 /weed/storage/needle_map_memory.go
parent10414fd81c2744b2b031f4d2f8a935b614d702f1 (diff)
downloadseaweedfs-c57c79a0ab2cb2b83c2f7ebf90a0d86c621f4d9f.tar.xz
seaweedfs-c57c79a0ab2cb2b83c2f7ebf90a0d86c621f4d9f.zip
optimiz commitig compact (#3388)
* optimiz vacuuming volume * fix bugx * rename parameters * fix conflict * change copyDataBasedOnIndexFile to an instance method * close needlemap * optimiz commiting Vacuum volume for leveldb index * fix bugs * fix leveldb loading bugs * refactor * fix leveldb loading bug * add leveldb recovery * add test case for levelDB * modify test case to cover all the new branches * use one tmpNm instead of two instances * refactor * refactor * move setWatermark to the end * add test for watermark and updating leveldb * fix error logic * refactor, add test * check nil before close needlemapeer add test case fix metric bug * add tests, fix bugs * adjust log level remove wrong test case refactor * avoid duplicate updating metric for leveldb index
Diffstat (limited to 'weed/storage/needle_map_memory.go')
-rw-r--r--weed/storage/needle_map_memory.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/weed/storage/needle_map_memory.go b/weed/storage/needle_map_memory.go
index 99a9f28e0..93b1fa4f5 100644
--- a/weed/storage/needle_map_memory.go
+++ b/weed/storage/needle_map_memory.go
@@ -7,6 +7,7 @@ import (
"github.com/seaweedfs/seaweedfs/weed/storage/idx"
"github.com/seaweedfs/seaweedfs/weed/storage/needle_map"
. "github.com/seaweedfs/seaweedfs/weed/storage/types"
+ "github.com/syndtr/goleveldb/leveldb/opt"
)
type NeedleMap struct {
@@ -69,6 +70,9 @@ func (nm *NeedleMap) Delete(key NeedleId, offset Offset) error {
return nm.appendToIndexFile(key, offset, TombstoneFileSize)
}
func (nm *NeedleMap) Close() {
+ if nm.indexFile == nil {
+ return
+ }
indexFileName := nm.indexFile.Name()
if err := nm.indexFile.Sync(); err != nil {
glog.Warningf("sync file %s failed, %v", indexFileName, err)
@@ -79,3 +83,53 @@ func (nm *NeedleMap) Destroy() error {
nm.Close()
return os.Remove(nm.indexFile.Name())
}
+
+func (nm *NeedleMap) UpdateNeedleMap(v *Volume, indexFile *os.File, opts *opt.Options) error {
+ if v.nm != nil {
+ v.nm.Close()
+ v.nm = nil
+ }
+ defer func() {
+ if v.tmpNm != nil {
+ v.tmpNm.Close()
+ v.tmpNm = nil
+ }
+ }()
+ nm.indexFile = indexFile
+ stat, err := indexFile.Stat()
+ if err != nil {
+ glog.Fatalf("stat file %s: %v", indexFile.Name(), err)
+ return err
+ }
+ nm.indexFileOffset = stat.Size()
+ v.nm = nm
+ v.tmpNm = nil
+ return nil
+}
+
+func (nm *NeedleMap) DoOffsetLoading(v *Volume, indexFile *os.File, startFrom uint64) error {
+ glog.V(0).Infof("loading idx from offset %d for file: %s", startFrom, indexFile.Name())
+ e := idx.WalkIndexFile(indexFile, startFrom, func(key NeedleId, offset Offset, size Size) error {
+ nm.MaybeSetMaxFileKey(key)
+ nm.FileCounter++
+ if !offset.IsZero() && size.IsValid() {
+ nm.FileByteCounter = nm.FileByteCounter + uint64(size)
+ oldOffset, oldSize := nm.m.Set(NeedleId(key), offset, size)
+ if !oldOffset.IsZero() && oldSize.IsValid() {
+ nm.DeletionCounter++
+ nm.DeletionByteCounter = nm.DeletionByteCounter + uint64(oldSize)
+ }
+ } else {
+ oldSize := nm.m.Delete(NeedleId(key))
+ nm.DeletionCounter++
+ nm.DeletionByteCounter = nm.DeletionByteCounter + uint64(oldSize)
+ }
+ return nil
+ })
+
+ return e
+}
+
+func (m *NeedleMap) UpdateNeedleMapMetric(indexFile *os.File) error {
+ return nil
+}