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

Bug 1885179: Avoid deadlock by closing pipe reader end #604

Merged
merged 1 commit into from
Oct 21, 2020
Merged

Bug 1885179: Avoid deadlock by closing pipe reader end #604

merged 1 commit into from
Oct 21, 2020

Conversation

ricardomaraschini
Copy link
Contributor

If we don't close this pipe reader with an error we ended up having a
deadlock as we keep trying to read indefinitely from it. This deadlock
causes the error message to be misguiding when attempting to upload a
layer with invalid format (gzip: invalid header).

Without this patch oc image append using an invalid layer format fails
with either "timeout" (docker.io) or "protocol error" (quay.io) instead
of reporting appropriate error ("invalid gzip").

@openshift-ci-robot
Copy link

@ricardomaraschini: An error was encountered adding this pull request to the external tracker bugs for bug 1885179 on the Bugzilla server at https://bugzilla.redhat.com:

JSONRPC error 32000: There was an error reported for a GitHub REST call. URL: https://api.github.com/repos/openshift/oc/pulls/604 Error: 403 Forbidden at /loader/0x558949c853b8/Bugzilla/Extension/ExternalBugs/Type/GitHub.pm line 111. at /loader/0x558949c853b8/Bugzilla/Extension/ExternalBugs/Type/GitHub.pm line 111. eval {...} called at /loader/0x558949c853b8/Bugzilla/Extension/ExternalBugs/Type/GitHub.pm line 98 Bugzilla::Extension::ExternalBugs::Type::GitHub::_do_rest_call('Bugzilla::Extension::ExternalBugs::Type::GitHub=HASH(0x55894d...', 'https://api.github.com/repos/openshift/oc/pulls/604', 'GET') called at /loader/0x558949c853b8/Bugzilla/Extension/ExternalBugs/Type/GitHub.pm line 62 Bugzilla::Extension::ExternalBugs::Type::GitHub::get_data('Bugzilla::Extension::ExternalBugs::Type::GitHub=HASH(0x55894d...', 'Bugzilla::Extension::ExternalBugs::Bug=HASH(0x55895065fc28)') called at /loader/0x558949c853b8/Bugzilla/Extension/ExternalBugs/Bug.pm line 302 eval {...} called at /loader/0x558949c853b8/Bugzilla/Extension/ExternalBugs/Bug.pm line 302 Bugzilla::Extension::ExternalBugs::Bug::update_ext_info('Bugzilla::Extension::ExternalBugs::Bug=HASH(0x55895065fc28)', 1) called at /loader/0x558949c853b8/Bugzilla/Extension/ExternalBugs/Bug.pm line 125 Bugzilla::Extension::ExternalBugs::Bug::create('Bugzilla::Extension::ExternalBugs::Bug', 'HASH(0x55894c8ff890)') called at /var/www/html/bugzilla/extensions/ExternalBugs/Extension.pm line 877 Bugzilla::Extension::ExternalBugs::bug_start_of_update('Bugzilla::Extension::ExternalBugs=HASH(0x55894d2cfac0)', 'HASH(0x55894c3a4f78)') called at /var/www/html/bugzilla/Bugzilla/Hook.pm line 21 Bugzilla::Hook::process('bug_start_of_update', 'HASH(0x55894c3a4f78)') called at /var/www/html/bugzilla/Bugzilla/Bug.pm line 1170 Bugzilla::Bug::update('Bugzilla::Bug=HASH(0x55894c32ea08)') called at /loader/0x558949c853b8/Bugzilla/Extension/ExternalBugs/WebService.pm line 88 Bugzilla::Extension::ExternalBugs::WebService::add_external_bug('Bugzilla::WebService::Server::JSONRPC::Bugzilla::Extension::E...', 'HASH(0x55894d4f2b40)') called at (eval 2931) line 1 eval ' $procedure->{code}->($self, @params) ;' called at /usr/share/perl5/vendor_perl/JSON/RPC/Legacy/Server.pm line 220 JSON::RPC::Legacy::Server::_handle('Bugzilla::WebService::Server::JSONRPC::Bugzilla::Extension::E...', 'HASH(0x55894d0801a0)') called at /var/www/html/bugzilla/Bugzilla/WebService/Server/JSONRPC.pm line 295 Bugzilla::WebService::Server::JSONRPC::_handle('Bugzilla::WebService::Server::JSONRPC::Bugzilla::Extension::E...', 'HASH(0x55894d0801a0)') called at /usr/share/perl5/vendor_perl/JSON/RPC/Legacy/Server.pm line 126 JSON::RPC::Legacy::Server::handle('Bugzilla::WebService::Server::JSONRPC::Bugzilla::Extension::E...') called at /var/www/html/bugzilla/Bugzilla/WebService/Server/JSONRPC.pm line 70 Bugzilla::WebService::Server::JSONRPC::handle('Bugzilla::WebService::Server::JSONRPC::Bugzilla::Extension::E...') called at /var/www/html/bugzilla/jsonrpc.cgi line 31 ModPerl::ROOT::Bugzilla::ModPerl::ResponseHandler::var_www_html_bugzilla_jsonrpc_2ecgi::handler('Apache2::RequestRec=SCALAR(0x55894c736b18)') called at /usr/lib64/perl5/vendor_perl/ModPerl/RegistryCooker.pm line 207 eval {...} called at /usr/lib64/perl5/vendor_perl/ModPerl/RegistryCooker.pm line 207 ModPerl::RegistryCooker::run('Bugzilla::ModPerl::ResponseHandler=HASH(0x55894d2bcbf8)') called at /usr/lib64/perl5/vendor_perl/ModPerl/RegistryCooker.pm line 173 ModPerl::RegistryCooker::default_handler('Bugzilla::ModPerl::ResponseHandler=HASH(0x55894d2bcbf8)') called at /usr/lib64/perl5/vendor_perl/ModPerl/Registry.pm line 32 ModPerl::Registry::handler('Bugzilla::ModPerl::ResponseHandler', 'Apache2::RequestRec=SCALAR(0x55894c736b18)') called at /var/www/html/bugzilla/mod_perl.pl line 139 Bugzilla::ModPerl::ResponseHandler::handler('Bugzilla::ModPerl::ResponseHandler', 'Apache2::RequestRec=SCALAR(0x55894c736b18)') called at (eval 2931) line 0 eval {...} called at (eval 2931) line 0
Please contact an administrator to resolve this issue, then request a bug refresh with /bugzilla refresh.

In response to this:

Bug 1885179: Avoid deadlock by closing pipe reader end

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.

@dmage
Copy link
Contributor

dmage commented Oct 6, 2020

/bugzilla refresh

@openshift-ci-robot openshift-ci-robot added bugzilla/severity-medium Referenced Bugzilla bug's severity is medium for the branch this PR is targeting. bugzilla/valid-bug Indicates that a referenced Bugzilla bug is valid for the branch this PR is targeting. labels Oct 6, 2020
@openshift-ci-robot
Copy link

@dmage: This pull request references Bugzilla bug 1885179, which is valid.

3 validation(s) were run on this bug
  • bug is open, matching expected state (open)
  • bug target release (4.7.0) matches configured target release for branch (4.7.0)
  • bug is in the state POST, which is one of the valid states (NEW, ASSIGNED, ON_DEV, POST, POST)

In response to this:

/bugzilla refresh

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.

@ricardomaraschini
Copy link
Contributor Author

/assign @sallyom

@@ -52,7 +52,7 @@ func DigestCopy(dst io.ReaderFrom, src io.Reader) (layerDigest, blobDigest diges
defer close(ch)
gr, err := gzip.NewReader(pr)
if err != nil {
ch <- fmt.Errorf("unable to create gzip reader layer upload: %v", err)
pr.CloseWithError(fmt.Errorf("unable to create gzip reader layer upload: %v", err))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My only concern is that gzip.NewReader may have already read all data from pr at this point (for example, when there were less than 10 bytes to read). In this case this error won't be detected as nothing will write into the writer.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you are absolutely right. I think it makes sense to still send the error down through that error channel. I have updated this to just close the pipe reader end with an error.

If we don't close this pipe reader with an error we ended up having a
deadlock as we keep trying to read indefinitely from it. This deadlock
causes the error message to be misguiding when attempting to upload a
layer with invalid format (gzip: invalid header).

Without this patch oc image append using an invalid layer format fails
with either "timeout" (docker.io) or "protocol error" (quay.io) instead
of reporting appropriate error ("invalid gzip").
@ricardomaraschini
Copy link
Contributor Author

/retest

@sallyom
Copy link
Contributor

sallyom commented Oct 21, 2020

thanks @ricardomaraschini and @dmage

/lgtm

@openshift-ci-robot openshift-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Oct 21, 2020
@sallyom
Copy link
Contributor

sallyom commented Oct 21, 2020

and I've confirmed the desired behavior:
with this change:

$ oc image append --from=quay.io/sallyom/testcli:test --to=quay.io/sallyom/testcli:append new-layer.tar
Uploading ... error: unable to upload new layer (0): Patch "https://quay.io/v2/sallyom/testcli/blobs/uploads/ab100e66-f2c6-4c8a-b4dc-b326d6c563fb": unable to create gzip reader layer upload: gzip: invalid header

and from master (and after a minute of waiting...):

$ oc image append --from=quay.io/sallyom/testcli:test --to=quay.io/sallyom/testcli:append new-layer.tar
Uploading ... error: unable to upload new layer (0): Patch "https://quay.io/v2/sallyom/testcli/blobs/uploads/b438f781-3070-45b2-8164-8dc14eba9c19": stream error: stream ID 15; PROTOCOL_ERROR

Copy link
Contributor

@soltysh soltysh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/approve

@openshift-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: ricardomaraschini, sallyom, soltysh

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci-robot openshift-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Oct 21, 2020
@openshift-bot
Copy link
Contributor

/retest

Please review the full test history for this PR and help us cut down flakes.

2 similar comments
@openshift-bot
Copy link
Contributor

/retest

Please review the full test history for this PR and help us cut down flakes.

@openshift-bot
Copy link
Contributor

/retest

Please review the full test history for this PR and help us cut down flakes.

@openshift-merge-robot openshift-merge-robot merged commit 6576713 into openshift:master Oct 21, 2020
@openshift-ci-robot
Copy link

@ricardomaraschini: All pull requests linked via external trackers have merged:

Bugzilla bug 1885179 has been moved to the MODIFIED state.

In response to this:

Bug 1885179: Avoid deadlock by closing pipe reader end

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
approved Indicates a PR has been approved by an approver from all required OWNERS files. bugzilla/severity-medium Referenced Bugzilla bug's severity is medium for the branch this PR is targeting. bugzilla/valid-bug Indicates that a referenced Bugzilla bug is valid for the branch this PR is targeting. lgtm Indicates that a PR is ready to be merged.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants