@@ -37,8 +37,6 @@ export interface Monitor {
3737
3838 endMonitoringClient ( ) : Promise < void > ;
3939
40- end ( ) : Promise < void > ;
41-
4240 releaseResources ( ) : Promise < void > ;
4341}
4442
@@ -125,13 +123,15 @@ export class MonitorImpl implements Monitor {
125123 for ( const [ key , val ] of MonitorImpl . newContexts . entries ( ) ) {
126124 if ( key < currentTimeNanos ) {
127125 const queue : Array < WeakRef < MonitorConnectionContext > > = val ;
126+
128127 processedKeys . push ( key ) ;
129128 // Each value of found entry is a queue of monitoring contexts awaiting active monitoring.
130129 // Add all contexts to an active monitoring contexts queue.
131130 // Ignore disposed contexts.
132131 let monitorContextRef : WeakRef < MonitorConnectionContext > | undefined ;
133- while ( ( monitorContextRef = queue . shift ( ) ) ) {
134- const monitorContext : MonitorConnectionContext = monitorContextRef . deref ( ) ;
132+
133+ while ( ( monitorContextRef = queue ?. shift ( ) ) != null ) {
134+ const monitorContext : MonitorConnectionContext = monitorContextRef ?. deref ( ) ?? null ;
135135 if ( monitorContext && monitorContext . isActive ( ) ) {
136136 this . activeContexts . push ( monitorContextRef ) ;
137137 }
@@ -176,22 +176,26 @@ export class MonitorImpl implements Monitor {
176176
177177 let monitorContextRef : WeakRef < MonitorConnectionContext > | undefined ;
178178
179- while ( ( monitorContextRef = this . activeContexts . shift ( ) ) ) {
179+ while ( ( monitorContextRef = this . activeContexts ? .shift ( ) ) != null ) {
180180 if ( this . isStopped ( ) ) {
181181 break ;
182182 }
183+
183184 const monitorContext : MonitorConnectionContext = monitorContextRef ?. deref ( ) ?? null ;
185+
184186 if ( ! monitorContext ) {
185187 continue ;
186188 }
187189
188190 if ( this . hostUnhealthy ) {
189191 // Kill connection
190192 monitorContext . setHostUnhealthy ( true ) ;
193+ const clientToAbort = monitorContext . getClient ( ) ;
194+
191195 monitorContext . setInactive ( ) ;
192- const connectionToAbort = monitorContext . getClient ( ) ;
193- if ( connectionToAbort != null ) {
194- await this . endMonitoringClient ( ) ;
196+ if ( clientToAbort != null ) {
197+ await this . endMonitoringClient ( clientToAbort ) ;
198+
195199 this . abortedConnectionsCounter . inc ( ) ;
196200 }
197201 } else if ( monitorContext && monitorContext . isActive ( ) ) {
@@ -219,7 +223,6 @@ export class MonitorImpl implements Monitor {
219223 logger . debug ( Messages . get ( "MonitorImpl.errorDuringMonitoringStop" , error . message ) ) ;
220224 } finally {
221225 await this . endMonitoringClient ( ) ;
222- await sleep ( 3000 ) ;
223226 }
224227
225228 logger . debug ( Messages . get ( "MonitorImpl.stopMonitoring" , this . hostInfo . host ) ) ;
@@ -260,13 +263,6 @@ export class MonitorImpl implements Monitor {
260263 return this . stopped ;
261264 }
262265
263- async end ( ) : Promise < void > {
264- this . stopped = true ;
265- // Waiting for 30s gives a task enough time to exit monitoring loop and close database connection.
266- await sleep ( 30000 ) ;
267- logger . debug ( Messages . get ( "MonitorImpl.stopped" , this . hostInfo . host ) ) ;
268- }
269-
270266 updateHostHealthStatus ( connectionValid : boolean , statusCheckStartNano : number , statusCheckEndNano : number ) : Promise < void > {
271267 if ( ! connectionValid ) {
272268 this . failureCount ++ ;
@@ -278,7 +274,7 @@ export class MonitorImpl implements Monitor {
278274 const invalidHostDurationNano = statusCheckEndNano - this . invalidHostStartTimeNano ;
279275 const maxInvalidHostDurationNano = this . failureDetectionIntervalNanos * Math . max ( 0 , this . failureDetectionCount - 1 ) ;
280276
281- if ( invalidHostDurationNano >= maxInvalidHostDurationNano ) {
277+ if ( this . failureCount >= this . failureDetectionCount || invalidHostDurationNano >= maxInvalidHostDurationNano ) {
282278 logger . debug ( Messages . get ( "MonitorConnectionContext.hostDead" , this . hostInfo . host ) ) ;
283279 this . hostUnhealthy = true ;
284280 return Promise . resolve ( ) ;
@@ -306,10 +302,18 @@ export class MonitorImpl implements Monitor {
306302 await sleep ( 500 ) ;
307303 }
308304
309- async endMonitoringClient ( ) {
310- if ( this . monitoringClient ) {
311- await this . pluginService . abortTargetClient ( this . monitoringClient ) ;
312- this . monitoringClient = null ;
305+ async endMonitoringClient ( clientToAbort ?: ClientWrapper ) {
306+ try {
307+ if ( clientToAbort ) {
308+ await this . pluginService . abortTargetClient ( clientToAbort ) ;
309+ } else if ( this . monitoringClient ) {
310+ await this . pluginService . abortTargetClient ( this . monitoringClient ) ;
311+ this . monitoringClient = null ;
312+ }
313+ this . stopped = true ;
314+ } catch ( error : any ) {
315+ // ignore
316+ logger . debug ( Messages . get ( "MonitorConnectionContext.errorAbortingConnection" , error . message ) ) ;
313317 }
314318 }
315319}
0 commit comments