有谁明白这个 RocksDB 错误指的是什么?
/column_family.cc:275:rocksdb::ColumnFamilyData::~ColumnFamilyData(): 断言 `refs_ == 0' 失败。中止(核心转储)
有谁明白这个 RocksDB 错误指的是什么?
/column_family.cc:275:rocksdb::ColumnFamilyData::~ColumnFamilyData(): 断言 `refs_ == 0' 失败。中止(核心转储)
这是 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 的代码可能会很有用。否则可能无法找到错误源。核心转储也可能提供有用的信息,因为它包含实际调用对象析构函数的代码的堆栈跟踪。
我注意到所有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)
断言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);
要修复此类断言失败,请确保在关闭数据库之前删除所有列族句柄。