Class DataStoreBlobStore

java.lang.Object
org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore
All Implemented Interfaces:
AutoCloseable, DataStore, org.apache.jackrabbit.oak.api.blob.BlobAccessProvider, BlobTrackingStore, TypedDataStore, SharedDataStore, BlobStore, GarbageCollectableBlobStore

public class DataStoreBlobStore extends Object implements DataStore, BlobStore, GarbageCollectableBlobStore, BlobTrackingStore, TypedDataStore, org.apache.jackrabbit.oak.api.blob.BlobAccessProvider
BlobStore wrapper for DataStore. Wraps Jackrabbit 2 DataStore and expose them as BlobStores It also handles inlining binaries if there size is smaller than DataStore.getMinRecordLength()
  • Field Details

  • Constructor Details

    • DataStoreBlobStore

      public DataStoreBlobStore(DataStore delegate)
    • DataStoreBlobStore

      public DataStoreBlobStore(DataStore delegate, boolean encodeLengthInId)
    • DataStoreBlobStore

      public DataStoreBlobStore(DataStore delegate, boolean encodeLengthInId, int cacheSizeInMB)
  • Method Details

    • getRecordIfStored

      public DataRecord getRecordIfStored(DataIdentifier identifier) throws DataStoreException
      Description copied from interface: DataStore
      Check if a record for the given identifier exists, and return it if yes. If no record exists, this method returns null.
      Specified by:
      getRecordIfStored in interface DataStore
      Parameters:
      identifier - data identifier
      Returns:
      the record if found, and null if not
      Throws:
      DataStoreException - if the data store could not be accessed
    • getRecord

      public DataRecord getRecord(DataIdentifier identifier) throws DataStoreException
      Description copied from interface: DataStore
      Returns the identified data record. The given identifier should be the identifier of a previously saved data record. Since records are never removed, there should never be cases where the identified record is not found. Abnormal cases like that are treated as errors and handled by throwing an exception.
      Specified by:
      getRecord in interface DataStore
      Parameters:
      identifier - data identifier
      Returns:
      identified data record
      Throws:
      DataStoreException - if the data store could not be accessed, or if the given identifier is invalid
    • getRecordFromReference

      public DataRecord getRecordFromReference(String reference) throws DataStoreException
      Description copied from interface: DataStore
      Returns the record that matches the given binary reference. Returns null if the reference is invalid, for example if it points to a record that does not exist.
      Specified by:
      getRecordFromReference in interface DataStore
      Parameters:
      reference - binary reference
      Returns:
      matching record, or null
      Throws:
      DataStoreException - if the data store could not be accessed
    • addRecord

      public DataRecord addRecord(InputStream stream) throws DataStoreException
      Description copied from interface: DataStore
      Creates a new data record. The given binary stream is consumed and a binary record containing the consumed stream is created and returned. If the same stream already exists in another record, then that record is returned instead of creating a new one.

      The given stream is consumed and not closed by this method. It is the responsibility of the caller to close the stream. A typical call pattern would be:

           InputStream stream = ...;
           try {
               record = store.addRecord(stream);
           } finally {
               stream.close();
           }
       
      Specified by:
      addRecord in interface DataStore
      Parameters:
      stream - binary stream
      Returns:
      data record that contains the given stream
      Throws:
      DataStoreException - if the data store could not be accessed
    • updateModifiedDateOnAccess

      public void updateModifiedDateOnAccess(long before)
      Description copied from interface: DataStore
      From now on, update the modified date of an object even when accessing it. Usually, the modified date is only updated when creating a new object, or when a new link is added to an existing object. When this setting is enabled, even getLength() will update the modified date.
      Specified by:
      updateModifiedDateOnAccess in interface DataStore
      Parameters:
      before - - update the modified date to the current time if it is older than this value
    • deleteAllOlderThan

      public int deleteAllOlderThan(long min) throws DataStoreException
      Description copied from interface: DataStore
      Delete objects that have a modified date older than the specified date.
      Specified by:
      deleteAllOlderThan in interface DataStore
      Parameters:
      min - the minimum time
      Returns:
      the number of data records deleted
      Throws:
      DataStoreException
    • getAllIdentifiers

      public Iterator<DataIdentifier> getAllIdentifiers() throws DataStoreException
      Description copied from interface: DataStore
      Get all identifiers.
      Specified by:
      getAllIdentifiers in interface DataStore
      Returns:
      an iterator over all DataIdentifier objects
      Throws:
      DataStoreException - if the list could not be read
    • init

      public void init(String homeDir) throws RepositoryException
      Description copied from interface: DataStore
      Initialized the data store
      Specified by:
      init in interface DataStore
      Parameters:
      homeDir - the home directory of the repository
      Throws:
      RepositoryException
    • getMinRecordLength

      public int getMinRecordLength()
      Description copied from interface: DataStore
      Get the minimum size of an object that should be stored in this data store. Depending on the overhead and configuration, each store may return a different value.
      Specified by:
      getMinRecordLength in interface DataStore
      Returns:
      the minimum size in bytes
    • close

      public void close() throws DataStoreException
      Description copied from interface: DataStore
      Close the data store
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface DataStore
      Throws:
      DataStoreException - if a problem occurred
    • writeBlob

      public String writeBlob(InputStream stream) throws IOException
      Description copied from interface: BlobStore
      Write a blob from an input stream. This method closes the input stream.
      Specified by:
      writeBlob in interface BlobStore
      Parameters:
      stream - the input stream
      Returns:
      the blob id
      Throws:
      IOException
    • writeBlob

      public String writeBlob(InputStream stream, BlobOptions options) throws IOException
      Description copied from interface: BlobStore
      Write a blob from an input stream with specified options. This method closes the input stream.
      Specified by:
      writeBlob in interface BlobStore
      Parameters:
      stream - the input stream to write
      options - the options to use
      Returns:
      Throws:
      IOException
    • readBlob

      public int readBlob(String encodedBlobId, long pos, byte[] buff, int off, int length) throws IOException
      Description copied from interface: BlobStore
      Read a number of bytes from a blob.
      Specified by:
      readBlob in interface BlobStore
      Parameters:
      encodedBlobId - the blob id
      pos - the position within the blob
      buff - the target byte array
      off - the offset within the target array
      length - the number of bytes to read
      Returns:
      the number of bytes read
      Throws:
      IOException
    • getBlobLength

      public long getBlobLength(String encodedBlobId) throws IOException
      Description copied from interface: BlobStore
      Get the length of the blob.
      Specified by:
      getBlobLength in interface BlobStore
      Parameters:
      encodedBlobId - the blob id
      Returns:
      the length
      Throws:
      IOException
    • getBlobId

      public String getBlobId(@NotNull @NotNull String reference)
      Description copied from interface: BlobStore
      Returns the blobId that referred by the given binary reference. Returns null if the reference is invalid, for example if it points to a blob that does not exist.
      Specified by:
      getBlobId in interface BlobStore
      Parameters:
      reference - binary reference
      Returns:
      matching blobId, or null
    • getReference

      public String getReference(@NotNull @NotNull String encodedBlobId)
      Description copied from interface: BlobStore
      Returns a secure reference to blob referred by blobid, or null if no such reference is available.
      Specified by:
      getReference in interface BlobStore
      Parameters:
      encodedBlobId - blobId referring the blob for which reference is required
      Returns:
      binary reference, or null
    • getInputStream

      public InputStream getInputStream(String encodedBlobId) throws IOException
      Description copied from interface: BlobStore
      Returns a new stream for given blobId. The streams returned from multiple calls to this method are byte wise equals. That is, subsequent calls to read return the same sequence of bytes as long as neither call throws an exception.
      Specified by:
      getInputStream in interface BlobStore
      Parameters:
      encodedBlobId - the blob id
      Returns:
      a new stream for given blobId
      Throws:
      IOException
    • setBlockSize

      public void setBlockSize(int x)
      Description copied from interface: GarbageCollectableBlobStore
      Set the block size used by this blob store, if the blob store splits binaries into blocks. If not, this setting is ignored.
      Specified by:
      setBlockSize in interface GarbageCollectableBlobStore
      Parameters:
      x - the block size in bytes.
    • writeBlob

      public String writeBlob(String tempFileName) throws IOException
      Description copied from interface: GarbageCollectableBlobStore
      Write a blob from a temporary file. The temporary file is removed afterwards. A file based blob stores might simply rename the file, so that no additional writes are necessary.
      Specified by:
      writeBlob in interface GarbageCollectableBlobStore
      Parameters:
      tempFileName - the temporary file name
      Returns:
      the blob id
      Throws:
      IOException
    • sweep

      public int sweep() throws IOException
      Description copied from interface: GarbageCollectableBlobStore
      Remove all unused blocks.
      Specified by:
      sweep in interface GarbageCollectableBlobStore
      Returns:
      the number of removed blocks
      Throws:
      IOException
    • startMark

      public void startMark() throws IOException
      Description copied from interface: GarbageCollectableBlobStore
      Start the mark phase.
      Specified by:
      startMark in interface GarbageCollectableBlobStore
      Throws:
      IOException
    • clearInUse

      public void clearInUse()
      Description copied from interface: DataStore
      Clear the in-use list. This is only used for testing to make the the garbage collection think that objects are no longer in use.
      Specified by:
      clearInUse in interface DataStore
      Specified by:
      clearInUse in interface GarbageCollectableBlobStore
    • clearCache

      public void clearCache()
      Description copied from interface: GarbageCollectableBlobStore
      Clear the cache.
      Specified by:
      clearCache in interface GarbageCollectableBlobStore
    • getBlockSizeMin

      public long getBlockSizeMin()
      Description copied from interface: GarbageCollectableBlobStore
      Get the minimum block size (if there is any).
      Specified by:
      getBlockSizeMin in interface GarbageCollectableBlobStore
      Returns:
      the block size
    • getAllChunkIds

      public Iterator<String> getAllChunkIds(long maxLastModifiedTime) throws Exception
      Description copied from interface: GarbageCollectableBlobStore
      Gets all the identifiers.
      Specified by:
      getAllChunkIds in interface GarbageCollectableBlobStore
      Parameters:
      maxLastModifiedTime - the max last modified time to consider for retrieval, with the special value '0' meaning no filtering by time
      Returns:
      the identifiers
      Throws:
      Exception - the exception
    • deleteChunks

      public boolean deleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception
      Description copied from interface: GarbageCollectableBlobStore
      Deletes the blobs with the given ids.
      Specified by:
      deleteChunks in interface GarbageCollectableBlobStore
      Parameters:
      chunkIds - the chunk ids
      maxLastModifiedTime - the max last modified time to consider for retrieval, with the special value '0' meaning no filtering by time
      Returns:
      true, if successful
      Throws:
      Exception - the exception
    • countDeleteChunks

      public long countDeleteChunks(List<String> chunkIds, long maxLastModifiedTime) throws Exception
      Description copied from interface: GarbageCollectableBlobStore
      Deletes the blobs with the given ids.
      Specified by:
      countDeleteChunks in interface GarbageCollectableBlobStore
      Parameters:
      chunkIds - the chunk ids
      maxLastModifiedTime - the max last modified time to consider for retrieval, with the special value '0' meaning no filtering by time
      Returns:
      long the count of successful deletions
      Throws:
      Exception - the exception
    • resolveChunks

      public Iterator<String> resolveChunks(String blobId) throws IOException
      Description copied from interface: GarbageCollectableBlobStore
      Resolve chunks stored in the blob store from the given Id. This will not return any chunks stored in-line in the id.
      Specified by:
      resolveChunks in interface GarbageCollectableBlobStore
      Parameters:
      blobId - the blob id
      Returns:
      the iterator
      Throws:
      IOException - Signals that an I/O exception has occurred.
    • addMetadataRecord

      public void addMetadataRecord(InputStream stream, String name) throws DataStoreException
      Description copied from interface: SharedDataStore
      Adds the root record.
      Specified by:
      addMetadataRecord in interface SharedDataStore
      Parameters:
      stream - the stream
      name - the name of the root record
      Throws:
      DataStoreException - the data store exception
    • addMetadataRecord

      public void addMetadataRecord(File f, String name) throws DataStoreException
      Description copied from interface: SharedDataStore
      Adds the root record.
      Specified by:
      addMetadataRecord in interface SharedDataStore
      Parameters:
      f - the file
      name - the name of the root record
      Throws:
      DataStoreException - the data store exception
    • getMetadataRecord

      public DataRecord getMetadataRecord(String name)
      Description copied from interface: SharedDataStore
      Retrieves the metadata record with the given name
      Specified by:
      getMetadataRecord in interface SharedDataStore
      Parameters:
      name - the name of the record
      Returns:
    • metadataRecordExists

      public boolean metadataRecordExists(String name)
      Description copied from interface: SharedDataStore
      Checks if the metadata record with the name exists
      Specified by:
      metadataRecordExists in interface SharedDataStore
      Parameters:
      name -
      Returns:
    • getAllMetadataRecords

      public List<DataRecord> getAllMetadataRecords(String prefix)
      Description copied from interface: SharedDataStore
      Gets the all root records.
      Specified by:
      getAllMetadataRecords in interface SharedDataStore
      Returns:
      the all root records
    • deleteMetadataRecord

      public boolean deleteMetadataRecord(String name)
      Description copied from interface: SharedDataStore
      Deletes the root record represented by the given parameters.
      Specified by:
      deleteMetadataRecord in interface SharedDataStore
      Parameters:
      name - the name of the root record
      Returns:
      success/failure
    • deleteAllMetadataRecords

      public void deleteAllMetadataRecords(String prefix)
      Description copied from interface: SharedDataStore
      Deletes all records matching the given prefix.
      Specified by:
      deleteAllMetadataRecords in interface SharedDataStore
      Parameters:
      prefix - metadata type identifier
    • setRepositoryId

      public void setRepositoryId(String repositoryId) throws DataStoreException
      Description copied from interface: SharedDataStore
      Sets the repository id to identify repository in the DataStore
      Specified by:
      setRepositoryId in interface SharedDataStore
      Parameters:
      repositoryId -
      Throws:
      DataStoreException
    • getRepositoryId

      public String getRepositoryId()
      Description copied from interface: SharedDataStore
      Returns the repository id (identifier for the repository in the DataStore)
      Specified by:
      getRepositoryId in interface SharedDataStore
      Returns:
      repository id
    • getAllRecords

      public Iterator<DataRecord> getAllRecords() throws DataStoreException
      Description copied from interface: SharedDataStore
      Retrieved an iterator over all DataRecords.
      Specified by:
      getAllRecords in interface SharedDataStore
      Returns:
      iterator over DataRecords
      Throws:
      DataStoreException
    • getRecordForId

      public DataRecord getRecordForId(DataIdentifier identifier) throws DataStoreException
      Description copied from interface: SharedDataStore
      Retrieves the record for the given identifier
      Specified by:
      getRecordForId in interface SharedDataStore
      Parameters:
      identifier - the if of the record
      Returns:
      data record
      Throws:
      DataStoreException
    • getType

      public SharedDataStore.Type getType()
      Description copied from interface: SharedDataStore
      Gets the type.
      Specified by:
      getType in interface SharedDataStore
      Returns:
      the type
    • addRecord

      public DataRecord addRecord(InputStream input, BlobOptions options) throws DataStoreException
      Description copied from interface: TypedDataStore
      Add a record with specified options.
      Specified by:
      addRecord in interface TypedDataStore
      Parameters:
      input -
      options -
      Returns:
      Throws:
      DataStoreException
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • getDataStore

      public DataStore getDataStore()
    • getCacheStats

      public CacheStats getCacheStats()
    • setMaxCachedBinarySize

      public void setMaxCachedBinarySize(int maxCachedBinarySize)
    • setBlobStatsCollector

      public void setBlobStatsCollector(BlobStatsCollector stats)
    • addTracker

      public void addTracker(BlobTracker tracker)
      Description copied from interface: BlobTrackingStore
      Registers a tracker in the data store.
      Specified by:
      addTracker in interface BlobTrackingStore
      Parameters:
      tracker -
    • getTracker

      @Nullable public @Nullable BlobTracker getTracker()
      Description copied from interface: BlobTrackingStore
      Gets the traker registered in the data store.
      Specified by:
      getTracker in interface BlobTrackingStore
      Returns:
      tracker
    • initiateBlobUpload

      @Nullable public @Nullable org.apache.jackrabbit.oak.api.blob.BlobUpload initiateBlobUpload(long maxUploadSizeInBytes, int maxNumberOfURIs) throws IllegalArgumentException
      Specified by:
      initiateBlobUpload in interface org.apache.jackrabbit.oak.api.blob.BlobAccessProvider
      Throws:
      IllegalArgumentException
    • initiateBlobUpload

      @Nullable public @Nullable org.apache.jackrabbit.oak.api.blob.BlobUpload initiateBlobUpload(long maxUploadSizeInBytes, int maxNumberOfURIs, @NotNull @NotNull org.apache.jackrabbit.oak.api.blob.BlobUploadOptions options) throws IllegalArgumentException
      Specified by:
      initiateBlobUpload in interface org.apache.jackrabbit.oak.api.blob.BlobAccessProvider
      Throws:
      IllegalArgumentException
    • completeBlobUpload

      @Nullable public @Nullable Blob completeBlobUpload(@NotNull @NotNull String uploadToken) throws IllegalArgumentException
      Specified by:
      completeBlobUpload in interface org.apache.jackrabbit.oak.api.blob.BlobAccessProvider
      Throws:
      IllegalArgumentException
    • getDownloadURI

      @Nullable public @Nullable URI getDownloadURI(@NotNull @NotNull Blob blob, @NotNull @NotNull org.apache.jackrabbit.oak.api.blob.BlobDownloadOptions downloadOptions)
      Specified by:
      getDownloadURI in interface org.apache.jackrabbit.oak.api.blob.BlobAccessProvider