public interface EntryFactory
MVCCEntry
instances for use in the InvocationContext
.
Implementations of this interface would typically wrap an internal CacheEntry
with an MVCCEntry
.
EntryWrappingInterceptor
checks CacheTopology.getReadConsistentHash()
and if this node is an owner
of the key, it loads the entry from DataContainer
. On the way back through interceptor stack, the entry is
committed from EntryWrappingInterceptor
through ClusteringDependentLogic
which checks
CacheTopology.getWriteConsistentHash()
.
Entry being wrapped is a prerequisite for the command to run and therefore commit the entry, but it's not up to
EntryWrappingInterceptor
to make sure the entry is always wrapped - all the interceptors below can expect
is (key is in readCH) => (entry is wrapped). The entry may be wrapped by EWI or other interceptors later,
e.g. (but not limited to) when:
If the entry should be read locally but it's not found in DC, the entry will be wrapped by
EntryWrappingInterceptor
(either as NullCacheEntry
for reads or other appropriate type for writes).
Such entry returns false
on CacheEntry.skipLookup()
as it's value is unsure (subsequent
interceptors can retrieve the new value from the cache store or remote node and call
wrapExternalEntry(org.infinispan.context.InvocationContext, java.lang.Object, org.infinispan.container.entries.CacheEntry, boolean, boolean)
to update the context.
With repeatable reads, the value that is context must not be overwritten by value out of the transaction
(only commands in this transaction can change the context entry. That's why EntryWrappingInterceptor
calls CacheEntry.setSkipLookup(boolean)
from the return handler for every command.
When a command is retried and repeatable reads are not used, the entry is removed from the context completely
and wrapped again by EntryWrappingInterceptor
. When repeatable reads are in use,
RepeatableReadEntry
entry keeps the value before the command was executed
and the context is reset to this value.
This summarizes expected behaviour of interceptors loading from persistence layer:
OutdatedTopologyException
is thrown)
VisitableCommand.loadType()
is OWNER
:
retrieve the value from remote node
In local mode, the data can be always read and written, so there is no risk that a command won't have the entry wrapped.
Modifier and Type | Method and Description |
---|---|
void |
wrapEntryForExpired(InvocationContext ctx,
Object key,
int segment)
Insert an entry that exists in the data container into the context, even if it is expired
Doesn't do anything if the key was already wrapped
|
CompletionStage<Void> |
wrapEntryForReading(InvocationContext ctx,
Object key,
int segment,
boolean isOwner,
boolean hasLock)
Wraps an entry for reading.
|
CompletionStage<Void> |
wrapEntryForWriting(InvocationContext ctx,
Object key,
int segment,
boolean isOwner,
boolean isRead)
Insert an entry that exists in the data container into the context.
|
void |
wrapExternalEntry(InvocationContext ctx,
Object key,
CacheEntry externalEntry,
boolean isRead,
boolean isWrite)
Insert an external entry (e.g.
|
CompletionStage<Void> wrapEntryForReading(InvocationContext ctx, Object key, int segment, boolean isOwner, boolean hasLock)
CacheEntry
but certain combinations of isolation
levels and the presence of an ongoing JTA transaction may force this to be a proper, wrapped MVCCEntry. The entry
is also typically placed in the invocation context.ctx
- current invocation contextkey
- key to look up and wrapsegment
- segment for the keyisOwner
- true if this node is current owner in readCH (or we ignore CH)hasLock
- true if the invoker already has the lock for this keyCompletionStage<Void> wrapEntryForWriting(InvocationContext ctx, Object key, int segment, boolean isOwner, boolean isRead)
The returned stage will always be complete if isOwner is false.
ctx
- current invocation contextkey
- key to look up and wrapsegment
- segment for the keyisOwner
- true if this node is current owner in readCH (or we ignore CH)isRead
- true if this operation is expected to read the value of the entryvoid wrapEntryForExpired(InvocationContext ctx, Object key, int segment)
ctx
- current invocation contextkey
- key to look up and wrapsegment
- segment for the keyvoid wrapExternalEntry(InvocationContext ctx, Object key, CacheEntry externalEntry, boolean isRead, boolean isWrite)
ctx
- current invocation contextkey
- key to look up and wrapexternalEntry
- the value to be inserted into contextisRead
- true if this operation is expected to read the value of the entryisWrite
- if this is executed within a write commandCopyright © 2021 JBoss by Red Hat. All rights reserved.