Merge pull request #18752 from cpuguy83/fix_broken_pipe_error_on_download_abrt

Don't log EPIPE errors on client download abort
This commit is contained in:
David Calavera 2016-01-05 13:34:57 -08:00
Родитель 6c30931b06 79c23fdbf4
Коммит b4e26a96da
1 изменённых файлов: 18 добавлений и 1 удалений

Просмотреть файл

@ -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 {