public class ScatteredCacheWriterInterceptor extends CacheWriterInterceptor
DistCacheWriterInterceptor
but as commands are not forwarded from primary owner
so we just write to the store all the time (with non-shared interceptors).
Uses its own locking scheme to order writes into the store - if there is a newer write into DC,
the older write is ignored. This could improve contented case, but has one strange property:
Assume CS contains V1, T2 writes V2 and T3 writes V3; if T2 receives version and stores into DC
before T3 but arrives here after T3 the V2 write into CS is ignored but the operation is confirmed
as if it was persisted correctly.
If T3 then (spuriously) fails to write into the store, V1 stays in CS but the error is reported
only to T3 - that means that T3 effectivelly rolled back V2 into V1 (and reported this as an error).
This may surprise some users.
Reads can be blocked by ongoing writes, though; when T2 finishes and then the application attempts
to read the value, and removal from T3 is not complete yet the read would not find the value in DC
(because it was removed by T3) but could load V1 from cache store. Therefore, read must wait until
the current write (that could have interacted with previous write) finishes.
TODO: block writes until other write completes, and don't block reads
However, blocking reads in cachestore is not something unusual; the DC lock is acquired when writing
the cache store during eviction/passivation, or during write skew checks in other modes as well.Modifier and Type | Class and Description |
---|---|
class |
ScatteredCacheWriterInterceptor.LockTimeoutFuture |
handlePutMapCommandReturn, persistenceManager
cacheConfiguration
Constructor and Description |
---|
ScatteredCacheWriterInterceptor() |
commitCommand, getNumberOfPersistedEntries, getWritesToTheStores, handlePutMapCommandReturn, isProperWriter, isStoreEnabled, resetStatistics, store, visitClearCommand, visitCommitCommand, visitPrepareCommand
getStatisticsEnabled, onStart, setStatisticsEnabled
handleDefault, visitCommand, visitEntrySetCommand, visitEvictCommand, visitGetKeysInGroupCommand, visitInvalidateCommand, visitInvalidateL1Command, visitKeySetCommand, visitLockControlCommand, visitReadOnlyKeyCommand, visitReadOnlyManyCommand, visitRollbackCommand, visitSizeCommand, visitUnknownCommand
asyncInvokeNext, asyncInvokeNext, asyncInvokeNext, asyncValue, delayedNull, delayedValue, delayedValue, invokeNext, invokeNextAndExceptionally, invokeNextAndFinally, invokeNextAndHandle, invokeNextThenAccept, invokeNextThenApply, isSuccessfullyDone, makeStage, setNextInterceptor, valueOrException
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
visitRemoveExpiredCommand
protected Log getLog()
getLog
in class CacheWriterInterceptor
public void start()
start
in class CacheWriterInterceptor
public Object visitGetKeyValueCommand(InvocationContext ctx, GetKeyValueCommand command) throws Throwable
visitGetKeyValueCommand
in interface Visitor
visitGetKeyValueCommand
in class DDAsyncInterceptor
Throwable
public Object visitGetCacheEntryCommand(InvocationContext ctx, GetCacheEntryCommand command) throws Throwable
visitGetCacheEntryCommand
in interface Visitor
visitGetCacheEntryCommand
in class DDAsyncInterceptor
Throwable
public Object visitGetAllCommand(InvocationContext ctx, GetAllCommand command) throws Throwable
visitGetAllCommand
in interface Visitor
visitGetAllCommand
in class DDAsyncInterceptor
Throwable
public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command) throws Throwable
visitPutKeyValueCommand
in interface Visitor
visitPutKeyValueCommand
in class CacheWriterInterceptor
Throwable
public Object visitReplaceCommand(InvocationContext ctx, ReplaceCommand command) throws Throwable
visitReplaceCommand
in interface Visitor
visitReplaceCommand
in class CacheWriterInterceptor
Throwable
public Object visitRemoveCommand(InvocationContext ctx, RemoveCommand command) throws Throwable
visitRemoveCommand
in interface Visitor
visitRemoveCommand
in class CacheWriterInterceptor
Throwable
public Object visitComputeCommand(InvocationContext ctx, ComputeCommand command) throws Throwable
visitComputeCommand
in interface Visitor
visitComputeCommand
in class CacheWriterInterceptor
Throwable
public Object visitComputeIfAbsentCommand(InvocationContext ctx, ComputeIfAbsentCommand command) throws Throwable
visitComputeIfAbsentCommand
in interface Visitor
visitComputeIfAbsentCommand
in class CacheWriterInterceptor
Throwable
public Object visitPutMapCommand(InvocationContext ctx, PutMapCommand command) throws Throwable
visitPutMapCommand
in interface Visitor
visitPutMapCommand
in class CacheWriterInterceptor
Throwable
public Object visitReadWriteKeyCommand(InvocationContext ctx, ReadWriteKeyCommand command) throws Throwable
visitReadWriteKeyCommand
in interface Visitor
visitReadWriteKeyCommand
in class CacheWriterInterceptor
Throwable
public Object visitReadWriteKeyValueCommand(InvocationContext ctx, ReadWriteKeyValueCommand command) throws Throwable
visitReadWriteKeyValueCommand
in interface Visitor
visitReadWriteKeyValueCommand
in class CacheWriterInterceptor
Throwable
public Object visitWriteOnlyKeyCommand(InvocationContext ctx, WriteOnlyKeyCommand command) throws Throwable
visitWriteOnlyKeyCommand
in interface Visitor
visitWriteOnlyKeyCommand
in class CacheWriterInterceptor
Throwable
public Object visitWriteOnlyKeyValueCommand(InvocationContext ctx, WriteOnlyKeyValueCommand command) throws Throwable
visitWriteOnlyKeyValueCommand
in interface Visitor
visitWriteOnlyKeyValueCommand
in class CacheWriterInterceptor
Throwable
public Object visitWriteOnlyManyCommand(InvocationContext ctx, WriteOnlyManyCommand command) throws Throwable
visitWriteOnlyManyCommand
in interface Visitor
visitWriteOnlyManyCommand
in class CacheWriterInterceptor
Throwable
public Object visitWriteOnlyManyEntriesCommand(InvocationContext ctx, WriteOnlyManyEntriesCommand command) throws Throwable
visitWriteOnlyManyEntriesCommand
in interface Visitor
visitWriteOnlyManyEntriesCommand
in class CacheWriterInterceptor
Throwable
public Object visitReadWriteManyCommand(InvocationContext ctx, ReadWriteManyCommand command) throws Throwable
visitReadWriteManyCommand
in interface Visitor
visitReadWriteManyCommand
in class CacheWriterInterceptor
Throwable
public Object visitReadWriteManyEntriesCommand(InvocationContext ctx, ReadWriteManyEntriesCommand command) throws Throwable
visitReadWriteManyEntriesCommand
in interface Visitor
visitReadWriteManyEntriesCommand
in class CacheWriterInterceptor
Throwable
protected boolean skipSharedStores(InvocationContext ctx, Object key, FlagAffectedCommand command)
skipSharedStores
in class CacheWriterInterceptor
Copyright © 2021 JBoss by Red Hat. All rights reserved.