Беркли DB / bsddb3 DB.open ситуация "живой блокировки"

Не связанный с моим другим вопросом, я иногда сталкиваюсь с отдельной проблемой с Berkeley DB/bsdddb3. При некоторых неизвестных условиях база данных, защищенная транзакцией и контрольной суммой, а также часто проверяемая точка попадает в поврежденное состояние. В этом состоянии открытие базы данных приводит к очень странному поведению Python. Похоже, что запускается фоновый поток, в результате чего из файла базы данных читается огромное количество данных; сумма может намного превышать размер самой базы данных. Хотя этот поток выполняет поток, вызывающий DB.open, он в основном заблокирован, но иногда возвращается к отладчику через много минут, пока фоновый поток все еще работает. В этой ситуации большинство пошаговых инструкций (включая инструкции доступа не из БД) могут блокироваться на несколько минут больше, так как фоновый поток продолжает работать. В конце концов поток завершает работу, но производительность процесса крайне низкая, и вызовы функций доступа к БД могут зависать бесконечно (без использования ЦП / доступа к диску). Закрытие и перезапуск процесса не приводит к исправлению базы данных.

_data_store_env.log_set_config(bdb.DB_LOG_AUTO_REMOVE, True)
_data_store_env.set_lg_max(256 * 2**20)
_data_store_env.set_cachesize(0, 512 * 2**20)
_data_store_env.set_lg_dir(str(_journal_path))
_data_store_env.set_tmp_dir(str(tmp_dir))
_data_store_env.open(str(_bulk_data_path), bdb.DB_CREATE | bdb.DB_INIT_LOCK | bdb.DB_INIT_LOG | bdb.DB_INIT_MPOOL | bdb.DB_INIT_TXN | bdb.DB_RECOVER | bdb.DB_THREAD)

_data_store = bdb.DB(_data_store_env)
_data_store.set_flags(bdb.DB_CHKSUM)
_data_store.set_pagesize(65536)
_data_store.open("filestore.db", None, bdb.DB_HASH, bdb.DB_AUTO_COMMIT | bdb.DB_CREATE | bdb.DB_THREAD)

_idx_store = bdb.DB(_data_store_env)
_idx_store.set_flags(bdb.DB_CHKSUM | bdb.DB_DUPSORT)
_idx_store.open("idxstore.db", None, bdb.DB_HASH, bdb.DB_AUTO_COMMIT | bdb.DB_CREATE | bdb.DB_THREAD)
_data_store.associate(_idx_store, lambda key, data: key[0:9], bdb.DB_IMMUTABLE_KEY)

РЕДАКТИРОВАТЬ: Хотя я изначально полагал иначе, на самом деле это может быть другое проявление зависания bsddb3 DB.get/put с проблемой транзакции. До сих пор одно и то же несовершенное решение работает и для этого.

0 ответов

Другие вопросы по тегам