aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/needle_map_memory.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2020-09-10 14:42:50 -0700
committerChris Lu <chris.lu@gmail.com>2020-09-10 14:42:52 -0700
commitc9ab8d05fa9b425352ce978b5c5b5b0d71d787ad (patch)
tree54eb1b881c6345a66fadca7ce9db1cfd0e800fad /weed/storage/needle_map_memory.go
parent07ec6c89a01e55d1745ddc75395ecd0dfe4cce02 (diff)
downloadseaweedfs-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.go19
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()