Foi publicada a versão 0.13.3 da biblioteca libmdbx (MDBX), que implementa um banco de dados compactado embutido de alto desempenho do tipo chave-valor. O código do libmdbx é distribuído sob a licença Apache 2.0. Suporta todos os sistemas operacionais e arquiteturas atuais, assim como o russo Elbrus 2000. Para o libmdbx, é oferecida uma API avançada para C++, além de bindings suportados por entusiastas para as linguagens Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno e Scala.
Historicamente, o libmdbx é uma reconstrução profunda do SGBD LMDB e supera seu predecessor em confiabilidade, conjunto de funcionalidades e desempenho. Em comparação com o LMDB, o libmdbx dedica grande atenção à qualidade do código, ao funcionamento estável da API, ao teste e a verificações automáticas. É fornecida uma ferramenta de verificação de integridade da estrutura do banco de dados com algumas capacidades de recuperação. Tecnicamente, o libmdbx oferece ACID, estrita serialização de mudanças e leitura não bloqueante com escalonamento linear por núcleos de CPU. Suporta auto compactação, gestão automática do tamanho do banco de dados e estimativa de volume de seleções por intervalos (estimar consulta de intervalo).
Principais mudanças:
- A versão 0.13.x recebeu o status de estável. O desenvolvimento da versão 0.14.x foi iniciado.
- Foi adicionada a função mdbx_cursor_count_ex() na API C, que permite obter tanto o número de múltiplos valores correspondentes à chave atual quanto informações sobre a árvore aninhada que armazena esses valores.
- Foi adicionado o método mdbx::txn::make_broken() na API C++, semelhante ao mdbx_txn_break().
- Nos utilitários mdbx_copy, mdbx_drop, mdbx_dump, mdbx_load e mdbx_stat, foi implementado o registro de erros, avisos e mensagens importantes do libmdbx.
- Mudança de comportamento:
- Ao habilitar o perfilamento do coletor de lixo (compilação com a opção MDBX_ENABLE_PROFGC=ON), agora são contabilizados os custos de tempo de CPU para mesclar listas de páginas, ou seja, para a função pnl_merge().
- No utilitário de testes, o valor do modo de dados foi renomeado de data.dups para data.multi.
- Foi aprimorado o controle do comprimento da chave dentro de cursor_seek().
- Se o usuário não especificar um valor com mdbx_env_set_option(MDBX_opt_txn_dp_limit), o limite de dirty-pages será ajustado no início de cada transação de escrita não aninhada, com base na quantidade de RAM disponível e no tamanho do banco de dados.
- No modo MDBX_NOSTICKYTHREADS, é permitido o commit/abort de transações aninhadas de qualquer thread.
- Ao tentar iniciar transações aninhadas no modo MDBX_WRITEMAP, é feito o registro e retornada a mensagem de erro MDBX_INCOMPATIBLE.
- Na API C++, os construtores/inicializadores e métodos relacionados à formação da geometria do banco de dados, por padrão, utilizam apenas valores default.
- Dentro de mdbx_env_set_geometry(), foram aprimoradas heurísticas para ajustar os parâmetros de geometria do banco de dados solicitados pelo usuário como "padrão".
- Correções:
- Removido o retrocesso que impedia o desbloqueio do mutex ao tentar fechar novamente o descritor dbi, incluindo ao tentar fechar explicitamente o descritor após remover a tabela associada.
- Eliminado o retrocesso do estado do cursor aninhado/dupsort após a inserção de dados no modo MDBX_APPEND.
- Suporte para obtenção do boot_id ao trabalhar dentro de um contêiner LXC.
- Corrigido o erro de processamento incorreto ao tentar iniciar uma transação de leitura aninhada. Agora, em tais situações, retorna-se o erro MDBX_EINVAL, uma vez que a aninhamento é suportado apenas para transações de leitura e gravação.
- Removido o retrocesso SIGSEGV ao acessar um endereço nulo ao operar no modo somente leitura sem usar um arquivo LCK, por exemplo, ao estar com o banco de dados em um dispositivo acessível apenas para leitura.
Fonte: opennet.ru
