2015-09-07 108 views
0

有誰知道這個RocksDB錯誤是指什麼?RocksDB神祕的錯誤消息

/column_family.cc:275:rocksdb :: ColumnFamilyData ::〜ColumnFamilyData(): 斷言`refs_ == 0' 失敗。 Aborted(核心轉儲)

回答

2

這是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的代碼。否則,可能無法找到錯誤來源。 核心轉儲也可能提供有用的信息,因爲它包含實際調用對象的析構函數的代碼的堆棧跟蹤。

0

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

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

要修復此斷言失敗,請確保在關閉數據庫之前刪除所有列族句柄。