fix(files): used space not updated after deleting folder

This commit is contained in:
hexxa 2022-03-05 19:00:27 +08:00 committed by Hexxa
parent d4b41cc401
commit 062d697841
3 changed files with 96 additions and 26 deletions

View file

@ -1,6 +1,7 @@
package boltstore package boltstore
import ( import (
"bytes"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
@ -289,48 +290,45 @@ func (bs *BoltStore) DelInfos(userID uint64, itemPath string, isDir bool) error
return bs.boltdb.Update(func(tx *bolt.Tx) error { return bs.boltdb.Update(func(tx *bolt.Tx) error {
var err error var err error
// delete file info
fileInfoBucket := tx.Bucket([]byte(db.InfoNs)) fileInfoBucket := tx.Bucket([]byte(db.InfoNs))
if fileInfoBucket == nil { if fileInfoBucket == nil {
return db.ErrBucketNotFound return db.ErrBucketNotFound
} }
fileInfoBytes := fileInfoBucket.Get([]byte(itemPath)) // delete children
if fileInfoBytes == nil { prefixBytes := []byte(itemPath)
if !isDir { cur := fileInfoBucket.Cursor()
return db.ErrKeyNotFound usedSpaceDecr := int64(0)
} for k, v := cur.Seek(prefixBytes); k != nil && bytes.HasPrefix(k, prefixBytes); k, v = cur.Next() {
} else {
fileInfo := &db.FileInfo{} fileInfo := &db.FileInfo{}
err = json.Unmarshal(fileInfoBytes, fileInfo) err = json.Unmarshal(v, fileInfo)
if err != nil { if err != nil {
return err return err
} }
err = fileInfoBucket.Delete([]byte(itemPath)) usedSpaceDecr += fileInfo.Size
childPath := string(k)
err = fileInfoBucket.Delete([]byte(childPath))
if err != nil { if err != nil {
return err return err
} }
if fileInfo.IsDir {
// decr used space err = bs.delShareID(tx, childPath)
userInfo, err := bs.getUserInfo(tx, userID) if err != nil {
if err != nil { return err
return err }
}
userInfo.UsedSpace -= fileInfo.Size
err = bs.setUserInfo(tx, userID, userInfo)
if err != nil {
return err
} }
} }
// delete share id // decr used space
if isDir { userInfo, err := bs.getUserInfo(tx, userID)
err = bs.delShareID(tx, itemPath) if err != nil {
if err != nil { return err
return err }
} userInfo.UsedSpace -= usedSpaceDecr
err = bs.setUserInfo(tx, userID, userInfo)
if err != nil {
return err
} }
return nil return nil

View file

@ -3,6 +3,7 @@ package server
import ( import (
"fmt" "fmt"
"os" "os"
"path/filepath"
"testing" "testing"
"github.com/ihexxa/quickshare/src/client" "github.com/ihexxa/quickshare/src/client"
@ -148,6 +149,77 @@ func TestSpaceLimit(t *testing.T) {
} }
}) })
t.Run("usedSpace keeps correct in operations: Mkdir-Create-UploadChunk-AddSharing-Move-IsSharing-List", func(t *testing.T) {
srcDir := "qs/files/folder/move/src"
dstDir := "qs/files/folder/move/dst"
filesCl := client.NewFilesClient(addr, token)
getUsedSpace := func() int64 {
resp, selfResp, errs := usersCl.Self(token)
if len(errs) > 0 {
t.Fatal(errs)
} else if resp.StatusCode != 200 {
t.Fatal("failed to get self")
}
return selfResp.UsedSpace
}
initUsedSpace := getUsedSpace()
for _, dirPath := range []string{srcDir, dstDir} {
res, _, errs := filesCl.Mkdir(dirPath)
if len(errs) > 0 {
t.Fatal(errs)
} else if res.StatusCode != 200 {
t.Fatal(res.StatusCode)
}
}
if getUsedSpace() != initUsedSpace {
t.Fatal("incorrect used space")
}
expectedUsedSpace := initUsedSpace
files := map[string]string{
"f1.md": "111",
"f2.md": "22222",
}
for fileName, content := range files {
oldPath := filepath.Join(srcDir, fileName)
assertUploadOK(t, oldPath, content, addr, token)
expectedUsedSpace += int64(len(content))
}
if getUsedSpace() != expectedUsedSpace {
t.Fatal("used space incorrect")
}
for fileName := range files {
oldPath := filepath.Join(srcDir, fileName)
newPath := filepath.Join(dstDir, fileName)
res, _, errs := filesCl.Move(oldPath, newPath)
if len(errs) > 0 {
t.Fatal(errs)
} else if res.StatusCode != 200 {
t.Fatal(res.StatusCode)
}
if getUsedSpace() != expectedUsedSpace {
t.Fatal("used space incorrect")
}
}
res, _, errs := filesCl.Delete(dstDir)
if len(errs) > 0 {
t.Fatal(errs)
} else if res.StatusCode != 200 {
t.Fatal(res.StatusCode)
}
if getUsedSpace() != initUsedSpace {
t.Fatal("used space incorrect")
}
})
resp, _, errs = usersCl.Logout(token) resp, _, errs = usersCl.Logout(token)
if len(errs) > 0 { if len(errs) > 0 {
t.Fatal(errs) t.Fatal(errs)

Binary file not shown.