diff --git a/lib/cache.coffee b/lib/cache.coffee index 86aec86..dfb316b 100644 --- a/lib/cache.coffee +++ b/lib/cache.coffee @@ -93,18 +93,18 @@ refresh = (callback) -> lock('presets_hash_lock', 3000, (err, unlockOrExtend) -> return callback(err) if err - counter = 4 + counter = 3 + + counter += 2 db.presetsCollection.find().toArray((err, res) -> if err - callback(err) if -- counter >= 0 - counter = 0 - return + callback(err) if counter & 1 + return counter = 0 db.objectsCollection.find().toArray((err, objects) -> if err - callback(err) if -- counter >= 0 - counter = 0 - return + callback(err) if (counter & 1) + return counter = 0 res.sort((a, b) -> if a.weight == b.weight @@ -167,13 +167,12 @@ refresh = (callback) -> p = "#{c.name}.[#{alias}]" _provisions.push(['instances', p, 0]) else - callback(new Error("Unknown configuration type #{c.type}")) if -- counter >= 0 - counter = 0 - return + callback(new Error("Unknown configuration type #{c.type}")) if counter & 1 + return counter = 0 presets.push({name: preset._id, channel: preset.channel or 'default', schedule: schedule, events: events, precondition: precondition, provisions: _provisions}) - if -- counter == 0 + if (counter -= 2) == 1 computeHash() db.redisClient.setex("presets_hash", 300, hash, (err) -> unlockOrExtend(0) @@ -183,11 +182,11 @@ refresh = (callback) -> ) ) + counter += 2 db.provisionsCollection.find().toArray((err, res) -> if err - callback(err) if -- counter >= 0 - counter = 0 - return + callback(err) if counter & 1 + return counter = 0 provisions = {} for r in res @@ -195,7 +194,7 @@ refresh = (callback) -> provisions[r._id].md5 = crypto.createHash('md5').update(r.script).digest('hex') provisions[r._id].script = new vm.Script("\"use strict\";(function(){\n#{r.script}\n})();", {filename: r._id, lineOffset: 1, timeout: 50}) - if -- counter == 0 + if (counter -= 2) == 1 computeHash() db.redisClient.setex("presets_hash", 300, hash, (err) -> unlockOrExtend(0) @@ -204,11 +203,11 @@ refresh = (callback) -> ) ) + counter += 2 db.virtualParametersCollection.find().toArray((err, res) -> if err - callback(err) if -- counter >= 0 - counter = 0 - return + callback(err) if counter & 1 + return counter = 0 virtualParameters = {} for r in res @@ -216,7 +215,7 @@ refresh = (callback) -> virtualParameters[r._id].md5 = crypto.createHash('md5').update(r.script).digest('hex') virtualParameters[r._id].script = new vm.Script("\"use strict\";(function(){\n#{r.script}\n})();", {filename: r._id, lineOffset: 1, timeout: 50}) - if -- counter == 0 + if (counter -= 2) == 1 computeHash() db.redisClient.setex("presets_hash", 300, hash, (err) -> unlockOrExtend(0) @@ -225,11 +224,11 @@ refresh = (callback) -> ) ) + counter += 2 db.filesCollection.find().toArray((err, res) -> if err - callback(err) if -- counter >= 0 - counter = 0 - return + callback(err) if counter & 1 + return counter = 0 files = {} for r in res @@ -239,7 +238,7 @@ refresh = (callback) -> files[id].md5 = r.md5 files[id].contentType = r.contentType - if -- counter == 0 + if (counter -= 2) == 1 computeHash() db.redisClient.setex("presets_hash", 300, hash, (err) -> unlockOrExtend(0) @@ -247,6 +246,14 @@ refresh = (callback) -> return callback() ) ) + + if (counter -= 2) == 1 + computeHash() + db.redisClient.setex("presets_hash", 300, hash, (err) -> + unlockOrExtend(0) + nextRefresh = now + REFRESH + return callback() + ) ) ) diff --git a/lib/cwmp.coffee b/lib/cwmp.coffee index c271e4d..6766d91 100644 --- a/lib/cwmp.coffee +++ b/lib/cwmp.coffee @@ -429,31 +429,31 @@ sendRpcRequest = (currentRequest, id, rpcRequest) -> db.clearTasks(currentRequest.sessionData.doneTasks, (err) -> return throwError(err, currentRequest.httpResponse) if err - counter = 1 + counter = 3 for k of currentRequest.sessionData.faultsTouched - ++ counter + counter += 2 if currentRequest.sessionData.faults[k] currentRequest.sessionData.faults[k].retries = currentRequest.sessionData.retries[k] db.saveFault(currentRequest.sessionData.deviceId, k, currentRequest.sessionData.faults[k], (err) -> - -- counter - if err and counter >= 0 - return throwError(err, currentRequest.httpResponse) if err + if err + throwError(err, currentRequest.httpResponse) if counter & 1 + return counter = 0 - if counter == 0 + if (counter -= 2) == 1 return writeResponse(currentRequest, soap.response(null)) ) else db.deleteFault(currentRequest.sessionData.deviceId, k, (err) -> - -- counter - if err and counter >= 0 - return throwError(err, currentRequest.httpResponse) if err + if err + throwError(err, currentRequest.httpResponse) if counter & 1 + return counter = 0 - if counter == 0 + if (counter -= 2) == 1 return writeResponse(currentRequest, soap.response(null)) ) - if -- counter == 0 + if (counter -= 2) == 1 return writeResponse(currentRequest, soap.response(null)) ) ) diff --git a/lib/sandbox.js b/lib/sandbox.js index 2afe369..d03f443 100644 --- a/lib/sandbox.js +++ b/lib/sandbox.js @@ -275,16 +275,17 @@ function run(script, globals, timestamp, deviceData, extensionsCache, startRevis let extCache = sandbox.extensionsCache; let args = arguments; - let counter = 1; + let counter = 3; for (let key in sandbox.extensions) { - ++ counter; + counter += 2; extensions.run(sandbox.extensions[key], function(err, fault, res) { - if ((err || fault) && counter > 0) { - counter = 0; - return callback(err, fault); + if (err || fault) { + if (counter & 1) + callback(err, fault); + return counter = 0; } extCache[key] = res; - if (-- counter === 0) + if ((counter -= 2) === 1) if (status === 2) return run.apply(null, args); else @@ -292,7 +293,7 @@ function run(script, globals, timestamp, deviceData, extensionsCache, startRevis }); } - if (-- counter === 0) + if ((counter -= 2) === 1) if (status === 2) return run.apply(null, args); else diff --git a/lib/session.coffee b/lib/session.coffee index 67192c3..0c410c6 100644 --- a/lib/session.coffee +++ b/lib/session.coffee @@ -238,7 +238,7 @@ revertDownloadParameters = (sessionData, instance, callback) -> timeoutOperations = (sessionData, callback) -> faults = [] operations = [] - counter = 1 + counter = 3 for commandKey, operation of sessionData.operations if operation.type isnt 'Download' @@ -259,17 +259,16 @@ timeoutOperations = (sessionData, callback) -> operations.push(operation) - ++ counter + counter += 2 revertDownloadParameters(sessionData, operation.args.instance, (err) -> - -- counter - if err and counter > 0 - counter = 0 + if err + callback(err) if counter & 1 + return counter = 0 - return callback(err, faults, operations) if counter == 0 + return callback(null, faults, operations) if (counter -= 2) == 1 ) - -- counter - return callback(null, faults, operations) if counter == 0 + return callback(null, faults, operations) if (counter -= 2) == 1 addProvisions = (sessionData, channel, provisions) -> @@ -322,24 +321,21 @@ runProvisions = (sessionData, provisions, startRevision, endRevision, callback) done = true allDeclarations = [] allClear = [] - counter = 1 + counter = 3 for provision in provisions if not sessionData.cache.provisions[provision[0]]? if defaultProvisions[provision[0]] done = defaultProvisions[provision[0]](sessionData, provision, allDeclarations, startRevision, endRevision) and done continue - ++ counter + counter += 2 sandbox.run(sessionData.cache.provisions[provision[0]].script, {args: provision[1]}, sessionData.timestamp, sessionData.deviceData, sessionData.extensionsCache, startRevision, endRevision, (err, _fault, _clear, _declarations, _done) -> - -- counter if err or _fault - if counter >= 0 - counter = 0 - return callback(err, _fault) - return + callback(err, _fault) if counter & 1 + return counter = 0 done &&= _done @@ -349,11 +345,11 @@ runProvisions = (sessionData, provisions, startRevision, endRevision, callback) if _clear allClear = allClear.concat(_clear) - if counter == 0 + if (counter -= 2) == 1 return callback(null, null, done, allDeclarations, allClear) ) - if -- counter == 0 + if (counter -= 2) == 1 return callback(null, null, done, allDeclarations, allClear) @@ -362,20 +358,17 @@ runVirtualParameters = (sessionData, provisions, startRevision, endRevision, cal virtualParameterUpdates = [] allDeclarations = [] allClear = [] - counter = 1 + counter = 3 for provision in provisions - ++ counter + counter += 2 globals = {TIMESTAMPS: provision[1], VALUES: provision[2]} sandbox.run(sessionData.cache.virtualParameters[provision[0]].script, globals, sessionData.timestamp, sessionData.deviceData, sessionData.extensionsCache, startRevision, endRevision, (err, _fault, _clear, _declarations, _done, _returnValue) -> - -- counter if err or _fault - if counter >= 0 - counter = 0 - return callback(err, _fault) - return + callback(err, _fault) if counter & 1 + return counter = 0 done &&= _done @@ -388,7 +381,7 @@ runVirtualParameters = (sessionData, provisions, startRevision, endRevision, cal if _done virtualParameterUpdates.push(_returnValue) - if counter == 0 + if (counter -= 2) == 1 toClear = null if virtualParameterUpdates.length == provisions.length for vpu, i in virtualParameterUpdates @@ -399,7 +392,7 @@ runVirtualParameters = (sessionData, provisions, startRevision, endRevision, cal ) ) - if -- counter == 0 + if (counter -= 2) == 1 toClear = null if virtualParameterUpdates.length == provisions.length for vpu, i in virtualParameterUpdates @@ -1566,38 +1559,46 @@ serialize = (sessionData, callback) -> end = (sessionData, callback) -> - counter = 2 + counter = 3 + + counter += 2 db.saveDevice(sessionData.deviceId, sessionData.deviceData, sessionData.new, (err) -> - -- counter - if err and counter > 0 - counter = 0 - return callback(err, sessionData.new) if counter == 0 + if err + callback(err) if counter & 1 + return counter = 0 + + return callback(null, sessionData.new) if (counter -= 2) == 1 ) + counter += 2 db.redisClient.del("session_#{sessionData.id}", (err) -> - -- counter - if err and counter > 0 - counter = 0 - return callback(err, sessionData.new) if counter == 0 + if err + callback(err) if counter & 1 + return counter = 0 + + return callback(null, sessionData.new) if (counter -= 2) == 1 ) for k of sessionData.operationsTouched - ++ counter + counter += 2 if sessionData.operations[k]? db.saveOperation(sessionData.deviceId, k, sessionData.operations[k], (err) -> - -- counter - if err and counter > 0 - counter = 0 - return callback(err, sessionData.new) if counter == 0 + if err + callback(err) if counter & 1 + return counter = 0 + + return callback(null, sessionData.new) if (counter -= 2) == 1 ) else db.deleteOperation(sessionData.deviceId, k, (err) -> - -- counter - if err and counter > 0 - counter = 0 - return callback(err, sessionData.new) if counter == 0 + if err + callback(err) if counter & 1 + return counter = 0 + + return callback(null, sessionData.new) if (counter -= 2) == 1 ) + callback(null, sessionData.new) if (counter -= 2) == 1 exports.init = init exports.timeoutOperations = timeoutOperations