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

http: fix http agent keep alive #43380

Merged
merged 1 commit into from
Jun 18, 2022

Conversation

theanarkh
Copy link
Contributor

@theanarkh theanarkh commented Jun 11, 2022

When options.keepAlive in createSocket function is true it leads to a bug. because createSocket will call this.createConnection(options, oncreate) which will create a socket and set two fields in socket.

this[kSetKeepAlive] = Boolean(options.keepAlive); // true
this[kSetKeepAliveInitialDelay] = ~~(options.keepAliveInitialDelay / 1000); // 0

this[kSetKeepAliveInitialDelay] will be 0 because options.keepAliveInitialDelay is undefined. When the connection is finished, afterConnect will be called and use this two fields, the related code is as follow.

if (self[kSetKeepAlive] && self._handle.setKeepAlive) {
      self._handle.setKeepAlive(true, self[kSetKeepAliveInitialDelay]);
}

It calls setKeepAlive with 0 (self[kSetKeepAliveInitialDelay]).

Then when the free event of agent is emitted, agent will call setKeepAlive in keepSocketAlive, the code is as follow.

// enable is true and this[kSetKeepAlive] is true too
if (this._handle.setKeepAlive && enable !== this[kSetKeepAlive]) {
    this[kSetKeepAlive] = enable;
    this[kSetKeepAliveInitialDelay] = initialDelay;
    this._handle.setKeepAlive(enable, initialDelay);
 }

enable !== this[kSetKeepAlive] will return false, so the agent do nothing which lead to a bug.

Currently http agent only set keepalive on some sockets (when free event is emitted). Maybe we can set keepalive for all sockets ? otherwise i think we should delete the keepAlive field of options before call this.createConnection in createSocket.

Refs: #41965.

  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • tests and/or benchmarks are included
  • documentation is changed or added
  • commit message follows commit guidelines

Affected subsystem: http

@nodejs-github-bot
Copy link
Collaborator

Review requested:

  • @nodejs/http
  • @nodejs/net

@nodejs-github-bot nodejs-github-bot added http Issues or PRs related to the http subsystem. needs-ci PRs that need a full CI run. labels Jun 11, 2022
@mscdex
Copy link
Contributor

mscdex commented Jun 11, 2022

This needs a test

@theanarkh theanarkh force-pushed the fix_http_agent_keep_alive branch 2 times, most recently from 99536b6 to 95d6aad Compare June 11, 2022 15:59
Copy link
Contributor

@ShogunPanda ShogunPanda left a comment

Choose a reason for hiding this comment

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

LGTM!

Copy link
Member

@mcollina mcollina left a comment

Choose a reason for hiding this comment

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

lgtm

@nodejs-github-bot
Copy link
Collaborator

@rickyes rickyes added the request-ci Add this label to start a Jenkins CI on a PR. label Jun 14, 2022
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jun 14, 2022
@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@theanarkh
Copy link
Contributor Author

@ShogunPanda Hi, can you help trigger CI again ? Thanks !

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@mcollina mcollina added author ready PRs that have at least one approval, no pending requests for changes, and a CI started. commit-queue Add this label to land a pull request using GitHub Actions. commit-queue-squash Add this label to instruct the Commit Queue to squash all the PR commits into the first one. and removed needs-ci PRs that need a full CI run. labels Jun 18, 2022
@nodejs-github-bot nodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label Jun 18, 2022
@nodejs-github-bot nodejs-github-bot merged commit fe776b8 into nodejs:main Jun 18, 2022
@nodejs-github-bot
Copy link
Collaborator

Landed in fe776b8

targos pushed a commit that referenced this pull request Jul 12, 2022
PR-URL: #43380
Reviewed-By: Paolo Insogna <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Ricky Zhou <[email protected]>
Reviewed-By: Trivikram Kamat <[email protected]>
targos pushed a commit that referenced this pull request Jul 18, 2022
PR-URL: #43380
Reviewed-By: Paolo Insogna <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Ricky Zhou <[email protected]>
Reviewed-By: Trivikram Kamat <[email protected]>
targos pushed a commit that referenced this pull request Jul 31, 2022
PR-URL: #43380
Reviewed-By: Paolo Insogna <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Ricky Zhou <[email protected]>
Reviewed-By: Trivikram Kamat <[email protected]>
guangwong pushed a commit to noslate-project/node that referenced this pull request Oct 10, 2022
PR-URL: nodejs/node#43380
Reviewed-By: Paolo Insogna <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Ricky Zhou <[email protected]>
Reviewed-By: Trivikram Kamat <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
author ready PRs that have at least one approval, no pending requests for changes, and a CI started. commit-queue-squash Add this label to instruct the Commit Queue to squash all the PR commits into the first one. http Issues or PRs related to the http subsystem.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants