绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
badger mremap size mismatch数据库异常
2022-04-21 10:40:38

系统信息:

板子:NVIDIA Jetson Xavier NX

系统:Ubuntu 18.04.6 LTS (GNU/Linux 4.9.201-tegra aarch64)

go version go1.17.7 linux/arm64

报错信息:

while opening memtables error: while opening fid: 1 error: while updating skiplist error: mremap size mismatch: requested: 312 got: 134217728

复现(本人的代码和以下代码类似,所以直接引用,引用出处在文末贴出):

package main

import (
	"fmt"
	"github.com/dgraph-io/badger/v3"
)

func main() {
  dir := "./data/badger"
	db, err := badger.Open(badger.DefaultOptions(dir))
	if err != nil {
		fmt.Println(err)
	}

	//defer db.Close() // It's a requirement condition, not to close db
}
复制代码

当成程序出现异常panic或进行kill -9 pid操作时,第二次重新启动程序出现以下错误:

while opening memtables error: while opening fid: 1 error: while updating skiplist error: mremap size mismatch: requested: 312 got: 134217728
复制代码

解决:

查阅相关资料后得知,问题出现在 ristrettommap_linux.go的这行代码mmapAddr, mmapSize, errno := unix.Syscall6(unix.SYS_MREMAP,header.Data,...),在ARM64中,mmapSize是旧大小而不是不是分配的大小,这导致了if mmapSize != uintptr(size)判断时返回了一个报错*“mremap size mismatch”*信息。

而这也影响了引用了Ristretto项目的Badger数据库,而Ristretto-repo中并没有发布此问题的修复版本,只在master分支上cmomit了移除mmapSize的修复代码。

解决方案:

步,采用 Manish R Jainoutcaste-io/ristretto项目中发布的修复版本(Manish R Jain不再维护原repo,而是在fork中维护)

第二步,将Badgerristrettoclone到$GOPATH/src/github.com/dgraph-io/目录下,记得checkout自己想要的branch或tag

第三步,在自己项目中的go.mod中进行replace github.com/dgraph-io/badger/v3 => /yourself/gopath/src/github.com/dgraph-io/badger

第四步,在$GOPATH/src/github.com/dgraph-io/Badger的go.mod中也进行replace github.com/dgraph-io/ristretto => /yourself/gopath/src/github.com/dgraph-io/ristretto

第五步,重新编译即可解决问题

结尾:

出现问题后查阅以下相关资料:

discuss.dgraph.io/t/error-mre…

github.com/dgraph-io/r…


作者:七里蓝
链接:https://juejin.cn/post/7072995942999261215

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Badger
创建时间:2022-04-15 15:34:19
Badger
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • itt0918
    专家
戳我,来吐槽~