Hi all,
Thanks to the help of Alon, oved, Tal, Moti, Arik and others, the following
changes were introduced:
1. Internal commands invocation -
When invoking an internal command from a command, please use the following :
Instead of Backend.getInstance().runInternalAction...
Use
runInternalAction - a new method that was introdced at CommandBase.
This method has two variants - one that accepts command context, and the other
that does not have a command contet -
runInternalAction(VdcActionType,VdcActionParametersBase,CommandContext)
and
runInternalAction(VdcActionType,VdcActionParametersBase)
If CommandContext is not passed the context at the calling command will be
cloned and set at the child command.
If a Command context is pased - it should be the responsibility of the caller
to clone, however, this will give the caller some degree of freedom to
determine whether various
parts of the context will be cloned, or not.
Examples:
runInternalAction(VdcActionType.AddPermission, permissionParams) has the same
effect as : runInternlAction(VdcActionType.AddPermissiosn, permissionParams,
getContext().clone())
runInternlAction(VdcActionType.AddPermissiosn, permissionParams,
getContext().clone().withoutCompensationContext()) - will cause the
compensation context to be reset, and let the child command determine the value
of compensation context (at handleTransactivity method).
The complete list of "context alteration methods" are -
withCompensationContext(CompensationContext) , withoutCompensationContext()
withLock(EngineLock), withoutLock()
withExecutionContext(ExecutionContext), withoutExecutionContext() - bare in
mind that all these follow the chaining method "design pattern" [1] (I would
like to thank Moti for the naming suggestions)
two methods for running InternalAction with context for tasks were created:
runInternalActionWithTasksContext(VdcActionType, VdcActionParametersBase)
runInternalActionWithTasksContext(VdcActionType, VdcActionParametersBase,
EngineLock)
These methods use ExecutionHandler.createDefaultContextForTasks to create the
relevant command context to be passed to the child command.
runInternalMultipleActions was introduced to command base in a similar manner,
with 3 versions:
runInternalMultipleActions(VdcActionType, ArrayList<VdcActionParametersBase>)
runInternalMultipleActions(VdcActionType, ArrayList<VdcActionParametersBase>,
ExecutionContext)
runInternalMultipleActions(VdcActionType, ArrayList<VdcActionParametersBase>,
CommandContext)
2. Queries invocation -
runInternalQuery(VdcQueryType, VdcQueryParametersBase) was introduced to
command base.
Basically it takes the engine context from the current command context, and
runs the internal query with it.
EngineContext is the context which should hold all the common attributes to our
flows at engine - currently it holds the engineSessionId, working towards
moving correlationId to it as well.
3. Commands & Queries coding
Each internal query should have a ctor that takes the parameters, and also the
engine context .
As some of the queries are both internal and non internal you may have two
ctors - one with parameters only, one with parameters and EngineContext
for example
public class GetUnregisteredDiskQuery<P extends
GetUnregisteredDiskQueryParameters> extends QueriesCommandBase<P> {
public GetUnregisteredDiskQuery(P parameters) {
this(parameters, null);
}
public GetUnregisteredDiskQuery(P parameters, EngineContext context) {
super(parameters, context);
}
Notice that the ctor without the context calls the one with the context.
Same happens at Commands:
public RemovePermissionCommand(T parameters) {
this(parameters, null);
}
public RemovePermissionCommand(T parameters, CommandContext commandContext)
{
super(parameters, commandContext);
}
4. runVdsCommand was introduced to CommandBase as well
runVdsCommand(VDSCommandType, VdsCommandParameters) - currently this just runs
the vds command on vds broker, working on propagating the engine context via
vds broker as well.
Please use the above in your code. If you see any issues , or places where its
problematic to use, feel free to contact me.
[1]
http://en.wikipedia.org/wiki/Method_chaining
_______________________________________________
Devel mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/devel