Package org.snmp4j.agent.db
Class MOXodusPersistence
- java.lang.Object
-
- org.snmp4j.agent.db.MOXodusPersistence
-
- All Implemented Interfaces:
EventListener,org.snmp4j.agent.mo.MOChangeListener
public class MOXodusPersistence extends Object implements org.snmp4j.agent.mo.MOChangeListener
TheMOXodusPersistenceclass provides persistent storage for SNMP4J-Agent using theMOXodusPersistenceProviderwrapper that actually implements theMOPersistenceProviderinterface of SNMP4J-Agent. As storage engine, the Xodus open source (Apache 2 License) DB is used. See https://github.com/JetBrains/xodus} for details. The database approach has the following advantages compared to the standard sequential persistence provider coming with SNMP4J-Agent:- Only changed objects are written again to disk. The default DefaultMOPersistenceProvider needs to save all objects in a sequence.
- DB size is smaller - if changes are limited to approximately less than 40% of the MIB objects during runtime.
- Agent shutdown is much faster because no objects need to be saved anymore.
- No data loss if agent is killed.
SampleAgentillustrates how this class is created and assigned to the agent during its initialization.File configFile = new File(myConfigDir); MOXodusPersistence moXodusPersistence = new MOXodusPersistence(moServers, Environments.newInstance(configFile)); MOXodusPersistenceProvider moXodusPersistenceProvider = new MOXodusPersistenceProvider(moXodusPersistence); OctetString defaultEngineID = new OctetString(MPv3.createLocalEngineID()); OctetString engineID = moXodusPersistenceProvider.getEngineId(defaultEngineID); ... agent = new AgentConfigManager(engineID, messageDispatcher, null, moServers, ThreadPool.create("SampleAgent", 3), (defaultEngineID == engineID) ? configurationFactory : null, moXodusPersistenceProvider, new EngineBootsCounterFile(bootCounterFile), null, dhKickstartParameters); agent.addAgentStateListener(new AgentStateListener() { public void agentStateChanged(AgentConfigManager agentConfigManager, AgentState newState) { switch (newState.getState()) { case AgentState.STATE_INITIALIZED: moXodusPersistence.registerChangeListenersWithServer(server); break; case AgentState.STATE_SHUTDOWN: moXodusPersistence.unregisterChangeListenersWithServer(server); break; } } });- Since:
- 3.0
- Version:
- 3.2.0
- Author:
- Frank Fock
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classMOXodusPersistence.SavingStrategy
-
Constructor Summary
Constructors Constructor Description MOXodusPersistence(org.snmp4j.agent.MOServer[] moServers, jetbrains.exodus.env.Environment environment)MOXodusPersistence(org.snmp4j.agent.MOServer[] moServers, jetbrains.exodus.env.Environment environment, MOXodusPersistence.SavingStrategy savingStrategy)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidafterMOChange(org.snmp4j.agent.mo.MOChangeEvent changeEvent)A change has been committed.voidafterPrepareMOChange(org.snmp4j.agent.mo.MOChangeEvent changeEvent)A change has been prepared.voidbeforeMOChange(org.snmp4j.agent.mo.MOChangeEvent changeEvent)A ManagedObject change is being committed.voidbeforePrepareMOChange(org.snmp4j.agent.mo.MOChangeEvent changeEvent)A ManagedObject change is being prepared.protected jetbrains.exodus.env.StorecreateStore(jetbrains.exodus.env.Transaction txn, org.snmp4j.smi.OctetString context)static int[]decodeIndexOID(org.snmp4j.asn1.BERInputStream is, org.snmp4j.asn1.BER.MutableByte type)protected List<org.snmp4j.smi.VariableBinding>decodeInstanceData(jetbrains.exodus.ByteIterable rawData)protected org.snmp4j.smi.VariableBindingdecodeVariableBinding(org.snmp4j.asn1.BERInputStream inputStream)static voidencodeIndexOID(OutputStream os, byte type, int[] oid)protected byte[]encodeInstanceData(List<org.snmp4j.smi.VariableBinding> vbs)protected voidencodeVariableBinding(org.snmp4j.smi.VariableBinding vb, org.snmp4j.asn1.BEROutputStream outputStream)protected Set<org.snmp4j.smi.OctetString>getContexts(org.snmp4j.agent.ManagedObject managedObject)jetbrains.exodus.env.EnvironmentgetEnvironment()static intgetIndexOIDLength(int[] value)protected jetbrains.exodus.ByteIterablegetKey(org.snmp4j.smi.OID oid, org.snmp4j.smi.OID instanceID)protected org.snmp4j.smi.OIDgetKeyOid(jetbrains.exodus.ByteIterable key)org.snmp4j.agent.MOServer[]getMOServer()MOXodusPersistence.SavingStrategygetSavingStrategy()booleanisContextLoadable(org.snmp4j.smi.OctetString context)Checks if there is already MIB data stored for the specified context.booleanisContinuousChangeListening()booleanisIgnoreChangeListenerEvents()voidload(org.snmp4j.agent.io.ImportMode importMode)Load the contents of allRandomAccessManagedObjects usingRandomAccessManagedObject.importInstance(OID, List, ImportMode)calls.voidregisterChangeListenersWithServer(org.snmp4j.agent.MOServer moServer)Register this object asMOChangeListeneron allRandomAccessManagedObjectinstances in the providedMOServer.protected voidrunSynchronization(Map<org.snmp4j.smi.OctetString,jetbrains.exodus.env.Store> stores, jetbrains.exodus.env.Transaction txn, org.snmp4j.agent.io.ImportMode importMode, Iterator<Map.Entry<org.snmp4j.agent.MOScope,org.snmp4j.agent.ManagedObject<?>>> moIterator)voidsave()Saves the data of theMOServers associated with this instance to persistent storage depoending on the currently configuredMOXodusPersistence.SavingStrategy.voidsetIgnoreChangeListenerEvents(boolean ignoreChangeListenerEvents)Defines whetherMOChangeEvents should be ignored or not.voidsetSavingStrategy(MOXodusPersistence.SavingStrategy savingStrategy)protected StringstoreNameFromContext(org.snmp4j.smi.OctetString context)Return a string store name for the provided SNMPv3 context.voidunregisterChangeListenersWithServer(org.snmp4j.agent.MOServer moServer)Removes a former registration of this object asMOChangeListeneron allRandomAccessManagedObjectinstances in the providedMOServer.
-
-
-
Constructor Detail
-
MOXodusPersistence
public MOXodusPersistence(org.snmp4j.agent.MOServer[] moServers, jetbrains.exodus.env.Environment environment)Creates a newMOXodusPersistencefrom an array ofMOServerinstances and an XodusEnvironment. The data of modified objects are stored whenever a correspondingMOChangeEventis received.- Parameters:
moServers- theManagedObjectservers of the agent to be supported with persistent storage capabilities by this object.environment- the Xodus environment that actually holds the persistent data.
-
MOXodusPersistence
public MOXodusPersistence(org.snmp4j.agent.MOServer[] moServers, jetbrains.exodus.env.Environment environment, MOXodusPersistence.SavingStrategy savingStrategy)- Parameters:
moServers- theManagedObjectservers of the agent to be supported with persistent storage capabilities by this object.environment- the Xodus environment that actually holds the persistent data.savingStrategy- defines when and how modified objects of the agent should be saved into persistent storage.
-
-
Method Detail
-
getSavingStrategy
public MOXodusPersistence.SavingStrategy getSavingStrategy()
-
setSavingStrategy
public void setSavingStrategy(MOXodusPersistence.SavingStrategy savingStrategy)
-
isIgnoreChangeListenerEvents
public boolean isIgnoreChangeListenerEvents()
-
setIgnoreChangeListenerEvents
public void setIgnoreChangeListenerEvents(boolean ignoreChangeListenerEvents)
Defines whetherMOChangeEvents should be ignored or not. This method can be used to disable persistent storage activities when the default strategyMOXodusPersistence.SavingStrategy.onChangeEventsOnlyis active and other bulk operations change MIB data in the agent. When activating the processing ofMOChangeEvents is activated again by setting this value tofalse, the missed events will not be processed again. Thus, if data has changed that need to be persistent, thesave()has to be called with strategyMOXodusPersistence.SavingStrategy.checkForModificationsOnSaveorMOXodusPersistence.SavingStrategy.fullDumpOnSavemanually.- Parameters:
ignoreChangeListenerEvents-trueto disable event processing and saving changes triggered byMOChangeEvents.
-
getEnvironment
public jetbrains.exodus.env.Environment getEnvironment()
-
isContinuousChangeListening
public boolean isContinuousChangeListening()
-
registerChangeListenersWithServer
public void registerChangeListenersWithServer(org.snmp4j.agent.MOServer moServer)
Register this object asMOChangeListeneron allRandomAccessManagedObjectinstances in the providedMOServer.- Parameters:
moServer- aMOServerholdingRandomAccessManagedObjects that should be persisted.
-
unregisterChangeListenersWithServer
public void unregisterChangeListenersWithServer(org.snmp4j.agent.MOServer moServer)
Removes a former registration of this object asMOChangeListeneron allRandomAccessManagedObjectinstances in the providedMOServer.- Parameters:
moServer- aMOServerholdingRandomAccessManagedObjects that should not be persisted anymore.
-
isContextLoadable
public boolean isContextLoadable(org.snmp4j.smi.OctetString context)
Checks if there is already MIB data stored for the specified context. To check the default context (null), please use the emptyOctetString. This method should be called before callingload(ImportMode)because afterwards it will returntruefor all contexts that were present ingetMOServer()and for the default context (empty context).- Parameters:
context- a non-null context string. The empty (zero length)OctetStringrepresents the default context.- Returns:
trueif there has been data stored for this context - even if noRandomAccessManagedObjectactually has stored any data.- Since:
- 3.0.1
-
load
public void load(org.snmp4j.agent.io.ImportMode importMode)
Load the contents of allRandomAccessManagedObjects usingRandomAccessManagedObject.importInstance(OID, List, ImportMode)calls. The providedImportModethereby defines how the data handles existing data. Data is loaded for all contexts and managed objects found in the {link MOServer} instances provided during object creation. While loading, the memberignoreChangeListenerEventsis set totrueto ignore updates caused by loading data into theRandomAccessManagedObjectinstances.- Parameters:
importMode- controls how existing data is used or not used during import.
-
createStore
@NotNull protected jetbrains.exodus.env.Store createStore(jetbrains.exodus.env.Transaction txn, org.snmp4j.smi.OctetString context)
-
storeNameFromContext
protected String storeNameFromContext(org.snmp4j.smi.OctetString context)
Return a string store name for the provided SNMPv3 context.- Parameters:
context- a context name ornullfor the default context.- Returns:
- a store name, by default
context == null ? "" : context.toHexString(). - Since:
- 3.0.1
-
getMOServer
public org.snmp4j.agent.MOServer[] getMOServer()
-
runSynchronization
protected void runSynchronization(Map<org.snmp4j.smi.OctetString,jetbrains.exodus.env.Store> stores, jetbrains.exodus.env.Transaction txn, org.snmp4j.agent.io.ImportMode importMode, Iterator<Map.Entry<org.snmp4j.agent.MOScope,org.snmp4j.agent.ManagedObject<?>>> moIterator)
-
decodeInstanceData
protected List<org.snmp4j.smi.VariableBinding> decodeInstanceData(jetbrains.exodus.ByteIterable rawData)
-
encodeInstanceData
protected byte[] encodeInstanceData(List<org.snmp4j.smi.VariableBinding> vbs)
-
decodeVariableBinding
protected org.snmp4j.smi.VariableBinding decodeVariableBinding(org.snmp4j.asn1.BERInputStream inputStream) throws IOException- Throws:
IOException
-
encodeVariableBinding
protected void encodeVariableBinding(org.snmp4j.smi.VariableBinding vb, org.snmp4j.asn1.BEROutputStream outputStream) throws IOException- Throws:
IOException
-
getKey
protected jetbrains.exodus.ByteIterable getKey(org.snmp4j.smi.OID oid, org.snmp4j.smi.OID instanceID)
-
getKeyOid
protected org.snmp4j.smi.OID getKeyOid(jetbrains.exodus.ByteIterable key)
-
save
public void save()
Saves the data of theMOServers associated with this instance to persistent storage depoending on the currently configuredMOXodusPersistence.SavingStrategy. If that strategy isMOXodusPersistence.SavingStrategy.onChangeEventsOnly, calling this method will have no effect, except that it setssetIgnoreChangeListenerEvents(boolean)tofalsein any case.
-
encodeIndexOID
public static void encodeIndexOID(OutputStream os, byte type, int[] oid) throws IOException
- Throws:
IOException
-
getIndexOIDLength
public static int getIndexOIDLength(int[] value)
-
decodeIndexOID
public static int[] decodeIndexOID(org.snmp4j.asn1.BERInputStream is, org.snmp4j.asn1.BER.MutableByte type) throws IOException- Throws:
IOException
-
beforePrepareMOChange
public void beforePrepareMOChange(org.snmp4j.agent.mo.MOChangeEvent changeEvent)
A ManagedObject change is being prepared. To cancel preparation set the deny reason to a SNMPv2/v3 error status.- Specified by:
beforePrepareMOChangein interfaceorg.snmp4j.agent.mo.MOChangeListener- Parameters:
changeEvent- the change event object.
-
afterPrepareMOChange
public void afterPrepareMOChange(org.snmp4j.agent.mo.MOChangeEvent changeEvent)
A change has been prepared. Setting the deny reason of the supplied event object will be ignored.- Specified by:
afterPrepareMOChangein interfaceorg.snmp4j.agent.mo.MOChangeListener- Parameters:
changeEvent- the change event object.
-
beforeMOChange
public void beforeMOChange(org.snmp4j.agent.mo.MOChangeEvent changeEvent)
A ManagedObject change is being committed. To cancel the commit phase set the deny reason to a SNMPv2/v3 error status.NOTE: Canceling the commit phase must be avoided. Setting a deny reason has only an effect if
DeniableEventObject.isDeniable()returnstrue. Otherwise, you will need to throw an exception.- Specified by:
beforeMOChangein interfaceorg.snmp4j.agent.mo.MOChangeListener- Parameters:
changeEvent- the change event object.
-
afterMOChange
public void afterMOChange(org.snmp4j.agent.mo.MOChangeEvent changeEvent)
A change has been committed. Setting the deny reason of the supplied event object will be ignored.- Specified by:
afterMOChangein interfaceorg.snmp4j.agent.mo.MOChangeListener- Parameters:
changeEvent- the change event object.
-
getContexts
protected Set<org.snmp4j.smi.OctetString> getContexts(org.snmp4j.agent.ManagedObject managedObject)
-
-