From 94e03a792876cbf5a471708a4f9e5426272c5887 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Thu, 28 Aug 2014 08:08:09 +1000 Subject: [PATCH] Add some counters and tracking to torrentfs events --- fs/torrentfs.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/fs/torrentfs.go b/fs/torrentfs.go index dd10d413..41877908 100644 --- a/fs/torrentfs.go +++ b/fs/torrentfs.go @@ -1,10 +1,12 @@ package torrentfs import ( + "expvar" "log" "os" "strings" "sync" + "time" "bazil.org/fuse" fusefs "bazil.org/fuse/fs" @@ -16,6 +18,12 @@ const ( defaultMode = 0555 ) +var ( + torrentfsReadRequests = expvar.NewInt("torrentfsReadRequests") + torrentfsDelayedReadRequests = expvar.NewInt("torrentfsDelayedReadRequests") + interruptedReads = expvar.NewInt("interruptedReads") +) + type torrentFS struct { Client *torrent.Client destroyed chan struct{} @@ -54,10 +62,18 @@ func (n *node) fsPath() string { } func (fn fileNode) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fusefs.Intr) fuse.Error { + torrentfsReadRequests.Add(1) + started := time.Now() if req.Dir { panic("read on directory") } - log.Printf("read request for %s: offset=%d size=%d", fn.fsPath(), req.Offset, req.Size) + defer func() { + ms := time.Now().Sub(started).Nanoseconds() / 1000000 + if ms < 20 { + return + } + log.Printf("torrentfs read took %dms", ms) + }() size := req.Size fileLeft := int64(fn.size) - req.Offset if fileLeft < int64(size) { @@ -74,6 +90,7 @@ func (fn fileNode) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fus panic(err) } }() + delayed := false for { dataWaiter := fn.FS.Client.DataWaiter() n, err := fn.FS.Client.TorrentReadAt(infoHash, torrentOff, resp.Data) @@ -82,6 +99,10 @@ func (fn fileNode) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fus resp.Data = resp.Data[:n] return nil case torrent.ErrDataNotReady: + if !delayed { + torrentfsDelayedReadRequests.Add(1) + delayed = true + } select { case <-dataWaiter: case <-fn.FS.destroyed: -- 2.48.1