如何修复无效的 infinispan 数据存储?

How to fix an invalid infinispan data storage?

我有一个使用 Modeshape(版本 4.2.0.Final)和 Infinispan(版本 6.0.2.Final)的应用程序。 在最近的一次中断期间,我的 infinispan 存储似乎崩溃了,因为我现在无法从该存储中获取任何数据,但

等例外情况除外
Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to org.infinispan.metadata.InternalMetadata
    at org.infinispan.marshall.core.MarshalledEntryImpl.getMetadata(MarshalledEntryImpl.java:72) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.CacheLoaderInterceptor.loadIfNeeded(CacheLoaderInterceptor.java:266) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.CacheLoaderInterceptor.loadIfNeededAndUpdateStats(CacheLoaderInterceptor.java:335) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.CacheLoaderInterceptor.visitGetKeyValueCommand(CacheLoaderInterceptor.java:105) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.EntryWrappingInterceptor.visitGetKeyValueCommand(EntryWrappingInterceptor.java:116) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:112) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:74) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.visitGetKeyValueCommand(AbstractTxLockingInterceptor.java:60) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.locking.OptimisticLockingInterceptor.visitGetKeyValueCommand(OptimisticLockingInterceptor.java:108) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:112) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:74) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.TxInterceptor.enlistReadAndInvokeNext(TxInterceptor.java:226) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.TxInterceptor.visitGetKeyValueCommand(TxInterceptor.java:221) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.CacheMgmtInterceptor.visitGetKeyValueCommand(CacheMgmtInterceptor.java:92) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:110) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:73) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:74) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:333) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.CacheImpl.get(CacheImpl.java:377) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.CacheImpl.get(CacheImpl.java:369) ~[infinispan-core-6.0.2.Final.jar:6.0.2.Final]
    at org.infinispan.schematic.internal.CacheSchematicDb.get(CacheSchematicDb.java:72) ~[modeshape-schematic-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.cache.document.LocalDocumentStore.get(LocalDocumentStore.java:71) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.cache.document.WorkspaceCache.documentFor(WorkspaceCache.java:180) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.cache.document.WorkspaceCache.documentFor(WorkspaceCache.java:199) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.cache.document.WorkspaceCache.getNode(WorkspaceCache.java:231) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.cache.document.AbstractSessionCache.getNode(AbstractSessionCache.java:240) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.cache.document.WritableSessionCache.getNode(WritableSessionCache.java:161) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.cache.RepositoryCache$RepositoryFeaturesDetector.<init>(RepositoryCache.java:684) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.cache.RepositoryCache.<init>(RepositoryCache.java:314) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.JcrRepository$RunningState.<init>(JcrRepository.java:1139) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.JcrRepository$RunningState.<init>(JcrRepository.java:978) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.JcrRepository.doStart(JcrRepository.java:387) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]
    at org.modeshape.jcr.JcrRepository.login(JcrRepository.java:651) ~[modeshape-jcr-4.2.0.Final.jar:4.2.0.Final]

我的 infinispan 集群是使用这个 XML

配置的
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd"
            xmlns="urn:infinispan:config:6.0">

    <namedCache name="myApp">
        <persistence passivation="false">
            <singleFile
                fetchPersistentState="false"
                location="../myApp-data/jcr-data"
                ignoreModifications="false"
                preload="false"
                purgeOnStartup="false"
                shared="false"
            />
        </persistence>
        <transaction
                transactionManagerLookupClass="org.infinispan.transaction.lookup.DummyTransactionManagerLookup"
                transactionMode="TRANSACTIONAL" lockingMode="OPTIMISTIC"/>
    </namedCache>
</infinispan>

如前所述,在一次中断期间全部损坏,但我该如何恢复此数据存储?

没有类似 fsck 的工具来处理不一致的存储。虽然,单个文件存储的格式非常简单(checkout https://github.com/infinispan/infinispan/blob/6.0.x/core/src/main/java/org/infinispan/persistence/file/SingleFileStore.java )所以你可以自己写 reader 并分析哪里出了问题。