diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-09-10 14:42:50 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-09-10 14:42:52 -0700 |
| commit | c9ab8d05fa9b425352ce978b5c5b5b0d71d787ad (patch) | |
| tree | 54eb1b881c6345a66fadca7ce9db1cfd0e800fad /weed/storage/needle_map_memory.go | |
| parent | 07ec6c89a01e55d1745ddc75395ecd0dfe4cce02 (diff) | |
| download | seaweedfs-c9ab8d05fa9b425352ce978b5c5b5b0d71d787ad.tar.xz seaweedfs-c9ab8d05fa9b425352ce978b5c5b5b0d71d787ad.zip | |
fixes for reading deleted fid
Diffstat (limited to 'weed/storage/needle_map_memory.go')
| -rw-r--r-- | weed/storage/needle_map_memory.go | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/weed/storage/needle_map_memory.go b/weed/storage/needle_map_memory.go index d0891dc98..3fa85deda 100644 --- a/weed/storage/needle_map_memory.go +++ b/weed/storage/needle_map_memory.go @@ -30,13 +30,18 @@ func LoadCompactNeedleMap(file *os.File) (*NeedleMap, error) { func doLoading(file *os.File, nm *NeedleMap) (*NeedleMap, error) { e := idx.WalkIndexFile(file, func(key NeedleId, offset Offset, size Size) error { nm.MaybeSetMaxFileKey(key) - if !offset.IsZero() && size.IsValid() { + if !offset.IsZero() { nm.FileCounter++ 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 if size < 0 { + // deletion + nm.DeletionCounter++ + nm.DeletionByteCounter = nm.DeletionByteCounter + uint64(-size) } } else { oldSize := nm.m.Delete(NeedleId(key)) @@ -54,14 +59,18 @@ func (nm *NeedleMap) Put(key NeedleId, offset Offset, size Size) error { nm.logPut(key, oldSize, size) return nm.appendToIndexFile(key, offset, size) } -func (nm *NeedleMap) Get(key NeedleId) (element *needle_map.NeedleValue, ok bool) { - element, ok = nm.m.Get(NeedleId(key)) +func (nm *NeedleMap) Get(key NeedleId) (existingValue *needle_map.NeedleValue, ok bool) { + existingValue, ok = nm.m.Get(NeedleId(key)) return } -func (nm *NeedleMap) Delete(key NeedleId, offset Offset) error { +func (nm *NeedleMap) Delete(key NeedleId) error { + existingValue, ok := nm.m.Get(NeedleId(key)) + if !ok || existingValue.Size.IsDeleted(){ + return nil + } deletedBytes := nm.m.Delete(NeedleId(key)) nm.logDelete(deletedBytes) - return nm.appendToIndexFile(key, offset, TombstoneFileSize) + return nm.appendToIndexFile(key, existingValue.Offset, -existingValue.Size) } func (nm *NeedleMap) Close() { indexFileName := nm.indexFile.Name() |
