[SNMP4J] ConcurrentModificationException in tabular data
Frank Fock
fock at agentpp.com
Tue Mar 21 09:33:02 CET 2006
Hi Fabian,
Of course you are right! My fault. The rows member could
still be used. We need a real independent copy here!
Best regards,
Frank
Fabian Nart wrote:
> Hi Frank
>
> Thanks for the quick answer. But I have to admit I don't see the point
> in your fix. The problem seems to be that somewhere in the system there
> is a reference to our TableListener AFTER TableUtils.GetTable() returns
> which is used to update the TableListner's List called rows. This
> problem is not solved by cloning the rows BEFORE returning them. The
> change that I made to my code looks following:
>
> --- Code ----------------------------------------------------
> TableUtils tu=new TableUtils(_snmp, new DefaultPDUFactory(PDU.GETBULK));
>
> List rows= tu.getTable(_target, oids, lowerBoundIndex, upperBoundIndex);
> List rows2= new ArrayList(rows); // inserted line
>
> for (Iterator i= rows2.iterator(); i.hasNext();) {
> TableEvent row= (TableEvent) i.next();
> (...)
> }
> --- / Code --------------------------------------------------
>
> This doesn't help for sure but it minimizes the possibility of a conflict.
>
> Cheers, Fabian
>
>
> Frank Fock wrote:
>> Hi Fabian,
>>
>> Indeed something strange must have happened.
>> The following change within the TableUtils
>> class should avoid the exception:
>>
>> class InternalTableListener implements TableListener {
>>
>> private List rows = new LinkedList();
>>
>> public boolean next(TableEvent event) {
>> rows.add(event);
>> return true;
>> }
>>
>> public synchronized void finished(TableEvent event) {
>> if ((event.getStatus() != TableEvent.STATUS_OK) ||
>> (event.getIndex() != null)) {
>> rows.add(event);
>> }
>> rows = new ArrayList(rows);
>> notify();
>> }
>>
>> public List getRows() {
>> return rows;
>> }
>> }
>>
>> The change should be also in the next nightly build
>> available from http://www.agentpp.org/~katzwww/snapshot/
>> (Note: The CVS snapshots are still experimental)
>>
>> Best regards,
>> Frank
>>
>> Fabian Nart wrote:
>>> Hi,
>>>
>>> I'm having trouble while retrieving tabular SNMP-data and proceed it
>>> with an Iterator. When I iterate through the received list of
>>> tableevents I get a ConcurrentModificationException. However, I'm
>>> pretty sure that my code doesn't touch the list at all (see code below).
>>>
>>> The exception occurs in the line marked with ###. The _snmp is a
>>> reference to the single Snmp-object in my system. Is it possible that
>>> somewhere inside SNMP4j the returned List is modified after I've
>>> created my Iterator? (I've looked at the source but didn't see
>>> anything suspect, but maybe I overlooked something)
>>>
>>> Unfortunately, I cannot reproduce this failure, it just showed up a
>>> few times -- but it should never occur, of course.
>>>
>>> I'm grateful for any comments
>>> Fabian
>>>
>>>
>>> --- Code ----------------------------------------------------
>>>
>>> TableUtils tu= new TableUtils(_snmp, new
>>> DefaultPDUFactory(PDU.GETBULK));
>>>
>>> List rows= tu.getTable(_target, oids, lowerBoundIndex, upperBoundIndex);
>>>
>>> for (Iterator i= rows.iterator(); i.hasNext();) {
>>> TableEvent row= (TableEvent) i.next(); // ###
>>> (...)
>>> }
>>>
>>> --- / Code --------------------------------------------------
>>> _______________________________________________
>>> SNMP4J mailing list
>>> SNMP4J at agentpp.org
>>> http://lists.agentpp.org/mailman/listinfo/snmp4j
>>
>
>
--
AGENT++
http://www.agentpp.com
http://www.mibexplorer.com
http://www.mibdesigner.com
More information about the SNMP4J
mailing list