Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

imageProgressWriter doesn't propagate docker errors under certain conditions #32

Closed
mmilata opened this issue Jan 17, 2017 · 5 comments
Closed
Labels
lifecycle/rotten Denotes an issue or PR that has aged beyond stale and will be auto-closed.

Comments

@mmilata
Copy link

mmilata commented Jan 17, 2017

The issue is that imageProgressWriter can be used in two ways, by calling ReadFrom or by calling Write (possibly multiple times). Both go-dockerclient and unit tests pass the writer to io.Copy which uses the ReadFrom method. However when I wrap imageProgressWriter in an io.MultiWriter the Write method is used which results in slightly different behavior. For example when the decoded JSON object contains error key, ReadFrom returns the error immediately but Write returns it on the next invocation which may never happen.

For openshift/origin#12407 I have an implementation of Write that does not use io.Pipe/goroutine but it's ugly and does a lot of unnecessary copying: https://github.com/mmilata/origin/blob/25a5c910d1afb87a0f8b6266954a72ee7eca4ec8/pkg/build/builder/dockerutil.go#L253

To reproduce:

diff --git a/imageprogress/progress_test.go b/imageprogress/progress_test.go
index 2438d80..d959f5f 100644
--- a/imageprogress/progress_test.go
+++ b/imageprogress/progress_test.go
@@ -79,7 +79,7 @@ func TestReports(t *testing.T) {
                        },
                )
                w.(*imageProgressWriter).stableThreshhold = 0
-               _, err := io.Copy(w, pipeIn)
+               _, err := io.Copy(io.MultiWriter(w), pipeIn)
                if err != nil {
                        if !test.errExpected {
                                t.Errorf("%s: unexpected: %v", test.name, err)
@@ -115,7 +115,7 @@ func TestErrorOnCopy(t *testing.T) {
        w := newWriter(func(r report) {}, func(a, b report) bool { return true })
 
        // Ensure that the error is propagated to the copy
-       _, err := io.Copy(w, genIn)
+       _, err := io.Copy(io.MultiWriter(w), genIn)
        if err == nil {
                t.Errorf("Did not get an error when copying to writer")
        }
@smarterclayton
Copy link
Contributor

Since this was just a copy of @csrwng's original code, we should just port the changes back.

@openshift-bot
Copy link

Issues go stale after 90d of inactivity.

Mark the issue as fresh by commenting /remove-lifecycle stale.
Stale issues rot after an additional 30d of inactivity and eventually close.
Exclude this issue from closing by commenting /lifecycle frozen.

If this issue is safe to close now please do so with /close.

/lifecycle stale

@openshift-ci-robot openshift-ci-robot added the lifecycle/stale Denotes an issue or PR has remained open with no activity and has become stale. label Aug 9, 2020
@openshift-bot
Copy link

Stale issues rot after 30d of inactivity.

Mark the issue as fresh by commenting /remove-lifecycle rotten.
Rotten issues close after an additional 30d of inactivity.
Exclude this issue from closing by commenting /lifecycle frozen.

If this issue is safe to close now please do so with /close.

/lifecycle rotten
/remove-lifecycle stale

@openshift-ci-robot openshift-ci-robot added lifecycle/rotten Denotes an issue or PR that has aged beyond stale and will be auto-closed. and removed lifecycle/stale Denotes an issue or PR has remained open with no activity and has become stale. labels Sep 8, 2020
@openshift-bot
Copy link

Rotten issues close after 30d of inactivity.

Reopen the issue by commenting /reopen.
Mark the issue as fresh by commenting /remove-lifecycle rotten.
Exclude this issue from closing again by commenting /lifecycle frozen.

/close

@openshift-ci-robot
Copy link

@openshift-bot: Closing this issue.

In response to this:

Rotten issues close after 30d of inactivity.

Reopen the issue by commenting /reopen.
Mark the issue as fresh by commenting /remove-lifecycle rotten.
Exclude this issue from closing again by commenting /lifecycle frozen.

/close

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
lifecycle/rotten Denotes an issue or PR that has aged beyond stale and will be auto-closed.
Projects
None yet
Development

No branches or pull requests

4 participants