RocksDB神秘错误消息

时间:2015-09-07 18:12:44

标签: rocksdb

有没有人理解这个RocksDB错误引用的内容?

  

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

3 个答案:

答案 0 :(得分:2)

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

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

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

在这个特定断言的情况下,rocksdb::ColumnFamilyData的析构函数引发了断言,因为它要求其refs_成员的值为0. refs_是一个引用计数器,它使得感觉断言在调用对象的析构函数时实际上没有引用。

从查看析构函数代码来看,目前还不清楚这是否是RocksDB库本身的错误,或者是错误使用错误导致的错误,例如:当列族系列对象仍然被其他对象使用时,它们将被销毁。

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

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

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

答案 1 :(得分:0)

我注意到在安装了不正确的rocksdb之后发生了所有column_family.cc错误(core_dumped,memory_order_relaxed等)。在我的流浪剧中,我发现了真实的方式。

而不是使用 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)

答案 2 :(得分: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);

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

相关问题