Sometimes when the SnmpSession.close() is called in
version 0.3.4 a nullpointer exception is thrown in
TimerLogic.cancel() at
m_thread.interrupt();
(m_thread is null)
This is probably due to the TimerLogic having
m_isActive = true even when the run method (which
sets m_thread to current thread) has not been called.
This does not happen when the same code is run in
0.3.2.
I suggest the TimerLogic.cancel(boolean) is changed
to :
public synchronized void cancel(boolean waitForAll)
{
if (m_isActive)
{
m_isActive = false;
if (m_thread != null) {
m_thread.interrupt();
}
}
if (waitForAll)
{
while (true)
{
try
{
if (m_thread != null) {
m_thread.join();
}
break;
}
catch (InterruptedException e)
{
// ignore
}
}
}
}
Best regards,
/Erik
erik.halen@andrew.com
Suggested fix
Hello
Yep.
I would like to confirm, that I have the same problem.
The exception is:
Exception in thread "main" java.lang.NullPointerException
at org.opennms.protocols.snmp.SnmpTimer$TimerLogic.cancel(SnmpTimer.java:177)
at org.opennms.protocols.snmp.SnmpTimer.cancel(SnmpTimer.java:80)
at org.opennms.protocols.snmp.SnmpSession.close(SnmpSession.java:961)
....
I think, that it is quite simple to reproduce:
1. take an example: joesnmp-0.3.4\src\joesnmp\org\opennms\examples\SimpleClient.java
2. Rename main to main2.
3. Add new main method:
public static void main(String[] args) throws Exception
{
for(int i = 0; i < 10; i++)
main2(args);
}
In my environment it's crashing every time i run it.
Regards,
Adam
The suggested patch is not good, it doesn's solve the reason why the m_thread is null and only checks for it. I think that the right fix is in the patch provided for the bug 2829316 "deadlock when closing SnmpSession".