[ovirt-devel] TransactionSupport during command validation
Tomer Saban
tsaban at redhat.com
Wed Jan 13 10:22:29 UTC 2016
Hi,
I wanted to draw your attention to something I found out while fixing a bug involving the use of transactions in commands.
When calling a command using getBackend().runAction() when another transaction is open, by default the command will become part of the open transaction because by default CommandBase specifies TransactionScopeOption.Required as the default 'scope'.
Unfortunately, validation function(formerly CanDoAction()) will not be aware of the opened transaction. This get be problematic in cases where the validation() method check things that are fixed in the opened transaction and not committed yet.
For example, In my case I'm using the AddVdsGroupCommand which creates a new cluster (In an open tranasction) and then, calls the AddCpuProfileCommand which creates a default cpu profile. The default cpu profile validation() check then, Check if the cluster exists which fails because it's not part of the opened transaction.
They way to over come this is to add the validation() method to the open transaction by adding @ValidateSupportsTransaction annotation on the command.
The associated part of the code in CommandBase(line 817) :
"""
if (!isValidateSupportsTransaction()) {
transaction = TransactionSupport.suspend();
}
"""
isValidateSupportsTransaction() - Checks that the annotation exists and if it's not it suspends the TransactionSupport.
FYI,
Tomer
More information about the Devel
mailing list