xodus - 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-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 版本更新到最新版本。
推荐阅读
- r - 在 R 中使用 API 并转换为数据帧格式
- python - MemoryError 使用数字范围作为 dict 索引(低效)
- java - 如何使用 JSON 数据在 JavaFX TableView (Scene Builder) 上添加数据
- mysql - 我可以将多个 MySQL 列连接成一列吗?
- r - 查找数据中的所有循环
- javascript - 从 Node.js 获取 PHP 或 Javascript 响应
- vba - 将项目从个人日历移动到接收并自动接受邀请的团队日历?
- ruby - Mac OS Mojave 上的 Ruby 2.4:找不到图像...与 openssl.bundle 相关
- javascript - 运行玩笑测试时出现jsx意外标识符
- python - 尝试使用 USB 将 Nintendo Switch 与 Raspberry 3b+ 通信