Discussion:
[vbox-dev] deleteConfig in VirtualBox 4.3.x
john alexander sanabria ordonez
2014-03-04 13:44:01 UTC
Permalink
Hi,

I wrote a Groovy script to use the Java binding to manage virtual machines
through the VirtualBox web service interface. My script worked well in
VirtualBox 4.2.x but when I updated to version 4.3 I noted that my
unregistervm procedure does not work. First, the IMachine.delete method was
not available and it was changed by IMachine.deleteConfig which basically
works similarly to the delete method. I made the corresponding
modifications however it does not delete the mediums returned by the
IMachine.unregister method.

My unregistervm methods looks similar to this

def mediums = machine.unregister(CleanupMode.DetachAllReturnHardDisksOnly)
def iprogress = machine.deleteConfig(mediums)
while (iprogress.percent < 100) {
out << "."
}

and it never ends because the iprogress.percent never reaches 100.

What I am doing wrong? Thanks for your help.

John,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.virtualbox.org/pipermail/vbox-dev/attachments/20140304/7934ad70/attachment.html
Klaus Espenlaub
2014-03-04 18:55:45 UTC
Permalink
Hi,
Post by john alexander sanabria ordonez
Hi,
I wrote a Groovy script to use the Java binding to manage virtual
machines through the VirtualBox web service interface. My script worked
well in VirtualBox 4.2.x but when I updated to version 4.3 I noted that
my unregistervm procedure does not work. First, the IMachine.delete
method was not available and it was changed by IMachine.deleteConfig
which basically works similarly to the delete method. I made the
corresponding modifications however it does not delete the mediums
returned by the IMachine.unregister method.
This is documented in the SDK reference, for the API changes in 4.3.
Post by john alexander sanabria ordonez
My unregistervm methods looks similar to this
def mediums = machine.unregister(CleanupMode.DetachAllReturnHardDisksOnly)
def iprogress = machine.deleteConfig(mediums)
while (iprogress.percent < 100) {
out << "."
}
and it never ends because the iprogress.percent never reaches 100.
What I am doing wrong? Thanks for your help.
The percentage will never reach 100 if there is any error. You should be
adding more flexible progress checking (there should be enough working
samples out there, including the Java sample code). What you have is
asking for hangs. Also, you should at least have some wait for
completion (if you prefer with very low timeout), as otherwise you're
simply burning CPU cycles.

Klaus
Post by john alexander sanabria ordonez
John,
Klaus Espenlaub
2014-03-06 10:35:46 UTC
Permalink
John,

please stay on the mailing list. This is a public service, if you want
personal support I have to ask for your Oracle customer support
identifier...
Hi Klaus,
I read the documentation but (from my experience) it does not behave
as I was expecting. For instance, I do understand that the
deleteConfig method does not reach the 100 percent if there is an
error but why the library does not throw an exception informing about
it. In addition, why if the previous method (delete) works with no
errors this time "deleteConfig" will generate any error?
The asynchronous part of the deletion might fail (and that's exactly the
same as in older versions, just the method name has been changed), and
your code will simply hang as it doesn't properly check for completion.
Failed async operations usually will never reach 100% - why should they,
they failed before.

These failures will NOT cause exceptions from the progress object method
calls, you have to check for them explicitly. It's been always like
that, and there's lots of sample code out there which shows how to do
this properly.
About the wait, this is the actual code
out << "To delete "
mediums.each {
out << it.name <http://it.name> + " "
}
def iprogress = machine.delete(mediums)
out << "\nDeleting "
while (iprogress.percent != 100) {
Do not check for 100%, check if iprogress.getCompletion returns non-zero
(dunno if the true/false stuff makes it all the way to Groovy).
out << "."
out.flush()
Thread.sleep(500)
Again, you're ignoring that you should wait using the method from the
progress object, iprogress.waitForCompletion(500) as this gives the API
middleware the opportunity to run its event queues and so on.

PLEASE have a look at the Java sample (TestVBox.java), it contains many
useful code sequences which are verified to be sensible (not that all of
them go into extreme error checking, but at least do the bare minimum
necessary to avoid hangs).

Klaus
}
John,
On 4 March 2014 13:55, Klaus Espenlaub <klaus.espenlaub at oracle.com
Hi,
Post by john alexander sanabria ordonez
Hi,
I wrote a Groovy script to use the Java binding to manage virtual
machines through the VirtualBox web service interface. My script
worked
Post by john alexander sanabria ordonez
well in VirtualBox 4.2.x but when I updated to version 4.3 I
noted that
Post by john alexander sanabria ordonez
my unregistervm procedure does not work. First, the IMachine.delete
method was not available and it was changed by IMachine.deleteConfig
which basically works similarly to the delete method. I made the
corresponding modifications however it does not delete the mediums
returned by the IMachine.unregister method.
This is documented in the SDK reference, for the API changes in 4.3.
Post by john alexander sanabria ordonez
My unregistervm methods looks similar to this
def mediums =
machine.unregister(CleanupMode.DetachAllReturnHardDisksOnly)
Post by john alexander sanabria ordonez
def iprogress = machine.deleteConfig(mediums)
while (iprogress.percent < 100) {
out << "."
}
and it never ends because the iprogress.percent never reaches 100.
What I am doing wrong? Thanks for your help.
The percentage will never reach 100 if there is any error. You should be
adding more flexible progress checking (there should be enough working
samples out there, including the Java sample code). What you have is
asking for hangs. Also, you should at least have some wait for
completion (if you prefer with very low timeout), as otherwise you're
simply burning CPU cycles.
Klaus
Post by john alexander sanabria ordonez
John,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.virtualbox.org/pipermail/vbox-dev/attachments/20140306/417f7b78/attachment.html
Klaus Espenlaub
2014-03-06 14:31:27 UTC
Permalink
well, what could I say... your answer do not solve the problem.
All I can say is that I've seen working Java code which deletes VMs,
based on this sample. The language should play no role (unless there is
a bug), it's all the same API behind it, whether it's used by C++ (e.g.
VBoxManage) or anything else.

Let's approach it from a different angle - can you provide VBoxSVC.log
(location is platform dependent, usually in the .VirtualBox subdirectory
of the home directory) for a case where you just produced the hang? If
you make sure that no VirtualBox related activities (no GUI, ...) are
running before your test it'd avoid unrelated log messages.

Klaus
On 6 March 2014 05:35, Klaus Espenlaub <klaus.espenlaub at oracle.com
John,
please stay on the mailing list. This is a public service, if you
want personal support I have to ask for your Oracle customer
support identifier...
Hi Klaus,
I read the documentation but (from my experience) it does not
behave as I was expecting. For instance, I do understand that the
deleteConfig method does not reach the 100 percent if there is an
error but why the library does not throw an exception informing
about it. In addition, why if the previous method (delete) works
with no errors this time "deleteConfig" will generate any error?
The asynchronous part of the deletion might fail (and that's
exactly the same as in older versions, just the method name has
been changed), and your code will simply hang as it doesn't
properly check for completion. Failed async operations usually
will never reach 100% - why should they, they failed before.
These failures will NOT cause exceptions from the progress object
method calls, you have to check for them explicitly. It's been
always like that, and there's lots of sample code out there which
shows how to do this properly.
About the wait, this is the actual code
out << "To delete "
mediums.each {
out << it.name <http://it.name> + " "
}
def iprogress = machine.delete(mediums)
out << "\nDeleting "
while (iprogress.percent != 100) {
Do not check for 100%, check if iprogress.getCompletion returns
non-zero (dunno if the true/false stuff makes it all the way to
Groovy).
out << "."
out.flush()
Thread.sleep(500)
Again, you're ignoring that you should wait using the method from
the progress object, iprogress.waitForCompletion(500) as this
gives the API middleware the opportunity to run its event queues
and so on.
PLEASE have a look at the Java sample (TestVBox.java), it contains
many useful code sequences which are verified to be sensible (not
that all of them go into extreme error checking, but at least do
the bare minimum necessary to avoid hangs).
Klaus
}
John,
On 4 March 2014 13:55, Klaus Espenlaub
<klaus.espenlaub at oracle.com <mailto:klaus.espenlaub at oracle.com>>
Hi,
Post by john alexander sanabria ordonez
Hi,
I wrote a Groovy script to use the Java binding to manage
virtual
Post by john alexander sanabria ordonez
machines through the VirtualBox web service interface. My
script worked
Post by john alexander sanabria ordonez
well in VirtualBox 4.2.x but when I updated to version 4.3
I noted that
Post by john alexander sanabria ordonez
my unregistervm procedure does not work. First, the
IMachine.delete
Post by john alexander sanabria ordonez
method was not available and it was changed by
IMachine.deleteConfig
Post by john alexander sanabria ordonez
which basically works similarly to the delete method. I
made the
Post by john alexander sanabria ordonez
corresponding modifications however it does not delete the
mediums
Post by john alexander sanabria ordonez
returned by the IMachine.unregister method.
This is documented in the SDK reference, for the API changes in 4.3.
Post by john alexander sanabria ordonez
My unregistervm methods looks similar to this
def mediums =
machine.unregister(CleanupMode.DetachAllReturnHardDisksOnly)
Post by john alexander sanabria ordonez
def iprogress = machine.deleteConfig(mediums)
while (iprogress.percent < 100) {
out << "."
}
and it never ends because the iprogress.percent never
reaches 100.
Post by john alexander sanabria ordonez
What I am doing wrong? Thanks for your help.
The percentage will never reach 100 if there is any error. You should be
adding more flexible progress checking (there should be enough working
samples out there, including the Java sample code). What you have is
asking for hangs. Also, you should at least have some wait for
completion (if you prefer with very low timeout), as
otherwise you're
simply burning CPU cycles.
Klaus
Post by john alexander sanabria ordonez
John,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.virtualbox.org/pipermail/vbox-dev/attachments/20140306/3c453512/attachment.html
Loading...