Class AbstractBlobStore
- All Implemented Interfaces:
AutoCloseable
,Cache.Backend<AbstractBlobStore.BlockId,
,AbstractBlobStore.Data> BlobStore
,GarbageCollectableBlobStore
- Direct Known Subclasses:
CachingBlobStore
,FileBlobStore
,MemoryBlobStore
Each data store id is a list of zero or more entries. Each entry is either
- data (a number of bytes), or
- the hash code of the content of a number of bytes, or
- the hash code of the content of a data store id (indirect hash)
The format of a 'data' entry is: type (one byte; 0 for data), length (variable size int), data (bytes).
The format of a 'hash of content' entry is: type (one byte; 1 for hash), level (variable size int, 0 meaning not nested), size (variable size long), hash code length (variable size int), hash code.
The format of a 'hash of data store id' entry is: type (one byte; 1 for hash), level (variable size int, nesting level), total size (variable size long), size of data store id (variable size long), hash code length (variable size int), hash code.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class
A block id.static class
The data for a block. -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final int
The minimum block size.protected static final String
protected Map<String,
WeakReference<String>> The blob ids that are still floating around in memory.protected static final int
protected static final int
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
Clear all objects marked as "transiently in use".void
close()
boolean
deleteChunks
(List<String> chunkIds, long maxLastModifiedTime) Deletes the blobs with the given ids.Returns the blobId that referred by the given binary reference.long
getBlobLength
(String blobId) Get the length of the blob.int
long
Get the minimum block size (if there is any).getInputStream
(String blobId) Returns a new stream for given blobId.protected byte[]
Returns the reference key of this blob store.getReference
(@NotNull String blobId) Returns a secure reference to blob referred by blobid, ornull
if no such reference is available.protected BlobStatsCollector
protected abstract boolean
Load the object.protected void
protected abstract void
protected void
int
Read a number of bytes from a blob.protected abstract byte[]
Load the block from the storage backend.resolveChunks
(String blobId) Resolve chunks stored in the blob store from the given Id.void
setBlockSize
(int x) Set the block size used by this blob store, if the blob store splits binaries into blocks.void
setBlockSizeMin
(int x) void
setReferenceKey
(byte[] referenceKey) void
setReferenceKeyEncoded
(String encodedKey) Set the referenceKey from Base64 encoded byte arrayvoid
setReferenceKeyPlainText
(String textKey) Set the referenceKey from plain text.void
abstract void
Start the mark phase.protected abstract void
storeBlock
(byte[] digest, int level, byte[] data) Store a block of data.abstract int
sweep()
Remove all unused blocks.protected void
usesBlobId
(String blobId) writeBlob
(InputStream in) Write a blob from an input stream.writeBlob
(InputStream in, BlobOptions options) Default implementation ignores options and delegates to thewriteBlob(InputStream)
method.Write a blob from a temporary file.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore
clearCache, countDeleteChunks, getAllChunkIds
-
Field Details
-
HASH_ALGORITHM
- See Also:
-
TYPE_DATA
protected static final int TYPE_DATA- See Also:
-
TYPE_HASH
protected static final int TYPE_HASH- See Also:
-
BLOCK_SIZE_LIMIT
protected static final int BLOCK_SIZE_LIMITThe minimum block size. Blocks must be larger than that so that the content hash is always shorter than the data itself.- See Also:
-
inUse
The blob ids that are still floating around in memory. The blob store assumes such binaries must not be deleted, because those binaries are not referenced yet in a way the garbage collection algorithm can detect (not referenced at all, or only referenced in memory).
-
-
Constructor Details
-
AbstractBlobStore
public AbstractBlobStore()
-
-
Method Details
-
setBlockSizeMin
public void setBlockSizeMin(int x) -
getBlockSizeMin
public long getBlockSizeMin()Description copied from interface:GarbageCollectableBlobStore
Get the minimum block size (if there is any).- Specified by:
getBlockSizeMin
in interfaceGarbageCollectableBlobStore
- Returns:
- the block size
-
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 interfaceGarbageCollectableBlobStore
- Parameters:
x
- the block size in bytes.
-
setStatsCollector
-
getStatsCollector
-
getBlockSize
public int getBlockSize() -
writeBlob
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 interfaceGarbageCollectableBlobStore
- Parameters:
tempFilePath
- the temporary file name- Returns:
- the blob id
- Throws:
IOException
-
writeBlob
Description copied from interface:BlobStore
Write a blob from an input stream. This method closes the input stream.- Specified by:
writeBlob
in interfaceBlobStore
- Parameters:
in
- the input stream- Returns:
- the blob id
- Throws:
IOException
-
writeBlob
Default implementation ignores options and delegates to thewriteBlob(InputStream)
method.- Specified by:
writeBlob
in interfaceBlobStore
- Parameters:
in
- the input stream to writeoptions
- the options to use- Returns:
- Throws:
IOException
-
getInputStream
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 toread
return the same sequence of bytes as long as neither call throws an exception.- Specified by:
getInputStream
in interfaceBlobStore
- Parameters:
blobId
- the blob id- Returns:
- a new stream for given blobId
- Throws:
IOException
-
getReference
Description copied from interface:BlobStore
Returns a secure reference to blob referred by blobid, ornull
if no such reference is available.- Specified by:
getReference
in interfaceBlobStore
- Parameters:
blobId
- blobId referring the blob for which reference is required- Returns:
- binary reference, or
null
-
getBlobId
Description copied from interface:BlobStore
Returns the blobId that referred by the given binary reference. Returnsnull
if the reference is invalid, for example if it points to a blob that does not exist. -
getOrCreateReferenceKey
protected byte[] getOrCreateReferenceKey()Returns the reference key of this blob store. If one does not already exist, it is automatically created in an implementation-specific way. The default implementation simply creates a temporary random key that's valid only until the data store gets restarted. Subclasses can override and/or decorate this method to support a more persistent reference key.This method is called only once during the lifetime of a data store instance and the return value is cached in memory, so it's no problem if the implementation is slow.
- Returns:
- reference key
-
setReferenceKey
public void setReferenceKey(byte[] referenceKey) -
setReferenceKeyEncoded
Set the referenceKey from Base64 encoded byte array- Parameters:
encodedKey
- base64 encoded key
-
setReferenceKeyPlainText
Set the referenceKey from plain text. Key content would be UTF-8 encoding of the string.This is useful when setting key via generic bean property manipulation from string properties. User can specify the key in plain text and that would be passed on this object via
PropertiesUtil.populate(Object, java.util.Map, boolean)
- Parameters:
textKey
- base64 encoded key- See Also:
-
usesBlobId
-
clearInUse
public void clearInUse()Description copied from interface:GarbageCollectableBlobStore
Clear all objects marked as "transiently in use".- Specified by:
clearInUse
in interfaceGarbageCollectableBlobStore
-
storeBlock
Store a block of data.- Parameters:
digest
- the content hash (32 bytes)level
- the indirection level (0 is for user data, 1 is a list of digests that point to user data, 2 is a list of digests that point to digests, and so on). This parameter is for informational use only, and it is not required to store it unless that's easy to achievedata
- the data to be stored (the number of bytes is at most the block size)- Throws:
IOException
-
startMark
Description copied from interface:GarbageCollectableBlobStore
Start the mark phase.- Specified by:
startMark
in interfaceGarbageCollectableBlobStore
- Throws:
IOException
-
sweep
Description copied from interface:GarbageCollectableBlobStore
Remove all unused blocks.- Specified by:
sweep
in interfaceGarbageCollectableBlobStore
- Returns:
- the number of removed blocks
- Throws:
IOException
-
isMarkEnabled
protected abstract boolean isMarkEnabled() -
mark
- Throws:
Exception
-
markInUse
- Throws:
IOException
-
readBlob
Description copied from interface:BlobStore
Read a number of bytes from a blob.- Specified by:
readBlob
in interfaceBlobStore
- Parameters:
blobId
- the blob idpos
- the position within the blobbuff
- the target byte arrayoff
- the offset within the target arraylength
- the number of bytes to read- Returns:
- the number of bytes read
- Throws:
IOException
-
load
Description copied from interface:Cache.Backend
Load the object. The method does not need to be synchronized (it is synchronized in the cache)- Specified by:
load
in interfaceCache.Backend<AbstractBlobStore.BlockId,
AbstractBlobStore.Data> - Parameters:
id
- the key- Returns:
- the value
-
readBlockFromBackend
Load the block from the storage backend. Returns null if the block was not found.- Parameters:
id
- the block id- Returns:
- the block data, or null
- Throws:
Exception
-
getBlobLength
Description copied from interface:BlobStore
Get the length of the blob.- Specified by:
getBlobLength
in interfaceBlobStore
- Parameters:
blobId
- the blob id- Returns:
- the length
- Throws:
IOException
-
mark
- Throws:
IOException
-
resolveChunks
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 interfaceGarbageCollectableBlobStore
- Parameters:
blobId
- the blob id- Returns:
- the iterator
- Throws:
IOException
- Signals that an I/O exception has occurred.
-
deleteChunks
Description copied from interface:GarbageCollectableBlobStore
Deletes the blobs with the given ids.- Specified by:
deleteChunks
in interfaceGarbageCollectableBlobStore
- Parameters:
chunkIds
- the chunk idsmaxLastModifiedTime
- 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
-
close
- Specified by:
close
in interfaceAutoCloseable
- Throws:
Exception
-