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

Merging to release-5.6.0: TT-13130 only mark the wg as done when the connection is stablished (#6574) #6579

Conversation

buger
Copy link
Member

@buger buger commented Sep 23, 2024

User description

TT-13130 only mark the wg as done when the connection is stablished (#6574)

User description

Description

When the gw is ran as edge we want this to wait until the connection is
established with MDCB before attempting to pull policies and apis, we
should only mark the connection waitgroup as done when the connection is
successful not on every attempt

Related Issue

TT-13130

Motivation and Context

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

PR Type

Bug fix


Description

  • Fixed the logic in rpc_client.go to ensure the waitgroup is marked
    as done only when a connection is successfully established.
  • Removed the Done() call from the defer statement and added it after
    the connection is confirmed.

Changes walkthrough 📝

Relevant files
Bug fix
rpc_client.go
Fix waitgroup completion logic in connection establishment

rpc/rpc_client.go

  • Removed the Done() call from the defer statement in the Dial function.
  • Added Done() call after the connection is successfully established.
  • Ensures the waitgroup is marked as done only upon successful
    connection.
  • +2/-1     

    💡 PR-Agent usage: Comment /help "your question" on any pull
    request to receive relevant information

    Co-authored-by: sredny buitrago [email protected]


    PR Type

    Bug fix


    Description

    • Fixed an issue in rpc_client.go where the waitgroup was marked as done prematurely. Now, it is only marked as done after a successful connection establishment.
    • This change ensures that the gateway waits for a successful connection with MDCB before proceeding, preventing potential issues with policy and API pulling.

    Changes walkthrough 📝

    Relevant files
    Bug fix
    rpc_client.go
    Ensure waitgroup is marked done only after successful connection

    rpc/rpc_client.go

  • Removed premature call to connectionDialingWG.Done().
  • Added connectionDialingWG.Done() after successful connection
    establishment.
  • +2/-1     

    💡 PR-Agent usage: Comment /help "your question" on any pull request to receive relevant information

    …6574)
    
    ### **User description**
    <!-- Provide a general summary of your changes in the Title above -->
    
    ## Description
    
    When the gw is ran as edge we want this to wait until the connection is
    established with MDCB before attempting to pull policies and apis, we
    should only mark the connection waitgroup as done when the connection is
    successful not on every attempt
    
    ## Related Issue
    
    TT-13130
    
    ## Motivation and Context
    
    <!-- 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
    
    
    ___
    
    ### **PR Type**
    Bug fix
    
    
    ___
    
    ### **Description**
    - Fixed the logic in `rpc_client.go` to ensure the waitgroup is marked
    as done only when a connection is successfully established.
    - Removed the `Done()` call from the defer statement and added it after
    the connection is confirmed.
    
    
    ___
    
    
    
    ### **Changes walkthrough** 📝
    <table><thead><tr><th></th><th align="left">Relevant
    files</th></tr></thead><tbody><tr><td><strong>Bug
    fix</strong></td><td><table>
    <tr>
      <td>
        <details>
    <summary><strong>rpc_client.go</strong><dd><code>Fix waitgroup
    completion logic in connection establishment</code></dd></summary>
    <hr>
    
    rpc/rpc_client.go
    
    <li>Removed the <code>Done()</code> call from the defer statement in the
    <code>Dial</code> function.<br> <li> Added <code>Done()</code> call
    after the connection is successfully established.<br> <li> Ensures the
    waitgroup is marked as done only upon successful <br>connection.<br>
    
    
    </details>
    
    
      </td>
    <td><a
    href="https://github.com/TykTechnologies/tyk/pull/6574/files#diff-3b88914c99bb9418e44e6389ce73579843562e8900730b380d7fff2e95c51033">+2/-1</a>&nbsp;
    &nbsp; &nbsp; </td>
    
    </tr>                    
    </table></td></tr></tr></tbody></table>
    
    ___
    
    > 💡 **PR-Agent usage**: Comment `/help "your question"` on any pull
    request to receive relevant information
    
    Co-authored-by: sredny buitrago <[email protected]>
    (cherry picked from commit 5c1f149)
    @buger buger enabled auto-merge (squash) September 23, 2024 16:35
    Copy link
    Contributor

    API Changes

    no api changes detected

    Copy link
    Contributor

    PR Reviewer Guide 🔍

    ⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
    🧪 No relevant tests
    🔒 No security concerns identified
    ⚡ Key issues to review

    Possible Bug
    Ensure that the connectionDialingWG.Done() is called in all possible execution paths to prevent deadlocks or goroutine leaks.

    Copy link
    Contributor

    github-actions bot commented Sep 23, 2024

    PR Code Suggestions ✨

    CategorySuggestion                                                                                                                                    Score
    Possible bug
    Add error handling for conn.Write() to prevent silent failures

    Consider handling potential errors from conn.Write() calls to ensure robust error
    handling and avoid silent failures.

    rpc/rpc_client.go [298-300]

    -conn.Write([]byte("proto2"))
    -conn.Write([]byte{byte(len(connID))})
    -conn.Write([]byte(connID))
    +if _, err := conn.Write([]byte("proto2")); err != nil {
    +    return nil, err
    +}
    +if _, err := conn.Write([]byte{byte(len(connID))}); err != nil {
    +    return nil, err
    +}
    +if _, err := conn.Write([]byte(connID)); err != nil {
    +    return nil, err
    +}
     
    Suggestion importance[1-10]: 10

    Why: Adding error handling for conn.Write() is crucial to prevent silent failures and ensure robust error management, addressing a potential bug.

    10
    Best practice
    Use defer to ensure Done() is called even if an error occurs

    Ensure that connectionDialingWG.Done() is called in a defer statement to guarantee
    it executes even if an error occurs earlier in the function.

    rpc/rpc_client.go [302]

    -// only mark as done is connection is established
    -connectionDialingWG.Done()
    +defer connectionDialingWG.Done()
     
    Suggestion importance[1-10]: 9

    Why: Using defer for connectionDialingWG.Done() ensures that it is called regardless of where the function exits, which is a best practice for resource management and error handling.

    9
    Performance
    Combine conn.Write() calls into a single call for better performance

    To improve performance, consider combining the conn.Write() calls into a single call
    by concatenating the byte slices beforehand.

    rpc/rpc_client.go [298-300]

    -conn.Write([]byte("proto2"))
    -conn.Write([]byte{byte(len(connID))})
    -conn.Write([]byte(connID))
    +data := append([]byte("proto2"), byte(len(connID)))
    +data = append(data, connID...)
    +if _, err := conn.Write(data); err != nil {
    +    return nil, err
    +}
     
    Suggestion importance[1-10]: 7

    Why: Combining conn.Write() calls can improve performance by reducing the number of system calls, although the performance gain may be minor in this context.

    7
    Maintainability
    Correct a typo in the comment

    Correct the typo in the comment to improve code readability and professionalism.

    rpc/rpc_client.go [301]

    -// only mark as done is connection is established
    +// only mark as done if connection is established
     
    Suggestion importance[1-10]: 5

    Why: Correcting the typo in the comment improves code readability and professionalism, but it is a minor change with no impact on functionality.

    5

    Copy link

    sonarcloud bot commented Sep 23, 2024

    Quality Gate Failed Quality Gate failed

    Failed conditions
    0.0% Coverage on New Code (required ≥ 80%)

    See analysis details on SonarCloud

    @buger buger merged commit e01b647 into release-5.6.0 Sep 23, 2024
    23 of 24 checks passed
    @buger buger deleted the merge/release-5.6.0/5c1f1498888e0275526da044423e3e5ae2370976 branch September 23, 2024 16:55
    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.

    2 participants