VirtualBox

Ticket #12379 (closed defect: fixed)

Opened 5 months ago

Last modified 5 months ago

API : ISnapshotEvent throw exception on getting Snapshot UUID

Reported by: noteirak Owned by:
Priority: major Component: webservices
Version: VirtualBox 4.3.2 Keywords:
Cc: Guest type: all
Host type: Linux

Description

While using the Java WebService API to work with Snapshot, I am unable to use the generated event objects. Any attempt to lookup the snapshot UUID will result in an exception.

I have attached the code to reproduce the issue with version 4.3.2 and 4.2.18 (each a specific Java file). My code assume that the web service is configured with null authentication.

4.2 Host

root@HB-Wheezy-4-2:~# uname -a
Linux HB-Wheezy-4-2 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
root@HB-Wheezy-4-2:~# java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
root@HB-Wheezy-4-2:~#

4.3 Host

root@HB-Wheezy-4-3:~# uname -a
Linux HB-Wheezy-4-3 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
root@HB-Wheezy-4-3:~# java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
root@HB-Wheezy-4-3:~#

The output for 4.3.2 :

VBox Version : 4.3.2 r90405
Skipping OnEventSourceChanged
Skipping OnMachineDataChanged
Skipping OnMachineStateChanged
Skipping OnMachineStateChanged
Skipping OnMachineDataChanged
org.virtualbox_4_3.VBoxException: VirtualBox error: Invalid managed object reference "7ba86778269d3cf5-0000000000000078"
	at org.virtualbox_4_3.ISnapshotEvent.getSnapshotId(ISnapshotEvent.java:54)
	at VBDebug_4_3.main(VBDebug_4_3.java:48)
Caused by: org.virtualbox_4_3.jaxws.InvalidObjectFaultMsg: VirtualBox error: Invalid managed object reference "7ba86778269d3cf5-0000000000000078"
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(Unknown Source)
	at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
	at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
	at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(Unknown Source)
	at $Proxy33.iSnapshotEventGetSnapshotId(Unknown Source)
	at org.virtualbox_4_3.ISnapshotEvent.getSnapshotId(ISnapshotEvent.java:49)
	... 1 more
Skipping OnSessionStateChanged
Deleted VM

The output for 4.2.18 :

VBox Version : 4.2.18 r88780
Skipping OnEventSourceChanged
Skipping OnMachineDataChanged
Skipping OnMachineStateChanged
Skipping OnMachineStateChanged
Skipping OnMachineDataChanged
org.virtualbox_4_2.VBoxException: VirtualBox error: Invalid managed object reference "1bf581ecb2941a09-000000000000283e"
	at org.virtualbox_4_2.ISnapshotEvent.getSnapshotId(ISnapshotEvent.java:47)
	at VBDebug_4_2.main(VBDebug_4_2.java:48)
Skipping OnSessionStateChanged
Deleted VM

Attachments

VBDebug_4_3.java Download (2.6 KB) - added by noteirak 5 months ago.
4.3 Code
VBDebug_4_2.java Download (2.6 KB) - added by noteirak 5 months ago.
4.2 Code
vboxwrv.log Download (47.0 KB) - added by noteirak 5 months ago.

Change History

Changed 5 months ago by noteirak

4.3 Code

Changed 5 months ago by noteirak

4.2 Code

Changed 5 months ago by noteirak

comment:1 Changed 5 months ago by noteirak

vboxwrv.log attached, being -v on the web service. The error in java was

org.virtualbox_4_3.VBoxException: VirtualBox error: Invalid managed object reference "bdff369b3a031f29-000000000000000d"

comment:2 Changed 5 months ago by klaus

Can't be your fault, managed to get this reproduced with the python webservice binding and a bit of hacking around in vboxshell.py. The beauty of using python is that I can easily run the very same code against the C++ API, and then it works perfectly.

So there must be a bug in the webservice somewhere, when dealing with the interface queries.

comment:3 Changed 5 months ago by noteirak

Thank you for checking. My current workarounds are either to rely on the IMachineDataChangedEvent, which also occurs when Snapshot information changes, or to create a custom event which informs that snapshot data has changed, but without given any precission on the snapshot ID.
Both cases mean a full reload on the snapshot data, but is the best option for now.

comment:4 Changed 5 months ago by klaus

This turned out to be a bug in the code generator for the events. For the more deeply nested VMs it produced a bogus list of implemented interfaces, resulting in this error. The bug is very old (the event code generation was added in 4.0), and this means that any released VirtualBox version since then is affected. There is no reasonable workaround possible, as the server component metadata is busted.

comment:5 Changed 5 months ago by noteirak

Thank you for the follow up.

In the meantime, for those in need of a workaround outside of the Virtualbox API, I have created a more specific event for my use, at the same level as IMachineDataChanged, which would correspond to IMachineSnapshotChanged if you would implement it into VB. This class doesn't have any snapshot ID, only a machine ID.
The event basically means "Something about Snapshots changed for the VM, don't know what, do a full refresh".

I handle this lack of data at the bridge between the API & my own abstracted code. Once it is fixed on your side, I won't rely on my custom event anymore.

comment:6 Changed 5 months ago by klaus

The fix will be in the next 4.3 and 4.2 maintenance release. As we can't change already released packages it might be a good idea (once you enabled the code) to blacklist the affected releases in your client, refusing to talk to broken versions.

Really annoying that this bug survived for over 3 years without anyone spotting it, because it's crippling the webservice interfaces more than I would've thought possible. The webservice bindings (Java, Python, ...) automatically works out the interface, and that means it'll pick ISnapshotEvent for the methods/attributes which are added there, no matter what interface type the client code actually uses.

The workaround which is available to C++ API clients (asking for the extended interface, e.g. ISnapshotTakenEvent) therefore won't help.

comment:7 Changed 5 months ago by frank

  • Status changed from new to closed
  • Resolution set to fixed

Fixed in 4.3.4 and 4.2.20.

Note: See TracTickets for help on using tickets.

www.oracle.com
ContactPrivacy policyTerms of Use