[libvirt-users] is libvirt java binding thread safe?

Matthias Bolte matthias.bolte at googlemail.com
Fri Sep 3 11:02:09 UTC 2010


Ah, okay, now I understand what you want to say.

You have two threads A and B. When A runs on its own then it's just
fine, but when you add B (that triggers an exception on purpose and
ignores it) then A picks it up and reports it. This is the point where
thread safety comes to mind.

libvirt stores errors in thread-local-storage. It uses
pthread_key_create/pthread_{get,set}specific for this (or
TlsAlloc/Tls{Get,Set}Value on Windows).

I think what's happening here is that all your threads in Java share
the same thread-local-storage. Therefore, thread A can pickup the
error triggered by thread B, that should not happen.

I'm not sure how to fix that.

Matthias


2010/9/3 Ravi Pawar <ravifc at gmail.com>:
>
> here is the stacktrace:
>
>
> org.libvirt.LibvirtException: invalid argument in cannot pin vcpus on an
> inactive domain
>         at org.libvirt.ErrorHandler.processError(Unknown Source)
>         at org.libvirt.Connect.processError(Unknown Source)
>         at org.libvirt.Connect.storagePoolLookupByName(Unknown Source)
>         at TestMultiThreadingLibvirt.run(TestMultiThreadingLibvirt.java:25)
>         at java.lang.Thread.run(Thread.java:619)
> libvir: QEMU error : invalid argument in cannot pin vcpus on an inactive
> domain



> from your stacktrace i could find out that you have printed the stacktrace
> in TestMultiThreadingLibvirtWithError  class. please do check the code i
> have pasted below for the second thread.
>
>
> public class TestMultiThreadingLibvirtWithError implements Runnable
> {
>         Connect m_conn = null;
>         public TestMultiThreadingLibvirtWithError(Connect conn)
>         {
>                 m_conn = conn;
>
>         }
>         @Override
>         public void run() {
>
>
>                         try {
>                                 Domain d =
> m_conn.domainLookupByName("afzaltestmachine");
>                                 VcpuInfo[] vcpuInfo = d.getVcpusInfo();
>
>
>                         }
>                         catch (Exception e)
>                         {
>                            //we are explicitly eating up the exception here
> and we know Exception is going to occur here.
>
>                         }
>
>         }
>
> }
>
>
> please let me know if my you have more queries to my problem.
>
> On Fri, Sep 3, 2010 at 2:37 PM, Matthias Bolte
> <matthias.bolte at googlemail.com> wrote:
>>
>> Well, if the domain is not running then I get this exception with
>> libvirt 0.6.3 and libvirt-java 0.4.2:
>>
>> org.libvirt.LibvirtException: invalid argument in cannot pin vcpus on
>> an inactive domain
>>        at org.libvirt.ErrorHandler.processError(Unknown Source)
>>        at org.libvirt.Connect.processError(Unknown Source)
>>        at org.libvirt.Domain.processError(Unknown Source)
>>        at org.libvirt.Domain.getVcpusInfo(Unknown Source)
>>        at
>> TestMultiThreadingLibvirtWithError.run(TestMultiThreadingLibvirtWithError.java:20)
>>        at java.lang.Thread.run(Thread.java:636)
>>
>> The error message is misleading and current git version gives this
>> exception when the domain is not running:
>>
>> org.libvirt.LibvirtException: Requested operation is not valid: cannot
>> list vcpu pinning for an inactive domain
>>        at org.libvirt.ErrorHandler.processError(Unknown Source)
>>        at org.libvirt.Connect.processError(Unknown Source)
>>        at org.libvirt.Domain.processError(Unknown Source)
>>        at org.libvirt.Domain.getVcpusInfo(Unknown Source)
>>        at
>> TestMultiThreadingLibvirtWithError.run(TestMultiThreadingLibvirtWithError.java:20)
>>        at java.lang.Thread.run(Thread.java:636)
>>
>> And that's perfectly valid, as the complete vCPU information is only
>> available when the domain is running, therefore the exception is
>> expected when you call getVcpusInfo on a non-running domain. Also this
>> has nothing to do with thread-safety.
>>
>> If this isn't the exception you're referring to, then please show a
>> stacktrace of the exception you're seeing.
>>
>> Matthias
>>
>> 2010/9/3 Ravi Pawar <ravifc at gmail.com>:
>> > thank you for the reply and time you spend.
>> > your guest domain should not be running and then run my program without
>> > any
>> > change.you will see an exception where you dont expect it to occur.
>> > libvirt : 0.6.3 and libvirt-java: 0.4.2 i am using. Please let me know
>> > if i
>> > miss to provide you any other details.
>> >
>> >
>> > On Fri, Sep 3, 2010 at 3:29 AM, Matthias Bolte
>> > <matthias.bolte at googlemail.com> wrote:
>> >>
>> >> 2010/9/2 Ravi Pawar <ravifc at gmail.com>:
>> >> > please check the java file attached they throws the exception in case
>> >> > of
>> >> > passing.
>> >> > please let me know if i am missing something.
>> >> >
>> >>
>> >> Can you explain in more detail what one should do to reproduce the
>> >> problem you seem to see with the attached code? Also you didn't
>> >> mention which versions of libvirt and libvirt-java you're using.
>> >>
>> >> When I run you example code (with a guest name that exists in my setup
>> >> and libvirt and libvirt-java form current git head) I don't see any
>> >> exceptions. Even when I add e.printStackTrace() to the catch block of
>> >> TestMultiThreadingLibvirtWithError I don't see exceptions.
>> >>
>> >> $ java -classpath
>> >> ./target/libvirt-0.4.6.jar:./ravi:/usr/share/java/jna.jar Test
>> >> start class 0
>> >> start class 1
>> >> start class 2
>> >> start class 3
>> >> start class 4
>> >> start class 5
>> >> start class 6
>> >> start class 7
>> >> start class 8
>> >> start class 9
>> >>
>> >> So this works for me.
>> >>
>> >> Matthias
>> >
>> >
>> >
>> > --
>> > Thanks & Regards
>> >
>> > Ravi Pawar
>> >
>
>
>
> --
> Thanks & Regards
>
> Ravi Pawar
>




More information about the libvirt-users mailing list