2
2
mirror of https://github.com/octoleo/restic.git synced 2024-11-04 20:37:49 +00:00

fuse: Add debug logs

This commit is contained in:
Alexander Neumann 2016-05-08 22:20:46 +02:00
parent 7c76ff3aaf
commit 6ee9baa9c5
3 changed files with 27 additions and 0 deletions

View File

@ -11,6 +11,7 @@ import (
"golang.org/x/net/context" "golang.org/x/net/context"
"restic" "restic"
"restic/debug"
"restic/repository" "restic/repository"
) )
@ -27,8 +28,10 @@ type dir struct {
} }
func newDir(repo *repository.Repository, node *restic.Node, ownerIsRoot bool) (*dir, error) { func newDir(repo *repository.Repository, node *restic.Node, ownerIsRoot bool) (*dir, error) {
debug.Log("newDir", "new dir for %v (%v)", node.Name, node.Subtree.Str())
tree, err := restic.LoadTree(repo, *node.Subtree) tree, err := restic.LoadTree(repo, *node.Subtree)
if err != nil { if err != nil {
debug.Log("newDir", " error loading tree %v: %v", node.Subtree.Str(), err)
return nil, err return nil, err
} }
items := make(map[string]*restic.Node) items := make(map[string]*restic.Node)
@ -65,14 +68,17 @@ func replaceSpecialNodes(repo *repository.Repository, node *restic.Node) ([]*res
} }
func newDirFromSnapshot(repo *repository.Repository, snapshot SnapshotWithId, ownerIsRoot bool) (*dir, error) { func newDirFromSnapshot(repo *repository.Repository, snapshot SnapshotWithId, ownerIsRoot bool) (*dir, error) {
debug.Log("newDirFromSnapshot", "new dir for snapshot %v (%v)", snapshot.ID.Str(), snapshot.Tree.Str())
tree, err := restic.LoadTree(repo, *snapshot.Tree) tree, err := restic.LoadTree(repo, *snapshot.Tree)
if err != nil { if err != nil {
debug.Log("newDirFromSnapshot", " loadTree(%v) failed: %v", snapshot.ID.Str(), err)
return nil, err return nil, err
} }
items := make(map[string]*restic.Node) items := make(map[string]*restic.Node)
for _, n := range tree.Nodes { for _, n := range tree.Nodes {
nodes, err := replaceSpecialNodes(repo, n) nodes, err := replaceSpecialNodes(repo, n)
if err != nil { if err != nil {
debug.Log("newDirFromSnapshot", " replaceSpecialNodes(%v) failed: %v", n, err)
return nil, err return nil, err
} }
@ -98,6 +104,7 @@ func newDirFromSnapshot(repo *repository.Repository, snapshot SnapshotWithId, ow
} }
func (d *dir) Attr(ctx context.Context, a *fuse.Attr) error { func (d *dir) Attr(ctx context.Context, a *fuse.Attr) error {
debug.Log("dir.Attr", "called")
a.Inode = d.inode a.Inode = d.inode
a.Mode = os.ModeDir | d.node.Mode a.Mode = os.ModeDir | d.node.Mode
@ -112,6 +119,7 @@ func (d *dir) Attr(ctx context.Context, a *fuse.Attr) error {
} }
func (d *dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { func (d *dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
debug.Log("dir.ReadDirAll", "called")
ret := make([]fuse.Dirent, 0, len(d.items)) ret := make([]fuse.Dirent, 0, len(d.items))
for _, node := range d.items { for _, node := range d.items {
@ -136,8 +144,10 @@ func (d *dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
} }
func (d *dir) Lookup(ctx context.Context, name string) (fs.Node, error) { func (d *dir) Lookup(ctx context.Context, name string) (fs.Node, error) {
debug.Log("dir.Lookup", "Lookup(%v)", name)
node, ok := d.items[name] node, ok := d.items[name]
if !ok { if !ok {
debug.Log("dir.Lookup", " Lookup(%v) -> not found", name)
return nil, fuse.ENOENT return nil, fuse.ENOENT
} }
switch node.Type { switch node.Type {
@ -148,6 +158,7 @@ func (d *dir) Lookup(ctx context.Context, name string) (fs.Node, error) {
case "symlink": case "symlink":
return newLink(d.repo, node, d.ownerIsRoot) return newLink(d.repo, node, d.ownerIsRoot)
default: default:
debug.Log("dir.Lookup", " node %v has unknown type %v", name, node.Type)
return nil, fuse.ENOENT return nil, fuse.ENOENT
} }
} }

View File

@ -8,6 +8,7 @@ import (
"restic" "restic"
"restic/backend" "restic/backend"
"restic/debug"
"restic/pack" "restic/pack"
"bazil.org/fuse" "bazil.org/fuse"
@ -47,6 +48,7 @@ var blobPool = sync.Pool{
} }
func newFile(repo BlobLoader, node *restic.Node, ownerIsRoot bool) (*file, error) { func newFile(repo BlobLoader, node *restic.Node, ownerIsRoot bool) (*file, error) {
debug.Log("newFile", "create new file for %v with %d blobs", node.Name, len(node.Content))
sizes := make([]uint, len(node.Content)) sizes := make([]uint, len(node.Content))
for i, id := range node.Content { for i, id := range node.Content {
size, err := repo.LookupBlobSize(id) size, err := repo.LookupBlobSize(id)
@ -67,6 +69,7 @@ func newFile(repo BlobLoader, node *restic.Node, ownerIsRoot bool) (*file, error
} }
func (f *file) Attr(ctx context.Context, a *fuse.Attr) error { func (f *file) Attr(ctx context.Context, a *fuse.Attr) error {
debug.Log("file.Attr", "Attr(%v)", f.node.Name)
a.Inode = f.node.Inode a.Inode = f.node.Inode
a.Mode = f.node.Mode a.Mode = f.node.Mode
a.Size = f.node.Size a.Size = f.node.Size
@ -84,6 +87,7 @@ func (f *file) Attr(ctx context.Context, a *fuse.Attr) error {
} }
func (f *file) getBlobAt(i int) (blob []byte, err error) { func (f *file) getBlobAt(i int) (blob []byte, err error) {
debug.Log("file.getBlobAt", "getBlobAt(%v, %v)", f.node.Name, i)
if f.blobs[i] != nil { if f.blobs[i] != nil {
return f.blobs[i], nil return f.blobs[i], nil
} }
@ -100,6 +104,7 @@ func (f *file) getBlobAt(i int) (blob []byte, err error) {
blob, err = f.repo.LoadBlob(pack.Data, f.node.Content[i], buf) blob, err = f.repo.LoadBlob(pack.Data, f.node.Content[i], buf)
if err != nil { if err != nil {
debug.Log("file.getBlobAt", "LoadBlob(%v, %v) failed: %v", f.node.Name, f.node.Content[i], err)
return nil, err return nil, err
} }
f.blobs[i] = blob f.blobs[i] = blob
@ -108,6 +113,7 @@ func (f *file) getBlobAt(i int) (blob []byte, err error) {
} }
func (f *file) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { func (f *file) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
debug.Log("file.Read", "Read(%v), file size %v", req.Size, f.node.Size)
offset := req.Offset offset := req.Offset
// Skip blobs before the offset // Skip blobs before the offset

View File

@ -13,6 +13,7 @@ import (
"restic" "restic"
"restic/backend" "restic/backend"
"restic/debug"
"restic/repository" "restic/repository"
"golang.org/x/net/context" "golang.org/x/net/context"
@ -39,6 +40,7 @@ type SnapshotsDir struct {
} }
func NewSnapshotsDir(repo *repository.Repository, ownerIsRoot bool) *SnapshotsDir { func NewSnapshotsDir(repo *repository.Repository, ownerIsRoot bool) *SnapshotsDir {
debug.Log("NewSnapshotsDir", "fuse mount initiated")
return &SnapshotsDir{ return &SnapshotsDir{
repo: repo, repo: repo,
knownSnapshots: make(map[string]SnapshotWithId), knownSnapshots: make(map[string]SnapshotWithId),
@ -54,10 +56,12 @@ func (sn *SnapshotsDir) Attr(ctx context.Context, attr *fuse.Attr) error {
attr.Uid = uint32(os.Getuid()) attr.Uid = uint32(os.Getuid())
attr.Gid = uint32(os.Getgid()) attr.Gid = uint32(os.Getgid())
} }
debug.Log("SnapshotsDir.Attr", "attr is %v", attr)
return nil return nil
} }
func (sn *SnapshotsDir) updateCache(ctx context.Context) error { func (sn *SnapshotsDir) updateCache(ctx context.Context) error {
debug.Log("SnapshotsDir.updateCache", "called")
sn.Lock() sn.Lock()
defer sn.Unlock() defer sn.Unlock()
@ -75,10 +79,12 @@ func (sn *SnapshotsDir) get(name string) (snapshot SnapshotWithId, ok bool) {
sn.RLock() sn.RLock()
snapshot, ok = sn.knownSnapshots[name] snapshot, ok = sn.knownSnapshots[name]
sn.RUnlock() sn.RUnlock()
debug.Log("SnapshotsDir.get", "get(%s) -> %v %v", name, snapshot, ok)
return snapshot, ok return snapshot, ok
} }
func (sn *SnapshotsDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { func (sn *SnapshotsDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
debug.Log("SnapshotsDir.ReadDirAll", "called")
err := sn.updateCache(ctx) err := sn.updateCache(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
@ -96,21 +102,25 @@ func (sn *SnapshotsDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
}) })
} }
debug.Log("SnapshotsDir.ReadDirAll", " -> %d entries", len(ret))
return ret, nil return ret, nil
} }
func (sn *SnapshotsDir) Lookup(ctx context.Context, name string) (fs.Node, error) { func (sn *SnapshotsDir) Lookup(ctx context.Context, name string) (fs.Node, error) {
debug.Log("SnapshotsDir.updateCache", "Lookup(%s)", name)
snapshot, ok := sn.get(name) snapshot, ok := sn.get(name)
if !ok { if !ok {
// We don't know about it, update the cache // We don't know about it, update the cache
err := sn.updateCache(ctx) err := sn.updateCache(ctx)
if err != nil { if err != nil {
debug.Log("SnapshotsDir.updateCache", " Lookup(%s) -> err %v", name, err)
return nil, err return nil, err
} }
snapshot, ok = sn.get(name) snapshot, ok = sn.get(name)
if !ok { if !ok {
// We still don't know about it, this time it really doesn't exist // We still don't know about it, this time it really doesn't exist
debug.Log("SnapshotsDir.updateCache", " Lookup(%s) -> not found", name)
return nil, fuse.ENOENT return nil, fuse.ENOENT
} }
} }