@@ -81,6 +81,9 @@ function start(options, cb) {
81
81
} ;
82
82
} ) ;
83
83
84
+ cservice . locals . proxy . refreshnessTimer = setInterval ( checkVersionsForFreshness , 10000 ) ;
85
+ cservice . locals . proxy . refreshnessTimer . unref ( ) ;
86
+
84
87
cservice . locals . proxy . enabled = true ;
85
88
86
89
async . parallel ( proxyWorkerTasks , function ( err ) {
@@ -133,6 +136,9 @@ function stop(cb) {
133
136
return cb && cb ( "Proxy not running" ) ;
134
137
}
135
138
139
+ clearInterval ( cservice . locals . proxy . refreshnessTimer ) ;
140
+ cservice . locals . proxy . refreshnessTimer = null ;
141
+
136
142
// now lets trigger a shutdown
137
143
cservice . trigger ( "shutdown" , function ( err , result ) {
138
144
cservice . locals . proxy . enabled = false ;
@@ -147,7 +153,7 @@ function version(versionStr, options, cb) {
147
153
}
148
154
149
155
options = options || { } ;
150
- if ( ! options . workerCount ) {
156
+ if ( isNaN ( options . workerCount ) === true ) {
151
157
options . workerCount =
152
158
( versionStr === cservice . locals . proxy . options . defaultVersion )
153
159
? cservice . locals . options . workerCount
@@ -161,6 +167,14 @@ function version(versionStr, options, cb) {
161
167
// determine worker delta from desired count and actual count
162
168
var workerCountDelta = options . workerCount - currentVersionWorkers . length ;
163
169
170
+ // get existing version listing
171
+ var v = cservice . locals . proxy . versions [ versionStr ] ;
172
+
173
+ if ( v ) {
174
+ // update version lastAccess
175
+ v . lastAccess = Date . now ( ) ;
176
+ }
177
+
164
178
// if version worker count is already current, nothing more to do
165
179
if ( workerCountDelta === 0 ) {
166
180
return cb && cb ( ) ;
@@ -194,8 +208,6 @@ function version(versionStr, options, cb) {
194
208
versionStr , cservice . locals . proxy . workerFilename
195
209
) ;
196
210
197
- // get existing version listing
198
- var v = cservice . locals . proxy . versions [ versionStr ] ;
199
211
// use existing port if available, otherwise allocate a new one
200
212
var versionPort = ( v && v . port ) || getNextAvailablePort ( ) ;
201
213
@@ -338,18 +350,20 @@ function info(cb) {
338
350
return cb && cb ( "Proxy cannot invoke 'info' from worker" ) ;
339
351
}
340
352
353
+ var now = Date . now ( ) ;
341
354
var proxyWorkers = getProxyWorkers ( ) . map ( function ( worker ) {
342
355
var bindingInfo = JSON . parse ( worker . cservice . bindingInfo ) ;
343
356
return {
344
357
port : bindingInfo . port ,
345
- ssl : typeof bindingInfo . tlsOptions === "object" ,
346
-
358
+ ssl : typeof bindingInfo . tlsOptions === "object"
347
359
} ;
348
360
} ) ;
349
361
var versionWorkers = getVersionWorkers ( ) . map ( function ( worker ) {
362
+ var versionInfo = cservice . locals . proxy . versions [ worker . cservice . version ] ;
350
363
return {
351
364
worker : worker . cservice . worker ,
352
- version : worker . cservice . version
365
+ version : worker . cservice . version ,
366
+ lastAccess : versionInfo ? Math . round ( ( now - versionInfo . lastAccess ) / 1000 ) : "?"
353
367
} ;
354
368
} ) ;
355
369
@@ -395,3 +409,26 @@ function isVersionRunning(versionStr, cb) {
395
409
396
410
return false ; // no workers running desired version
397
411
}
412
+
413
+ function checkVersionsForFreshness ( ) {
414
+ var now = Date . now ( ) ;
415
+ for ( var k in cservice . locals . proxy . versions ) {
416
+ if (
417
+ // live version is exempt
418
+ k === cservice . locals . proxy . options . defaultVersion ||
419
+ // verify a valid version
420
+ ! cservice . locals . proxy . versions . hasOwnProperty ( k ) ) {
421
+ continue ; // skip
422
+ }
423
+ var v = cservice . locals . proxy . versions [ k ] ;
424
+ var diff_s = ( now - v . lastAccess ) / 1000 ; // seconds
425
+ if ( diff_s < cservice . locals . proxy . options . nonDefaultWorkerIdleTime ) {
426
+ continue ; // all OK
427
+ }
428
+
429
+ cservice . log ( "Proxy version " . warn + k . info + " shutting down due to inactivity" . warn ) ;
430
+
431
+ // kill all the things
432
+ version ( k , { workerCount : 0 } ) ;
433
+ }
434
+ }
0 commit comments