...
- This Monitor implements a pre-processing script for jobs that request resource locks.
- The monitor is used by the above
request_resource_lock
job and can be assigned to any individual job node of a job chain that requires a resource lock.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
function spooler_process_before() {
var resourceJobChainParamDefault = "/resource_lock_provider/resource_lock_provider";
var resourceLockJobChainParam = "resource_job_chain";
var resourceLockNameParam = "resource_lock";
var resourceLockWakeUpParam = "resource_lock_wake_up";
var order = spooler_task.order;
var params = spooler.create_variable_set();
params.merge( spooler_task.params );
params.merge( order.params );
// name of the requested resource: explicitely set by parameter or assuming the current job chain path
var resourceLock = params.value( resourceLockNameParam );
if ( !resourceLock ) {
resourceLock = order.job_chain.path;
}
// name of the job chain that handles resource locks
var resourceJobChainName = params.value( resourceLockJobChainParam );
if ( !resourceJobChainName ) {
resourceJobChainName = resourceJobChainParamDefault;
}
// order wake up parameter indicates that order has acquired resource lock
if ( params.value( resourceLockWakeUpParam ) == "yes" ) {
spooler_log.info( ".. order acquired resource lock: " + resourceLock );
return true;
} else if ( params.value( resourceLockWakeUpParam ) == "no" ) {
spooler_log.info( ".. order suspended and waiting for resource lock: " + resourceLock );
order.state = order.job_chain_node.state;
order.suspended = true;
return false;
}
var resourceJobChain = spooler.job_chain( resourceJobChainName );
var resourceOrder = spooler.create_order();
var resourceParams = spooler.create_variable_set();
resourceParams.set_var( "requestor_job_chain", order.job_chain.path );
resourceParams.set_var( "requestor_order", order.id );
resourceOrder.params = resourceParams;
resourceOrder.title = resourceLock;
resourceOrder.at = "now+3";
if ( (order.job_chain.path + "/" + order.id).length <= 100 ) {
resourceOrder.id = order.job_chain.path + "/" + order.id;
}
resourceJobChain.add_order( resourceOrder );
spooler_log.info( ".. order requested resource lock: " + resourceLock );
params.set_var( resourceLockWakeUpParam, "no" );
order.state = order.job_chain_node.state;
// always suspend current order, it will be waked up by the requested resource lock
order.suspended = true;
return false;
} |
...