Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Fix bug with Watch and 410 retries - #227

Merged
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug
Feb 25, 2021
Merged

Fix bug with Watch and 410 retries#227
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug

Conversation

@chrisayoub

Copy link
Copy Markdown
Contributor

There is a bug that was introduced with the following PR:
#133

When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry.

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please follow instructions at https://git.k8s.io/community/CLA.md#the-contributor-license-agreement to sign the CLA.

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.


Details

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. I understand the commands that are listed here.

@k8s-ci-robotk8s-ci-robot added the cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. label Feb 22, 2021
@chrisayoubchrisayoub changed the title Fix bug with Watch and 410 retryFix bug with Watch and 410 retriesFeb 22, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Welcome @chrisayoub!

It looks like this is your first PR to kubernetes-client/python-base 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-client/python-base has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robotk8s-ci-robot added size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Feb 22, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @mbohlool@roycaihw@yliaog

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@chrisayoub: GitHub didn't allow me to assign the following users: mbohlool.

Note that only kubernetes-client members, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

Details

In response to this:

/assign @mbohlool@roycaihw@yliaog

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.

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @micw523

@yliaog

Copy link
Copy Markdown
Contributor

if timeout or stop, retry should not be attempted? i think the current behavior is expected.

@PaulFurtado

Copy link
Copy Markdown

@yliaog If you look at the timeouts variable in the code, it is an argument to this function for a user-specified watch timeout for the request, it does not indicate that a timeout has actually occurred.

So for clients that specify a timeout as an argument to the function, the result of this is that when a 410 error occurs, the caller gets no exception at all and it appears that the watch has gracefully ended, which makes it impossible for a caller to recover from 410.

@yliaog

Copy link
Copy Markdown
Contributor

i see. in that case, timeouts condition is not useful. but it should still break without retry when stop is true. so what about the following:

if self._stop:
break

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

This is the previous PR and issue where this timeouts functionality was introduced:
#36
kubernetes-client/python#124

Do you think that change would conflict with this?

@PaulFurtado

Copy link
Copy Markdown

Yeah, removing the timeouts condition would break functionality. If that were set, a user might end up having a watch which lasts forever despite having set a timeout on it explicitly.

Thinking about this more, I actually think the best fix would be to never do any type of retry when timeouts is set because then it is impossible to guarantee that the function exits within the specified timeout. That would remain true to the way that this code worked prior to the 410 error handling. To achieve that, line 169 could be altered to include timeouts is not None so that we don't retry 410 when the timeouts parameter is set.

Additionally, I think maybe we should make that intention more clear so that similar bugs don't get introduced in the future. Before the while loop, we could set a variable like:

disable_retries=timeoutsisnotNone

and then alter this condition to be:

ifself._stopordisable_retries:
break

and change the condition on line 169 to:

ifnotdisable_retriesandnotretry_after_410andobj['code'] ==HTTP_STATUS_GONE:

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@PaulFurtado I updated the PR with your suggested changes, and I tested and they seem to work correctly for me.

@yliaog can you take another look? Thanks!

@yliaog

Copy link
Copy Markdown
Contributor

i'm not sure how the PR solve the original problem as given in the PR description below, so when there is 410 error, and timeout is given, there will be no retry at all, it returns.

"When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry."

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

I think this is just a question of the desired behavior ultimately. When the user specifies a timeout value and we encounter an event of type error, should we yield that event as normal, or should we raise an ApiException? I can easily modify the PR to do whichever seems more correct here.

Ultimately, the desired fix is that under these circumstances, we do not simply return from the function, and we either yield the event or raise an Exception.

@PaulFurtado

Copy link
Copy Markdown

@yliaog by adding the not disable_retries condition to the if statement on line 169, it hits the else block of that if statement which immediately raises the ApiException indicating that the 410 occurred, so that the caller can deal with the 410 error.

Comment threadwatch/watch.py
obj = event['raw_object']
# Current request expired, let's retry,
# but only if we have not already retried.
if not retry_after_410 and \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

please add a comment about the added condition "not disable_retries and not"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, see lines 154-155 as well

@yliaog

Copy link
Copy Markdown
Contributor

looks good to disable retry for the 410 case, could you please add a test case for it?

@k8s-ci-robotk8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. labels Feb 25, 2021
Comment threadwatch/watch_test.py
Comment on lines +291 to +293
# No events are generated when no initial resourceVersion is passed
# No retry is attempted either, preventing an ApiException
assert not list(w.stream(fake_api.get_thing))

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I updated the existing test case, which was not actually correct for the current version of the code with retries. Additionally, I added 2 more test cases to test both code paths that my PR is related to.

Comment threadwatch/watch_test.py

w = Watch()
try:
for _ in w.stream(fake_api.get_thing, timeout_seconds=10):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

no resource_version?

@chrisayoubchrisayoubFeb 25, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

For testing this code path and condition, you do not actually need to supply resource_version here, as an exception is raised and only the code in the watch finally block will execute. resource_version is needed in the other test because the code path goes beyond the finally block

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok

@yliaog

Copy link
Copy Markdown
Contributor

thanks for the pr.

/lgtm
/approve

@k8s-ci-robotk8s-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 25, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chrisayoub, yliaog

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

The pull request process is described here

Details 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

@k8s-ci-robotk8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 25, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@yliaog it looks like the failed CI run is preventing this from automatically merging:
https://travis-ci.org/github/kubernetes-client/python-base/jobs/760405517

However, this test case isn't even in this repo? Am I supposed to do anything else to proceed further in getting this merged?

Thank you!

@yliaog

Copy link
Copy Markdown
Contributor

closing the pr, and reoopen to trigger another CI run

@yliaog

Copy link
Copy Markdown
Contributor

/close

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Closed this PR.

Details

In response to this:

/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.

@yliaog

Copy link
Copy Markdown
Contributor

/open

@yliaog

Copy link
Copy Markdown
Contributor

/reopen

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Reopened this PR.

Details

In response to this:

/reopen

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.

@k8s-ci-robot
k8s-ci-robot merged commit 060cac1 into kubernetes-client:masterFeb 25, 2021
@chrisayoub
chrisayoub deleted the fix_watch_bug branch May 2, 2021 02:01
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

approvedIndicates a PR has been approved by an approver from all required OWNERS files.cncf-cla: yesIndicates the PR's author has signed the CNCF CLA.lgtmIndicates that a PR is ready to be merged.size/MDenotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@chrisayoub@k8s-ci-robot@yliaog@PaulFurtado@roycaihw@micw523
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Fix bug with Watch and 410 retries by chrisayoub · Pull Request #227 · kubernetes-client/python-base · GitHub
Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Fix bug with Watch and 410 retries - #227

Merged
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug
Feb 25, 2021
Merged

Fix bug with Watch and 410 retries#227
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug

Conversation

@chrisayoub

Copy link
Copy Markdown
Contributor

There is a bug that was introduced with the following PR:
#133

When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry.

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please follow instructions at https://git.k8s.io/community/CLA.md#the-contributor-license-agreement to sign the CLA.

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.


Details

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. I understand the commands that are listed here.

@k8s-ci-robotk8s-ci-robot added the cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. label Feb 22, 2021
@chrisayoubchrisayoub changed the title Fix bug with Watch and 410 retryFix bug with Watch and 410 retriesFeb 22, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Welcome @chrisayoub!

It looks like this is your first PR to kubernetes-client/python-base 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-client/python-base has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robotk8s-ci-robot added size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Feb 22, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @mbohlool@roycaihw@yliaog

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@chrisayoub: GitHub didn't allow me to assign the following users: mbohlool.

Note that only kubernetes-client members, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

Details

In response to this:

/assign @mbohlool@roycaihw@yliaog

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.

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @micw523

@yliaog

Copy link
Copy Markdown
Contributor

if timeout or stop, retry should not be attempted? i think the current behavior is expected.

@PaulFurtado

Copy link
Copy Markdown

@yliaog If you look at the timeouts variable in the code, it is an argument to this function for a user-specified watch timeout for the request, it does not indicate that a timeout has actually occurred.

So for clients that specify a timeout as an argument to the function, the result of this is that when a 410 error occurs, the caller gets no exception at all and it appears that the watch has gracefully ended, which makes it impossible for a caller to recover from 410.

@yliaog

Copy link
Copy Markdown
Contributor

i see. in that case, timeouts condition is not useful. but it should still break without retry when stop is true. so what about the following:

if self._stop:
break

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

This is the previous PR and issue where this timeouts functionality was introduced:
#36
kubernetes-client/python#124

Do you think that change would conflict with this?

@PaulFurtado

Copy link
Copy Markdown

Yeah, removing the timeouts condition would break functionality. If that were set, a user might end up having a watch which lasts forever despite having set a timeout on it explicitly.

Thinking about this more, I actually think the best fix would be to never do any type of retry when timeouts is set because then it is impossible to guarantee that the function exits within the specified timeout. That would remain true to the way that this code worked prior to the 410 error handling. To achieve that, line 169 could be altered to include timeouts is not None so that we don't retry 410 when the timeouts parameter is set.

Additionally, I think maybe we should make that intention more clear so that similar bugs don't get introduced in the future. Before the while loop, we could set a variable like:

disable_retries=timeoutsisnotNone

and then alter this condition to be:

ifself._stopordisable_retries:
break

and change the condition on line 169 to:

ifnotdisable_retriesandnotretry_after_410andobj['code'] ==HTTP_STATUS_GONE:

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@PaulFurtado I updated the PR with your suggested changes, and I tested and they seem to work correctly for me.

@yliaog can you take another look? Thanks!

@yliaog

Copy link
Copy Markdown
Contributor

i'm not sure how the PR solve the original problem as given in the PR description below, so when there is 410 error, and timeout is given, there will be no retry at all, it returns.

"When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry."

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

I think this is just a question of the desired behavior ultimately. When the user specifies a timeout value and we encounter an event of type error, should we yield that event as normal, or should we raise an ApiException? I can easily modify the PR to do whichever seems more correct here.

Ultimately, the desired fix is that under these circumstances, we do not simply return from the function, and we either yield the event or raise an Exception.

@PaulFurtado

Copy link
Copy Markdown

@yliaog by adding the not disable_retries condition to the if statement on line 169, it hits the else block of that if statement which immediately raises the ApiException indicating that the 410 occurred, so that the caller can deal with the 410 error.

Comment threadwatch/watch.py
obj = event['raw_object']
# Current request expired, let's retry,
# but only if we have not already retried.
if not retry_after_410 and \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

please add a comment about the added condition "not disable_retries and not"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, see lines 154-155 as well

@yliaog

Copy link
Copy Markdown
Contributor

looks good to disable retry for the 410 case, could you please add a test case for it?

@k8s-ci-robotk8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. labels Feb 25, 2021
Comment threadwatch/watch_test.py
Comment on lines +291 to +293
# No events are generated when no initial resourceVersion is passed
# No retry is attempted either, preventing an ApiException
assert not list(w.stream(fake_api.get_thing))

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I updated the existing test case, which was not actually correct for the current version of the code with retries. Additionally, I added 2 more test cases to test both code paths that my PR is related to.

Comment threadwatch/watch_test.py

w = Watch()
try:
for _ in w.stream(fake_api.get_thing, timeout_seconds=10):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

no resource_version?

@chrisayoubchrisayoubFeb 25, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

For testing this code path and condition, you do not actually need to supply resource_version here, as an exception is raised and only the code in the watch finally block will execute. resource_version is needed in the other test because the code path goes beyond the finally block

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok

@yliaog

Copy link
Copy Markdown
Contributor

thanks for the pr.

/lgtm
/approve

@k8s-ci-robotk8s-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 25, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chrisayoub, yliaog

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

The pull request process is described here

Details 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

@k8s-ci-robotk8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 25, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@yliaog it looks like the failed CI run is preventing this from automatically merging:
https://travis-ci.org/github/kubernetes-client/python-base/jobs/760405517

However, this test case isn't even in this repo? Am I supposed to do anything else to proceed further in getting this merged?

Thank you!

@yliaog

Copy link
Copy Markdown
Contributor

closing the pr, and reoopen to trigger another CI run

@yliaog

Copy link
Copy Markdown
Contributor

/close

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Closed this PR.

Details

In response to this:

/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.

@yliaog

Copy link
Copy Markdown
Contributor

/open

@yliaog

Copy link
Copy Markdown
Contributor

/reopen

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Reopened this PR.

Details

In response to this:

/reopen

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.

@k8s-ci-robot
k8s-ci-robot merged commit 060cac1 into kubernetes-client:masterFeb 25, 2021
@chrisayoub
chrisayoub deleted the fix_watch_bug branch May 2, 2021 02:01
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

approvedIndicates a PR has been approved by an approver from all required OWNERS files.cncf-cla: yesIndicates the PR's author has signed the CNCF CLA.lgtmIndicates that a PR is ready to be merged.size/MDenotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@chrisayoub@k8s-ci-robot@yliaog@PaulFurtado@roycaihw@micw523
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix bug with Watch and 410 retries by chrisayoub · Pull Request #227 · kubernetes-client/python-base · GitHub
Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Fix bug with Watch and 410 retries - #227

Merged
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug
Feb 25, 2021
Merged

Fix bug with Watch and 410 retries#227
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug

Conversation

@chrisayoub

Copy link
Copy Markdown
Contributor

There is a bug that was introduced with the following PR:
#133

When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry.

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please follow instructions at https://git.k8s.io/community/CLA.md#the-contributor-license-agreement to sign the CLA.

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.


Details

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. I understand the commands that are listed here.

@k8s-ci-robotk8s-ci-robot added the cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. label Feb 22, 2021
@chrisayoubchrisayoub changed the title Fix bug with Watch and 410 retryFix bug with Watch and 410 retriesFeb 22, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Welcome @chrisayoub!

It looks like this is your first PR to kubernetes-client/python-base 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-client/python-base has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robotk8s-ci-robot added size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Feb 22, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @mbohlool@roycaihw@yliaog

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@chrisayoub: GitHub didn't allow me to assign the following users: mbohlool.

Note that only kubernetes-client members, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

Details

In response to this:

/assign @mbohlool@roycaihw@yliaog

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.

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @micw523

@yliaog

Copy link
Copy Markdown
Contributor

if timeout or stop, retry should not be attempted? i think the current behavior is expected.

@PaulFurtado

Copy link
Copy Markdown

@yliaog If you look at the timeouts variable in the code, it is an argument to this function for a user-specified watch timeout for the request, it does not indicate that a timeout has actually occurred.

So for clients that specify a timeout as an argument to the function, the result of this is that when a 410 error occurs, the caller gets no exception at all and it appears that the watch has gracefully ended, which makes it impossible for a caller to recover from 410.

@yliaog

Copy link
Copy Markdown
Contributor

i see. in that case, timeouts condition is not useful. but it should still break without retry when stop is true. so what about the following:

if self._stop:
break

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

This is the previous PR and issue where this timeouts functionality was introduced:
#36
kubernetes-client/python#124

Do you think that change would conflict with this?

@PaulFurtado

Copy link
Copy Markdown

Yeah, removing the timeouts condition would break functionality. If that were set, a user might end up having a watch which lasts forever despite having set a timeout on it explicitly.

Thinking about this more, I actually think the best fix would be to never do any type of retry when timeouts is set because then it is impossible to guarantee that the function exits within the specified timeout. That would remain true to the way that this code worked prior to the 410 error handling. To achieve that, line 169 could be altered to include timeouts is not None so that we don't retry 410 when the timeouts parameter is set.

Additionally, I think maybe we should make that intention more clear so that similar bugs don't get introduced in the future. Before the while loop, we could set a variable like:

disable_retries=timeoutsisnotNone

and then alter this condition to be:

ifself._stopordisable_retries:
break

and change the condition on line 169 to:

ifnotdisable_retriesandnotretry_after_410andobj['code'] ==HTTP_STATUS_GONE:

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@PaulFurtado I updated the PR with your suggested changes, and I tested and they seem to work correctly for me.

@yliaog can you take another look? Thanks!

@yliaog

Copy link
Copy Markdown
Contributor

i'm not sure how the PR solve the original problem as given in the PR description below, so when there is 410 error, and timeout is given, there will be no retry at all, it returns.

"When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry."

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

I think this is just a question of the desired behavior ultimately. When the user specifies a timeout value and we encounter an event of type error, should we yield that event as normal, or should we raise an ApiException? I can easily modify the PR to do whichever seems more correct here.

Ultimately, the desired fix is that under these circumstances, we do not simply return from the function, and we either yield the event or raise an Exception.

@PaulFurtado

Copy link
Copy Markdown

@yliaog by adding the not disable_retries condition to the if statement on line 169, it hits the else block of that if statement which immediately raises the ApiException indicating that the 410 occurred, so that the caller can deal with the 410 error.

Comment threadwatch/watch.py
obj = event['raw_object']
# Current request expired, let's retry,
# but only if we have not already retried.
if not retry_after_410 and \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

please add a comment about the added condition "not disable_retries and not"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, see lines 154-155 as well

@yliaog

Copy link
Copy Markdown
Contributor

looks good to disable retry for the 410 case, could you please add a test case for it?

@k8s-ci-robotk8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. labels Feb 25, 2021
Comment threadwatch/watch_test.py
Comment on lines +291 to +293
# No events are generated when no initial resourceVersion is passed
# No retry is attempted either, preventing an ApiException
assert not list(w.stream(fake_api.get_thing))

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I updated the existing test case, which was not actually correct for the current version of the code with retries. Additionally, I added 2 more test cases to test both code paths that my PR is related to.

Comment threadwatch/watch_test.py

w = Watch()
try:
for _ in w.stream(fake_api.get_thing, timeout_seconds=10):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

no resource_version?

@chrisayoubchrisayoubFeb 25, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

For testing this code path and condition, you do not actually need to supply resource_version here, as an exception is raised and only the code in the watch finally block will execute. resource_version is needed in the other test because the code path goes beyond the finally block

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok

@yliaog

Copy link
Copy Markdown
Contributor

thanks for the pr.

/lgtm
/approve

@k8s-ci-robotk8s-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 25, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chrisayoub, yliaog

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

The pull request process is described here

Details 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

@k8s-ci-robotk8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 25, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@yliaog it looks like the failed CI run is preventing this from automatically merging:
https://travis-ci.org/github/kubernetes-client/python-base/jobs/760405517

However, this test case isn't even in this repo? Am I supposed to do anything else to proceed further in getting this merged?

Thank you!

@yliaog

Copy link
Copy Markdown
Contributor

closing the pr, and reoopen to trigger another CI run

@yliaog

Copy link
Copy Markdown
Contributor

/close

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Closed this PR.

Details

In response to this:

/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.

@yliaog

Copy link
Copy Markdown
Contributor

/open

@yliaog

Copy link
Copy Markdown
Contributor

/reopen

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Reopened this PR.

Details

In response to this:

/reopen

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.

@k8s-ci-robot
k8s-ci-robot merged commit 060cac1 into kubernetes-client:masterFeb 25, 2021
@chrisayoub
chrisayoub deleted the fix_watch_bug branch May 2, 2021 02:01
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

approvedIndicates a PR has been approved by an approver from all required OWNERS files.cncf-cla: yesIndicates the PR's author has signed the CNCF CLA.lgtmIndicates that a PR is ready to be merged.size/MDenotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@chrisayoub@k8s-ci-robot@yliaog@PaulFurtado@roycaihw@micw523
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix bug with Watch and 410 retries by chrisayoub · Pull Request #227 · kubernetes-client/python-base · GitHub
Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Fix bug with Watch and 410 retries - #227

Merged
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug
Feb 25, 2021
Merged

Fix bug with Watch and 410 retries#227
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug

Conversation

@chrisayoub

Copy link
Copy Markdown
Contributor

There is a bug that was introduced with the following PR:
#133

When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry.

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please follow instructions at https://git.k8s.io/community/CLA.md#the-contributor-license-agreement to sign the CLA.

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.


Details

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. I understand the commands that are listed here.

@k8s-ci-robotk8s-ci-robot added the cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. label Feb 22, 2021
@chrisayoubchrisayoub changed the title Fix bug with Watch and 410 retryFix bug with Watch and 410 retriesFeb 22, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Welcome @chrisayoub!

It looks like this is your first PR to kubernetes-client/python-base 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-client/python-base has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robotk8s-ci-robot added size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Feb 22, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @mbohlool@roycaihw@yliaog

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@chrisayoub: GitHub didn't allow me to assign the following users: mbohlool.

Note that only kubernetes-client members, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

Details

In response to this:

/assign @mbohlool@roycaihw@yliaog

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.

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @micw523

@yliaog

Copy link
Copy Markdown
Contributor

if timeout or stop, retry should not be attempted? i think the current behavior is expected.

@PaulFurtado

Copy link
Copy Markdown

@yliaog If you look at the timeouts variable in the code, it is an argument to this function for a user-specified watch timeout for the request, it does not indicate that a timeout has actually occurred.

So for clients that specify a timeout as an argument to the function, the result of this is that when a 410 error occurs, the caller gets no exception at all and it appears that the watch has gracefully ended, which makes it impossible for a caller to recover from 410.

@yliaog

Copy link
Copy Markdown
Contributor

i see. in that case, timeouts condition is not useful. but it should still break without retry when stop is true. so what about the following:

if self._stop:
break

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

This is the previous PR and issue where this timeouts functionality was introduced:
#36
kubernetes-client/python#124

Do you think that change would conflict with this?

@PaulFurtado

Copy link
Copy Markdown

Yeah, removing the timeouts condition would break functionality. If that were set, a user might end up having a watch which lasts forever despite having set a timeout on it explicitly.

Thinking about this more, I actually think the best fix would be to never do any type of retry when timeouts is set because then it is impossible to guarantee that the function exits within the specified timeout. That would remain true to the way that this code worked prior to the 410 error handling. To achieve that, line 169 could be altered to include timeouts is not None so that we don't retry 410 when the timeouts parameter is set.

Additionally, I think maybe we should make that intention more clear so that similar bugs don't get introduced in the future. Before the while loop, we could set a variable like:

disable_retries=timeoutsisnotNone

and then alter this condition to be:

ifself._stopordisable_retries:
break

and change the condition on line 169 to:

ifnotdisable_retriesandnotretry_after_410andobj['code'] ==HTTP_STATUS_GONE:

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@PaulFurtado I updated the PR with your suggested changes, and I tested and they seem to work correctly for me.

@yliaog can you take another look? Thanks!

@yliaog

Copy link
Copy Markdown
Contributor

i'm not sure how the PR solve the original problem as given in the PR description below, so when there is 410 error, and timeout is given, there will be no retry at all, it returns.

"When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry."

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

I think this is just a question of the desired behavior ultimately. When the user specifies a timeout value and we encounter an event of type error, should we yield that event as normal, or should we raise an ApiException? I can easily modify the PR to do whichever seems more correct here.

Ultimately, the desired fix is that under these circumstances, we do not simply return from the function, and we either yield the event or raise an Exception.

@PaulFurtado

Copy link
Copy Markdown

@yliaog by adding the not disable_retries condition to the if statement on line 169, it hits the else block of that if statement which immediately raises the ApiException indicating that the 410 occurred, so that the caller can deal with the 410 error.

Comment threadwatch/watch.py
obj = event['raw_object']
# Current request expired, let's retry,
# but only if we have not already retried.
if not retry_after_410 and \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

please add a comment about the added condition "not disable_retries and not"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, see lines 154-155 as well

@yliaog

Copy link
Copy Markdown
Contributor

looks good to disable retry for the 410 case, could you please add a test case for it?

@k8s-ci-robotk8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. labels Feb 25, 2021
Comment threadwatch/watch_test.py
Comment on lines +291 to +293
# No events are generated when no initial resourceVersion is passed
# No retry is attempted either, preventing an ApiException
assert not list(w.stream(fake_api.get_thing))

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I updated the existing test case, which was not actually correct for the current version of the code with retries. Additionally, I added 2 more test cases to test both code paths that my PR is related to.

Comment threadwatch/watch_test.py

w = Watch()
try:
for _ in w.stream(fake_api.get_thing, timeout_seconds=10):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

no resource_version?

@chrisayoubchrisayoubFeb 25, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

For testing this code path and condition, you do not actually need to supply resource_version here, as an exception is raised and only the code in the watch finally block will execute. resource_version is needed in the other test because the code path goes beyond the finally block

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok

@yliaog

Copy link
Copy Markdown
Contributor

thanks for the pr.

/lgtm
/approve

@k8s-ci-robotk8s-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 25, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chrisayoub, yliaog

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

The pull request process is described here

Details 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

@k8s-ci-robotk8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 25, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@yliaog it looks like the failed CI run is preventing this from automatically merging:
https://travis-ci.org/github/kubernetes-client/python-base/jobs/760405517

However, this test case isn't even in this repo? Am I supposed to do anything else to proceed further in getting this merged?

Thank you!

@yliaog

Copy link
Copy Markdown
Contributor

closing the pr, and reoopen to trigger another CI run

@yliaog

Copy link
Copy Markdown
Contributor

/close

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Closed this PR.

Details

In response to this:

/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.

@yliaog

Copy link
Copy Markdown
Contributor

/open

@yliaog

Copy link
Copy Markdown
Contributor

/reopen

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Reopened this PR.

Details

In response to this:

/reopen

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.

@k8s-ci-robot
k8s-ci-robot merged commit 060cac1 into kubernetes-client:masterFeb 25, 2021
@chrisayoub
chrisayoub deleted the fix_watch_bug branch May 2, 2021 02:01
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

approvedIndicates a PR has been approved by an approver from all required OWNERS files.cncf-cla: yesIndicates the PR's author has signed the CNCF CLA.lgtmIndicates that a PR is ready to be merged.size/MDenotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@chrisayoub@k8s-ci-robot@yliaog@PaulFurtado@roycaihw@micw523
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Fix bug with Watch and 410 retries by chrisayoub · Pull Request #227 · kubernetes-client/python-base · GitHub
Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Fix bug with Watch and 410 retries - #227

Merged
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug
Feb 25, 2021
Merged

Fix bug with Watch and 410 retries#227
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug

Conversation

@chrisayoub

Copy link
Copy Markdown
Contributor

There is a bug that was introduced with the following PR:
#133

When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry.

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please follow instructions at https://git.k8s.io/community/CLA.md#the-contributor-license-agreement to sign the CLA.

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.


Details

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. I understand the commands that are listed here.

@k8s-ci-robotk8s-ci-robot added the cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. label Feb 22, 2021
@chrisayoubchrisayoub changed the title Fix bug with Watch and 410 retryFix bug with Watch and 410 retriesFeb 22, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Welcome @chrisayoub!

It looks like this is your first PR to kubernetes-client/python-base 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-client/python-base has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robotk8s-ci-robot added size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Feb 22, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @mbohlool@roycaihw@yliaog

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@chrisayoub: GitHub didn't allow me to assign the following users: mbohlool.

Note that only kubernetes-client members, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

Details

In response to this:

/assign @mbohlool@roycaihw@yliaog

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.

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @micw523

@yliaog

Copy link
Copy Markdown
Contributor

if timeout or stop, retry should not be attempted? i think the current behavior is expected.

@PaulFurtado

Copy link
Copy Markdown

@yliaog If you look at the timeouts variable in the code, it is an argument to this function for a user-specified watch timeout for the request, it does not indicate that a timeout has actually occurred.

So for clients that specify a timeout as an argument to the function, the result of this is that when a 410 error occurs, the caller gets no exception at all and it appears that the watch has gracefully ended, which makes it impossible for a caller to recover from 410.

@yliaog

Copy link
Copy Markdown
Contributor

i see. in that case, timeouts condition is not useful. but it should still break without retry when stop is true. so what about the following:

if self._stop:
break

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

This is the previous PR and issue where this timeouts functionality was introduced:
#36
kubernetes-client/python#124

Do you think that change would conflict with this?

@PaulFurtado

Copy link
Copy Markdown

Yeah, removing the timeouts condition would break functionality. If that were set, a user might end up having a watch which lasts forever despite having set a timeout on it explicitly.

Thinking about this more, I actually think the best fix would be to never do any type of retry when timeouts is set because then it is impossible to guarantee that the function exits within the specified timeout. That would remain true to the way that this code worked prior to the 410 error handling. To achieve that, line 169 could be altered to include timeouts is not None so that we don't retry 410 when the timeouts parameter is set.

Additionally, I think maybe we should make that intention more clear so that similar bugs don't get introduced in the future. Before the while loop, we could set a variable like:

disable_retries=timeoutsisnotNone

and then alter this condition to be:

ifself._stopordisable_retries:
break

and change the condition on line 169 to:

ifnotdisable_retriesandnotretry_after_410andobj['code'] ==HTTP_STATUS_GONE:

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@PaulFurtado I updated the PR with your suggested changes, and I tested and they seem to work correctly for me.

@yliaog can you take another look? Thanks!

@yliaog

Copy link
Copy Markdown
Contributor

i'm not sure how the PR solve the original problem as given in the PR description below, so when there is 410 error, and timeout is given, there will be no retry at all, it returns.

"When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry."

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

I think this is just a question of the desired behavior ultimately. When the user specifies a timeout value and we encounter an event of type error, should we yield that event as normal, or should we raise an ApiException? I can easily modify the PR to do whichever seems more correct here.

Ultimately, the desired fix is that under these circumstances, we do not simply return from the function, and we either yield the event or raise an Exception.

@PaulFurtado

Copy link
Copy Markdown

@yliaog by adding the not disable_retries condition to the if statement on line 169, it hits the else block of that if statement which immediately raises the ApiException indicating that the 410 occurred, so that the caller can deal with the 410 error.

Comment threadwatch/watch.py
obj = event['raw_object']
# Current request expired, let's retry,
# but only if we have not already retried.
if not retry_after_410 and \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

please add a comment about the added condition "not disable_retries and not"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, see lines 154-155 as well

@yliaog

Copy link
Copy Markdown
Contributor

looks good to disable retry for the 410 case, could you please add a test case for it?

@k8s-ci-robotk8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. labels Feb 25, 2021
Comment threadwatch/watch_test.py
Comment on lines +291 to +293
# No events are generated when no initial resourceVersion is passed
# No retry is attempted either, preventing an ApiException
assert not list(w.stream(fake_api.get_thing))

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I updated the existing test case, which was not actually correct for the current version of the code with retries. Additionally, I added 2 more test cases to test both code paths that my PR is related to.

Comment threadwatch/watch_test.py

w = Watch()
try:
for _ in w.stream(fake_api.get_thing, timeout_seconds=10):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

no resource_version?

@chrisayoubchrisayoubFeb 25, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

For testing this code path and condition, you do not actually need to supply resource_version here, as an exception is raised and only the code in the watch finally block will execute. resource_version is needed in the other test because the code path goes beyond the finally block

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok

@yliaog

Copy link
Copy Markdown
Contributor

thanks for the pr.

/lgtm
/approve

@k8s-ci-robotk8s-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 25, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chrisayoub, yliaog

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

The pull request process is described here

Details 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

@k8s-ci-robotk8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 25, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@yliaog it looks like the failed CI run is preventing this from automatically merging:
https://travis-ci.org/github/kubernetes-client/python-base/jobs/760405517

However, this test case isn't even in this repo? Am I supposed to do anything else to proceed further in getting this merged?

Thank you!

@yliaog

Copy link
Copy Markdown
Contributor

closing the pr, and reoopen to trigger another CI run

@yliaog

Copy link
Copy Markdown
Contributor

/close

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Closed this PR.

Details

In response to this:

/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.

@yliaog

Copy link
Copy Markdown
Contributor

/open

@yliaog

Copy link
Copy Markdown
Contributor

/reopen

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Reopened this PR.

Details

In response to this:

/reopen

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.

@k8s-ci-robot
k8s-ci-robot merged commit 060cac1 into kubernetes-client:masterFeb 25, 2021
@chrisayoub
chrisayoub deleted the fix_watch_bug branch May 2, 2021 02:01
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

approvedIndicates a PR has been approved by an approver from all required OWNERS files.cncf-cla: yesIndicates the PR's author has signed the CNCF CLA.lgtmIndicates that a PR is ready to be merged.size/MDenotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@chrisayoub@k8s-ci-robot@yliaog@PaulFurtado@roycaihw@micw523
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix bug with Watch and 410 retries by chrisayoub · Pull Request #227 · kubernetes-client/python-base · GitHub
Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Fix bug with Watch and 410 retries - #227

Merged
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug
Feb 25, 2021
Merged

Fix bug with Watch and 410 retries#227
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug

Conversation

@chrisayoub

Copy link
Copy Markdown
Contributor

There is a bug that was introduced with the following PR:
#133

When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry.

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please follow instructions at https://git.k8s.io/community/CLA.md#the-contributor-license-agreement to sign the CLA.

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.


Details

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. I understand the commands that are listed here.

@k8s-ci-robotk8s-ci-robot added the cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. label Feb 22, 2021
@chrisayoubchrisayoub changed the title Fix bug with Watch and 410 retryFix bug with Watch and 410 retriesFeb 22, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Welcome @chrisayoub!

It looks like this is your first PR to kubernetes-client/python-base 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-client/python-base has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robotk8s-ci-robot added size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Feb 22, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @mbohlool@roycaihw@yliaog

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@chrisayoub: GitHub didn't allow me to assign the following users: mbohlool.

Note that only kubernetes-client members, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

Details

In response to this:

/assign @mbohlool@roycaihw@yliaog

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.

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @micw523

@yliaog

Copy link
Copy Markdown
Contributor

if timeout or stop, retry should not be attempted? i think the current behavior is expected.

@PaulFurtado

Copy link
Copy Markdown

@yliaog If you look at the timeouts variable in the code, it is an argument to this function for a user-specified watch timeout for the request, it does not indicate that a timeout has actually occurred.

So for clients that specify a timeout as an argument to the function, the result of this is that when a 410 error occurs, the caller gets no exception at all and it appears that the watch has gracefully ended, which makes it impossible for a caller to recover from 410.

@yliaog

Copy link
Copy Markdown
Contributor

i see. in that case, timeouts condition is not useful. but it should still break without retry when stop is true. so what about the following:

if self._stop:
break

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

This is the previous PR and issue where this timeouts functionality was introduced:
#36
kubernetes-client/python#124

Do you think that change would conflict with this?

@PaulFurtado

Copy link
Copy Markdown

Yeah, removing the timeouts condition would break functionality. If that were set, a user might end up having a watch which lasts forever despite having set a timeout on it explicitly.

Thinking about this more, I actually think the best fix would be to never do any type of retry when timeouts is set because then it is impossible to guarantee that the function exits within the specified timeout. That would remain true to the way that this code worked prior to the 410 error handling. To achieve that, line 169 could be altered to include timeouts is not None so that we don't retry 410 when the timeouts parameter is set.

Additionally, I think maybe we should make that intention more clear so that similar bugs don't get introduced in the future. Before the while loop, we could set a variable like:

disable_retries=timeoutsisnotNone

and then alter this condition to be:

ifself._stopordisable_retries:
break

and change the condition on line 169 to:

ifnotdisable_retriesandnotretry_after_410andobj['code'] ==HTTP_STATUS_GONE:

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@PaulFurtado I updated the PR with your suggested changes, and I tested and they seem to work correctly for me.

@yliaog can you take another look? Thanks!

@yliaog

Copy link
Copy Markdown
Contributor

i'm not sure how the PR solve the original problem as given in the PR description below, so when there is 410 error, and timeout is given, there will be no retry at all, it returns.

"When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry."

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

I think this is just a question of the desired behavior ultimately. When the user specifies a timeout value and we encounter an event of type error, should we yield that event as normal, or should we raise an ApiException? I can easily modify the PR to do whichever seems more correct here.

Ultimately, the desired fix is that under these circumstances, we do not simply return from the function, and we either yield the event or raise an Exception.

@PaulFurtado

Copy link
Copy Markdown

@yliaog by adding the not disable_retries condition to the if statement on line 169, it hits the else block of that if statement which immediately raises the ApiException indicating that the 410 occurred, so that the caller can deal with the 410 error.

Comment threadwatch/watch.py
obj = event['raw_object']
# Current request expired, let's retry,
# but only if we have not already retried.
if not retry_after_410 and \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

please add a comment about the added condition "not disable_retries and not"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, see lines 154-155 as well

@yliaog

Copy link
Copy Markdown
Contributor

looks good to disable retry for the 410 case, could you please add a test case for it?

@k8s-ci-robotk8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. labels Feb 25, 2021
Comment threadwatch/watch_test.py
Comment on lines +291 to +293
# No events are generated when no initial resourceVersion is passed
# No retry is attempted either, preventing an ApiException
assert not list(w.stream(fake_api.get_thing))

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I updated the existing test case, which was not actually correct for the current version of the code with retries. Additionally, I added 2 more test cases to test both code paths that my PR is related to.

Comment threadwatch/watch_test.py

w = Watch()
try:
for _ in w.stream(fake_api.get_thing, timeout_seconds=10):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

no resource_version?

@chrisayoubchrisayoubFeb 25, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

For testing this code path and condition, you do not actually need to supply resource_version here, as an exception is raised and only the code in the watch finally block will execute. resource_version is needed in the other test because the code path goes beyond the finally block

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok

@yliaog

Copy link
Copy Markdown
Contributor

thanks for the pr.

/lgtm
/approve

@k8s-ci-robotk8s-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 25, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chrisayoub, yliaog

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

The pull request process is described here

Details 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

@k8s-ci-robotk8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 25, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@yliaog it looks like the failed CI run is preventing this from automatically merging:
https://travis-ci.org/github/kubernetes-client/python-base/jobs/760405517

However, this test case isn't even in this repo? Am I supposed to do anything else to proceed further in getting this merged?

Thank you!

@yliaog

Copy link
Copy Markdown
Contributor

closing the pr, and reoopen to trigger another CI run

@yliaog

Copy link
Copy Markdown
Contributor

/close

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Closed this PR.

Details

In response to this:

/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.

@yliaog

Copy link
Copy Markdown
Contributor

/open

@yliaog

Copy link
Copy Markdown
Contributor

/reopen

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Reopened this PR.

Details

In response to this:

/reopen

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.

@k8s-ci-robot
k8s-ci-robot merged commit 060cac1 into kubernetes-client:masterFeb 25, 2021
@chrisayoub
chrisayoub deleted the fix_watch_bug branch May 2, 2021 02:01
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

approvedIndicates a PR has been approved by an approver from all required OWNERS files.cncf-cla: yesIndicates the PR's author has signed the CNCF CLA.lgtmIndicates that a PR is ready to be merged.size/MDenotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@chrisayoub@k8s-ci-robot@yliaog@PaulFurtado@roycaihw@micw523
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix bug with Watch and 410 retries by chrisayoub · Pull Request #227 · kubernetes-client/python-base · GitHub
Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Fix bug with Watch and 410 retries - #227

Merged
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug
Feb 25, 2021
Merged

Fix bug with Watch and 410 retries#227
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug

Conversation

@chrisayoub

Copy link
Copy Markdown
Contributor

There is a bug that was introduced with the following PR:
#133

When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry.

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please follow instructions at https://git.k8s.io/community/CLA.md#the-contributor-license-agreement to sign the CLA.

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.


Details

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. I understand the commands that are listed here.

@k8s-ci-robotk8s-ci-robot added the cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. label Feb 22, 2021
@chrisayoubchrisayoub changed the title Fix bug with Watch and 410 retryFix bug with Watch and 410 retriesFeb 22, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Welcome @chrisayoub!

It looks like this is your first PR to kubernetes-client/python-base 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-client/python-base has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robotk8s-ci-robot added size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Feb 22, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @mbohlool@roycaihw@yliaog

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@chrisayoub: GitHub didn't allow me to assign the following users: mbohlool.

Note that only kubernetes-client members, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

Details

In response to this:

/assign @mbohlool@roycaihw@yliaog

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.

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @micw523

@yliaog

Copy link
Copy Markdown
Contributor

if timeout or stop, retry should not be attempted? i think the current behavior is expected.

@PaulFurtado

Copy link
Copy Markdown

@yliaog If you look at the timeouts variable in the code, it is an argument to this function for a user-specified watch timeout for the request, it does not indicate that a timeout has actually occurred.

So for clients that specify a timeout as an argument to the function, the result of this is that when a 410 error occurs, the caller gets no exception at all and it appears that the watch has gracefully ended, which makes it impossible for a caller to recover from 410.

@yliaog

Copy link
Copy Markdown
Contributor

i see. in that case, timeouts condition is not useful. but it should still break without retry when stop is true. so what about the following:

if self._stop:
break

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

This is the previous PR and issue where this timeouts functionality was introduced:
#36
kubernetes-client/python#124

Do you think that change would conflict with this?

@PaulFurtado

Copy link
Copy Markdown

Yeah, removing the timeouts condition would break functionality. If that were set, a user might end up having a watch which lasts forever despite having set a timeout on it explicitly.

Thinking about this more, I actually think the best fix would be to never do any type of retry when timeouts is set because then it is impossible to guarantee that the function exits within the specified timeout. That would remain true to the way that this code worked prior to the 410 error handling. To achieve that, line 169 could be altered to include timeouts is not None so that we don't retry 410 when the timeouts parameter is set.

Additionally, I think maybe we should make that intention more clear so that similar bugs don't get introduced in the future. Before the while loop, we could set a variable like:

disable_retries=timeoutsisnotNone

and then alter this condition to be:

ifself._stopordisable_retries:
break

and change the condition on line 169 to:

ifnotdisable_retriesandnotretry_after_410andobj['code'] ==HTTP_STATUS_GONE:

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@PaulFurtado I updated the PR with your suggested changes, and I tested and they seem to work correctly for me.

@yliaog can you take another look? Thanks!

@yliaog

Copy link
Copy Markdown
Contributor

i'm not sure how the PR solve the original problem as given in the PR description below, so when there is 410 error, and timeout is given, there will be no retry at all, it returns.

"When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry."

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

I think this is just a question of the desired behavior ultimately. When the user specifies a timeout value and we encounter an event of type error, should we yield that event as normal, or should we raise an ApiException? I can easily modify the PR to do whichever seems more correct here.

Ultimately, the desired fix is that under these circumstances, we do not simply return from the function, and we either yield the event or raise an Exception.

@PaulFurtado

Copy link
Copy Markdown

@yliaog by adding the not disable_retries condition to the if statement on line 169, it hits the else block of that if statement which immediately raises the ApiException indicating that the 410 occurred, so that the caller can deal with the 410 error.

Comment threadwatch/watch.py
obj = event['raw_object']
# Current request expired, let's retry,
# but only if we have not already retried.
if not retry_after_410 and \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

please add a comment about the added condition "not disable_retries and not"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, see lines 154-155 as well

@yliaog

Copy link
Copy Markdown
Contributor

looks good to disable retry for the 410 case, could you please add a test case for it?

@k8s-ci-robotk8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. labels Feb 25, 2021
Comment threadwatch/watch_test.py
Comment on lines +291 to +293
# No events are generated when no initial resourceVersion is passed
# No retry is attempted either, preventing an ApiException
assert not list(w.stream(fake_api.get_thing))

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I updated the existing test case, which was not actually correct for the current version of the code with retries. Additionally, I added 2 more test cases to test both code paths that my PR is related to.

Comment threadwatch/watch_test.py

w = Watch()
try:
for _ in w.stream(fake_api.get_thing, timeout_seconds=10):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

no resource_version?

@chrisayoubchrisayoubFeb 25, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

For testing this code path and condition, you do not actually need to supply resource_version here, as an exception is raised and only the code in the watch finally block will execute. resource_version is needed in the other test because the code path goes beyond the finally block

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok

@yliaog

Copy link
Copy Markdown
Contributor

thanks for the pr.

/lgtm
/approve

@k8s-ci-robotk8s-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 25, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chrisayoub, yliaog

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

The pull request process is described here

Details 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

@k8s-ci-robotk8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 25, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@yliaog it looks like the failed CI run is preventing this from automatically merging:
https://travis-ci.org/github/kubernetes-client/python-base/jobs/760405517

However, this test case isn't even in this repo? Am I supposed to do anything else to proceed further in getting this merged?

Thank you!

@yliaog

Copy link
Copy Markdown
Contributor

closing the pr, and reoopen to trigger another CI run

@yliaog

Copy link
Copy Markdown
Contributor

/close

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Closed this PR.

Details

In response to this:

/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.

@yliaog

Copy link
Copy Markdown
Contributor

/open

@yliaog

Copy link
Copy Markdown
Contributor

/reopen

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Reopened this PR.

Details

In response to this:

/reopen

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.

@k8s-ci-robot
k8s-ci-robot merged commit 060cac1 into kubernetes-client:masterFeb 25, 2021
@chrisayoub
chrisayoub deleted the fix_watch_bug branch May 2, 2021 02:01
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

approvedIndicates a PR has been approved by an approver from all required OWNERS files.cncf-cla: yesIndicates the PR's author has signed the CNCF CLA.lgtmIndicates that a PR is ready to be merged.size/MDenotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@chrisayoub@k8s-ci-robot@yliaog@PaulFurtado@roycaihw@micw523
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Fix bug with Watch and 410 retries by chrisayoub · Pull Request #227 · kubernetes-client/python-base · GitHub
Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Fix bug with Watch and 410 retries - #227

Merged
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug
Feb 25, 2021
Merged

Fix bug with Watch and 410 retries#227
k8s-ci-robot merged 1 commit into
kubernetes-client:masterfrom
chrisayoub:fix_watch_bug

Conversation

@chrisayoub

Copy link
Copy Markdown
Contributor

There is a bug that was introduced with the following PR:
#133

When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry.

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please follow instructions at https://git.k8s.io/community/CLA.md#the-contributor-license-agreement to sign the CLA.

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.


Details

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. I understand the commands that are listed here.

@k8s-ci-robotk8s-ci-robot added the cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. label Feb 22, 2021
@chrisayoubchrisayoub changed the title Fix bug with Watch and 410 retryFix bug with Watch and 410 retriesFeb 22, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

Welcome @chrisayoub!

It looks like this is your first PR to kubernetes-client/python-base 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-client/python-base has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robotk8s-ci-robot added size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Feb 22, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @mbohlool@roycaihw@yliaog

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@chrisayoub: GitHub didn't allow me to assign the following users: mbohlool.

Note that only kubernetes-client members, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

Details

In response to this:

/assign @mbohlool@roycaihw@yliaog

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.

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

/assign @micw523

@yliaog

Copy link
Copy Markdown
Contributor

if timeout or stop, retry should not be attempted? i think the current behavior is expected.

@PaulFurtado

Copy link
Copy Markdown

@yliaog If you look at the timeouts variable in the code, it is an argument to this function for a user-specified watch timeout for the request, it does not indicate that a timeout has actually occurred.

So for clients that specify a timeout as an argument to the function, the result of this is that when a 410 error occurs, the caller gets no exception at all and it appears that the watch has gracefully ended, which makes it impossible for a caller to recover from 410.

@yliaog

Copy link
Copy Markdown
Contributor

i see. in that case, timeouts condition is not useful. but it should still break without retry when stop is true. so what about the following:

if self._stop:
break

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

This is the previous PR and issue where this timeouts functionality was introduced:
#36
kubernetes-client/python#124

Do you think that change would conflict with this?

@PaulFurtado

Copy link
Copy Markdown

Yeah, removing the timeouts condition would break functionality. If that were set, a user might end up having a watch which lasts forever despite having set a timeout on it explicitly.

Thinking about this more, I actually think the best fix would be to never do any type of retry when timeouts is set because then it is impossible to guarantee that the function exits within the specified timeout. That would remain true to the way that this code worked prior to the 410 error handling. To achieve that, line 169 could be altered to include timeouts is not None so that we don't retry 410 when the timeouts parameter is set.

Additionally, I think maybe we should make that intention more clear so that similar bugs don't get introduced in the future. Before the while loop, we could set a variable like:

disable_retries=timeoutsisnotNone

and then alter this condition to be:

ifself._stopordisable_retries:
break

and change the condition on line 169 to:

ifnotdisable_retriesandnotretry_after_410andobj['code'] ==HTTP_STATUS_GONE:

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@PaulFurtado I updated the PR with your suggested changes, and I tested and they seem to work correctly for me.

@yliaog can you take another look? Thanks!

@yliaog

Copy link
Copy Markdown
Contributor

i'm not sure how the PR solve the original problem as given in the PR description below, so when there is 410 error, and timeout is given, there will be no retry at all, it returns.

"When there is a 410 error that needs to be retried and the user specifics any timeout values (timeouts), the code currently returns, when it really should proceed to the next iteration of the for loop and actually do the retry."

@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

I think this is just a question of the desired behavior ultimately. When the user specifies a timeout value and we encounter an event of type error, should we yield that event as normal, or should we raise an ApiException? I can easily modify the PR to do whichever seems more correct here.

Ultimately, the desired fix is that under these circumstances, we do not simply return from the function, and we either yield the event or raise an Exception.

@PaulFurtado

Copy link
Copy Markdown

@yliaog by adding the not disable_retries condition to the if statement on line 169, it hits the else block of that if statement which immediately raises the ApiException indicating that the 410 occurred, so that the caller can deal with the 410 error.

Comment threadwatch/watch.py
obj = event['raw_object']
# Current request expired, let's retry,
# but only if we have not already retried.
if not retry_after_410 and \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

please add a comment about the added condition "not disable_retries and not"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, see lines 154-155 as well

@yliaog

Copy link
Copy Markdown
Contributor

looks good to disable retry for the 410 case, could you please add a test case for it?

@k8s-ci-robotk8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/XS Denotes a PR that changes 0-9 lines, ignoring generated files. labels Feb 25, 2021
Comment threadwatch/watch_test.py
Comment on lines +291 to +293
# No events are generated when no initial resourceVersion is passed
# No retry is attempted either, preventing an ApiException
assert not list(w.stream(fake_api.get_thing))

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I updated the existing test case, which was not actually correct for the current version of the code with retries. Additionally, I added 2 more test cases to test both code paths that my PR is related to.

Comment threadwatch/watch_test.py

w = Watch()
try:
for _ in w.stream(fake_api.get_thing, timeout_seconds=10):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

no resource_version?

@chrisayoubchrisayoubFeb 25, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

For testing this code path and condition, you do not actually need to supply resource_version here, as an exception is raised and only the code in the watch finally block will execute. resource_version is needed in the other test because the code path goes beyond the finally block

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok

@yliaog

Copy link
Copy Markdown
Contributor

thanks for the pr.

/lgtm
/approve

@k8s-ci-robotk8s-ci-robot added the lgtm Indicates that a PR is ready to be merged. label Feb 25, 2021
@k8s-ci-robot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chrisayoub, yliaog

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

The pull request process is described here

Details 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

@k8s-ci-robotk8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 25, 2021
@chrisayoub

Copy link
Copy Markdown
ContributorAuthor

@yliaog it looks like the failed CI run is preventing this from automatically merging:
https://travis-ci.org/github/kubernetes-client/python-base/jobs/760405517

However, this test case isn't even in this repo? Am I supposed to do anything else to proceed further in getting this merged?

Thank you!

@yliaog

Copy link
Copy Markdown
Contributor

closing the pr, and reoopen to trigger another CI run

@yliaog

Copy link
Copy Markdown
Contributor

/close

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Closed this PR.

Details

In response to this:

/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.

@yliaog

Copy link
Copy Markdown
Contributor

/open

@yliaog

Copy link
Copy Markdown
Contributor

/reopen

@k8s-ci-robot

Copy link
Copy Markdown
Contributor

@yliaog: Reopened this PR.

Details

In response to this:

/reopen

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.

@k8s-ci-robot
k8s-ci-robot merged commit 060cac1 into kubernetes-client:masterFeb 25, 2021
@chrisayoub
chrisayoub deleted the fix_watch_bug branch May 2, 2021 02:01
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

approvedIndicates a PR has been approved by an approver from all required OWNERS files.cncf-cla: yesIndicates the PR's author has signed the CNCF CLA.lgtmIndicates that a PR is ready to be merged.size/MDenotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@chrisayoub@k8s-ci-robot@yliaog@PaulFurtado@roycaihw@micw523