-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merging to release-4-lts: [TT-9284] Ensure that old transport will cl…
…ose idle connections (#5231) (#5741) [TT-9284] Ensure that old transport will close idle connections (#5231) <details open> <br /> <table> <tr> <th>Summary</th> <td>[CS] The gateway leaks file handles via sockets when max_conn_time is above 0</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 Code Review</td> </tr> <tr> <th>Points</th> <td>N/A</td> </tr> </table> </details> <!-- do not remove this marker as it will break jira-lint's functionality. added_by_jira_lint --> --- TBD ## Description <!-- Describe your changes in detail --> ## Related Issue <!-- 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 <!-- 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 --------- Co-authored-by: Tit Petric <tit@tyk.io> [TT-9284]: https://tyktech.atlassian.net/browse/TT-9284?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Tit Petric <tit@tyk.io>
- Loading branch information
Showing
7 changed files
with
104 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package httputil | ||
|
||
import ( | ||
"net" | ||
"net/http" | ||
"sync/atomic" | ||
) | ||
|
||
// ConnectionWatcher counts http server connections. | ||
type ConnectionWatcher struct { | ||
n int64 | ||
} | ||
|
||
// NewConnectionWatcher returns a new *ConnectionWatcher. | ||
func NewConnectionWatcher() *ConnectionWatcher { | ||
return &ConnectionWatcher{} | ||
} | ||
|
||
// OnStateChange records open connections in response to connection | ||
// state changes. Set net/http Server.ConnState to this method | ||
// as value. | ||
func (cw *ConnectionWatcher) OnStateChange(_ net.Conn, state http.ConnState) { | ||
switch state { | ||
case http.StateNew: | ||
cw.Add(1) | ||
case http.StateHijacked, http.StateClosed: | ||
cw.Add(-1) | ||
} | ||
} | ||
|
||
// Count returns the number of connections at the time the call. | ||
|
||
func (cw *ConnectionWatcher) Count() int { | ||
return int(atomic.LoadInt64(&cw.n)) | ||
} | ||
|
||
// Add adds c to the number of active connections. | ||
func (cw *ConnectionWatcher) Add(c int64) { | ||
atomic.AddInt64(&cw.n, c) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package httputil_test | ||
|
||
import ( | ||
"net/http" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
|
||
"github.com/TykTechnologies/tyk/internal/httputil" | ||
) | ||
|
||
func TestConnectionWatcher(t *testing.T) { | ||
w := httputil.NewConnectionWatcher() | ||
w.Add(1) | ||
assert.Equal(t, 1, w.Count()) | ||
w.Add(2) | ||
assert.Equal(t, 3, w.Count()) | ||
w.Add(-3) | ||
assert.Equal(t, 0, w.Count()) | ||
|
||
w.OnStateChange(nil, http.StateNew) | ||
assert.Equal(t, 1, w.Count()) | ||
|
||
w.OnStateChange(nil, http.StateClosed) | ||
w.OnStateChange(nil, http.StateHijacked) | ||
assert.Equal(t, -1, w.Count()) | ||
|
||
} |