How to know which subrequestId to work with?
Alex Finogenov
afinogenov____malibunet.com
Thu Apr 11 21:45:33 CEST 2002
Frank,
Isn't MibTable::update() called on every subrequest, starting from subrequestId = 0?
Initially I built my agent to pre-populate each table that is hit for the entire request exactly once in the overloaded MibTable::update() for that table.
This approach worked well with all SNMP requests except GetBulk. Upon a closer research of the agentpp internals, I've found that MibTable:: update() is actually called on every single subrequest, and a good way to find out the subrequest Id is to call Request::first_pending(). You can use this method to implement either approach since when it returns 0, it means that the agent is processing a new request.
My agent is not SNMPv3 and is not multi-threaded, although I don't think that this matters.
After reading your reply to the Kjersti's question, I wonder if I am missing anything in my approach.
Thanks,
Alex
> -----Original Message-----
> From: Frank.Fock____t-online.de [mailto:Frank.Fock____t-online.de]
> Sent: Thursday, April 11, 2002 10:48 AM
> To: Kjersti Grønnevik
> Cc: agentpp-dl____agentpp.com
> Subject: Re: How to know which subrequestId to work with?
>
>
> Hi Kjersti,
>
> I have considered to include the subrequest ID in the
> interface of update.
> I ended up with the current design, because the
> MibTable::update should
> not operate on a subrequest basis. Rather than, it should
> update all necessary
> data for the whole request in one go and remember the last
> transaction IDs
> to avoid duplicate updates. In addition a timer could be used
> to avoid additional
> updates within a given time interval.
>
> The MibTable::update method is called from the class Mib when
> processing
> a request.
>
> Best regards,
> Frank
>
> Kjersti Grønnevik wrote:
>
> > Hi
> >
> > I have a dynamic table which fetches the requested rows
> from DB when a new request comes. The cache is emptied when a
> new request comes.
> >
> > My problem is that I need the subrequestId to get the right
> row from DB and I can't seem to find any function that can
> give the Id?
> >
> > Any suggenstions will be highly appreciated!
> >
> > I first worked around this by creating this function and call it:
> >
> > ----------------------------------------------------------------
> > void AptEntry::update(Request* req, int subReqIndex)
> > {
> > start_synch();
> > currentSubReqIndex = suReqIndex; //
> currentSubReqIndex is a global variable so the suReqIndex is
> // available
> in the update(req) function
> > update(req); // calls the
> function, but it is also called elsewhere?
> > lastReqId = req->get_request_id(); // to see if the
> subRequest is from the same request or a new
> //one
> > end_synch();
> > }
> > -----------------------------------------------------------------
> > But this function is never called, and I don't know where
> to call it from. It will not be called from the table index
> get_request, and where else to put the call?
> >
> > I have filled the update(request req); function with my own
> code and I think it will work(?), but it depends on the
> currentSubReqIndex.
> > -----------------------------------------------------------------
> >
> > void lvAptEntry::update(Request* req)
> > {
> > // clear table rows if this is a new request
> > unsigned long currentReqId = req->get_request_id();
> > if( lastReqId != currentReqId )
> > {
> > removeAllAPTEntries();
> > }
> >
> > Oidx oid = req->get_oid( currentSubReqIndex );
> > Oidx oid_aptId = getPrimaryKeyAsOID( oid ); //extract the
> index/APT.id from the oid
> >
> > //use this index to fetch the corresponding row in the APT
> table in the DB and cache the row data.
> > long aptId = getPrimaryKeyAsLong( oid );
> >
> > try
> > {
> > LVDatabase *db = LVDatabase::getInstance();
> >
> > APTEntry aptEntry;
> >
> > // GET
> > if(req->get_type() == 160)
> > {
> > //use this index and check cache if corresponding row data
> already has been loaded from DB in this request
> > MibTableRow* existingRow = find_index( oid_aptId );
> >
> > // if row data exists in cache - the cached row data are available
> > // else
> > if( existingRow == 0 )
> > {
> > aptEntry = db->getAPTEntry( aptId
> ); //get the row from db
> > if( aptEntry.exists() == true )
> > {
> > addEntry( aptEntry,
> oid_aptId ); //add the row with the row data from db
> > }
> > }
> > }
> > // GET NEXT
> > else if(req->get_type() == 161)
> > {
> > Oidx nextOidId = computeNextOID( oid );//Finds
> out what the next rowIndex would be
> >
> > MibTableRow* existNextRow = find_index( nextOidId
> ); //Checks if the row is already fetched
> >
> > if( existNextRow == 0 )// If not fetched, fetch
> the row from db
> > {
> > aptEntry = db->getNextAPTEntry( aptId );
> //get row from db
> >
> > if( aptEntry.exists() )
> > {
> > Oidx oid_nextAptId =
> getPrimaryKeyAsOID( aptEntry ); //get the rowId
> > addEntry( aptEntry, oid_nextAptId
> ); //add the row with the row data from db
> > }
> > else
> > {
> > Oidx oid_collumnNr = oid.cut_right(
> 1 );//find which collumn that is asked for
> > long colNr = oid_collumnNr.last();
> >
> > if( colNr < 31 ) //If not the last
> column in DB table
> > {
> > aptEntry =
> db->getNextAPTEntry( (long)-1 ); //get first row from db
> > if( aptEntry.exists() )
> > {
> > Oidx oid_nextAptId
> = getPrimaryKeyAsOID( aptEntry ); //get the rowId
> > addEntry( aptEntry,
> oid_nextAptId ); //add the row with the row data from db
> > }
> > }
> > }
> > }
> > }
> > }
> > catch( exception& e )
> > {
> > char catchBuffer[200];
> > sprintf( catchBuffer, "lvAptEntry.update(.)
> Standard library exception: SQL error %d ", e );
> > Log::addEvent( Log::INFO, catchBuffer, LOC );
> > }
> > catch( ... )
> > {
> > char catchBuffer[200];
> > sprintf( catchBuffer, "lvAptEntry.update(.)
> Standard library exception: SQL error " );
> > Log::addEvent( Log::INFO, catchBuffer, LOC );
> > }
> > }
> >
> > ---------------------------------------
> > Oidx lvAptEntry::find_succ(const Oidx& oid, Request* req)
> > {
> > MibLeaf* leaf = find_next( oid );
> > if( leaf )
> > {
> > return leaf->get_oid();
> > }
> > else
> > {
> > return Oidx();
> > }
> > }
> >
> >
> --------------------------------------------------------------
> ---------
> > void lvAptEntry::removeAllAPTEntries()
> > {
> > //remove old rows from MibTable
> > clear();
> > delete_rows.clearAll();
> > notready_rows.clearAll();
> > }
> >
> --------------------------------------------------------------
> ---------
> >
> > Hope this is understandable and thanks so much for great
> help so far!
> >
> > Best regards,
> > Kjersti
>
> --
> Frank Fock - AGENT++
> Email: fock____agentpp.com
> Fax: +49 7195 177108
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.agentpp.org/pipermail/agentpp/attachments/20020411/a61194bd/attachment.htm
More information about the AGENTPP
mailing list