mirror of
https://github.com/restic/restic.git
synced 2026-09-15 16:57:58 +00:00
fuse: forget fs.Node instances on request by the kernel
Forget fs.Node instances once the kernel frees the corresponding nodeId. This ensures that restic does not run out of memory on large snapshots.
This commit is contained in:
+15
-8
@@ -20,14 +20,16 @@ const blockSize = 512
|
||||
|
||||
// Statically ensure that *file and *openFile implement the given interfaces
|
||||
var _ = fs.HandleReader(&openFile{})
|
||||
var _ = fs.NodeListxattrer(&file{})
|
||||
var _ = fs.NodeForgetter(&file{})
|
||||
var _ = fs.NodeGetxattrer(&file{})
|
||||
var _ = fs.NodeListxattrer(&file{})
|
||||
var _ = fs.NodeOpener(&file{})
|
||||
|
||||
type file struct {
|
||||
root *Root
|
||||
node *restic.Node
|
||||
inode uint64
|
||||
root *Root
|
||||
forget forgetFn
|
||||
node *restic.Node
|
||||
inode uint64
|
||||
}
|
||||
|
||||
type openFile struct {
|
||||
@@ -36,12 +38,13 @@ type openFile struct {
|
||||
cumsize []uint64
|
||||
}
|
||||
|
||||
func newFile(root *Root, inode uint64, node *restic.Node) (fusefile *file, err error) {
|
||||
func newFile(root *Root, forget forgetFn, inode uint64, node *restic.Node) (fusefile *file, err error) {
|
||||
debug.Log("create new file for %v with %d blobs", node.Name, len(node.Content))
|
||||
return &file{
|
||||
inode: inode,
|
||||
root: root,
|
||||
node: node,
|
||||
inode: inode,
|
||||
forget: forget,
|
||||
root: root,
|
||||
node: node,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -172,3 +175,7 @@ func (f *file) Listxattr(_ context.Context, req *fuse.ListxattrRequest, resp *fu
|
||||
func (f *file) Getxattr(_ context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
|
||||
return nodeGetXattr(f.node, req, resp)
|
||||
}
|
||||
|
||||
func (f *file) Forget() {
|
||||
f.forget()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user