0

有谁明白这个 RocksDB 错误指的是什么?

/column_family.cc:275:rocksdb::ColumnFamilyData::~ColumnFamilyData(): 断言 `refs_ == 0' 失败。中止(核心转储)

4

3 回答 3

2

这是 RocksDB 提出的断言失败,它故意终止程序的执行。

通常,程序员使用断言来确保程序中的某些不变量。断言有一些运行时开销,因此可以完全禁用。通常它们被编译到开发或调试版本中,但在生产版本中被省略。

当断言失败时,程序执行会通过调用立即中止std::abort。这可能会导致您的操作系统编写核心转储(正如上面的消息所显示的那样显然是这样做的),但是是否写入核心转储以及在何处写入取决于操作系统配置。

在此特定断言的情况下,由于它要求其成员具有值 0 ,rocksdb::ColumnFamilyData因此引发断言的析构函数是一个引用计数器,并且断言在调用对象的析构函数时实际上没有任何引用是有意义的。refs_refs_

仅从析构函数代码来看,尚不清楚这是否是 RocksDB 库本身的错误,还是错误使用方式导致的错误,例如在列族对象仍在被其他对象使用时将其销毁。

作为参考,这里是引发断言的代码部分(目前在文件rocksdb/db/column_family.cc的第 365 行):

ColumnFamilyData::~ColumnFamilyData() {
  assert(refs_.load(std::memory_order_relaxed) == 0);

如果错误仍然存​​在,如果您在此处提供使用 RocksDB 的代码可能会很有用。否则可能无法找到错误源。核心转储也可能提供有用的信息,因为它包含实际调用对象析构函数的代码的堆栈跟踪。

于 2015-09-22T10:29:06.087 回答
0

我注意到所有column_family.cc错误(core_dumped、memory_order_relaxed 等)都发生在不正确的 Rocksdb 安装之后。在我的流浪脚本中,我找到了真正的方法。

而不是使用 https://github.com/facebook/rocksdb/blob/master/INSTALL.md

我创建脚本

cd /opt 
git clone https://github.com/facebook/rocksdb.git
cd rocksdb
git checkout tags/v4.1

PORTABLE=1 make shared_lib
export LD_LIBRARY_PATH=/opt/rocksdb

LD_LIBRARY_PATH 更好地添加到您的环境路径(.bash_rc 或 /etc/environment)

于 2016-03-24T09:03:38.350 回答
0

断言refs_ == 0失败~ColumnFamilyData()意味着当列族被删除时,列族的引用计数不为零。在关闭数据库之前,您很可能有一些未删除的列族句柄。请注意,在关闭数据库之前必须删除所有列族句柄。否则断言将失败。

// Before delete DB, you have to close All column families by calling
// DestroyColumnFamilyHandle() with all the handles.
static Status Open(const DBOptions& db_options, const std::string& name,
                   const std::vector<ColumnFamilyDescriptor>& column_families,
                   std::vector<ColumnFamilyHandle*>* handles, DB** dbptr);

要修复此类断言失败,请确保在关闭数据库之前删除所有列族句柄。

于 2016-09-23T21:40:11.983 回答