Don't allow minicap to fail more than 3 times in 10s.

This commit is contained in:
Simo Kinnunen
2015-04-27 16:10:41 +09:00
parent 688ddda713
commit 2123a475e3
2 changed files with 54 additions and 0 deletions

View File

@@ -16,6 +16,7 @@ var FrameConfig = require('./util/frameconfig')
var BroadcastSet = require('./util/broadcastset')
var StateQueue = require('./util/statequeue')
var RiskyStream = require('./util/riskystream')
var FailCounter = require('./util/failcounter')
module.exports = syrup.serial()
.dependency(require('../../support/adb'))
@@ -38,6 +39,9 @@ module.exports = syrup.serial()
this.readable = false
this.needsReadable = false
this.starter = Promise.resolve(true)
this.failCounter = new FailCounter(3, 10000)
this.failCounter.on('exceedLimit', this._failLimitExceeded.bind(this))
this.failed = false
}
util.inherits(FrameProducer, EventEmitter)
@@ -52,6 +56,11 @@ module.exports = syrup.serial()
return
}
if (this.failed) {
log.warn('Will not apply desired state due to too many failures')
return
}
switch (this.runningState) {
case FrameProducer.STATE_STARTING:
case FrameProducer.STATE_STOPPING:
@@ -88,6 +97,7 @@ module.exports = syrup.serial()
})
.catch(function(err) {
return this._stop().finally(function() {
this.failCounter.inc()
this.emit('error', err)
})
})
@@ -191,14 +201,26 @@ module.exports = syrup.serial()
FrameProducer.prototype._socketEnded = function() {
log.warn('Connection to minicap ended unexpectedly')
this.failCounter.inc()
this.restart()
}
FrameProducer.prototype._outputEnded = function() {
log.warn('Shell keeping minicap running ended unexpectedly')
this.failCounter.inc()
this.restart()
}
FrameProducer.prototype._failLimitExceeded = function(limit, time) {
this._stop()
this.failed = true
this.emit('error', new Error(util.format(
'Failed more than %d times in %dms'
, limit
, time
)))
}
FrameProducer.prototype._startService = function() {
log.info('Launching screen service')
return minicap.run(util.format('-S -P %s', this.frameConfig.toString()))