Skip to content

JS Client reconnection, HubConnection.ts. Incorrect number of reconnection attempts is logged. #42806

@babinik

Description

@babinik

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

JS SignalR Client version: 6.0.7

/** The version of the SignalR client. */
const VERSION = "6.0.7";

Overview.

Using standard SignalR reconnection mechanism, and in case connection was not finally established, the number of reconnection attempts is incorrectly logged. The number is -> reconnection attempts + 1, but expected to be -> reconnection attempts.

Details.

source: HubConnection.ts
method: private async _reconnect(error?: Error)

Problematic code-snippet _reconnect() loop source:

while (nextRetryDelay !== null) {
    this._logger.log(LogLevel.Information, `Reconnect attempt number ${previousReconnectAttempts} will start in ${nextRetryDelay} ms.`);

    //...

    try {
        await this._startInternal();

        // ...

        return;
    } catch (e) {
        this._logger.log(LogLevel.Information, `Reconnect attempt failed because of error '${e}'.`);
        // ... 

        retryError = e instanceof Error ? e : new Error(e.toString());
        // ! source code line number 822, previousReconnectAttempts++
        // increment, which finally influence on the incorrect log message (in case connection was not established).
        nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime, retryError);
    }
}

// ! source code line number 826
// incorrect number of reconnection attempts logged.
this._logger.log(LogLevel.Information, `Reconnect retries have been exhausted after ${Date.now() - reconnectStartTime} ms and ${previousReconnectAttempts} failed attempts. Connection disconnecting.`);

this._completeClose();

source line 822:
nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime, retryError);
source line 826:
this._logger.log(LogLevel.Information, `Reconnect retries have been exhausted after ${Date.now() - reconnectStartTime} ms and ${previousReconnectAttempts} failed attempts. Connection disconnecting.`);

Issue example.

When standard .withAutomaticReconnect() (witch attempts to reconnect 4 times [0, 2000, 10000, 30000]) fails to reconnect the following log message is logged:

[2022-07-19T07:55:10.103Z] Information: Reconnect retries have been exhausted after 58811 ms and 5 failed attempts. Connection disconnecting.

Message contains 5 attempts, but actually there were 4 attempts.

Expected Behavior

In case reconnection fails to establish connection, then the number of attempts logged should correspond to the number of actual reconnection attempts.

Steps To Reproduce

  1. Create connection and start it.
const hubConnection = new signalR.HubConnectionBuilder()
    .withUrl("<connectionURL>")
    .withAutomaticReconnect()
    .configureLogging(signalR.LogLevel.Information);


hubConnection.start();
  1. Stop hub, interrupting (closing) connection.

  2. Check log messages.

Example:

[2022-07-19T07:54:11.293Z] Information: Reconnect attempt number 1 will start in 0 ms.


[2022-07-19T07:54:15.388Z] Information: Reconnect attempt failed because of error 'Error: Failed to complete negotiation with the server: TypeError: Failed to fetch'.
[2022-07-19T07:54:15.388Z] Information: Reconnect attempt number 2 will start in 2000 ms.
[2022-07-19T07:54:21.464Z] Warning: Error from HTTP request. TypeError: Failed to fetch.


[2022-07-19T07:54:21.465Z] Information: Reconnect attempt failed because of error 'Error: Failed to complete negotiation with the server: TypeError: Failed to fetch'.
[2022-07-19T07:54:21.465Z] Information: Reconnect attempt number 3 will start in 10000 ms.
[2022-07-19T07:54:35.575Z] Warning: Error from HTTP request. TypeError: Failed to fetch.


[2022-07-19T07:54:35.576Z] Information: Reconnect attempt failed because of error 'Error: Failed to complete negotiation with the server: TypeError: Failed to fetch'.
[2022-07-19T07:54:35.576Z] Information: Reconnect attempt number 4 will start in 30000 ms.
[2022-07-19T07:55:10.102Z] Warning: Error from HTTP request. TypeError: Failed to fetch.


[2022-07-19T07:55:10.103Z] Information: Reconnect attempt failed because of error 'Error: Failed to complete negotiation with the server: TypeError: Failed to fetch'.
[2022-07-19T07:55:10.103Z] Information: Reconnect retries have been exhausted after 58811 ms and 5 failed attempts. Connection disconnecting.

There were 4 actual attempts to reconnect. Logged 5 attempts -> "Reconnect retries have been exhausted after 58811 ms and 5 failed attempts."

Exceptions (if any)

No response

.NET Version

6.0.300

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-signalrIncludes: SignalR clients and serversbugThis issue describes a behavior which is not expected - a bug.good first issueGood for newcomers.help candidateIndicates that the issues may be a good fit for community to help with. Requires work from eng. team

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions