Class TransactionalBlobStore
- java.lang.Object
-
- org.nuxeo.ecm.core.blob.AbstractBlobStore
-
- org.nuxeo.ecm.core.blob.TransactionalBlobStore
-
- All Implemented Interfaces:
javax.transaction.Synchronization
,BlobStore
public class TransactionalBlobStore extends AbstractBlobStore implements javax.transaction.Synchronization
Transactional Blob Store.Until the transaction is committed, blobs are stored in a transient store. Upon commit, they are sent to the permanent store.
It is important that a copy operation between the transient store and the permanent store be extremely fast and never fail, as it will be done during commit.
- Since:
- 11.1
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
TransactionalBlobStore.TransientInfo
Transient data recording operations applied to a blob, to be executed on the permanent store at commit time.-
Nested classes/interfaces inherited from interface org.nuxeo.ecm.core.blob.BlobStore
BlobStore.OptionalOrUnknown<T>
-
-
Field Summary
Fields Modifier and Type Field Description protected static String
DELETE_MARKER
protected Map<String,javax.transaction.Transaction>
keysInActiveTransactions
BlobStore
store
protected ThreadLocal<Map<String,TransactionalBlobStore.TransientInfo>>
transientInfo
BlobStore
transientStore
-
Fields inherited from class org.nuxeo.ecm.core.blob.AbstractBlobStore
blobProviderId, BYTE_RANGE_SEP, keyStrategy, name
-
-
Constructor Summary
Constructors Constructor Description TransactionalBlobStore(String blobProviderId, BlobStore store, BlobStore transientStore)
TransactionalBlobStore(BlobStore store, BlobStore transientStore)
Deprecated.since 11.5
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
afterCompletion(int status)
void
beforeCompletion()
void
clear()
INTERNAL (TESTS).String
copyOrMoveBlob(String key, BlobStore sourceStore, String sourceKey, boolean atomicMove)
Writes a file based on a key, as an optimized copy/move from a source in another compatible blob store.void
deleteBlob(String key)
Deletes a blob based on a key.BinaryGarbageCollector
getBinaryGarbageCollector()
Returns the binary garbage collector (GC).BlobStore.OptionalOrUnknown<Path>
getFile(String key)
Gets an already-existing file containing the blob for the given key, if present.BlobStore.OptionalOrUnknown<InputStream>
getStream(String key)
Gets the stream of the blob for the given key, if present.protected javax.transaction.Transaction
getTransaction()
protected TransactionalBlobStore.TransientInfo
getTransientInfo(String key)
protected String
getTransientKey(String key)
boolean
hasVersioning()
Whether this blob store has versioning.protected static boolean
isDeleteMarker(String transientKey)
protected void
putTransientKey(String key, String transientKey)
protected void
putTransientUpdate(String key, BlobUpdateContext blobUpdateContext)
boolean
readBlob(String key, Path file)
Reads a blob based on its key into the given file.BlobStore
unwrap()
If this blob store wraps another one, returns it, otherwise returns this.boolean
useAsyncDigest()
Whether this blob store is configured for async digest computation.protected String
writeBlobGeneric(BlobWriteContext blobWriteContext)
Writes the blob without using any store-to-store optimization.void
writeBlobProperties(BlobUpdateContext blobUpdateContext)
Sets properties on a blob.-
Methods inherited from class org.nuxeo.ecm.core.blob.AbstractBlobStore
copyBlobIsOptimized, deleteBlob, getBlobKeyReplacement, getByteRangeFromKey, getKeyStrategy, getName, logTrace, logTrace, logTrace, notifyAsyncDigest, randomLong, randomString, setByteRangeInKey, stripBlobKeyPrefix, stripBlobKeyVersionSuffix, transfer, transfer, transfer, writeBlob, writeBlob, writeBlobUsingOptimizedCopy
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.nuxeo.ecm.core.blob.BlobStore
copyBlob, exists, hasDefaultStorageClass
-
-
-
-
Field Detail
-
store
public final BlobStore store
-
transientStore
public final BlobStore transientStore
-
transientInfo
protected final ThreadLocal<Map<String,TransactionalBlobStore.TransientInfo>> transientInfo
-
keysInActiveTransactions
protected final Map<String,javax.transaction.Transaction> keysInActiveTransactions
-
DELETE_MARKER
protected static final String DELETE_MARKER
- See Also:
- Constant Field Values
-
-
Method Detail
-
isDeleteMarker
protected static boolean isDeleteMarker(String transientKey)
-
getBinaryGarbageCollector
public BinaryGarbageCollector getBinaryGarbageCollector()
Description copied from interface:BlobStore
Returns the binary garbage collector (GC).Several calls to this method will return the same GC, so that its status can be monitored using
BinaryGarbageCollector.isInProgress()
.- Specified by:
getBinaryGarbageCollector
in interfaceBlobStore
- Returns:
- the binary GC
-
hasVersioning
public boolean hasVersioning()
Description copied from interface:BlobStore
Whether this blob store has versioning.With versioning, two writes may use the same key. The returned keys will include a different version number to distinguish the writes.
- Specified by:
hasVersioning
in interfaceBlobStore
- Overrides:
hasVersioning
in classAbstractBlobStore
-
unwrap
public BlobStore unwrap()
Description copied from interface:BlobStore
If this blob store wraps another one, returns it, otherwise returns this.- Specified by:
unwrap
in interfaceBlobStore
- Overrides:
unwrap
in classAbstractBlobStore
- Returns:
- the lowest-level blob store
-
writeBlobGeneric
protected String writeBlobGeneric(BlobWriteContext blobWriteContext) throws IOException
Description copied from class:AbstractBlobStore
Writes the blob without using any store-to-store optimization.- Overrides:
writeBlobGeneric
in classAbstractBlobStore
- Throws:
IOException
-
copyOrMoveBlob
public String copyOrMoveBlob(String key, BlobStore sourceStore, String sourceKey, boolean atomicMove) throws IOException
Description copied from interface:BlobStore
Writes a file based on a key, as an optimized copy/move from a source in another compatible blob store.The target
key
may benull
, which is a signal from the caller that it has determined that deduplication is enabled and async digest computation is enabled, but the needed digest hasn't been computed, so this method should either find the digest in an efficient way if it can, or otherwise trigger an async digest computation.If the copy/move is requested to be atomic, then the destination file is created atomically. In case of atomic move, in some stores the destination will be created atomically but the source will only be deleted afterwards.
The returned key may be different than the passed one when versioning is used.
- Specified by:
copyOrMoveBlob
in interfaceBlobStore
- Parameters:
key
- the key; ornull
if the store should choose it or trigger async digest computationsourceStore
- the source storesourceKey
- the source keyatomicMove
-true
for an atomic move,false
for a regular copy- Returns:
- the key of the copied/moved file, or
null
if copy/move failed - Throws:
IOException
-
useAsyncDigest
public boolean useAsyncDigest()
Description copied from class:AbstractBlobStore
Whether this blob store is configured for async digest computation.- Overrides:
useAsyncDigest
in classAbstractBlobStore
-
getFile
public BlobStore.OptionalOrUnknown<Path> getFile(String key)
Description copied from interface:BlobStore
Gets an already-existing file containing the blob for the given key, if present.Note that this method is best-effort, it may return unknown even though the blob exists in the store, it's just that it's not handily available locally in a file.
-
getStream
public BlobStore.OptionalOrUnknown<InputStream> getStream(String key) throws IOException
Description copied from interface:BlobStore
Gets the stream of the blob for the given key, if present.Note that this method is best-effort, it may return unknown even though the blob exists in the store, it's just that it's not efficient to return it as a stream.
- Specified by:
getStream
in interfaceBlobStore
- Parameters:
key
- the blob key- Returns:
- the blob stream, or empty if the blob cannot be found, or unknown if no stream is efficiently available
- Throws:
IOException
-
readBlob
public boolean readBlob(String key, Path file) throws IOException
Description copied from interface:BlobStore
Reads a blob based on its key into the given file.- Specified by:
readBlob
in interfaceBlobStore
- Parameters:
key
- the blob keyfile
- the file to use to store the fetched data- Returns:
true
if the file was fetched,false
if the file was not found- Throws:
IOException
-
writeBlobProperties
public void writeBlobProperties(BlobUpdateContext blobUpdateContext) throws IOException
Description copied from interface:BlobStore
Sets properties on a blob.- Specified by:
writeBlobProperties
in interfaceBlobStore
- Overrides:
writeBlobProperties
in classAbstractBlobStore
- Parameters:
blobUpdateContext
- the blob update context- Throws:
IOException
-
deleteBlob
public void deleteBlob(String key)
Description copied from interface:BlobStore
Deletes a blob based on a key. No error occurs if the blob does not exist.This method does not throw
IOException
, but may log an error message.- Specified by:
deleteBlob
in interfaceBlobStore
- Parameters:
key
- the blob key
-
clear
public void clear()
Description copied from interface:BlobStore
INTERNAL (TESTS). Clears the blob store of all its data.
-
getTransaction
protected javax.transaction.Transaction getTransaction()
-
putTransientUpdate
protected void putTransientUpdate(String key, BlobUpdateContext blobUpdateContext)
-
getTransientInfo
protected TransactionalBlobStore.TransientInfo getTransientInfo(String key)
-
beforeCompletion
public void beforeCompletion()
- Specified by:
beforeCompletion
in interfacejavax.transaction.Synchronization
-
afterCompletion
public void afterCompletion(int status)
- Specified by:
afterCompletion
in interfacejavax.transaction.Synchronization
-
-