How to know which subrequestId to work with?

Frank Fock Frank.Fock____t-online.de
Thu Apr 11 23:11:26 CEST 2002


Alex,

Your answer is right as well. I just wanted to point out why I had not
added the subrequest ID as parameter to the update method. Using
Request::first_pending() is a valid way to get the subrequest ID.

Best regards,
Frank

Alex Finogenov wrote:

>
>
> 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
> >
> >
> >

--
Frank Fock - AGENT++
Email: fock____agentpp.com
Fax: +49 7195 177108






More information about the AGENTPP mailing list