A number of fixes in sandbox and declaration processing

This commit is contained in:
Zaid Abdulla committed 2016-11-10 07:07:51 -08:00
1 parent 3b987cc0cc
commit f9c5272ce0
5 files changed
+100 -112

No files matched your search

+1 -4
View File
@@ -209,8 +209,6 @@ applyPresets = (currentRequest) ->
session.rpcRequest(currentRequest.sessionData, null, (err, id, rpcRequest) -> session.rpcRequest(currentRequest.sessionData, null, (err, id, rpcRequest) ->
throw err if err throw err if err
if not rpcRequest?
session.clearProvisions(currentRequest.sessionData)
sendRpcRequest(currentRequest, id, rpcRequest) sendRpcRequest(currentRequest, id, rpcRequest)
) )
) )
@@ -235,12 +233,11 @@ nextRpc = (currentRequest) ->
currentRequest.sessionData.tasks.splice(j, 1) currentRequest.sessionData.tasks.splice(j, 1)
break break
session.clearProvisions(currentRequest.sessionData)
for task in currentRequest.sessionData.tasks for task in currentRequest.sessionData.tasks
# Delete if expired # Delete if expired
if task.expiry <= currentRequest.sessionData.timestamp if task.expiry <= currentRequest.sessionData.timestamp
util.log("#{currentRequest.sessionData.deviceId}: Task is expired #{task.name}(#{task._id})") util.log("#{currentRequest.sessionData.deviceId}: Task is expired #{task.name}(#{task._id})")
currentRequest.sessionData.doneTasks ?= []
currentRequest.sessionData.doneTasks.push(String(task._id)) currentRequest.sessionData.doneTasks.push(String(task._id))
continue continue
+1 -2
View File
@@ -21,7 +21,6 @@ script = require("#{process.argv[2]}/#{process.argv[3]}")
process.on('message', (message) -> process.on('message', (message) ->
script[message[1][0]](message[1].slice(1), (err, res) -> script[message[1][0]](message[1].slice(1), (err, res) ->
throw err if err process.send([message[0], err, res])
process.send([message[0], res])
) )
) )
+1 -1
View File
@@ -30,7 +30,7 @@ queue = {}
messageHandler = (message) -> messageHandler = (message) ->
func = queue[message[0]] func = queue[message[0]]
delete queue[message[0]] delete queue[message[0]]
func(null, message[1]) func(message[1], message[2])
run = (args, callback) -> run = (args, callback) ->
+54 -65
View File
@@ -132,35 +132,34 @@ function declare(path, timestamps, values) {
let parsedPath = common.parsePath(path); let parsedPath = common.parsePath(path);
sandbox.declarations[path] = sandbox.declarations[path] || [parsedPath, 1, {}, null, {}]; let declaration = [parsedPath, 1];
let attrs = {}; let attrs = {};
for (let attrName in timestamps) { if (timestamps)
if (attrName === "path") { for (let attrName in timestamps)
if (timestamps.path > sandbox.declarations[path][1]) if (attrName === "path")
sandbox.declarations[path][1] = timestamps.path; declaration[1] = timestamps.path;
}
else { else {
attrs[attrName] = 1; attrs[attrName] = 1;
if (!(timestamps[attrName] <= sandbox.declarations[path][2][attrName])) declaration[2] = declaration[2] || {};
sandbox.declarations[path][2][attrName] = timestamps[attrName]; declaration[2][attrName] = timestamps[attrName];
}
} }
if (values) { if (values)
for (let attrName in values) { for (let attrName in values)
if (attrName === "path") if (attrName === "path")
sandbox.declarations[path][3] = values.path; declaration[3] = values.path;
else { else {
attrs[attrName] = 1; attrs[attrName] = 1;
if (attrName === 'value' && !Array.isArray(values[attrName])) declaration[4] = declaration[4] || {};
sandbox.declarations[path][4].value = [values[attrName]]; if (attrName === "value" && !Array.isArray(values.value))
declaration[4].value = [values.value];
else else
sandbox.declarations[path][4].value = values[attrName]; declaration[4][attrName] = values[attrName];
}
}
} }
sandbox.declarations.push(declaration);
return new ParameterWrapper(parsedPath, Object.keys(attrs)); return new ParameterWrapper(parsedPath, Object.keys(attrs));
} }
@@ -212,7 +211,7 @@ function run(script, globals, timestamp, deviceData, extensionsCache, startRevis
sandbox.revision = startRevision; sandbox.revision = startRevision;
sandbox.maxRevision = maxRevision; sandbox.maxRevision = maxRevision;
sandbox.uncommitted = false; sandbox.uncommitted = false;
sandbox.declarations = {}; sandbox.declarations = [];
sandbox.extensions = {}; sandbox.extensions = {};
sandbox.clear = null; sandbox.clear = null;
@@ -222,59 +221,49 @@ function run(script, globals, timestamp, deviceData, extensionsCache, startRevis
for (let n in globals) for (let n in globals)
sandbox.context[n] = globals[n]; sandbox.context[n] = globals[n];
let ret, status;
try { try {
let ret = script.runInContext(sandbox.context, {displayErrors: false}); ret = script.runInContext(sandbox.context, {displayErrors: false});
status = 0;
let declarations = [];
for (let p in sandbox.declarations)
declarations.push(sandbox.declarations[p]);
let counter = 1;
for (let key in sandbox.extensions) {
++ counter;
extensions.run(sandbox.extensions[key], function(err, res) {
sandbox.extensionsCache[key] = res;
if (-- counter === 0)
return callback(null, sandbox.clear, declarations, true, ret);
});
}
if (-- counter === 0)
return callback(null, sandbox.clear, declarations, true, ret);
} }
catch (err) { catch (err) {
if (err === COMMIT) { if (err === COMMIT)
let declarations = []; status = 1;
for (let p in sandbox.declarations) else if (err === EXT)
declarations.push(sandbox.declarations[p]); status = 2;
let counter = 1;
for (let key in sandbox.extensions) {
++ counter;
extensions.run(sandbox.extensions[key], function(err, res) {
sandbox.extensionsCache[key] = res;
if (-- counter === 0)
return callback(null, sandbox.clear, declarations, false);
});
}
if (-- counter === 0)
return callback(null, sandbox.clear, declarations, false);
}
else if (err === EXT) {
let counter = 1;
for (let key in sandbox.extensions) {
++ counter;
extensions.run(sandbox.extensions[key], function(err, res) {
sandbox.extensionsCache[key] = res;
if (-- counter === 0)
return run(script, globals, timestamp, deviceData, extensionsCache, startRevision, maxRevision, callback);
});
}
if (-- counter === 0)
return run(script, globals, timestamp, deviceData, extensionsCache, startRevision, maxRevision, callback);
}
else else
return callback(err); return callback(err);
} }
let ext = sandbox.extensions;
let decs = sandbox.declarations;
let clr = sandbox.clear;
let extCache = sandbox.extensionsCache;
let args = arguments;
let counter = 1;
for (let key in sandbox.extensions) {
++ counter;
extensions.run(sandbox.extensions[key], function(err, res) {
if (err && counter > 0) {
counter = 0;
return callback(err);
}
extCache[key] = res;
if (-- counter === 0)
if (status === 2)
return run.apply(null, args);
else
return callback(null, clr, decs, status === 0, ret);
});
}
if (-- counter === 0)
if (status === 2)
return run.apply(null, args);
else
return callback(null, clr, decs, status === 0, ret);
} }
+43 -40
View File
@@ -157,13 +157,17 @@ inform = (sessionData, rpcReq, callback) ->
addProvisions = (sessionData, channel, provisions) -> addProvisions = (sessionData, channel, provisions) ->
sessionData.declarations = [] if sessionData.revisions[0] > 0
sessionData.provisions.length = 1 sessionData.deviceData.timestamps.collapse(1)
sessionData.doneProvisions = 0 sessionData.deviceData.attributes.collapse(1)
sessionData.doneDeclarations = 0
delete sessionData.syncState
sessionData.declarations = []
sessionData.doneProvisions = 0
sessionData.provisions[0] ?= [] sessionData.provisions[0] ?= []
sessionData.revisions[0] ?= 0 sessionData.provisions.length = 1
sessionData.revisions = [0]
sessionData.extensionsCache = {}
for provision, i in provisions for provision, i in provisions
# Remove duplicate provisions # Remove duplicate provisions
@@ -175,34 +179,25 @@ addProvisions = (sessionData, channel, provisions) ->
sessionData.provisions[0].push(provision) sessionData.provisions[0].push(provision)
sessionData.channels.push(channel) sessionData.channels.push(channel)
if sessionData.revisions.length > 1 or sessionData.revisions[0] > 0
v.collapse(1) for k, v of sessionData.deviceData.timestamps
v.collapse(1) for k, v of sessionData.deviceData.attributes
sessionData.rpcCount = 0
sessionData.revisions = [0]
sessionData.extensionsCache = {}
clearProvisions = (sessionData) -> clearProvisions = (sessionData) ->
if sessionData.revisions[sessionData.revisions.length - 1] > 0
sessionData.deviceData.timestamps.collapse(1)
sessionData.deviceData.attributes.collapse(1)
delete sessionData.syncState delete sessionData.syncState
sessionData.provisions = [[]] sessionData.provisions = []
sessionData.channels = [] sessionData.channels = []
sessionData.declarations = [] sessionData.declarations = []
sessionData.doneProvisions = 0 sessionData.doneProvisions = 0
sessionData.doneDeclarations = 0 sessionData.revisions = []
if sessionData.revisions.length > 1 or sessionData.revisions[0] > 0
sessionData.deviceData.timestamps.collapse(1)
sessionData.deviceData.attributes.collapse(1)
sessionData.rpcCount = 0
sessionData.revisions = [0]
sessionData.extensionsCache = {} sessionData.extensionsCache = {}
runProvisions = (sessionData, provisions, startRevision, endRevision, callback) -> runProvisions = (sessionData, provisions, startRevision, endRevision, callback) ->
done = true done = true
_extensions = []
_clear = []
allDeclarations = [] allDeclarations = []
allClear = []
counter = 1 counter = 1
for provision in provisions for provision in provisions
if not sessionData.cache.provisions[provision[0]]? if not sessionData.cache.provisions[provision[0]]?
@@ -259,22 +254,26 @@ runProvisions = (sessionData, provisions, startRevision, endRevision, callback)
return return
done &&= _done done &&= _done
if _declarations
allDeclarations = allDeclarations.concat(_declarations) allDeclarations = allDeclarations.concat(_declarations)
if _clear
allClear = allClear.concat(_clear)
if counter == 0 if counter == 0
return callback(null, done, allDeclarations, _clear) return callback(null, done, allDeclarations, allClear)
) )
if -- counter == 0 if -- counter == 0
return callback(null, done, allDeclarations, _clear) return callback(null, done, allDeclarations, allClear)
runVirtualParameters = (sessionData, provisions, startRevision, endRevision, callback) -> runVirtualParameters = (sessionData, provisions, startRevision, endRevision, callback) ->
done = true done = true
decs = []
virtualParameterUpdates = [] virtualParameterUpdates = []
_extensions = [] allDeclarations = []
_clear = [] allClear = []
counter = 1 counter = 1
for provision in provisions for provision in provisions
++ counter ++ counter
@@ -291,7 +290,12 @@ runVirtualParameters = (sessionData, provisions, startRevision, endRevision, cal
return return
done &&= _done done &&= _done
decs = decs.concat(_declarations)
if _declarations
allDeclarations = allDeclarations.concat(_declarations)
if _clear
allClear = allClear.concat(_clear)
if _done if _done
virtualParameterUpdates.push(_returnValue) virtualParameterUpdates.push(_returnValue)
@@ -303,7 +307,7 @@ runVirtualParameters = (sessionData, provisions, startRevision, endRevision, cal
toClear = commitVirtualParameter(sessionData, provisions[i], vpu, toClear) toClear = commitVirtualParameter(sessionData, provisions[i], vpu, toClear)
clear(sessionData, toClear, (err) -> clear(sessionData, toClear, (err) ->
return callback(err, done, decs, _clear) return callback(err, done, allDeclarations, allClear)
) )
) )
@@ -314,7 +318,7 @@ runVirtualParameters = (sessionData, provisions, startRevision, endRevision, cal
toClear = commitVirtualParameter(sessionData, provisions[i], vpu, toClear) toClear = commitVirtualParameter(sessionData, provisions[i], vpu, toClear)
clear(sessionData, toClear, (err) -> clear(sessionData, toClear, (err) ->
return callback(err, done, decs, _clear) return callback(err, done, allDeclarations, allClear)
) )
@@ -354,7 +358,7 @@ runDeclarations = (sessionData, declarations) ->
if (path.alias | path.wildcard) & 1 or path[0] == 'Reboot' if (path.alias | path.wildcard) & 1 or path[0] == 'Reboot'
sessionData.deviceData.paths.add(['Reboot']) sessionData.deviceData.paths.add(['Reboot'])
if (path.aliasa | path.wildcard) & 1 or path[0] == 'FactoryReset' if (path.alias | path.wildcard) & 1 or path[0] == 'FactoryReset'
sessionData.deviceData.paths.add(['FactoryReset']) sessionData.deviceData.paths.add(['FactoryReset'])
if path.alias if path.alias
@@ -411,7 +415,7 @@ runDeclarations = (sessionData, declarations) ->
else else
minInstances = maxInstances = declaration[3] minInstances = maxInstances = declaration[3]
parent = sessionData.deviceData.paths.add(path.slice(0, -1)) parent = common.addPathMeta(path.slice(0, -1))
if Array.isArray(path[path.length - 1]) if Array.isArray(path[path.length - 1])
keys = {} keys = {}
@@ -421,12 +425,14 @@ runDeclarations = (sessionData, declarations) ->
keys = {} keys = {}
if ((path.wildcard | path.alias) & ((1 << (path.length - 1)) - 1)) == 0 if ((path.wildcard | path.alias) & ((1 << (path.length - 1)) - 1)) == 0
parent = sessionData.deviceData.paths.add(parent)
unpacked ?= device.unpack(sessionData.device, path) unpacked ?= device.unpack(sessionData.device, path)
processInstances(sessionData, parent, unpacked, keys, minInstances, maxInstances) processInstances(sessionData, parent, unpacked, keys, minInstances, maxInstances)
else else
parentsUnpacked = device.unpack(sessionData.deviceData, parent) parentsUnpacked = device.unpack(sessionData.deviceData, parent)
for parent in parentsUnpacked for parent in parentsUnpacked
processInstances(sessionData, parent, device.unpack(sessionData.deviceData, parent.concat([path[parent.length]])), keys, minInstances, maxInstances) parent = sessionData.deviceData.paths.add(parent)
processInstances(sessionData, parent, device.unpack(sessionData.deviceData, common.addPathMeta(parent.concat([path[parent.length]]))), keys, minInstances, maxInstances)
return processDeclarations(sessionData, allDeclareTimestamps, allDeclareAttributeTimestamps, allDeclareAttributeValues) return processDeclarations(sessionData, allDeclareTimestamps, allDeclareAttributeTimestamps, allDeclareAttributeValues)
@@ -437,6 +443,9 @@ rpcRequest = (sessionData, _declarations, callback) ->
if sessionData.declarations.length < sessionData.provisions.length if sessionData.declarations.length < sessionData.provisions.length
inception = sessionData.declarations.length inception = sessionData.declarations.length
revision = sessionData.revisions[inception] + 1
sessionData.deviceData.timestamps.revision = revision
sessionData.deviceData.attributes.revision = revision
run = if inception == 0 then runProvisions else runVirtualParameters run = if inception == 0 then runProvisions else runVirtualParameters
return run(sessionData, sessionData.provisions[inception], sessionData.revisions[inception - 1] ? 0, sessionData.revisions[inception], (err, done, decs, toClear) -> return run(sessionData, sessionData.provisions[inception], sessionData.revisions[inception - 1] ? 0, sessionData.revisions[inception], (err, done, decs, toClear) ->
@@ -474,7 +483,6 @@ rpcRequest = (sessionData, _declarations, callback) ->
return rpcRequest(sessionData, null, callback) return rpcRequest(sessionData, null, callback)
) )
if (sessionData.syncState?.virtualParameterDeclarations?.length or 0) < sessionData.declarations.length if (sessionData.syncState?.virtualParameterDeclarations?.length or 0) < sessionData.declarations.length
inception = sessionData.syncState?.virtualParameterDeclarations?.length or 0 inception = sessionData.syncState?.virtualParameterDeclarations?.length or 0
vpd = runDeclarations(sessionData, sessionData.declarations[inception]) vpd = runDeclarations(sessionData, sessionData.declarations[inception])
@@ -508,10 +516,6 @@ rpcRequest = (sessionData, _declarations, callback) ->
if not sessionData.syncState? if not sessionData.syncState?
return callback() return callback()
revision = sessionData.revisions[sessionData.revisions.length - 1] + 1
sessionData.deviceData.timestamps.revision = revision
sessionData.deviceData.attributes.revision = revision
inception = sessionData.declarations.length - 1 inception = sessionData.declarations.length - 1
provisions = generateGetVirtualParameterProvisions(sessionData, sessionData.syncState.virtualParameterDeclarations[inception]) provisions = generateGetVirtualParameterProvisions(sessionData, sessionData.syncState.virtualParameterDeclarations[inception])
@@ -586,8 +590,7 @@ rpcRequest = (sessionData, _declarations, callback) ->
sessionData.deviceData.timestamps.collapse(rev + 1) sessionData.deviceData.timestamps.collapse(rev + 1)
sessionData.deviceData.attributes.collapse(rev + 1) sessionData.deviceData.attributes.collapse(rev + 1)
for k of sessionData.extensionsCache for k of sessionData.extensionsCache
n = Number(k.split(':', 1)[0]) if rev < Number(k.split(':', 1)[0])
if n > rev
delete sessionData.extensionsCache[k] delete sessionData.extensionsCache[k]
sessionData.syncState.virtualParameterDeclarations.length = sessionData.declarations.length sessionData.syncState.virtualParameterDeclarations.length = sessionData.declarations.length
@@ -747,7 +750,7 @@ generateSetRpcRequest = (sessionData) ->
# Delete instance # Delete instance
iter = syncState.instancesToDelete.values() iter = syncState.instancesToDelete.values()
while instances = iter.next().value while instances = iter.next().value
if instance = instances.values().next().value and if (instance = instances.values().next().value) and
sessionData.deviceData.attributes.has(instance) sessionData.deviceData.attributes.has(instance)
return { return {
type: 'DeleteObject' type: 'DeleteObject'