有没有人理解这个RocksDB错误引用的内容?
/column_family.cc:275:rocksdb :: ColumnFamilyData :: ~ColumnFamilyData(): 断言`refs_ == 0'失败。中止(核心倾销)
答案 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);
要修复此类断言失败,请确保在关闭数据库之前删除所有列族句柄。