mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #41105 from Random-Liu/fix-kuberuntime-log
Automatic merge from submit-queue (batch tested with PRs 38796, 40823, 40756, 41083, 41105)
Let ReadLogs return when there is a read error.
Fixes a bug in kuberuntime log.
Today, @yujuhong found that once we cancel `kubectl logs -f` with `Ctrl+C`, kuberuntime will keep complaining:
```
27939 kuberuntime_logs.go:192] Failed with err write tcp 10.240.0.4:10250->10.240.0.2:53913: write: broken pipe when writing log for log file "/var/log/pods/5bb76510-ed71-11e6-ad02-42010af00002/busybox_0.log": &{timestamp:{sec:63622095387 nsec:625309193 loc:0x484c440} stream:stdout log:[84 117 101 32 70 101 98 32 32 55 32 50 48 58 49 54 58 50 55 32 85 84 67 32 50 48 49 55 10]}
```
This is because kuberuntime keeps writing to the connection even though it is already closed. Actually, kuberuntime should return and report error whenever there is a writing error.
Ref the [docker code](3a4ae1f661/pkg/stdcopy/stdcopy.go (L159-L167))
I'm still creating the cluster and verifying this fix. Will post the result here after that.
/cc @yujuhong @kubernetes/sig-node-bugs
			
			
This commit is contained in:
		@@ -191,6 +191,7 @@ func ReadLogs(path string, apiOpts *v1.PodLogOptions, stdout, stderr io.Writer)
 | 
				
			|||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			glog.Errorf("Failed with err %v when writing log for log file %q: %+v", err, path, msg)
 | 
								glog.Errorf("Failed with err %v when writing log for log file %q: %+v", err, path, msg)
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -299,6 +300,9 @@ type logWriter struct {
 | 
				
			|||||||
// errMaximumWrite is returned when all bytes have been written.
 | 
					// errMaximumWrite is returned when all bytes have been written.
 | 
				
			||||||
var errMaximumWrite = errors.New("maximum write")
 | 
					var errMaximumWrite = errors.New("maximum write")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// errShortWrite is returned when the message is not fully written.
 | 
				
			||||||
 | 
					var errShortWrite = errors.New("short write")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newLogWriter(stdout io.Writer, stderr io.Writer, opts *logOptions) *logWriter {
 | 
					func newLogWriter(stdout io.Writer, stderr io.Writer, opts *logOptions) *logWriter {
 | 
				
			||||||
	w := &logWriter{
 | 
						w := &logWriter{
 | 
				
			||||||
		stdout: stdout,
 | 
							stdout: stdout,
 | 
				
			||||||
@@ -342,6 +346,10 @@ func (w *logWriter) write(msg *logMessage) error {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// If the line has not been fully written, return errShortWrite
 | 
				
			||||||
 | 
						if n < len(line) {
 | 
				
			||||||
 | 
							return errShortWrite
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	// If there are no more bytes left, return errMaximumWrite
 | 
						// If there are no more bytes left, return errMaximumWrite
 | 
				
			||||||
	if w.remain <= 0 {
 | 
						if w.remain <= 0 {
 | 
				
			||||||
		return errMaximumWrite
 | 
							return errMaximumWrite
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user