-
Notifications
You must be signed in to change notification settings - Fork 566
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rewriteaof 存在死锁的可能 #32
Comments
明白, 还真有点难处理。我把 rewrite buffer 改到临时文件好了 |
这个方案没有解决 aofRewriteBuffer <- cmd 会阻塞的问题。handleAof 被阻塞后,db.aofChan 很快也会填满,进而阻塞主协程的 addAof 函数, 最终导致所有写命令被阻塞,同时 goroutine 数量迅速上升。我觉得还是从源头上解决 aofRewriteBuffer 会被填满的问题比较好 |
是的,上面的方案只是解决了死锁的问题。要解决aofRewriteBuffer阻塞的问题,还有个方法:
|
好主意 |
如果当前数据库中有1G的数据,再加载一份AOF文件岂不是内存又多占用了1G? |
fixed in 48ba261 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
aof重写步骤为:
开始rewrite,对应startRewrite方法
获取写锁,暂停aof写入
获取aof文件大小
创建rewriteBuffer channel(带缓冲channel)
生成临时文件
释放写锁,恢复aof写入
读取aof文件内容,加载内容到临时DB对象
根据临时DB对象的数据,生成命令写入临时文件
结束rewrite
获取写锁,暂停aof写入
读取rewriteBuffer,写入aof临时文件
关闭rewriteBuffer,并设置为nil
重命名临时文件为aof文件
open 新的aof文件,并设置为db.aofFile
释放写锁,恢复aof写入
而主程序,在第一步与第四步之间,一直可以写入aof chan,在处理aof chan中的数据时,同步写入一份到rewriteBuffer chan中,此时会存在一个问题: 程序写入aof时命令较多,超过了rewriteBuffer的缓冲大小,此时会出现 handleAof方法获取到了读锁,但是在写入rewriteBuffer时,阻塞住了,无法释放读锁
而 finishRewrite 方法,在结束rewrite时,需要先获取到写锁,才会接收 rewriteBuffer chan的数据,就会出现锁已被 handleAof占用,finishRewrite方法获取不到锁的情况,从而导致死锁
The text was updated successfully, but these errors were encountered: