[AGENT++] AgentX++ suagent commiterror let the RowStatus in detroy(6); the row is block forever!

Claus Klein claus.klein at arcormail.de
Tue Nov 2 22:40:34 CET 2010


Hallo Frank,

I really need help.

If you study the log at the end of my scripts you will see the there  
is an agentx error while destroy.

The reason is the deallocate_index() is called while remove_row(), but  
it was never allocated in add_row().
How should this shared table really work?

Fact is that net-snmp does not accept this deallocate_index.
Last but not least, still with this uncommented version there is a  
genError while rowdestroy happens?

Claus

./agentx_usecase_rowstatus2.sh 2

#Setup
+ printf '\n#Pre-condition: row must not exist!\n'

#Pre-condition: row must not exist!
+ '[' 2 -gt 1 ']'
+ snmpget -v3 -r0 -t 5 -uunsecureUser localhost:4700 AGENTPP-TEST- 
MIB::agentppTestSharedTableRowStatus.2
+ grep -v -q 'No Such Instance'
+ printf '\n#Test case: create non-existing table with RowStatus with  
3 shots\n'

#Test case: create non-existing table with RowStatus with 3 shots
+ snmpget -v3 -r0 -t 5 -uunsecureUser localhost:4700 AGENTPP-TEST- 
MIB::agentppTestSharedTableRowStatus.2
+ grep -q 'No Such Instance'
+ snmpset -v3 -r0 -t 5 -uunsecureUser localhost:4700 AGENTPP-TEST- 
MIB::agentppTestSharedTableRowStatus.2 = createAndWait
AGENTPP-TEST-MIB::agentppTestSharedTableRowStatus.2 = INTEGER:  
createAndWait(5)
+ printf '\n#Condition: row must now exist!\n'

#Condition: row must now exist!
+ snmpget -v3 -r0 -t 5 -uunsecureUser localhost:4700 AGENTPP-TEST- 
MIB::agentppTestSharedTableRowStatus.2
+ grep -v -q 'No Such Instance'
+ snmpset -v3 -r0 -t 5 -uunsecureUser localhost:4700 AGENTPP-TEST- 
MIB::agentppTestSharedTableRowStatus.2 = notInService AGENTPP-TEST- 
MIB::agentppTestSharedTableDelay.2 = 2 AGENTPP-TEST- 
MIB::agentppTestTimeout.0 = 2
AGENTPP-TEST-MIB::agentppTestSharedTableRowStatus.2 = INTEGER:  
notInService(2)
AGENTPP-TEST-MIB::agentppTestSharedTableDelay.2 = INTEGER: 2 1/100  
seconds.
AGENTPP-TEST-MIB::agentppTestTimeout.0 = Gauge32: 2 1/1000 seconds.
+ snmpset -v3 -r0 -t 5 -uunsecureUser localhost:4700 AGENTPP-TEST- 
MIB::agentppTestSharedTableRowStatus.2 = active
AGENTPP-TEST-MIB::agentppTestSharedTableRowStatus.2 = INTEGER: active(1)
+ printf '\n#Post-condition: row must exist and in state active!\n'

#Post-condition: row must exist and in state active!
+ snmpget -v3 -r0 -t 5 -uunsecureUser localhost:4700 AGENTPP-TEST- 
MIB::agentppTestSharedTableRowStatus.2
+ grep -qw active
+ printf '\n#Cleanup\n'

#Cleanup
+ snmpset -v3 -r0 -t 5 -uunsecureUser localhost:4700 AGENTPP-TEST- 
MIB::agentppTestSharedTableRowStatus.2 = destroy
Error in packet.
Reason: (genError) A general failure occured


_________________________________________________

MibTableRow* AgentXSharedTable::add_row(const Oidx& ind)
{
	if ((ind.len() == 0) || (generator.size() == 0)) return 0;

	// check whether row exists
	MibTableRow* new_row = find_index(ind);
	boolean existing = (new_row != 0);
	if (!new_row) {
		new_row = new MibTableRow(generator);
		new_row->set_index(ind);
	}
	// register row
	Oidx subtree(new_row->get_nth(0)->get_oid());
	unsigned int u = (*(generator.last()->key()))[0];
	AgentXRegion r(subtree, (unsigned char)(key()->len()+1), u);
	backReference->register_region(myContext, r, timeout, TRUE, this);
	//below event is fired when confirmation of registration is received
	//fire_row_changed(rowCreateAndGo, new_row, ind);
	if (existing)
		return new_row;
	return content.add(new_row);	
}

void AgentXSharedTable::remove_row(const Oidx& ind)
{
	Oidx o(ind);
	MibTableRow* r = content.find(&o);

#if 0   // FIXME: never allocate_index() called! see add_row() ck
	// deallocate index
	Vbx* vbs = create_index_vbs(ind);
	if (vbs) {
	  backReference->deallocate_index(myContext, vbs, index_len, this);
	  delete[] vbs;
	}
#endif

	// unregister row
	Oidx subtree(r->get_nth(0)->get_oid());
	unsigned int u = r->last()->get_oid()[key()->len()];
	AgentXRegion reg(subtree, (unsigned char)(key()->len()+1), u);
	backReference->register_region(myContext, reg, 0, FALSE);

	fire_row_changed(rowDestroy, r, ind);

	if (r) notready_rows.remove(r);
	content.remove(&o);
}

On 31.10.2010, at 12:02, Claus Klein wrote:

> Hi Frank,
>
> my first interpretation of my test was not right. The handling with  
> commit failed works fine!
>
> But still there may be a problem if the AgentXSlave 'deallocate  
> request' fails.
> Too, It is not very efficiently if we register a row only to destroy  
> it immediately?
>
>
> I changed a little bit at the code and improved the RowStatus  
> destroy handling.
> I hope it is right, I am not sure! Please check it.
>
> Too I improved my test scripts, I attache my patch and the scripts.
>
> With regards,
>
> Claus
>
> claus-kleins-macbook-pro:AgentPro clausklein$ bzr diff -p1
> === modified file 'agent++/src/mib.cpp'
> --- old/agent++/src/mib.cpp	2010-10-31 08:30:19 +0000
> +++ new/agent++/src/mib.cpp	2010-10-31 10:28:54 +0000
> @@ -572,10 +572,10 @@
> 		  return ((l == rowNotInService) ||
> 			  (l == rowActive) || (l == rowDestroy));
> 		default:
> -		  return FALSE;
> +		  return (l == rowDestroy); // FIXME: added! We have to allow  
> destroy in each state! ck
> 		}
> 	}
> -	else
> +	else    // FIXME: what state is this? ck
> 		return ((l == rowCreateAndGo) || (l == rowCreateAndWait) ||
> 			(l == rowDestroy));
> }
> @@ -672,7 +672,7 @@
> 	  break;
> 	case rowDestroy:
> 	  set_value(rs);
> -	  delete undo; // No undo of row destroy!
> +	  delete undo; // FIXME: why, ck? No undo of row destroy!
> 	  undo = 0;
> 	  break;
> 	default:
> @@ -2177,10 +2177,12 @@
> 			  ok   = TRUE;
> 			  wait = TRUE;
> 			  break;
> +#if 1   // FIXME: Do we allow destroy of a nonexiting row without  
> error? YES! ck
> 			case rowDestroy:
> 			  ok = TRUE;
> 			  ignore = TRUE;
> 			  break;
> +#endif
> 			default:
> 			  delete[] fulfilled;
> 			  delete[] required;
> @@ -2236,6 +2238,7 @@
> 			pvbs[col] = req->get_value(i);
> 		}
> 	}
> +
> 	// test values through prepare
> 	MibTableRow* new_row = new MibTableRow(generator);
> 	new_row->set_index(new_index);
> @@ -2304,14 +2307,15 @@
> 	else
> 		voting_result = perform_voting(new_row,
> 					       rowEmpty, rowDestroy);
> -	delete new_row;
> -
> 	// Unset the ready flag of the current column.
> 	// via this one all the other columns are set by commit_set_request
> 	req->unset_ready(ind);
> 	delete[] fulfilled;
> 	delete[] required;
> 	delete[] pvbs;
> +	delete new_row; // FIXME: same oder as other cleanup blocks; ck
> +        // TODO: use a macro for cleanup or better spart pointers? ck
> +
> 	return voting_result;
> }
>
>
> claus-kleins-macbook-pro:AgentPro clausklein$
>
>
>
> On 29.10.2010, at 22:59, Claus Klein wrote:
>
>> Hi Frank,
>>
>> I have found a third issue about the RowStatus handling at the  
>> subagent.
>> With this script, you can force this error as many times you want,
>> simple choose a new row index.
>>
>> Kindly regards,
>> Claus
>>
>
> _______________________________________________
> AGENTPP mailing list
> AGENTPP at agentpp.org
> http://lists.agentpp.org/mailman/listinfo/agentpp




More information about the AGENTPP mailing list