Foi lançado o versão da biblioteca libmdbx 0.13.7 (MDBX) com a implementação de um banco de dados incorporado de alto desempenho do tipo chave-valor. O código da libmdbx é distribuído sob a licença Apache 2.0. Suporta todos os sistemas operacionais e arquiteturas atuais, incluindo o Elbrus 2000 da Rússia. A libmdbx oferece uma API abrangente para C++, além de bindings suportados por entusiastas para as linguagens Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno e Scala. Entre os projetos que utilizam a libmdbx, destacam-se Isar, Erigon e Reth, assim como as desenvolvimentos das empresas StarkWare e Positive Technologies.
Historicamente, o libmdbx é uma reengenharia profunda do SGBD LMDB e supera seu predecessor em confiabilidade, conjunto de recursos e desempenho. Comparado ao LMDB, o libmdbx dá ênfase especial à qualidade do código, operação estável da API, testes e verificações automáticas. Uma ferramenta de verificação de integridade da estrutura do banco de dados é fornecida com algumas funcionalidades de recuperação. Tecnologicamente, o libmdbx oferece ACID, serialização rigorosa de alterações e leitura não bloqueante com escalabilidade linear em núcleos de CPU. Suporte é dado a compactação automática, gestão automática do tamanho do banco de dados e avaliação de exceções em consultas por intervalo (range query estimation).
Principais mudanças:
- Corrigido um erro crítico na funcionalidade mdbx_env_resurrect_after_fork() ao usar semáforos SysV. O erro se manifestava apenas após a criação de um processo filho por meio de fork() durante uma transação de escrita em execução, resultando na operação incorreta dos semáforos e, consequentemente, em diversos erros, incluindo a corrupção do banco de dados. O problema existia desde o surgimento do mdbx_env_resurrect_after_fork() e afetava macOS, além de plataformas POSIX quando compiladas com a opção MDBX_LOCKING=5.
- Resolvido um problema na API de cópia de banco de dados, que se manifestava em sistemas POSIX diferentes de Linux (principalmente no macOS), além de em alguns casos quando o arquivo de destino estava localizado em um sistema de arquivos não local. O problema levava ao retorno do erro EWOULDBLOCK/EAGAIN, causado por uma falha/conflito nas bloqueios fcntl(F_SETLK) e flock() no núcleo do sistema operacional. A gestão de erros para a captura de bloqueios de arquivos na API de cópia foi reestruturada em sistemas POSIX.
- Corrigido um erro que resultava no retorno inesperado de MDBX_BAD_DBI ao iniciar várias transações simultaneamente dentro de um único processo após a abertura do banco de dados.
- Corrigido um erro que resultava no retorno inesperado de MDBX_DBS_FULL ao reabrir tabelas já abertas e ao limite de descritores DBI já alcançado.
- Corrigido um erro de compilação para a plataforma Android ao definir explicitamente _FILE_OFFSET_BITS.
- Corrigido um erro no uso de ENOMEM em vez de MDBX_ENOMEM, o que poderia quebrar a compilação em plataformas não-POSIX/Windows, dependendo da configuração e/ou versão do SDK.
- Corrigidos ou removidos vários assert checks incorretos, que causavam falhas em compilações de depuração em situações específicas. Principalmente, no código das funções txn_end(), txn_lock() e txn_unlock() tanto no Windows quanto no POSIX.
- Eliminadas advertências insignificantes do MSVC. As advertências C5286 e C5287 foram desativadas.
- A lógica para a desistência do uso de bloqueios OFD em plataformas POSIX foi aprimorada. Agora, além de EINVAL, são considerados códigos de erro adicionais (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP), permitindo que a biblioteca compilada funcione em alguns casos quando o núcleo/conteiner/emulador atual não suporta as chamadas de sistema necessárias.
- Adicionada ao framework de teste a opção ‘—numa ’ para vincular o teste estocástico a um nó NUMA. No script battery/tmux, foi adicionada uma distribuição explícita entre os nós NUMA, o que aumentou significativamente a eficiência ao testar em máquinas NUMA.
- Implementada uma ordem aleatória de execução para testes individuais no script estocástico.
Fonte: opennet.ru
