有誰知道這個RocksDB錯誤是指什麼?RocksDB神祕的錯誤消息
/column_family.cc:275:rocksdb :: ColumnFamilyData ::〜ColumnFamilyData(): 斷言`refs_ == 0' 失敗。 Aborted(核心轉儲)
有誰知道這個RocksDB錯誤是指什麼?RocksDB神祕的錯誤消息
/column_family.cc:275:rocksdb :: ColumnFamilyData ::〜ColumnFamilyData(): 斷言`refs_ == 0' 失敗。 Aborted(核心轉儲)
這是RocksDB引發的斷言失敗,它故意終止程序的執行。
通常,程序員使用斷言來確保程序中的某些不變量。斷言有一些運行時間開銷,因此可以完全禁用。通常它們被編譯到開發或調試版本中,但在生產版本中被忽略。
當斷言失敗時,通過調用std::abort
立即中止程序執行。這可能會導致您的操作系統編寫核心轉儲(正如上面的消息所顯示的那樣),但是如果和在哪裏寫入核心轉儲取決於操作系統配置。
在這個特定的斷言的情況下,rocksdb::ColumnFamilyData
析構函數提出的主張,因爲它需要它的refs_
成員有0 refs_
的值是一個引用計數器,它是有道理的斷言,任何引用,實際持有的時調用對象的析構函數。
從僅查看析構函數代碼,不清楚這是RocksDB庫自身中的錯誤,還是錯誤地使用錯誤導致的錯誤,例如,當其他對象仍在使用時破壞列家族對象。
僅供參考,下面是提出的斷言代碼部分(目前在文件中的行365 rocksdb/DB/column_family.cc):
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 /環境)
斷言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);
要修復此斷言失敗,請確保在關閉數據庫之前刪除所有列族句柄。