浏览代码

Merge pull request #18752 from cpuguy83/fix_broken_pipe_error_on_download_abrt

Don't log EPIPE errors on client download abort
David Calavera 9 年之前
父节点
当前提交
b4e26a96da
共有 1 个文件被更改,包括 18 次插入1 次删除
  1. 18 1
      daemon/daemon.go

+ 18 - 1
daemon/daemon.go

@@ -10,11 +10,13 @@ import (
 	"fmt"
 	"io"
 	"io/ioutil"
+	"net"
 	"os"
 	"path/filepath"
 	"runtime"
 	"strings"
 	"sync"
+	"syscall"
 	"time"
 
 	"github.com/Sirupsen/logrus"
@@ -1032,7 +1034,12 @@ func writeDistributionProgress(cancelFunc func(), outStream io.Writer, progressC
 
 	for prog := range progressChan {
 		if err := progressOutput.WriteProgress(prog); err != nil && !operationCancelled {
-			logrus.Errorf("error writing progress to client: %v", err)
+			// don't log broken pipe errors as this is the normal case when a client aborts
+			if isBrokenPipe(err) {
+				logrus.Info("Pull session cancelled")
+			} else {
+				logrus.Errorf("error writing progress to client: %v", err)
+			}
 			cancelFunc()
 			operationCancelled = true
 			// Don't return, because we need to continue draining
@@ -1041,6 +1048,16 @@ func writeDistributionProgress(cancelFunc func(), outStream io.Writer, progressC
 	}
 }
 
+func isBrokenPipe(e error) bool {
+	if netErr, ok := e.(*net.OpError); ok {
+		e = netErr.Err
+		if sysErr, ok := netErr.Err.(*os.SyscallError); ok {
+			e = sysErr.Err
+		}
+	}
+	return e == syscall.EPIPE
+}
+
 // PullImage initiates a pull operation. image is the repository name to pull, and
 // tag may be either empty, or indicate a specific tag to pull.
 func (daemon *Daemon) PullImage(ref reference.Named, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error {