首页 > 解决方案 > Jetbrains xodus 没有更多可用字节错误

问题描述

我在我的应用程序中使用 Jetbrains 的 Exodus 作为嵌入式数据库。最近我遇到了一些奇怪的行为,我担心其中一家商店坏了。至少我不能再访问它了。

jetbrains.exodus.ExodusException: DataIterator: no more bytes available, address = 19359, file = 00000000000.xd
        at jetbrains.exodus.log.DataIterator.next(DataIterator.java:60)
        at jetbrains.exodus.log.Log.readNotNull(Log.java:440)
        at jetbrains.exodus.tree.btree.BTreeBase.getLoggable(BTreeBase.java:119)
        at jetbrains.exodus.tree.btree.BTreeBase.compareLeafToKey(BTreeBase.java:170)
        at jetbrains.exodus.tree.btree.BasePageImmutable.binarySearch(BasePageImmutable.java:169)
        at jetbrains.exodus.tree.btree.BasePageImmutable.binarySearch(BasePageImmutable.java:121)
        at jetbrains.exodus.tree.btree.BottomPage.get(BottomPage.java:139)
        at jetbrains.exodus.tree.btree.BottomPage.get(BottomPage.java:57)
        at jetbrains.exodus.tree.btree.InternalPage.get(InternalPage.java:98)
        at jetbrains.exodus.tree.btree.InternalPage.get(InternalPage.java:72)
        at jetbrains.exodus.tree.btree.InternalPage.get(InternalPage.java:98)
        at jetbrains.exodus.tree.btree.InternalPage.get(InternalPage.java:72)
        at jetbrains.exodus.tree.btree.BTreeBase.get(BTreeBase.java:181)
        at jetbrains.exodus.env.StoreImpl.get(StoreImpl.java:79)

更重要的是,恐怕其他的店铺也会同样破门而入,进不去。我正在使用单一环境和大约 10 家不同的商店。整个数据库的 gzip 备份大约是 2 GB。您知道问题的根本原因是什么以及如何恢复存储吗?

环境启动还有一个异常:

2019-11-19 19:15:49,897 13408 [Exodus shared background cleaner] ERROR j.exodus.gc.GarbageCollector - cleanFile(000000r1g00.xd)
jetbrains.exodus.ExodusException: DataIterator: no more bytes available, address = 6019, file = 00000000000.xd
        at jetbrains.exodus.log.DataIterator.next(DataIterator.java:60)
        at jetbrains.exodus.log.Log.readNotNull(Log.java:440)
        at jetbrains.exodus.tree.btree.BTreeBase.getLoggable(BTreeBase.java:119)
        at jetbrains.exodus.tree.btree.BTreeBase.compareLeafToKey(BTreeBase.java:170)
        at jetbrains.exodus.tree.btree.BasePageImmutable.binarySearch(BasePageImmutable.java:169)
        at jetbrains.exodus.tree.btree.BTreeTraverser.getNextSibling(BTreeTraverser.java:141)
        at jetbrains.exodus.tree.btree.LeafNode.reclaim(LeafNode.java:154)
        at jetbrains.exodus.tree.btree.BTreeMutable.reclaim(BTreeMutable.java:295)
        at jetbrains.exodus.env.StoreImpl.reclaim(StoreImpl.java:160)
        at jetbrains.exodus.gc.GarbageCollector.cleanSingleFile(GarbageCollector.java:377)
        at jetbrains.exodus.gc.GarbageCollector.doCleanFiles(GarbageCollector.java:288)
        at jetbrains.exodus.gc.GarbageCollector.cleanFiles(GarbageCollector.java:215)
        at jetbrains.exodus.gc.BackgroundCleaningJob.cleanFiles(BackgroundCleaningJob.java:139)
        at jetbrains.exodus.gc.BackgroundCleaningJob.doCleanLog(BackgroundCleaningJob.java:110)
        at jetbrains.exodus.gc.BackgroundCleaningJob.execute(BackgroundCleaningJob.java:78)
        at jetbrains.exodus.core.execution.Job.run(Job.java:99)
        at jetbrains.exodus.core.execution.ThreadJobProcessor.executeJob(ThreadJobProcessor.java:132)
        at jetbrains.exodus.core.execution.JobProcessorQueueAdapter.doExecuteJob(JobProcessorQueueAdapter.java:238)
        at jetbrains.exodus.core.execution.JobProcessorQueueAdapter.doTimedJobs(JobProcessorQueueAdapter.java:190)
        at jetbrains.exodus.core.execution.JobProcessorQueueAdapter.doJobs(JobProcessorQueueAdapter.java:161)
        at jetbrains.exodus.core.execution.ThreadJobProcessor.run(ThreadJobProcessor.java:110)
        at jetbrains.exodus.core.execution.ThreadJobProcessor$1.run(ThreadJobProcessor.java:43)
        at java.lang.Thread.run(Thread.java:745)
2019-11-19 19:15:49,898 13409 [Exodus shared background cleaner] ERROR j.exodus.gc.BackgroundCleaner - DataIterator: no more bytes available, address = 6019, file = 00000000000.xd
jetbrains.exodus.ExodusException: DataIterator: no more bytes available, address = 6019, file = 00000000000.xd
        at jetbrains.exodus.log.DataIterator.next(DataIterator.java:60)
        at jetbrains.exodus.log.Log.readNotNull(Log.java:440)
        at jetbrains.exodus.tree.btree.BTreeBase.getLoggable(BTreeBase.java:119)
        at jetbrains.exodus.tree.btree.BTreeBase.compareLeafToKey(BTreeBase.java:170)
        at jetbrains.exodus.tree.btree.BasePageImmutable.binarySearch(BasePageImmutable.java:169)
        at jetbrains.exodus.tree.btree.BTreeTraverser.getNextSibling(BTreeTraverser.java:141)
        at jetbrains.exodus.tree.btree.LeafNode.reclaim(LeafNode.java:154)
        at jetbrains.exodus.tree.btree.BTreeMutable.reclaim(BTreeMutable.java:295)
        at jetbrains.exodus.env.StoreImpl.reclaim(StoreImpl.java:160)
        at jetbrains.exodus.gc.GarbageCollector.cleanSingleFile(GarbageCollector.java:377)
        at jetbrains.exodus.gc.GarbageCollector.doCleanFiles(GarbageCollector.java:288)
        at jetbrains.exodus.gc.GarbageCollector.cleanFiles(GarbageCollector.java:215)
        at jetbrains.exodus.gc.BackgroundCleaningJob.cleanFiles(BackgroundCleaningJob.java:139)
        at jetbrains.exodus.gc.BackgroundCleaningJob.doCleanLog(BackgroundCleaningJob.java:110)
        at jetbrains.exodus.gc.BackgroundCleaningJob.execute(BackgroundCleaningJob.java:78)
        at jetbrains.exodus.core.execution.Job.run(Job.java:99)
        at jetbrains.exodus.core.execution.ThreadJobProcessor.executeJob(ThreadJobProcessor.java:132)
        at jetbrains.exodus.core.execution.JobProcessorQueueAdapter.doExecuteJob(JobProcessorQueueAdapter.java:238)
        at jetbrains.exodus.core.execution.JobProcessorQueueAdapter.doTimedJobs(JobProcessorQueueAdapter.java:190)
        at jetbrains.exodus.core.execution.JobProcessorQueueAdapter.doJobs(JobProcessorQueueAdapter.java:161)
        at jetbrains.exodus.core.execution.ThreadJobProcessor.run(ThreadJobProcessor.java:110)
        at jetbrains.exodus.core.execution.ThreadJobProcessor$1.run(ThreadJobProcessor.java:43)
        at java.lang.Thread.run(Thread.java:745)

标签: xodus

解决方案


看起来其中一个环境由于某种原因被破坏了。

在大多数情况下,可以使用反射工具修复损坏的环境。xodus-tools.jar请从https://mvnrepository.com/artifact/org.jetbrains.xodus/xodus-tools下载最新发布的版本。假设sourceDir是损坏环境所在的路径。targetDir准备工具将创建环境副本的空路径。跑:

java -jar <path to jar>/xodus-tools.jar reflect -c sourceDir targetDir

该工具有什么作用?它在targetDir环境的固定和压缩副本中从sourceDir. 它尝试复制尽可能多的键/值对。

尝试针对固定环境运行您的应用程序。如果可以,请将 Xodus 版本更新到最新版本。


推荐阅读