On 09/03/07, Zhang Chuan <[EMAIL PROTECTED]> wrote:
> Since I want to get the newest data from system when a GETBULK message come
> in. I have an init_table() function in get_first_data_point(). The
> init_table() function get the data from system by TCP and set them to a
> given dataset. Then get_next_data_point() can get data from the dataset and
> return to manager.
If you are loading the table into the agent every time, then the iterate
handler is probably not the best choice. This is primarily designed for
tables where the number of rows (and their indexes) is not known to
the agent, and has to be retrieved from "outside".
Given that you are loading the table into the agent, I'd suggest that you
look at using one of the "internal-data" helpers - such as 'tdata'. This
allows the agent to go directly to the relevant row for any given request,
without having to search through the whole table every time.
The bulk of the code will look similar to the handler you're already used
to - there'll just be a couple of minor differences in how to retrieve the
relevant row from the request structure. But mib2c will generate a
suitable template for you.
This can also generate the basic framework for loading and releasing
this internal cache, using a standard helper. That's basically Adam's
suggestion, but with most of the work done for you automatically.
(And manageable via SNMP!)
An alternative approach would be to use Robert's MfD framework, which
can also handle both iterative and internal data tables. But the look of
that code is completely different to what you're used to, so it might be
simpler to stick with relatively familiar code.
> I have read some others questions similar with mine. The answer is change to
> netsnmp_inject_handler instead of mib2c.iterate.conf.
No - that's not really correct.
"netsnmp_inject_handler" is a relatively low-level API, which is often used as
part of implementing a given table helper. But you'd still need to decide which
helper(s) to make use of. It's not usually necessary to fiddle about with this
directly - most of the time it's hidden away in the helper
initialisation routines.
>
> Is there anyone can
> show me a way not to change the helper but modify my code to decrease
> the execute init_table() times?
Use the cache helper - either with the existing iterate helper, or switch
to the tdata helper. Try running mib2c using
mib2c -S cache=1 -c mib2c.iterate.conf ....
and
mib2c -S cache=1 -c mib2c.table_data.conf ....
and compare the resulting frameworks.
The "init_table" stuff would need to be moved into the cache load routine,
but the main handler itself should be relatively unchanged.
Dave
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders