From: Matt Joiner Date: Wed, 27 Aug 2014 22:08:09 +0000 (+1000) Subject: Add some counters and tracking to torrentfs events X-Git-Tag: v1.0.0~1589 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=94e03a792876cbf5a471708a4f9e5426272c5887;p=btrtrc.git Add some counters and tracking to torrentfs events --- 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: