Throwing exceptions in case of database errors.

This commit is contained in:
Zaid Abdulla committed 2013-08-18 05:35:03 +03:00
1 parent c3f2f6ea5f
commit 3ad8d08ea9
3 files changed
+35 -8

No files matched your search

+16 -4
View File
@@ -24,6 +24,7 @@ applyConfigurations = (currentRequest, taskList) ->
if taskList.length if taskList.length
util.log("#{currentRequest.deviceId}: Presets discrepancy found") util.log("#{currentRequest.deviceId}: Presets discrepancy found")
apiFunctions.insertTasks(taskList, (err, tasks) -> apiFunctions.insertTasks(taskList, (err, tasks) ->
throw new Error(err) if err?
task = tasks[0] task = tasks[0]
util.log("#{currentRequest.deviceId}: Started task #{task.name}(#{task._id})") util.log("#{currentRequest.deviceId}: Started task #{task.name}(#{task._id})")
runTask(currentRequest, task, {}) runTask(currentRequest, task, {})
@@ -43,7 +44,7 @@ writeResponse = (currentRequest, res) ->
if config.DEBUG_DEVICES[currentRequest.deviceId] if config.DEBUG_DEVICES[currentRequest.deviceId]
dump = "# RESPONSE #{new Date(Date.now())}\n" + JSON.stringify(res.headers) + "\n#{res.data}\n\n" dump = "# RESPONSE #{new Date(Date.now())}\n" + JSON.stringify(res.headers) + "\n#{res.data}\n\n"
fs = require('fs').appendFile("debug/#{currentRequest.deviceId}.dump", dump, (err) -> fs = require('fs').appendFile("debug/#{currentRequest.deviceId}.dump", dump, (err) ->
throw new Error(err) if err throw new Error(err) if err?
) )
currentRequest.httpResponse.writeHead(res.code, res.headers) currentRequest.httpResponse.writeHead(res.code, res.headers)
@@ -102,14 +103,14 @@ updateDevice = (currentRequest, actions, callback) ->
updates["#{path}_timestamp"] = now updates["#{path}_timestamp"] = now
if Object.keys(updates).length > 0 or Object.keys(deletes).length > 0 if Object.keys(updates).length > 0 or Object.keys(deletes).length > 0
db.devicesCollection.update({'_id' : currentRequest.deviceId}, {'$set' : updates, '$unset' : deletes}, {safe: true}, (err, count) -> db.devicesCollection.update({'_id' : currentRequest.deviceId}, {'$set' : updates, '$unset' : deletes}, {}, (err, count) ->
if (err) if (err)
callback(err) if callback? callback(err) if callback?
return return
if count == 0 if count == 0
util.log("#{currentRequest.deviceId}: New device detected") util.log("#{currentRequest.deviceId}: New device detected")
db.devicesCollection.update({'_id' : currentRequest.deviceId}, {'$set' : updates}, {upsert: true, safe: true}, (err) -> db.devicesCollection.update({'_id' : currentRequest.deviceId}, {'$set' : updates}, {upsert: true}, (err) ->
if err? if err?
callback(err) if callback? callback(err) if callback?
return return
@@ -135,9 +136,10 @@ updateDevice = (currentRequest, actions, callback) ->
runTask = (currentRequest, task, methodResponse) -> runTask = (currentRequest, task, methodResponse) ->
timeDiff = process.hrtime() timeDiff = process.hrtime()
tasks.task(task, methodResponse, (err, status, cwmpResponse, deviceUpdates) -> tasks.task(task, methodResponse, (err, status, cwmpResponse, deviceUpdates) ->
throw new Error(err) if err?
# TODO handle error # TODO handle error
updateDevice(currentRequest, deviceUpdates, (err) -> updateDevice(currentRequest, deviceUpdates, (err) ->
util.error(err) if err? throw new Error(err) if err?
timeDiff = process.hrtime(timeDiff)[0] + 1 timeDiff = process.hrtime(timeDiff)[0] + 1
if timeDiff > 3 # in seconds if timeDiff > 3 # in seconds
@@ -148,23 +150,27 @@ runTask = (currentRequest, task, methodResponse) ->
when tasks.STATUS_FINISHED when tasks.STATUS_FINISHED
db.memcached.del(String(task._id)) db.memcached.del(String(task._id))
db.tasksCollection.remove({'_id' : mongodb.ObjectID(String(task._id))}, {safe: true}, (err, removed) -> db.tasksCollection.remove({'_id' : mongodb.ObjectID(String(task._id))}, {safe: true}, (err, removed) ->
throw new Error(err) if err?
util.log("#{currentRequest.deviceId}: Completed task #{task.name}(#{task._id})") util.log("#{currentRequest.deviceId}: Completed task #{task.name}(#{task._id})")
nextTask(currentRequest) nextTask(currentRequest)
) )
when tasks.STATUS_FAULT when tasks.STATUS_FAULT
util.log("#{currentRequest.deviceId}: Fault response for task #{task._id}") util.log("#{currentRequest.deviceId}: Fault response for task #{task._id}")
db.saveTask(task, (err) -> db.saveTask(task, (err) ->
throw new Error(err) if err?
# Faulty task. No more work to do until task is deleted. # Faulty task. No more work to do until task is deleted.
res = tr069.response(null, cwmpResponse) res = tr069.response(null, cwmpResponse)
writeResponse(currentRequest, res) writeResponse(currentRequest, res)
) )
when tasks.STATUS_PENDING when tasks.STATUS_PENDING
db.saveTask(task, (err) -> db.saveTask(task, (err) ->
throw new Error(err) if err?
# task expects CPE confirmation later # task expects CPE confirmation later
nextTask(currentRequest) nextTask(currentRequest)
) )
when tasks.STATUS_STARTED when tasks.STATUS_STARTED
db.updateTask(task, (err) -> db.updateTask(task, (err) ->
throw new Error(err) if err?
res = tr069.response(task._id, cwmpResponse) res = tr069.response(task._id, cwmpResponse)
writeResponse(currentRequest, res) writeResponse(currentRequest, res)
) )
@@ -184,11 +190,13 @@ isTaskExpired = (task) ->
nextTask = (currentRequest) -> nextTask = (currentRequest) ->
cur = db.tasksCollection.find({'device' : currentRequest.deviceId}).sort(['timestamp']).limit(1) cur = db.tasksCollection.find({'device' : currentRequest.deviceId}).sort(['timestamp']).limit(1)
cur.nextObject((err, task) -> cur.nextObject((err, task) ->
throw new Error(err) if err?
cwmpResponse = {} cwmpResponse = {}
if not task if not task
# no more tasks, check presets discrepancy # no more tasks, check presets discrepancy
db.memcached.get(["#{currentRequest.deviceId}_presets_hash", 'presets_hash'], (err, results) -> db.memcached.get(["#{currentRequest.deviceId}_presets_hash", 'presets_hash'], (err, results) ->
# ignore memcached errors
presetsHash = results['presets_hash'] presetsHash = results['presets_hash']
devicePresetsHash = results["#{currentRequest.deviceId}_presets_hash"] devicePresetsHash = results["#{currentRequest.deviceId}_presets_hash"]
@@ -218,6 +226,7 @@ nextTask = (currentRequest) ->
writeResponse(currentRequest, res) writeResponse(currentRequest, res)
else if isTaskExpired(task) else if isTaskExpired(task)
db.tasksCollection.remove({'_id' : mongodb.ObjectID(String(task._id))}, {safe: true}, (err, removed) -> db.tasksCollection.remove({'_id' : mongodb.ObjectID(String(task._id))}, {safe: true}, (err, removed) ->
throw new Error(err) if err?
nextTask(currentRequest) nextTask(currentRequest)
) )
else else
@@ -287,6 +296,7 @@ listener = (httpRequest, httpResponse) ->
util.log("#{currentRequest.deviceId}: Inform (#{cwmpRequest.methodRequest.event}); retry count #{cwmpRequest.methodRequest.retryCount}") util.log("#{currentRequest.deviceId}: Inform (#{cwmpRequest.methodRequest.event}); retry count #{cwmpRequest.methodRequest.retryCount}")
updateDevice(currentRequest, {'inform' : cwmpRequest.methodRequest.event, 'parameterValues' : cwmpRequest.methodRequest.parameterList}, (err) -> updateDevice(currentRequest, {'inform' : cwmpRequest.methodRequest.event, 'parameterValues' : cwmpRequest.methodRequest.parameterList}, (err) ->
throw new Error(err) if err?
res = tr069.response(cwmpRequest.id, cwmpResponse, cookies) res = tr069.response(cwmpRequest.id, cwmpResponse, cookies)
writeResponse(currentRequest, res) writeResponse(currentRequest, res)
) )
@@ -330,6 +340,8 @@ cluster = require 'cluster'
numCPUs = require('os').cpus().length numCPUs = require('os').cpus().length
if cluster.isMaster if cluster.isMaster
db.memcached.flush(() ->
)
cluster.on('listening', (worker, address) -> cluster.on('listening', (worker, address) ->
util.log("Worker #{worker.process.pid} listening to #{address.address}:#{address.port}") util.log("Worker #{worker.process.pid} listening to #{address.address}:#{address.port}")
) )
+9 -1
View File
@@ -14,7 +14,8 @@ objectsCollection = null
options = { options = {
db : { db : {
native_parser: true w : 1
wtimeout : 60000
} }
server : { server : {
auto_reconnect : true auto_reconnect : true
@@ -24,24 +25,29 @@ options = {
mongodb.MongoClient.connect("mongodb://#{config.MONGODB_SOCKET}/#{config.DATABASE_NAME}", options, (err, db) -> mongodb.MongoClient.connect("mongodb://#{config.MONGODB_SOCKET}/#{config.DATABASE_NAME}", options, (err, db) ->
exports.mongoDb = db exports.mongoDb = db
db.collection('tasks', (err, collection) -> db.collection('tasks', (err, collection) ->
throw new Error(err) if err?
exports.tasksCollection = tasksCollection = collection exports.tasksCollection = tasksCollection = collection
collection.ensureIndex({device: 1, timestamp: 1}, (err) -> collection.ensureIndex({device: 1, timestamp: 1}, (err) ->
) )
) )
db.collection('devices', (err, collection) -> db.collection('devices', (err, collection) ->
throw new Error(err) if err?
exports.devicesCollection = devicesCollection = collection exports.devicesCollection = devicesCollection = collection
) )
db.collection('presets', (err, collection) -> db.collection('presets', (err, collection) ->
throw new Error(err) if err?
exports.presetsCollection = presetsCollection = collection exports.presetsCollection = presetsCollection = collection
) )
db.collection('objects', (err, collection) -> db.collection('objects', (err, collection) ->
throw new Error(err) if err?
exports.objectsCollection = objectsCollection = collection exports.objectsCollection = objectsCollection = collection
) )
db.collection('fs.files', (err, collection) -> db.collection('fs.files', (err, collection) ->
throw new Error(err) if err?
exports.filesCollection = filesCollection = collection exports.filesCollection = filesCollection = collection
) )
) )
@@ -56,6 +62,8 @@ getTask = (taskId, callback) ->
task = data[tid] task = data[tid]
if not task? if not task?
tasksCollection.findOne({_id : mongodb.ObjectID(tid)}, (err, task) -> tasksCollection.findOne({_id : mongodb.ObjectID(tid)}, (err, task) ->
# TODO use err parameter in callback
throw new Error(err) if err?
callback(task) callback(task)
) )
else else
+10 -3
View File
@@ -86,6 +86,7 @@ exports.assertPresets = (deviceId, presetsHash, callback) ->
mongoQuery.optimizeProjection(projection) mongoQuery.optimizeProjection(projection)
db.devicesCollection.findOne({'_id' : deviceId}, projection, (err, device) -> db.devicesCollection.findOne({'_id' : deviceId}, projection, (err, device) ->
throw new Error(err) if err?
devicePresets = [] devicePresets = []
for p in presets for p in presets
if mongoQuery.test(device, p.precondition) if mongoQuery.test(device, p.precondition)
@@ -133,7 +134,9 @@ exports.assertPresets = (deviceId, presetsHash, callback) ->
else if matchObject(objects[c.object], p) else if matchObject(objects[c.object], p)
u = {} u = {}
u["#{c.name}.#{k}._name"] = c.object u["#{c.name}.#{k}._name"] = c.object
db.devicesCollection.update({'_id' : deviceId}, {'$set' : u}, {safe : false}) db.devicesCollection.update({'_id' : deviceId}, {'$set' : u}, {}, (err, count) ->
throw new Error(err) if err?
)
instances[k] = p instances[k] = p
if Object.keys(instances).length > 0 if Object.keys(instances).length > 0
@@ -163,10 +166,14 @@ exports.assertPresets = (deviceId, presetsHash, callback) ->
log("#{deviceId}: Updating tags") log("#{deviceId}: Updating tags")
if delete_tags.length > 0 if delete_tags.length > 0
db.devicesCollection.update({'_id' : deviceId}, {'$pull' : {'_tags' : {'$in' : delete_tags}}}, {safe : false}) db.devicesCollection.update({'_id' : deviceId}, {'$pull' : {'_tags' : {'$in' : delete_tags}}}, {}, (err, count) ->
throw new Error(err) if err?
)
if add_tags.length > 0 if add_tags.length > 0
db.devicesCollection.update({'_id' : deviceId}, {'$addToSet' : {'_tags' : {'$each' : add_tags}}}, {safe : false}) db.devicesCollection.update({'_id' : deviceId}, {'$addToSet' : {'_tags' : {'$each' : add_tags}}}, {}, (err, count) ->
throw new Error(err) if err?
)
if getParameterValues.length if getParameterValues.length
taskList.push {device : deviceId, name : 'getParameterValues', parameterNames: getParameterValues, timestamp : new Date()} taskList.push {device : deviceId, name : 'getParameterValues', parameterNames: getParameterValues, timestamp : new Date()}