cid string
}
-func CopyPipeToChan(in io.Reader, out chan string, done chan<- bool) {
+func CopyPipeToChan(in io.ReadCloser, out chan string, done chan<- bool) {
+ defer in.Close()
+
+ // TODO(twp): handle long input records gracefully, if possible
+ // without killing the child task (#4889)
+ //
s := bufio.NewScanner(in)
for s.Scan() {
out <- s.Text()
}
+ if s.Err() != nil {
+ out <- fmt.Sprintf("crunchstat: line buffering error: %s", s.Err())
+ }
done <- true
}
}
var logChan chan string
+
func LogPrintf(format string, args ...interface{}) {
if logChan == nil {
return
}
- logChan <- fmt.Sprintf("crunchstat: " + format, args...)
+ logChan <- fmt.Sprintf("crunchstat: "+format, args...)
}
func ReadAllOrWarn(in *os.File) ([]byte, error) {
defer c.Close()
b := bufio.NewScanner(c)
thisSample := MemSample{time.Now(), make(map[string]int64)}
- wantStats := [...]string{"cache", "pgmajfault", "rss"}
+ wantStats := [...]string{"cache", "swap", "pgmajfault", "rss"}
for b.Scan() {
var stat string
var val int64
nextSample.txBytes = tx
nextSample.rxBytes = rx
var delta string
- if lastSample, ok := lastSample[ifName]; ok {
- interval := nextSample.sampleTime.Sub(lastSample.sampleTime).Seconds()
+ if prev, ok := lastSample[ifName]; ok {
+ interval := nextSample.sampleTime.Sub(prev.sampleTime).Seconds()
delta = fmt.Sprintf(" -- interval %.4f seconds %d tx %d rx",
interval,
- tx-lastSample.txBytes,
- rx-lastSample.rxBytes)
+ tx-prev.txBytes,
+ rx-prev.rxBytes)
}
LogPrintf("net:%s %d tx %d rx%s", ifName, tx, rx, delta)
lastSample[ifName] = nextSample