mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 22:46:12 +00:00
Merge pull request #50381 from sczizzo/bugfix-issue-47800
Automatic merge from submit-queue (batch tested with PRs 50381, 51307, 49645, 50995, 51523) Bugfix: Use local JSON log buffer in parseDockerJSONLog. **What this PR does / why we need it**: The issue described in #47800 is due to a race condition in `ReadLogs`: Because the JSON log buffer (`dockerJSONLog`) is package-scoped, any two goroutines modifying the buffer could race and overwrite the other's changes. In particular, one goroutine could unmarshal a JSON log line into the buffer, then another goroutine could `Reset()` the buffer, and the resulting `Stream` would be empty (`""`). This empty `Stream` is caught in a `case` block and raises an `unexpected stream type` error. This PR creates a new buffer for each execution of `parseDockerJSONLog`, so each goroutine is guaranteed to have a local instance of the buffer. **Which issue this PR fixes**: fixes #47800 **Release note**: ```release-note Fixed an issue (#47800) where `kubectl logs -f` failed with `unexpected stream type ""`. ```
This commit is contained in:
commit
0955f3602e
@ -280,16 +280,14 @@ func parseCRILog(log []byte, msg *logMessage) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// dockerJSONLog is the JSON log buffer used in parseDockerJSONLog.
|
|
||||||
var dockerJSONLog = &jsonlog.JSONLog{}
|
|
||||||
|
|
||||||
// parseDockerJSONLog parses logs in Docker JSON log format. Docker JSON log format
|
// parseDockerJSONLog parses logs in Docker JSON log format. Docker JSON log format
|
||||||
// example:
|
// example:
|
||||||
// {"log":"content 1","stream":"stdout","time":"2016-10-20T18:39:20.57606443Z"}
|
// {"log":"content 1","stream":"stdout","time":"2016-10-20T18:39:20.57606443Z"}
|
||||||
// {"log":"content 2","stream":"stderr","time":"2016-10-20T18:39:20.57606444Z"}
|
// {"log":"content 2","stream":"stderr","time":"2016-10-20T18:39:20.57606444Z"}
|
||||||
func parseDockerJSONLog(log []byte, msg *logMessage) error {
|
func parseDockerJSONLog(log []byte, msg *logMessage) error {
|
||||||
dockerJSONLog.Reset()
|
var l = &jsonlog.JSONLog{}
|
||||||
l := dockerJSONLog
|
l.Reset()
|
||||||
|
|
||||||
// TODO: JSON decoding is fairly expensive, we should evaluate this.
|
// TODO: JSON decoding is fairly expensive, we should evaluate this.
|
||||||
if err := json.Unmarshal(log, l); err != nil {
|
if err := json.Unmarshal(log, l); err != nil {
|
||||||
return fmt.Errorf("failed with %v to unmarshal log %q", err, l)
|
return fmt.Errorf("failed with %v to unmarshal log %q", err, l)
|
||||||
|
Loading…
Reference in New Issue
Block a user