badger mremap size mismatch数据库异常

2022-04-21 00:00:00 专区 订阅 代码 引用 修复

系统信息:

板子: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
复制代码

解决:

查阅相关资料后得知,问题出现在 ristretto库 mmap_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 Jain在outcaste-io/ristretto项目中发布的修复版本(Manish R Jain不再维护原repo,而是在fork中维护)

第二步,将Badger和 ristrettoclone到$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…

相关文章