Загадочное сообщение об ошибке RocksDB

Кто-нибудь понимает, к чему относится эта ошибка RocksDB?

/column_family.cc:275: rockdb::ColumnFamilyData::~ColumnFamilyData(): Утверждение `refs_ == 0' не удалось. Прервано (сброшено ядро)


person user1305541    schedule 07.09.2015    source источник


Ответы (3)


Это ошибка утверждения, поднятая 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. В противном случае может оказаться невозможным найти источник ошибки. Дамп ядра также может предоставить полезную информацию, поскольку он содержит трассировку стека кода, который фактически вызвал деструктор объекта.

person stj    schedule 22.09.2015

Я заметил, что все ошибки 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)

person Igor Semin    schedule 24.03.2016

Утверждение 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);

Чтобы исправить такую ​​​​ошибку утверждения, убедитесь, что вы удалили все дескрипторы семейства столбцов перед закрытием БД.

person keelar    schedule 23.09.2016