[SNMP4J] Code hangs on syncResponse.wait();

Frank Fock fock at agentpp.com
Mon Aug 11 18:19:23 CEST 2008


The question is, does it hang longer than 5000ms?
Does the debugger stop all other threads when
you step through?
Please try also the latest version 1.9.3b which
fixed a race condition which might have been
occurred in your case.

Best regards,
Frank Fock

Oosten, Harry van wrote:
> I use 1.8.2.
> I've callec Snmp.listen() and it only happens when I use a wrong
> password or username. The request is then ignored by the agent and the
> code is hanging on syncResponse.wait(); When I debug. 
> 
> 
> Met vriendelijke groet / Kind Regards,
> 
> ing. Harry van Oosten
> 
> Software engineer
> _________________________________________
> 
> 
> Logica Nederland B.V.
> Registered office in Amstelveen, The Netherlands
> Registration Number Chamber of Commerce: 33136004
> 
> -----Original Message-----
> From: Frank Fock [mailto:fock at agentpp.com] 
> Sent: zondag 10 augustus 2008 13:47
> To: Oosten, Harry van
> Cc: snmp4j at agentpp.org
> Subject: Re: [SNMP4J] Code hangs on syncResponse.wait();
> 
> Harry,
> 
> That's all you need to do. What SNMP4J version
> are you using? Have you called Snmp.listen()
> before sending the request?
> 
> Best regards,
> Frank
> 
> Oosten, Harry van wrote:
>> Frank, 
>>
>> I've set the time out of the target to 5000 ms. 
>> But on the scopedPDU I create for the request message I can't set any
>> timeout. How do I set the time out off the request message?
>>
>>
>> Met vriendelijke groet / Kind Regards,
>>
>> ing. Harry van Oosten
>>
>> Software engineer
>> _________________________________________
>>
>>
>> -----Original Message-----
>> From: Frank Fock [mailto:fock at agentpp.com] 
>> Sent: woensdag 6 augustus 2008 13:58
>> To: Oosten, Harry van
>> Cc: snmp4j at agentpp.org
>> Subject: Re: [SNMP4J] Code hangs on syncResponse.wait();
>>
>> I have not read your code, but in general
>> this is handled by the timeout value of the
>> request. Try to decrease the value. The
>> wait() is OK. The timeout is handled
>> elsewhere.
>>
>> Best regards,
>> Frank
>>
>> Oosten, Harry van schrieb:
>>> Anybody got an idea? I don't understands why the code hangs on the
>> wait
>>> as the request is being ignored. Could it help to set .the
>>> syncResponse.wait(); with an timeout value of 10 seconds or is there
>>> more time needed for the agent to response? 
>>>
>>> Thanks.
>>>
>>> Met vriendelijke groet / Kind Regards,
>>>
>>> ing. Harry van Oosten
>>>
>>> Software engineer
>>>
>>>
>>> -----Original Message-----
>>> From: snmp4j-bounces at agentpp.org [mailto:snmp4j-bounces at agentpp.org]
>> On
>>> Behalf Of Oosten, Harry van
>>> Sent: dinsdag 5 augustus 2008 10:08
>>> To: snmp4j at agentpp.org
>>> Subject: [SNMP4J] Code hangs on syncResponse.wait();
>>>
>>> Hi,
>>>
>>>  
>>>
>>> I managed to create an test class that's send a GETBULK request to an
>>> configured switch and router. This goes well as long as I use the
>> right
>>> username password. 
>>>
>>>  
>>>
>>> Only when I change a username or password the request is ignored by
>> the
>>> device and the code hangs on the syncResponse.wait(); 
>>>
>>>  
>>>
>>>  
>>>
>>> MyCode:
>>>
>>>  
>>>
>>> public class SNMPManager {
>>>
>>>    
>>>
>>>     private boolean needConfig = false;
>>>
>>>    
>>>
>>>     public static void main(String[] args) {
>>>
>>>         SNMPManager snmpMan = new SNMPManager();
>>>
>>>         System.out.println("Switch = up?
>>> "+snmpMan.isResponding("192.168.16.122", "1AuthUser", "AuthPassword",
>>> null)); //wrong username
>>>
>>>         System.out.println(snmpMan.needConfig);
>>>
>>>     }
>>>
>>>     public boolean isResponding(String ipAddress, String userName,
>>> String authPassword, String privPassword){
>>>
>>>     List<String> OIDList = new LinkedList<String>();
>>>
>>>     //OIDList.add("");
>>>
>>>       PDU pdu;
>>>
>>>         try {
>>>
>>>             pdu = getPDU(ipAddress, userName, authPassword,
>> privPassword
>>> ,OIDList);
>>>
>>>             if (pdu != null)  {
>>>
>>>                     System.out.println(pdu);
>>>
>>>                     return true;      
>>>
>>>             } else{
>>>
>>>                 return false;
>>>
>>>             }
>>>
>>>         } catch (IOException e) {
>>>
>>>             e.printStackTrace();
>>>
>>>             needConfig = true;
>>>
>>>             return false;
>>>
>>>         }
>>>
>>>     }
>>>
>>>     
>>>
>>>     private PDU getPDU(String ipAddress, String userName, String
>>> authPassword, String privPassword ,List<String> OIDList) throws
>>> IOException {
>>>
>>>         //Create transport.
>>>
>>>         Address targetAddress =
>>> GenericAddress.parse("udp:"+ipAddress+"/161");
>>>
>>>         TransportMapping transport = new
> DefaultUdpTransportMapping();
>>>         Snmp snmp = new Snmp(transport);
>>>
>>>         
>>>
>>>         USM usm = new USM(SecurityProtocols.getInstance(), new
>>> OctetString(MPv3.createLocalEngineID()),0);
>>>
>>>         SecurityModels.getInstance().addSecurityModel(usm);
>>>
>>>         transport.listen();
>>>
>>>         
>>>
>>>         // add user to the USM
>>>
>>>         if (privPassword != null)  {
>>>
>>>             snmp.getUSM().addUser(new OctetString(userName), 
>>>
>>>                                   //new
>>> OctetString("80:00:13:70:c0:a8:01:0d"), 
>>>
>>>                                   new UsmUser(new
>> OctetString(userName),
>>>                                               AuthMD5.ID, 
>>>
>>>                                               new
>>> OctetString(authPassword),
>>>
>>>                                               PrivDES.ID,
>>>
>>>                                               new
>>> OctetString(privPassword)
>>>
>>>                                               )); //Fill out!  
>>>
>>>         } else {
>>>
>>>             snmp.getUSM().addUser(new OctetString(userName), 
>>>
>>>                                //new
>>> OctetString("80:00:13:70:c0:a8:01:0d"), 
>>>
>>>                                new UsmUser(new OctetString(userName),
> 
>>>                                            AuthMD5.ID, 
>>>
>>>                                            new
>>> OctetString(authPassword),
>>>
>>>                                            null,
>>>
>>>                                            null)); 
>>>
>>>         }
>>>
>>>         
>>>
>>>         //Create target.
>>>
>>>         UserTarget target = createTarget(targetAddress, userName);
>>>
>>>         
>>>
>>>         //Create the PDU
>>>
>>>         PDU pdu = createPDU(OIDList);
>>>
>>>         
>>>
>>>         //Send the PDU
>>>
>>>         ResponseEvent responseEvent = snmp.send(pdu, target);
>>>
>>>         //Exctract the response PDU (could be null if timed out)
>>>
>>>         PDU responsePDU = responseEvent.getResponse();
>>>
>>>         closeTransport(transport);
>>>
>>>         return responsePDU;
>>>
>>>     }
>>>
>>>  
>>>
>>>     /**
>>>
>>>      * Used to create the PDU. 
>>>
>>>      * Gets a list of Strings containing the OID's that needs to be
>>> acquired.
>>>
>>>      * @param OIDList String List
>>>
>>>      * @return PDU
>>>
>>>      */
>>>
>>>     private PDU createPDU(List<String> OIDList) {
>>>
>>>         PDU pdu = new ScopedPDU();
>>>
>>>         for (String oid :OIDList ) {
>>>
>>>             pdu.add(new VariableBinding(new OID(oid)));
>>>
>>>         }
>>>
>>>         pdu.setType(PDU.GETBULK);
>>>
>>>         return pdu;
>>>
>>>     }
>>>
>>>  
>>>
>>>     private UserTarget createTarget(Address targetAddress, String
>>> userName) {
>>>
>>>         UserTarget target = new UserTarget();
>>>
>>>         target.setAddress(targetAddress);
>>>
>>>         target.setRetries(0);
>>>
>>>         target.setTimeout(5000);
>>>
>>>         target.setVersion(SnmpConstants.version3);
>>>
>>>         target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);
>>>
>>>         target.setSecurityName(new OctetString(userName));
>>>
>>>         return target;
>>>
>>>     }
>>>
>>>  
>>>
>>>     private void closeTransport(TransportMapping transport) throws
>>> IOException {
>>>
>>>             transport.close();
>>>
>>>     }
>>>
>>> }
>>>
>>>  
>>>
>>> Where it goes wrong: (snmp.java)
>>>
>>>  
>>>
>>> public ResponseEvent send(PDU pdu, Target target,
>>>
>>>                             TransportMapping transport) throws
>>> IOException {
>>>
>>>     if (!pdu.isConfirmedPdu()) {
>>>
>>>       sendMessage(pdu, target, transport, null);
>>>
>>>       return null;
>>>
>>>     }
>>>
>>>     if (timer == null) {
>>>
>>>       createPendingTimer();
>>>
>>>     }
>>>
>>>     SyncResponseListener syncResponse = new SyncResponseListener();
>>>
>>>     PendingRequest retryRequest = null;
>>>
>>>     synchronized (syncResponse) {
>>>
>>>       PduHandle handle = null;
>>>
>>>       PendingRequest request =
>>>
>>>           new PendingRequest(syncResponse, target, pdu, target,
>>> transport);
>>>
>>>       handle = sendMessage(pdu, target, transport, request);
>>>
>>>       try {
>>>
>>>         syncResponse.wait();
>>>
>>>         retryRequest = (PendingRequest)
>> pendingRequests.remove(handle);
>>>         if (logger.isDebugEnabled()) {
>>>
>>>           logger.debug("Removed pending request with handle:
>> "+handle);
>>>         }
>>>
>>>         request.setFinished();
>>>
>>>         request.cancel();
>>>
>>>       }
>>>
>>>       catch (InterruptedException iex) {
>>>
>>>         logger.warn(iex);
>>>
>>>         // ignore
>>>
>>>       }
>>>
>>>     }
>>>
>>>     if (retryRequest != null) {
>>>
>>>       retryRequest.setFinished();
>>>
>>>       retryRequest.cancel();
>>>
>>>     }
>>>
>>>     return syncResponse.response;
>>>
>>>   }
>>>
>>>  
>>>
>>>   private synchronized void createPendingTimer() {
>>>
>>>     if (timer == null) {
>>>
>>>       timer = SNMP4JSettings.getTimerFactory().createTimer();
>>>
>>>     }
>>>
>>>   }
>>>
>>>  
>>>
>>> Hope you can help! 
>>>
>>>  
>>>
>>>  
>>>
>>> Met vriendelijke groet / Kind Regards,
>>>
>>>  
>>>
>>> ing. Harry van Oosten
>>>
>>>  
>>>
>>> Software engineer
>>>
>>> _________________________________________
>>>
>>>  
>>>
>>>
>>>
>>>
>>>
>>>  
>>>
>>>
>>>
>>> This e-mail and any attachment is for authorised use by the intended
>>> recipient(s) only. It may contain proprietary material, confidential
>>> information and/or be subject to legal privilege. It should not be
>>> copied, disclosed to, retained or used by, any other party. If you
> are
>>> not an intended recipient then please promptly delete this e-mail and
>>> any attachment and all copies and inform the sender. Thank you.
>>>
>>> _______________________________________________
>>> SNMP4J mailing list
>>> SNMP4J at agentpp.org
>>> http://lists.agentpp.org/mailman/listinfo/snmp4j
>>>
>>>
>>> This e-mail and any attachment is for authorised use by the intended
>> recipient(s) only. It may contain proprietary material, confidential
>> information and/or be subject to legal privilege. It should not be
>> copied, disclosed to, retained or used by, any other party. If you are
>> not an intended recipient then please promptly delete this e-mail and
>> any attachment and all copies and inform the sender. Thank you.
>>> _______________________________________________
>>> SNMP4J mailing list
>>> SNMP4J at agentpp.org
>>> http://lists.agentpp.org/mailman/listinfo/snmp4j
>>>   
>>
>>
>> This e-mail and any attachment is for authorised use by the intended
> recipient(s) only. It may contain proprietary material, confidential
> information and/or be subject to legal privilege. It should not be
> copied, disclosed to, retained or used by, any other party. If you are
> not an intended recipient then please promptly delete this e-mail and
> any attachment and all copies and inform the sender. Thank you.
>>
> 

-- 
AGENT++
http://www.agentpp.com
http://www.mibexplorer.com
http://www.mibdesigner.com




More information about the SNMP4J mailing list