diff --git a/acs.coffee b/acs.coffee index 28a56b4..d79d7a9 100644 --- a/acs.coffee +++ b/acs.coffee @@ -98,7 +98,7 @@ runTask = (task, reqParams) -> updateDevice(currentRequest.deviceId, actions) if Object.keys(resParams).length > 0 - db.memcached.set(String(task._id), task, config.CACHE_DURATION, (err, result) -> + db.updateTask(task, (err) -> res = tr069.response(currentRequest.sessionId, resParams, {task : String(task._id)}) writeResponse res ) @@ -106,7 +106,7 @@ runTask = (task, reqParams) -> # Task finished db.memcached.del(String(task._id)) - db.tasksCollection.remove({'_id' : db.mongo.ObjectID(task._id)}, {safe: true}, (err, removed) -> + db.tasksCollection.remove({'_id' : db.mongo.ObjectID(String(task._id))}, {safe: true}, (err, removed) -> util.log("#{currentRequest.deviceId}: completed task #{task.name}(#{task._id})") cookies = {task : null} nextTask(cookies) @@ -246,8 +246,7 @@ else if not taskId nextTask(cookies) else - db.memcached.get(taskId, (err, task) -> - # TODO if not found in memcached, fetch from mongo + db.getTask(taskId, (task) -> runTask(task, reqParams) ) diff --git a/db.coffee b/db.coffee index 88c147b..9023958 100644 --- a/db.coffee +++ b/db.coffee @@ -2,27 +2,60 @@ config = require './config' mongo = require 'mongodb' Memcached = require 'memcached' Memcached.config.maxExpiration = 86400 +Memcached.config.timeout = 1000 +Memcached.config.retries = 0 +Memcached.config.reconnect = 1000 memcached = new Memcached(config.MEMCACHED_SOCKET) +tasksCollection = null +devicesCollection = null +presetsCollection = null dbserver = new mongo.Server(config.MONGODB_SOCKET, 0, {auto_reconnect: true}) db = new mongo.Db(config.DATABASE_NAME, dbserver, {native_parser:true, safe:true}) db.open( (err, db) -> db.collection('tasks', (err, collection) -> - exports.tasksCollection = collection + exports.tasksCollection = tasksCollection = collection collection.ensureIndex({device: 1, timestamp: 1}, (err) -> ) ) db.collection('devices', (err, collection) -> - exports.devicesCollection = collection + exports.devicesCollection = devicesCollection = collection ) db.collection('presets', (err, collection) -> - exports.presetsCollection = collection + exports.presetsCollection = presetsCollection = collection ) ) +getTask = (taskId, callback) -> + memcached.get(taskId, (err, task) -> + if not task? + tasksCollection.findOne({_id : mongo.ObjectID(String(taskId))}, (err, task) -> + callback(task) + ) + else + callback(task) + ) + + +updateTask = (task, callback) -> + id = String(task._id) + + memcached.set(id, task, config.CACHE_DURATION, (err, res) -> + if res + callback() + else + task._id = mongo.ObjectID(id) + tasksCollection.save(task, (err) -> + callback(err) + ) + ) + + exports.mongo = mongo exports.memcached = memcached +exports.getTask = getTask +exports.updateTask = updateTask diff --git a/presets.coffee b/presets.coffee index cf82d56..9db7811 100644 --- a/presets.coffee +++ b/presets.coffee @@ -6,8 +6,6 @@ mongoQuery = require './mongo-query' getPresets = (callback) -> db.memcached.get('presets', (err, res) -> - throw new Error(err) if err - if res callback(res) return