Re: SNMPv3 bulkwalk()/callback blocking during background EngineID queries
Paul S <[email protected]> Thu, 11 Jun 2026 14:59:23 +0100
| Newsgroups | gmane.network.net-snmp.devel |
|---|---|
| Message-ID | <[email protected]> |
Quoting Wes Hardaker <[email protected]>: > Paul S <[email protected]> writes: > >> From packet analysis, I see that when bulkwalk() is called, the SNMP >> library first queries that device's EngineID if this is not already >> cached. > > SNMPv3 does have a larger start up cost because of this while it does > engine synchronization. It would surprise me that bulkwalk is the only > function with this problem. Are you sure the same symptoms don't occur > with other types of requests (walks or even gets)? Actually, I'm not sure as I'm only using bulkwalk(), but I have no doubt that engine synchronisation must happen for walks/gets if its not already cached. However, it's not the engine synchronization itself that's the issue - it's the fact that the engine synchonisation is not handled within SNMP::MainLoop(). Thus the attempted synchronisation of one unavailable device blocks the asynchronous SNMP processing of hundreds of other devices until that single device times-out. There may be a number of devices unavailable, and all of these will block asynchonous polling each time they are retried and found to be unavailable. As an alternative immediate solution I tried to handle the engine synchonrisation in a separate process, and pass the EngineID via SecEngineId in SNMP::Session->new() in my code. If I specify 0 as the EngineID (default, as above), we have the overhead of the blocking EngineId request (a working device returns Report 33, usmStatsUnknownEngineIDs increments) If I specify the correct EngineID, The device replies Report 31, usmStatsNotInTimeWindows increments, which implies I have the EngineID correct, but bulkwalk() itself then fails to complete - callback is immediately called with empty data. If I specify an incorrect EngineID the device returns Report 33, usmStatsUnknownEngineIDs increments, and this attempt is retried before timing-out and the callback called with empty data. This does not block. So, specifying a non-zero SecEngineId avoids blocking of bulkwalk as there is no EngineID synchonrisation happening in the background. This would solve my issue except it seems bulkwalk() fails even when a correct EngineID is specified. Any ideas how I might work around this? Many thanks, Paul -- Paul S