ActiveHostsMan::getActiveHosts函数里为什么不用加锁?

  • 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()这个锁,所以很困惑,想知道是什么情况。

https://github.com/vesoft-inc/nebula/blob/master/src/meta/processors/listener/ListenerProcessor.cpp#L109

我和你看的代码是不同的,原因是:我的是3.0.2版本;你的是master版本。感觉3.0.2版本有点问题?我看下最新的3.1.0和master版本的代码吧。

为什么点回复经常失败呢?
我和你看的代码是不同的,原因是:我的是3.0.2版本;你的是master版本。感觉3.0.2版本有点问题?我看下最新的3.1.0和master版本的代码吧。

虽然没成功,但是会有提醒的,放心。- -,我们论坛用的第三方的开源软件,这个 bug 我之前上报过。一直没修复…