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(a)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(a)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(a)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(a)googlemail.com> wrote:
> >>
> >> 2010/9/2 Ravi Pawar <ravifc(a)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