Corrupción de Chainstate LevelDB después de leer de la base de datos

He estado trabajando con LevelDB durante algunas semanas, codificando algunas herramientas para acceder a la base de datos y analizar los datos para que sean legibles por humanos.

Sin embargo, cada vez que leo del estado de cadena, los datos se corrompen (pídeme que los reconstruya cuando ejecute bitcoind). Decidí copiar la base de datos como solución alternativa después de que sucedió la primera vez, pero es bastante molesto hacerlo cada vez que quiero actualizar los datos.

Estoy usando plyvel y Python 2.8, y cierro la base de datos cada vez que termino con la lectura.

Ejemplo

# Open the LevelDB
db = plyvel.DB(".bitcoin/chainstate")

for key, o_value in db:
 # do stuff

# Close the LevelDB
db.close()

Alguien sabe cual puede ser el motivo? ¿Bitcoind evita que otro software acceda a la base de datos marcando el último acceso de alguna manera?

chainstate LOG después de ejecutar el código, recuperar la clave de ofuscación y cerrar la base de datos:

2017/03/22-11:03:45.746702 7f3c18a39700 Recovering log #394423
2017/03/22-11:03:45.854583 7f3c18a39700 Delete type=0 #394423
2017/03/22-11:03:45.854711 7f3c18a39700 Delete type=3 #394422

Código de ejemplo :

db = plyvel.DB(".bitcoin/chainstate")
o_key = db.get((a2b_hex("0e00") + "obfuscate_key"))
db.close()

debug.log después de abrir bitcoind (solo la parte que se refiere a LevelDB):

2017-03-22 10:03:45 Cache configuration:
2017-03-22 10:03:45 * Using 2.0MiB for block index database
2017-03-22 10:03:45 * Using 8.0MiB for chain state database
2017-03-22 10:03:45 * Using 290.0MiB for in-memory UTXO set
2017-03-22 10:03:45 init message: Loading block index...
2017-03-22 10:03:45 Opening LevelDB in /home/sdelgado/.bitcoin/blocks/index
2017-03-22 10:03:45 Opened LevelDB successfully
2017-03-22 10:03:45 Using obfuscation key for /home/sdelgado/.bitcoin/blocks/index: 0000000000000000
2017-03-22 10:03:45 Opening LevelDB in /home/sdelgado/.bitcoin/chainstate
2017-03-22 10:03:45 Opened LevelDB successfully
2017-03-22 10:03:45 Using obfuscation key for /home/sdelgado/.bitcoin/chainstate: 27c78118b7316105
2017-03-22 10:03:48 LoadBlockIndexDB: last block file = 810
2017-03-22 10:03:48 LoadBlockIndexDB: last block file info: CBlockFileInfo(blocks=53, size=51783543, heights=457770...458279, time=2017-03-18...2017-03-21)
2017-03-22 10:03:48 Checking all blk files are present...
2017-03-22 10:03:49 LoadBlockIndexDB: transaction index disabled
2017-03-22 10:03:49 LevelDB read failure: Corruption: corrupted compressed block contents
2017-03-22 10:03:49 Corruption: corrupted compressed block contents
2017-03-22 10:03:51 Aborted block database rebuild. Exiting.
2017-03-22 10:03:51 scheduler thread interrupt
2017-03-22 10:03:51 Shutdown: In progress...
2017-03-22 10:03:51 StopNode()
2017-03-22 10:03:51 Shutdown: done
¿Estás abriendo la base de datos mientras se ejecuta bitcoind?
No, bitcoind no se está ejecutando cuando abro la base de datos.
Entonces no tengo ni idea. ¿Puede compartir su archivo debug.log o chainstate/LOG?
Actualizado con los registros

Respuestas (1)

Plyvel tiene habilitada la compresión Snappy de manera predeterminada . ¿Has probado a desactivarlo al abrir la base de datos?

# Open the LevelDB
db = plyvel.DB(".bitcoin/chainstate", compression=None)

Con este código mi bitcoind no parece quejarse después de haber abierto la base de datos con python.

Ese parece ser el problema. No hay corrupción de datos después de abrirlo usando compresión = Ninguno. ¡Gracias!