@@ -35,6 +35,7 @@ import { version } from './version.js';
3535const MAX_RECONNECT_ATTEMPTS = 10 ;
3636const ASSIGNMENT_TIMEOUT = 7.5 * 1000 ;
3737const UPDATE_LOAD_INTERVAL = 2.5 * 1000 ;
38+ const DRAIN_TIMEOUT = 60 * 60 * 1000 ;
3839const PROJECT_TYPE = 'nodejs' ;
3940
4041let localEotRunnerRegistered = false ;
@@ -159,6 +160,7 @@ export class ServerOptions {
159160 loadFunc : ( worker : AgentServer ) => Promise < number > ;
160161 loadThreshold : number ;
161162 numIdleProcesses : number ;
163+ drainTimeout : number ;
162164 shutdownProcessTimeout : number ;
163165 initializeProcessTimeout : number ;
164166 permissions : WorkerPermissions ;
@@ -185,6 +187,7 @@ export class ServerOptions {
185187 loadFunc = defaultCpuLoad ,
186188 loadThreshold = undefined ,
187189 numIdleProcesses = undefined ,
190+ drainTimeout = DRAIN_TIMEOUT ,
188191 shutdownProcessTimeout = 60 * 1000 ,
189192 initializeProcessTimeout = 10 * 1000 ,
190193 permissions = new WorkerPermissions ( ) ,
@@ -215,6 +218,8 @@ export class ServerOptions {
215218 /** When the load exceeds this threshold, the worker will be marked as unavailable. */
216219 loadThreshold ?: number ;
217220 numIdleProcesses ?: number ;
221+ /** Number of milliseconds to wait for current jobs to finish upon shutdown. */
222+ drainTimeout ?: number ;
218223 shutdownProcessTimeout ?: number ;
219224 initializeProcessTimeout ?: number ;
220225 permissions ?: WorkerPermissions ;
@@ -254,6 +259,7 @@ export class ServerOptions {
254259 this . loadFunc = loadFunc ;
255260 this . loadThreshold = simulation ? Infinity : loadThreshold || Default . loadThreshold ( production ) ;
256261 this . numIdleProcesses = numIdleProcesses || Default . numIdleProcesses ( production ) ;
262+ this . drainTimeout = drainTimeout ;
257263 this . shutdownProcessTimeout = shutdownProcessTimeout ;
258264 this . initializeProcessTimeout = initializeProcessTimeout ;
259265 this . permissions = permissions ;
@@ -539,9 +545,11 @@ export class AgentServer {
539545
540546 const promises = [ joinJobs ( ) ] ;
541547
542- if ( timeout ) {
548+ const timeoutMs = timeout ?? this . #opts. drainTimeout ;
549+
550+ if ( timeoutMs ) {
543551 promises . push (
544- rejectOnAbort ( AbortSignal . timeout ( timeout ) ) . catch ( ( ) => {
552+ rejectOnAbort ( AbortSignal . timeout ( timeoutMs ) ) . catch ( ( ) => {
545553 throw new WorkerError ( 'timed out draining' ) ;
546554 } ) ,
547555 ) ;
0 commit comments