【问题标题】:RocksDB cryptic error messageRocksDB 神秘的错误信息
【发布时间】:2015-09-07 18:12:43
【问题描述】:

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

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

【问题讨论】:

    标签: rocksdb


    【解决方案1】:

    这是 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 的代码可能会很有用。否则可能无法找到错误源。 核心转储也可能提供有用的信息,因为它包含实际调用对象析构函数的代码的堆栈跟踪。

    【讨论】:

      【解决方案2】:

      我注意到所有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)

      【讨论】:

        【解决方案3】:

        断言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);
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-18
          • 2014-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-20
          • 2015-03-13
          相关资源
          最近更新 更多