Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[TT-12417] Do not delete keys on synchronization #6642

Merged
merged 12 commits into from
Oct 24, 2024
Merged

[TT-12417] Do not delete keys on synchronization #6642

merged 12 commits into from
Oct 24, 2024

Conversation

mativm02
Copy link
Contributor

@mativm02 mativm02 commented Oct 15, 2024

TT-12417
Summary Api keys are lost in worker gateways when keyspace sync interrupted
Type Bug Bug
Status In Dev
Points N/A
Labels customer_bug, jira_escalated

Description

Avoiding key deletion when synchronizing. This will avoid having inconsistent key data between master and slave Redis.

Related Issue

https://tyktech.atlassian.net/browse/TT-12417?atlOrigin=eyJpIjoiYWNiZTdlNmYwODY5NDI1ZDkzYmQ1MWFlZjM5NGQ3ZTgiLCJwIjoiaiJ9

Motivation and Context

https://tyktech.atlassian.net/browse/TT-12417?atlOrigin=eyJpIjoiYWNiZTdlNmYwODY5NDI1ZDkzYmQ1MWFlZjM5NGQ3ZTgiLCJwIjoiaiJ9

How This Has Been Tested

Screenshots (if appropriate)

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Refactoring or add test (improvements in base code or adds test coverage to functionality)

Checklist

  • I ensured that the documentation is up to date
  • I explained why this PR updates go.mod in detail with reasoning why it's required
  • I would like a code coverage CI quality gate exception and have explained why

@mativm02 mativm02 marked this pull request as ready for review October 15, 2024 15:15
@mativm02 mativm02 changed the title Do not delete keys on synchronization [TT-12417] Do not delete keys on synchronization Oct 15, 2024
Copy link
Contributor

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Error Handling
The error handling for the key retrieval process might be insufficient. The debug log in line 1139 only logs the error but does not handle it, potentially leading to unmanaged errors that could affect the flow.

Logging Level
The use of log.Debugf for a potentially critical error related to key retrieval might be inappropriate. Consider using a higher log level such as Error or Warn to ensure visibility in production environments.

Copy link
Contributor

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Score
Possible bug
Add error handling for session detail retrieval to prevent unnoticed failures

Ensure that the session details are properly handled for both hashed and non-hashed
keys by checking the return values and handling potential errors.

gateway/rpc_storage_handler.go [1128-1134]

-_, found = r.Gw.GlobalSessionManager.SessionDetail(orgId, key, true)
-_, found = r.Gw.GlobalSessionManager.SessionDetail(orgId, key, false)
+_, found, err = r.Gw.GlobalSessionManager.SessionDetail(orgId, key, true)
+if err != nil {
+    log.Errorf("Error retrieving session details: %v", err)
+}
+_, found, err = r.Gw.GlobalSessionManager.SessionDetail(orgId, key, false)
+if err != nil {
+    log.Errorf("Error retrieving session details: %v", err)
+}
Suggestion importance[1-10]: 9

Why: This suggestion adds necessary error handling for session detail retrieval, which is crucial for preventing silent failures and ensuring robustness in the code.

9
Enhancement
Improve error logging for better error visibility and troubleshooting

Replace the debug log statement with an error log if the key ID cannot be found, to
ensure visibility of critical errors.

gateway/rpc_storage_handler.go [1139]

-log.Debugf("cannot found key with id: %v, error: %v", id, err)
+log.Errorf("cannot found key with id: %v, error: %v", id, err)
Suggestion importance[1-10]: 8

Why: Changing the log level from debug to error is a significant improvement for visibility of critical issues, ensuring that missing keys are not overlooked in production environments.

8
Maintainability
Refactor session detail checking into a method to enhance code maintainability

Refactor the session detail retrieval and key not found logic into a separate method
to improve code readability and maintainability.

gateway/rpc_storage_handler.go [1128-1141]

-_, found = r.Gw.GlobalSessionManager.SessionDetail(orgId, key, true)
-if !found {
-    id, err := storage.TokenID(key)
-    if err != nil {
-        log.Debugf("cannot found key with id: %v, error: %v", id, err)
-    }
-    _, found = r.Gw.GlobalSessionManager.SessionDetail(orgId, id, false)
-}
+found = r.checkSessionDetails(orgId, key)
Suggestion importance[1-10]: 7

Why: Refactoring the logic into a separate method can improve code readability and maintainability, making it easier to manage and understand the codebase.

7

@buger
Copy link
Member

buger commented Oct 17, 2024

Let's make that PR title a 💯 shall we? 💪

Your PR title and story title look slightly different. Just checking in to know if it was intentional!

Story Title Api keys are lost in worker gateways when keyspace sync interrupted
PR Title [TT-12417] Do not delete keys on synchronization

Check out this guide to learn more about PR best-practices.

Copy link
Contributor

github-actions bot commented Oct 17, 2024

API Changes

--- prev.txt	2024-10-24 12:00:40.271485679 +0000
+++ current.txt	2024-10-24 12:00:33.947525669 +0000
@@ -11837,11 +11837,15 @@
     NewSyncForcer returns a new syncforcer with a connected redis with a key
     prefix synchronizer-group- for group synchronization control.
 
+func (sf *SyncronizerForcer) GetIsFirstConnection() bool
+
 func (sf *SyncronizerForcer) GroupLoginCallback(userKey string, groupID string) interface{}
     GroupLoginCallback checks if the groupID key exists in the storage to turn
     on/off ForceSync param. If the the key doesn't exists in the storage,
     it creates it and set ForceSync to true
 
+func (sf *SyncronizerForcer) SetFirstConnection(isFirstConnection bool)
+
 # Package: ./signature_validator
 
 package signature_validator // import "github.com/TykTechnologies/tyk/signature_validator"

@mativm02 mativm02 enabled auto-merge (squash) October 24, 2024 11:59
@mativm02 mativm02 merged commit cea1df4 into master Oct 24, 2024
33 of 39 checks passed
@mativm02 mativm02 deleted the TT-12417 branch October 24, 2024 12:27
Copy link

sonarcloud bot commented Oct 24, 2024

@mativm02
Copy link
Contributor Author

/release to release-5.3

Copy link

tykbot bot commented Oct 24, 2024

Working on it! Note that it can take a few minutes.

tykbot bot pushed a commit that referenced this pull request Oct 24, 2024
<details open>
<summary><a href="https://tyktech.atlassian.net/browse/TT-12417"
title="TT-12417" target="_blank">TT-12417</a></summary>
  <br />
  <table>
    <tr>
      <th>Summary</th>
<td>Api keys are lost in worker gateways when keyspace sync
interrupted</td>
    </tr>
    <tr>
      <th>Type</th>
      <td>
<img alt="Bug"
src="https://tyktech.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"
/>
        Bug
      </td>
    </tr>
    <tr>
      <th>Status</th>
      <td>In Dev</td>
    </tr>
    <tr>
      <th>Points</th>
      <td>N/A</td>
    </tr>
    <tr>
      <th>Labels</th>
<td><a
href="https://tyktech.atlassian.net/issues?jql=project%20%3D%20TT%20AND%20labels%20%3D%20customer_bug%20ORDER%20BY%20created%20DESC"
title="customer_bug">customer_bug</a>, <a
href="https://tyktech.atlassian.net/issues?jql=project%20%3D%20TT%20AND%20labels%20%3D%20jira_escalated%20ORDER%20BY%20created%20DESC"
title="jira_escalated">jira_escalated</a></td>
    </tr>
  </table>
</details>
<!--
  do not remove this marker as it will break jira-lint's functionality.
  added_by_jira_lint
-->

---

<!-- Provide a general summary of your changes in the Title above -->

Avoiding key deletion when synchronizing. This will avoid having
inconsistent key data between master and slave Redis.
<!-- Describe your changes in detail -->

https://tyktech.atlassian.net/browse/TT-12417?atlOrigin=eyJpIjoiYWNiZTdlNmYwODY5NDI1ZDkzYmQ1MWFlZjM5NGQ3ZTgiLCJwIjoiaiJ9
<!-- This project only accepts pull requests related to open issues. -->
<!-- If suggesting a new feature or change, please discuss it in an
issue first. -->
<!-- If fixing a bug, there should be an issue describing it with steps
to reproduce. -->
<!-- OSS: Please link to the issue here. Tyk: please create/link the
JIRA ticket. -->

https://tyktech.atlassian.net/browse/TT-12417?atlOrigin=eyJpIjoiYWNiZTdlNmYwODY5NDI1ZDkzYmQ1MWFlZjM5NGQ3ZTgiLCJwIjoiaiJ9
<!-- Why is this change required? What problem does it solve? -->

<!-- Please describe in detail how you tested your changes -->
<!-- Include details of your testing environment, and the tests -->
<!-- you ran to see how your change affects other areas of the code,
etc. -->
<!-- This information is helpful for reviewers and QA. -->

<!-- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Refactoring or add test (improvements in base code or adds test
coverage to functionality)

<!-- Go over all the following points, and put an `x` in all the boxes
that apply -->
<!-- If there are no documentation updates required, mark the item as
checked. -->
<!-- Raise up any additional concerns not covered by the checklist. -->

- [ ] I ensured that the documentation is up to date
- [ ] I explained why this PR updates go.mod in detail with reasoning
why it's required
- [ ] I would like a code coverage CI quality gate exception and have
explained why

(cherry picked from commit cea1df4)
Copy link

tykbot bot commented Oct 24, 2024

@mativm02 Succesfully merged PR

mativm02 added a commit that referenced this pull request Oct 24, 2024
…ion (#6642) (#6667)

[TT-12417] Do not delete keys on synchronization (#6642)

<details open>
<summary><a href="https://tyktech.atlassian.net/browse/TT-12417"
title="TT-12417" target="_blank">TT-12417</a></summary>
  <br />
  <table>
    <tr>
      <th>Summary</th>
<td>Api keys are lost in worker gateways when keyspace sync
interrupted</td>
    </tr>
    <tr>
      <th>Type</th>
      <td>
<img alt="Bug"

src="https://tyktech.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"
/>
        Bug
      </td>
    </tr>
    <tr>
      <th>Status</th>
      <td>In Dev</td>
    </tr>
    <tr>
      <th>Points</th>
      <td>N/A</td>
    </tr>
    <tr>
      <th>Labels</th>
<td><a

href="https://tyktech.atlassian.net/issues?jql=project%20%3D%20TT%20AND%20labels%20%3D%20customer_bug%20ORDER%20BY%20created%20DESC"
title="customer_bug">customer_bug</a>, <a

href="https://tyktech.atlassian.net/issues?jql=project%20%3D%20TT%20AND%20labels%20%3D%20jira_escalated%20ORDER%20BY%20created%20DESC"
title="jira_escalated">jira_escalated</a></td>
    </tr>
  </table>
</details>
<!--
  do not remove this marker as it will break jira-lint's functionality.
  added_by_jira_lint
-->

---

<!-- Provide a general summary of your changes in the Title above -->

## Description
Avoiding key deletion when synchronizing. This will avoid having
inconsistent key data between master and slave Redis.
<!-- Describe your changes in detail -->

## Related Issue


https://tyktech.atlassian.net/browse/TT-12417?atlOrigin=eyJpIjoiYWNiZTdlNmYwODY5NDI1ZDkzYmQ1MWFlZjM5NGQ3ZTgiLCJwIjoiaiJ9
<!-- This project only accepts pull requests related to open issues. -->
<!-- If suggesting a new feature or change, please discuss it in an
issue first. -->
<!-- If fixing a bug, there should be an issue describing it with steps
to reproduce. -->
<!-- OSS: Please link to the issue here. Tyk: please create/link the
JIRA ticket. -->

## Motivation and Context


https://tyktech.atlassian.net/browse/TT-12417?atlOrigin=eyJpIjoiYWNiZTdlNmYwODY5NDI1ZDkzYmQ1MWFlZjM5NGQ3ZTgiLCJwIjoiaiJ9
<!-- Why is this change required? What problem does it solve? -->

## How This Has Been Tested

<!-- Please describe in detail how you tested your changes -->
<!-- Include details of your testing environment, and the tests -->
<!-- you ran to see how your change affects other areas of the code,
etc. -->
<!-- This information is helpful for reviewers and QA. -->

## Screenshots (if appropriate)

## Types of changes

<!-- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Refactoring or add test (improvements in base code or adds test
coverage to functionality)

## Checklist

<!-- Go over all the following points, and put an `x` in all the boxes
that apply -->
<!-- If there are no documentation updates required, mark the item as
checked. -->
<!-- Raise up any additional concerns not covered by the checklist. -->

- [ ] I ensured that the documentation is up to date
- [ ] I explained why this PR updates go.mod in detail with reasoning
why it's required
- [ ] I would like a code coverage CI quality gate exception and have
explained why

[TT-12417]:
https://tyktech.atlassian.net/browse/TT-12417?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

---------

Co-authored-by: Matias <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants