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

      • DEFAULTFACTORY

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

        protected final String name
      • cachingAllowed

        protected final boolean cachingAllowed
      • scheme

        protected final String scheme
      • validateHeader

        protected final boolean validateHeader
    • Constructor Detail

      • RrdBackendFactory

        protected RrdBackendFactory()
    • Method Detail

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