Difference between revisions of "Agent Modes"

From Net-SNMP Wiki
Jump to: navigation, search
(Baby Steps)
(Set processing)
 
Line 11: Line 11:
  
 
== Set processing ==
 
== Set processing ==
 +
All the various modes used during set processing can be confusing. Let's start
 +
with a simple state diagram:
 +
http://www.net-snmp.org/tutorial/tutorial-5/toolkit/mib_module/set-actions.jpg
 +
 +
Here is a brief overview of the reserve, free, action, undo and commit modes.
 +
 
=== SET_RESERVE1 ===
 
=== SET_RESERVE1 ===
 
The purpose of SET_RESERVE1 is to try and detect invalid SET requests
 
The purpose of SET_RESERVE1 is to try and detect invalid SET requests
Line 18: Line 24:
 
=== SET_RESERVE2 ===
 
=== SET_RESERVE2 ===
 
The purpose of SET_RESERVE2 is to set up/allocate the data structure for a new
 
The purpose of SET_RESERVE2 is to set up/allocate the data structure for a new
row or perform any resource allocation needed for further processing (e.g. database locks).
+
row or perform any resource allocation needed for further processing (e.g. allocate
 +
memory or lock a database).
  
 
=== SET_FREE ===
 
=== SET_FREE ===
 
The purpose of SET_FREE is to undo anything done in the two SET_RESERVE
 
The purpose of SET_FREE is to undo anything done in the two SET_RESERVE
 
passes, if some aspect of the request proves unacceptable.  This means
 
passes, if some aspect of the request proves unacceptable.  This means
possibly releasing the data structure for a new row, if one has
+
possibly releasing the data structure for a new row, if one was
just been created.
+
just been created. No action was performed, so no undo is needed.
  
 
=== SET_ACTION ===
 
=== SET_ACTION ===
Line 39: Line 46:
 
=== SET_COMMIT ===
 
=== SET_COMMIT ===
 
The purpose of SET_COMMIT is to confirm that the processing of the SET
 
The purpose of SET_COMMIT is to confirm that the processing of the SET
request has completed successfully, and perform any "irreversible" actions.
+
request has completed successfully, and perform any "irreversible" actions. For
 +
example, committing database changes.
  
 +
=== Notes ===
 +
Note that there is no common final "I'm done" mode. You must keep track of what
 +
needs to be for the 3 final states (free, undo, commit). For example, all three
 +
of those modes may require you to release some resource, like a database lock.
  
 
== Baby Steps ==
 
== Baby Steps ==

Latest revision as of 17:55, 22 June 2010

Good Answer

This is a Good Answer article. It was likely created as a response to a question on a Net-SNMP Mailing List and written up here for others to see. It likely covers material not yet in the FAQ or in the Tutorial but may someday be moved there

Question

What are the various modes that the agent goes through when answering requests.

Answer

Get processing

TBD

Set processing

All the various modes used during set processing can be confusing. Let's start with a simple state diagram: http://www.net-snmp.org/tutorial/tutorial-5/toolkit/mib_module/set-actions.jpg

Here is a brief overview of the reserve, free, action, undo and commit modes.

SET_RESERVE1

The purpose of SET_RESERVE1 is to try and detect invalid SET requests as soon as possible. If any of the columns are assigned an impossible value (wrong type, or out-of-range, etc), then the request fails.

SET_RESERVE2

The purpose of SET_RESERVE2 is to set up/allocate the data structure for a new row or perform any resource allocation needed for further processing (e.g. allocate memory or lock a database).

SET_FREE

The purpose of SET_FREE is to undo anything done in the two SET_RESERVE passes, if some aspect of the request proves unacceptable. This means possibly releasing the data structure for a new row, if one was just been created. No action was performed, so no undo is needed.

SET_ACTION

SET_ACTION assigns the appropriate column values to the data structure for this row (either the new structure created in the SET_RESERVE2 step, or an existing row structure).

SET_UNDO

SET_UNDO reverses anything done in the two SET_RESERVE steps or SET_ACTION - called if some part of the SET_ACTION processing fails. This is similar to the SET_FREE processing, but also needs to reverse any newly assigned values.

SET_COMMIT

The purpose of SET_COMMIT is to confirm that the processing of the SET request has completed successfully, and perform any "irreversible" actions. For example, committing database changes.

Notes

Note that there is no common final "I'm done" mode. You must keep track of what needs to be for the 3 final states (free, undo, commit). For example, all three of those modes may require you to release some resource, like a database lock.

Baby Steps

see agent/helpers/baby_steps.c

   /*
    * Baby Steps Flow Chart (2004.06.05)                                  *
    *                                                                     *
    * +--------------+    +================+    U = unconditional path    *
    * |optional state|    ||required state||    S = path for success      *
    * +--------------+    +================+    E = path for error        *
    ***********************************************************************
    *
    *                        +--------------+
    *                        |     pre      |
    *                        |   request    |
    *                        +--------------+
    *                               | U
    * +-------------+        +==============+
    * |    row    |f|<-------||  object    ||
    * |  create   |1|      E ||  lookup    ||
    * +-------------+        +==============+
    *     E |   | S                 | S
    *       |   +------------------>|
    *       |                +==============+
    *       |              E ||   check    ||
    *       |<---------------||   values   ||
    *       |                +==============+
    *       |                       | S
    *       |                +==============+
    *       |       +<-------||   undo     ||
    *       |       |      E ||   setup    ||
    *       |       |        +==============+
    *       |       |               | S
    *       |       |        +==============+
    *       |       |        ||    set     ||-------------------------->+
    *       |       |        ||   value    || E                         |
    *       |       |        +==============+                           |
    *       |       |               | S                                 |
    *       |       |        +--------------+                           |
    *       |       |        |    check     |-------------------------->|
    *       |       |        |  consistency | E                         |
    *       |       |        +--------------+                           |
    *       |       |               | S                                 |
    *       |       |        +==============+         +==============+  |
    *       |       |        ||   commit   ||-------->||     undo   ||  |
    *       |       |        ||            || E       ||    commit  ||  |
    *       |       |        +==============+         +==============+  |
    *       |       |               | S                     U |<--------+
    *       |       |        +--------------+         +==============+
    *       |       |        | irreversible |         ||    undo    ||
    *       |       |        |    commit    |         ||     set    ||
    *       |       |        +--------------+         +==============+
    *       |       |               | U                     U |
    *       |       +-------------->|<------------------------+
    *       |                +==============+
    *       |                ||   undo     ||
    *       |                ||  cleanup   ||
    *       |                +==============+
    *       +---------------------->| U
    *                               |
    *                          (err && f1)------------------->+
    *                               |                         |
    *                        +--------------+         +--------------+
    *                        |    post      |<--------|      row     |
    *                        |   request    |       U |    release   |
    *                        +--------------+         +--------------+
    *
    */