fix(files): used space not updated after deleting folder
This commit is contained in:
parent
d4b41cc401
commit
062d697841
3 changed files with 96 additions and 26 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
BIN
src/server/testdata/test_quickshare.db
vendored
BIN
src/server/testdata/test_quickshare.db
vendored
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue