Class RrdBackendFactory

java.lang.Object
org.rrd4j.core.RrdBackendFactory
All Implemented Interfaces:
Closeable, AutoCloseable
Direct Known Subclasses:
RrdFileBackendFactory, RrdMemoryBackendFactory

public abstract class RrdBackendFactory extends Object implements Closeable
Base (abstract) backend factory class which holds references to all concrete backend factories and defines abstract methods which must be implemented in all concrete factory implementations.

Factory classes are used to create concrete RrdBackend implementations. Each factory creates unlimited number of specific backend objects. Rrd4j supports six different backend types (backend factories) out of the box:

  • RrdRandomAccessFileBackend: objects of this class are created from the RrdRandomAccessFileBackendFactory class. This was the default backend used in all Rrd4j releases before 1.4.0 release. It uses java.io.* package and RandomAccessFile class to store RRD data in files on the disk.
  • RrdSafeFileBackend: objects of this class are created from the RrdSafeFileBackendFactory class. It uses java.io.* package and RandomAccessFile class to store RRD data in files on the disk. This backend is SAFE: it locks the underlying RRD file during update/fetch operations, and caches only static parts of a RRD file in memory. Therefore, this backend is safe to be used when RRD files should be shared between several JVMs at the same time. However, this backend is *slow* since it does not use fast java.nio.* package (it's still based on the RandomAccessFile class).
  • RrdNioBackend: objects of this class are created from the RrdNioBackendFactory class. The backend uses java.io.* and java.nio.* classes (mapped ByteBuffer) to store RRD data in files on the disk. This is the default backend since 1.4.0 release.
  • RrdMemoryBackend: objects of this class are created from the RrdMemoryBackendFactory class. This backend stores all data in memory. Once JVM exits, all data gets lost. The backend is extremely fast and memory hungry.

Each backend factory used to be identified by its name. Constructors are provided in the RrdDb class to create RrdDb objects (RRD databases) backed with a specific backend.

A more generic management was added in version 3.2 that allows multiple instances of a backend to be used. Each backend can manage custom URL. They are tried in the declared order by the setActiveFactories(RrdBackendFactory...) or addFactories(RrdBackendFactory...) and the method canStore(URI) return true when it can manage the given URI. Using setActiveFactories(RrdBackendFactory...) with new created instance is the preferred way to manage factories, as it provides a much precise control of creation and end of life of factories.

Since 3.4, using only setActiveFactories(RrdBackendFactory...) and addActiveFactories(RrdBackendFactory...) will not register any named backend at all. getDefaultFactory() will return the first active factory. All methods using named backend and the registry of factory were deprecated.

For default implementation, the path is separated in a root URI prefix and the path components. The root URI can be used to identify different name spaces or just be `/`.

See javadoc for RrdBackend to find out how to create your custom backends.

  • Field Details

    • DEFAULTFACTORY

      public static final String DEFAULTFACTORY
      The default factory type. It will also put in the active factories list.
      See Also:
    • name

      protected final String name
    • cachingAllowed

      protected final boolean cachingAllowed
    • scheme

      protected final String scheme
    • validateHeader

      protected final boolean validateHeader
  • Constructor Details

    • RrdBackendFactory

      protected RrdBackendFactory()
  • Method Details

    • getFactory

      @Deprecated public static RrdBackendFactory getFactory(String name)
      Deprecated.
      Uses active factory instead
      Returns backend factory for the given backend factory name.
      Parameters:
      name - Backend factory name. Initially supported names are:
      • FILE: Default factory which creates backends based on the java.io.* package. RRD data is stored in files on the disk
      • SAFE: Default factory which creates backends based on the java.io.* package. RRD data is stored in files on the disk. This backend is "safe". Being safe means that RRD files can be safely shared between several JVM's.
      • NIO: Factory which creates backends based on the java.nio.* package. RRD data is stored in files on the disk
      • MEMORY: Factory which creates memory-oriented backends. RRD data is stored in memory, it gets lost as soon as JVM exits.
      • BERKELEY: a memory-oriented backend that ensure persistent in a Berkeley Db storage.
      • MONGODB: a memory-oriented backend that ensure persistent in a MongoDB storage.
      Returns:
      Backend factory for the given factory name
    • registerFactory

      @Deprecated public static void registerFactory(RrdBackendFactory factory)
      Deprecated.
      Uses active factory instead
      Registers new (custom) backend factory within the Rrd4j framework.
      Parameters:
      factory - Factory to be registered
    • registerAndSetAsDefaultFactory

      @Deprecated public static void registerAndSetAsDefaultFactory(RrdBackendFactory factory)
      Deprecated.
      Registers new (custom) backend factory within the Rrd4j framework and sets this factory as the default.
      Parameters:
      factory - Factory to be registered and set as default
    • getDefaultFactory

      public static RrdBackendFactory getDefaultFactory()
      Returns the default backend factory. This factory is used to construct RrdDb objects if no factory is specified in the RrdDb constructor.
      Returns:
      Default backend factory.
    • setDefaultFactory

      @Deprecated public static void setDefaultFactory(String factoryName)
      Deprecated.
      Uses active factory instead
      Replaces the default backend factory with a new one. This method must be called before the first RRD gets created.

      It also clear the list of actives factories and set it to the default factory.

      Parameters:
      factoryName - Name of the default factory..
    • setActiveFactories

      public static void setActiveFactories(RrdBackendFactory... newFactories)
      Set the list of active factories, i.e. the factory used to resolve URI.
      Parameters:
      newFactories - the new active factories.
    • getActiveFactories

      public static java.util.stream.Stream<RrdBackendFactory> getActiveFactories()
      Return the current active factories as a stream.
      Returns:
      Since:
      3.7
    • addFactories

      @Deprecated public static void addFactories(RrdBackendFactory... newFactories)
      Deprecated.
      Add factories to the list of active factories, i.e. the factory used to resolve URI.
      Parameters:
      newFactories - active factories to add.
    • addActiveFactories

      public static void addActiveFactories(RrdBackendFactory... newFactories)
      Add factories to the list of active factories, i.e. the factory used to resolve URI.
      Parameters:
      newFactories - active factories to add.
    • findFactory

      public static RrdBackendFactory findFactory(URI uri)
      For a given URI, try to find a factory that can manage it in the list of active factories.
      Parameters:
      uri - URI to try.
      Returns:
      a RrdBackendFactory that can manage that URI.
      Throws:
      IllegalArgumentException - when no matching factory is found.
    • buildGenericUri

      public static URI buildGenericUri(String rrdpath)
      Try to detect an URI from a path. It's needed because of Microsoft Windows path that look's like an URI and to URL-encode the path.
      Parameters:
      rrdpath - a file URI that can be a Windows path
      Returns:
      an URI
    • checkClosing

      public void checkClosing()
      Check that all phantom reference are indeed safely closed.
    • getScheme

      public String getScheme()
      Returns:
      the scheme name for URI, default to getName().toLowerCase()
    • getRootUri

      protected URI getRootUri()
    • canStore

      public boolean canStore(URI uri)
    • resolve

      protected URI resolve(URI rootUri, URI uri, boolean relative)
      Try to match an URI against a root URI using a few rules:
      • scheme must match if they are given.
      • authority must match if they are given.
      • if uri is opaque (scheme:nonabsolute), the scheme specific part is resolve as a relative path.
      • query and fragment is kept as is.
      Parameters:
      rootUri - the URI to match against
      uri - an URI that the current backend can handle.
      relative - if true, return an URI relative to the rootUri
      Returns:
      a calculate normalized absolute URI or null if the tried URL don't match against the root.
    • getCanonicalUri

      public URI getCanonicalUri(URI uri)
      Ensure that an URI is returned in a non-ambiguous way.
      Parameters:
      uri - a valid URI for this backend.
      Returns:
      the canonized URI.
    • getUri

      public URI getUri(String path)
      Transform an path in a valid URI for this backend.
      Parameters:
      path - a path local to the current backend.
      Returns:
      an URI that the current backend can handle.
    • getPath

      public String getPath(URI uri)
      Extract the local path from an URI.
      Parameters:
      uri - The URI to parse.
      Returns:
      the local path from the URI.
    • open

      protected abstract RrdBackend open(String path, boolean readOnly) throws IOException
      Throws:
      IOException
    • getBackend

      RrdBackend getBackend(RrdDb rrdDb, String path, boolean readOnly) throws IOException
      Creates RrdBackend object for the given storage path.
      Parameters:
      path - Storage path
      readOnly - True, if the storage should be accessed in read/only mode. False otherwise.
      Returns:
      Backend object which handles all I/O operations for the given storage path
      Throws:
      IOException - Thrown in case of I/O error.
    • getBackend

      RrdBackend getBackend(RrdDb rrdDb, URI uri, boolean readOnly) throws IOException
      Creates RrdBackend object for the given storage path.
      Parameters:
      rrdDb -
      uri - Storage uri
      readOnly - True, if the storage should be accessed in read/only mode. False otherwise.
      Returns:
      Backend object which handles all I/O operations for the given storage path
      Throws:
      IOException - Thrown in case of I/O error.
    • exists

      protected abstract boolean exists(String path) throws IOException
      Determines if a storage with the given path already exists.
      Parameters:
      path - Storage path
      Returns:
      a boolean.
      Throws:
      IOException - in case of I/O error.
    • exists

      protected boolean exists(URI uri) throws IOException
      Determines if a storage with the given URI already exists.
      Parameters:
      uri - Storage URI.
      Returns:
      a boolean.
      Throws:
      IOException - in case of I/O error.
    • shouldValidateHeader

      protected boolean shouldValidateHeader(String path) throws IOException
      Determines if the header should be validated.
      Parameters:
      path - Storage path
      Returns:
      a boolean.
      Throws:
      IOException - if header validation fails
    • shouldValidateHeader

      protected boolean shouldValidateHeader(URI uri) throws IOException
      Determines if the header should be validated.
      Parameters:
      uri - Storage URI
      Returns:
      a boolean.
      Throws:
      IOException - if header validation fails
    • getName

      public String getName()
      Returns the name (primary ID) for the factory.
      Returns:
      Name of the factory.
    • close

      public void close() throws IOException
      A generic close handle, default implementation does nothing.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Throws:
      IOException - if the close fails
      Since:
      3.4