Se ha publicado el lanzamiento de la biblioteca libmdbx 0.13.1 (MDBX) con la implementación de una base de datos incorporada compacta y de alto rendimiento de tipo clave-valor. El código de libmdbx se distribuye bajo la licencia Apache 2.0. Se soportan todos los sistemas operativos y arquitecturas actuales, así como el ruso Elbrus 2000. Se ofrece una API avanzada para C++, así como enlaces mantenidos por entusiastas a los lenguajes Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno y Scala.
Históricamente, libmdbx es una profunda reestructuración de la base de datos LMDB y supera a su predecesor en fiabilidad, conjunto de funciones y rendimiento. En comparación con LMDB, libmdbx presta especial atención a la calidad del código, al funcionamiento estable de la API, a las pruebas y a las verificaciones automáticas. Se incluye una utilidad de verificación de la integridad de la estructura de la base de datos con algunas capacidades de recuperación. Tecnológicamente, libmdbx ofrece ACID, estricta serialización de cambios y lectura no bloqueante con escalabilidad lineal en núcleos de CPU. Soporta la autocompactación, la gestión automática del tamaño de la base de datos y la estimación del volumen de las muestras por rangos (estimación de consultas de rango).
Principales cambios:
- Cambio de la licencia del código de OpenLDAP Public License a Apache 2.0.
- Expansión de la API de cursores con operaciones de posicionamiento más convenientes y evidentes, análogas a las condiciones <, =, > tanto para claves como para pares clave-valor. Se han agregado funciones mdbx_cursor_unbind() y mdbx_txn_release_all_cursors() para una gestión flexible de los cursores en escenarios de reutilización para reducir la sobrecarga. Funciones mdbx_cursor_scan() y mdbx_cursor_scan_from() para escanear tablas utilizando un predicado funcional y reduciendo la sobrecarga asociada.
- Reestructuración de los cursores para unificar el comportamiento, tener un código más regular y reducir la cantidad de ramificaciones y operaciones de máquina.
- Transferencia de la funcionalidad de la utilidad mdbx_chk dentro de la biblioteca en forma de la función mdbx_env_chk() para verificar la integridad de la estructura de la base de datos, incluida la lógica de la aplicación.
- Opción MDBX_opt_gc_time_limit para un control más flexible del tiempo gastado en la búsqueda de secuencias de páginas libres adyacentes en GC.
- Reducción significativa de los costos operativos al iniciar transacciones en escenarios con una gran cantidad de manejadores DBI, gracias a la inicialización diferida/perezosa de los elementos de las tablas de servicio. Incluye el mecanismo de soporte para conjuntos dispersos de manejadores DBI, controlado por la opción de compilación MDBX_ENABLE_DBI_SPARSE, que está habilitada por defecto.
- Reducción de los costos al abrir manejadores DBI. Incluye el mecanismo de liberación diferida y soporte para una vía rápida de apertura sin bloqueos, controlado por la opción de compilación MDBX_ENABLE_DBI_LOCKFREE, que está habilitada por defecto.
- Soporte para la 'aparcar' transacciones de lectura, desplazándolas para reutilizar antiguos snapshots de MVCC y prevenir problemas causados por la suspensión del reciclaje de basura. El mecanismo de aparcamiento y desplazamiento de transacciones aparcadas es tanto un complemento como una alternativa más sencilla al callback Handle-Slow-Readers. Para conveniencia, las funciones mdbx_txn_park() y mdbx_txn_unpark() cuentan con argumentos adicionales que permiten solicitar el 'desaparcar' automático de transacciones aparcadas y reiniciar las desplazadas. Se han añadido opciones correspondientes -d y -p a la utilidad mdbx_copy.
- Soporte para la recuperación de un entorno de trabajo abierto con la base de datos en un proceso hijo después de bifurcaciones/particiones de proceso a través de mdbx_env_resurrect_after_fork().
- Soporte para renombrar tablas mediante mdbx_dbi_rename() y mdbx_dbi_rename2(). Se agregó la función mdbx_enumerate_tables() para obtener información sobre tablas de usuario nombradas.
- Modo de funcionamiento MDBX_NOSTICKYTHREADS en lugar de MDBX_NOTLS para simplificar la integración con hilos ligeros/multiplexión de estos junto con transacciones en los hilos del sistema operativo.
- Para la identificación de la base de datos se añadió un UUID disponible en el campo mi_dxbid de la estructura MDBX_envinfo, obtenida a través de mdbx_env_info_ex(). Se implementó la obtención de información de la base de datos sin abrirla a través de mdbx_preopen_snapinfo().
- Soporte para funciones de registro de callbacks sin funcionalidad vprintf(), lo que facilita significativamente el uso del registro en enlaces a otros lenguajes de programación.
- Adición de funciones mdbx_txn_copy2pathname() y mdbx_txn_copy2fd() a la API.
- Reestructura del código fuente con refactorización.
- Uso del término 'tabla' en lugar de 'subDb'.
- Se anuncian las opciones obsoletas MDBX_COALESCE y MDBX_NOTLS. Se reemplaza la opción de compilación MDBX_USE_VALGRIND por la estándar ENABLE_MEMCHECK.
Fuente: opennet.ru
