Skip to content

Commit 98d5c13

Browse files
committed
refactor(socket): Add maintenance mode support and dynamic timeout handling
- Introduced `#inMaintenance` property and setter to track maintenance mode state in `RedisSocket`. - Added `#maintenanceTimeout` and `setMaintenanceTimeout` method to dynamically adjust socket timeouts during maintenance. - Enhanced timeout error handling to differentiate between regular timeouts (`SocketTimeoutError`) and maintenance-specific timeouts (`SocketTimeoutDuringMaintananceError`).
1 parent e70c12b commit 98d5c13

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

packages/client/lib/client/socket.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { EventEmitter, once } from 'node:events';
22
import net from 'node:net';
33
import tls from 'node:tls';
4-
import { ConnectionTimeoutError, ClientClosedError, SocketClosedUnexpectedlyError, ReconnectStrategyError, SocketTimeoutError } from '../errors';
4+
import { ConnectionTimeoutError, ClientClosedError, SocketClosedUnexpectedlyError, ReconnectStrategyError, SocketTimeoutError, SocketTimeoutDuringMaintananceError } from '../errors';
55
import { setTimeout } from 'node:timers/promises';
66
import { RedisArgument } from '../RESP/types';
77

@@ -60,6 +60,8 @@ export default class RedisSocket extends EventEmitter {
6060
readonly #socketFactory;
6161
readonly #socketTimeout;
6262

63+
#maintenanceTimeout: number | undefined;
64+
6365
#socket?: net.Socket | tls.TLSSocket;
6466

6567
#isOpen = false;
@@ -82,6 +84,12 @@ export default class RedisSocket extends EventEmitter {
8284
return this.#socketEpoch;
8385
}
8486

87+
#inMaintenance = false;
88+
89+
set inMaintenance(value: boolean) {
90+
this.#inMaintenance = value;
91+
}
92+
8593
constructor(initiator: RedisSocketInitiator, options?: RedisSocketOptions) {
8694
super();
8795

@@ -238,6 +246,18 @@ export default class RedisSocket extends EventEmitter {
238246
} while (this.#isOpen && !this.#isReady);
239247
}
240248

249+
setMaintenanceTimeout(ms?: number) {
250+
if (this.#maintenanceTimeout === ms) return;
251+
252+
this.#maintenanceTimeout = ms;
253+
254+
if(ms !== undefined) {
255+
this.#socket?.setTimeout(ms);
256+
} else {
257+
this.#socket?.setTimeout(this.#socketTimeout ?? 0);
258+
}
259+
}
260+
241261
async #createSocket(): Promise<net.Socket | tls.TLSSocket> {
242262
const socket = this.#socketFactory.create();
243263

@@ -260,7 +280,10 @@ export default class RedisSocket extends EventEmitter {
260280

261281
if (this.#socketTimeout) {
262282
socket.once('timeout', () => {
263-
socket.destroy(new SocketTimeoutError(this.#socketTimeout!));
283+
const error = this.#inMaintenance
284+
? new SocketTimeoutDuringMaintananceError(this.#socketTimeout!)
285+
: new SocketTimeoutError(this.#socketTimeout!)
286+
socket.destroy(error);
264287
});
265288
socket.setTimeout(this.#socketTimeout);
266289
}

0 commit comments

Comments
 (0)