- nebula 版本:3.0.2
- 问题的具体描述
为什么ActiveHostsMan::getActiveHosts函数内部不用加读锁呢?它内部使用prefix来scan rocksdb的kv,用到的iterator在有别的线程写入的情况下,这个iterator还是有效的吗?还能读出有效的数据来吗?
为什么代码里别的地方也是使用prefix来scan rocksdb的kv,这些地方却加锁了呢,比如LeaderBalanceJobExecutor::getAllSpaces这个函数?
ActiveHostsMan::getActiveHosts 这个函数一般都用在 meta 的 Processors 中。所有 meta Processor 入口处都加了读写锁。
所以其实涉及到prefix拉取的操作都是要加锁的是吗?
但我看到ListListenerProcessor::process里面也调用了ActiveHostsMan::getActiveHosts,这个调用从头到尾没看到加spaceLock锁的地方,这又是怎么回事呢?
好像刚刚没有操作成回复您。所以这里重新回复一下:
所以其实涉及到prefix拉取的操作都是要加锁的是吗?
但我看到ListListenerProcessor::process里面也调用了ActiveHostsMan::getActiveHosts,这个调用从头到尾没看到加spaceLock锁的地方,这又是怎么回事呢?
不是 spaceLock,是 LockUtils::lock()。
我理解调用ActiveHostsMan::getActiveHosts这个函数前,是不是应该上folly::SharedMutex::ReadHolder rHolder(LockUtils::spaceLock()) 这个锁呢?
我看到在ListListenerProcessor::process里也调用了ActiveHostsMan::getActiveHosts,但只上了LockUtils::listenerLock()这个锁,没有上LockUtils::spaceLock()这个锁,所以很困惑,想知道是什么情况。
我和你看的代码是不同的,原因是:我的是3.0.2版本;你的是master版本。感觉3.0.2版本有点问题?我看下最新的3.1.0和master版本的代码吧。
为什么点回复经常失败呢?
我和你看的代码是不同的,原因是:我的是3.0.2版本;你的是master版本。感觉3.0.2版本有点问题?我看下最新的3.1.0和master版本的代码吧。
虽然没成功,但是会有提醒的,放心。- -,我们论坛用的第三方的开源软件,这个 bug 我之前上报过。一直没修复…