Tue, 23 May 2023 00:00:00 GMT

0.10.0 Release

guid: e0a2b6f4-b18d-47d8-b642-e27907255666

author: Tomislav Makar

pubDate: Tue, 23 May 2023 13:33:52 +0200

shortDesc: New Changetracking API, New spec plugin, Go into repo

We are proud to release Elektra 0.10.0.

What is Elektra?

Elektra serves as a universal and secure framework to access configuration settings in a global, hierarchical key database. For more information, visit https://libelektra.org.

You can also read the news on our website.

You can try out the latest Elektra release using our docker image elektra/elektra. This is the quickest way to get started with Elektra without compiling and other obstacles, simply run:

docker pull elektra/elektra
docker run -it elektra/elektra

Highlights

New Changetracking API

New spec plugin

Go into repo

New Changetracking API

We've created a new KeySet diffing and changetracking API for both internal and external use. Several plugins already had their own implementations to detect changes made to the key database. Every implementation did something different and results varied. With this new release every plugin now uses the same shared implementation, with identical results!

To try the amazing new API yourself, take a look at the tutorial.

Elektra's internal code now also uses this new API to detect which backends to execute. This can lead to better performance in I/O bound cases, where previously certain keys would have been detected as changed when they weren't.

We ran some memory benchmarks and found a slightly increased memory usage on a stock instance of Elektra. If you're using many plugins that do changetracking, the overhead will decrease.

Number of Keys | Old Implementation (bytes) | New Implementation (bytes) | Memory Increase (%)
50 | 225792 bytes | 229580 bytes | 1,68 %
500 | 383180 bytes | 411238 bytes | 7,32 %
5000 | 1992294 bytes | 2306867 bytes | 15,79 %
50000 | 18245222 bytes | 21181235 bytes | 16,09 %
500000 | 178782208 bytes | 207827763 bytes | 16,25 %

Apart from memory benchmark, we also ran some performance benchmarks. As the benchmark is heavily I/O bound, the biggest bottleneck is the I/O performance of the system. We could not reliably detect a real, reliably reproducible performance impact measured in seconds. Alternatively, we have measured executed instructions. There seems to be about 10 % overhead, but we don't expect it to be noticeable in real-world workloads.

Number of Keys | Old Implementation (Instructions) | New Implementation (Instructions) | Performance Overhead (%)
50 | 18910449 | 19583227 | 3,56 %
500 | 63001911 | 68948096 | 9,44 %
5000 | 526801917 | 586344210 | 11,30 %
50000 | 5730261920 | 6340292587 | 10,65 %
500000 | 104614374974 | 110702166761 | 5,82 %

New spec plugin

The spec plugin was rewritten to use the standardized error handling in Elektra. It is now strictly defined that the spec plugin throws a warning on kdbGet and on any other call an error.

Default values are now created in the default namespace. The instantiated array specifications are now also created in the default namespace.

Keys with a require metakey and no default metakey do throw an error now.

Known limitations:

# and _ keys do not work on MINGW

No defaults for _ globbing character

For more information see Spec Plugin.

Go into repo

The go binding is now inside of libelektra repository. It is now also included into our build pipeline. For more information on how to use it see go readme.

NOTE: On information how to publish new versions of go-elektra to go packages see go-publishing.

Plugins

The following text lists news about the plugins we updated in this release.

General

Updated target name of shared object files according to #3486

spec

Rewrite spec plugin, fix bugs and use correct error handling (Tomislav Makar @tmakar)

Remove info metakey from spec plugin (Tomislav Makar @tmakar)

counter

Move static variables into functions to avoid global variables (@kodebach)

logchange

Utilize new changetracking API (Maximilian Irlinger @atmaxinger)

Add Maximilian Irlinger as maintainer (Maximilian Irlinger @atmaxinger)

yajl

The itKs global variable workaround, which was used to replace the now removed internal KeySet cursor, was replaced with a custom context struct. (@kodebach)

toml

The flex lexer and bison parser are now fully reentrant and therefore thread-safe. (@kodebach)

multifile

Remove multifile plugin as it is unmaintained and conflicts with the new backend architecture (Maximilian Irlinger @atmaxinger)

c

Add Florian Lindner as maintainer (Florian Lindner @flo91)

Use separate symbols for set and commit functions to satisfy kdb plugin-check (@kodebach)

Use new elektraPluginGetPhase() instead of counting executions (@kodebach)

mmapstorage

Note: The plugin is currently disabled, because it is not yet compatible with the COW data structures.

TODO: remove above note, when COW support is added.

The magic data structures are now fully compile-time constants. The magic number to detect endianness is generated in CMake instead of at runtime. (@kodebach)

syslog

Convert to hook plugin (Maximilian Irlinger @atmaxinger)

Utilize new changetracking API (Maximilian Irlinger @atmaxinger)

lineendings

Add Florian Lindner as maintainer (Florian Lindner @flo91)

length

Add Florian Lindner as maintainer (Florian Lindner @flo91)

missing

Add Florian Lindner as maintainer (Florian Lindner @flo91)

unit

Add Florian Lindner as maintainer (Florian Lindner @flo91)

dbus

Utilize new changetracking API (Maximilian Irlinger @atmaxinger)

Add Maximilian Irlinger as maintainer (Maximilian Irlinger @atmaxinger)

internalnotifications

Utilize new changetracking API (Maximilian Irlinger @atmaxinger)

Add Maximilian Irlinger as maintainer (Maximilian Irlinger @atmaxinger)

Libraries

The text below summarizes updates to the C (and C++)-based libraries of Elektra.

Compatibility

Core

The syslog logging code now calls openlog before every syslog to avoid the use of a global variable. (@kodebach)

Fix memleak in kdb.c, #4925 (@hannes99)

loader

Adapt target rename with -plugin- in dl.c (Tomislav Makar @tmakar)

go

Golang is now included to build go binding (Tomislav Makar @tmakar)

From now on we use tags which are prefixed with v so go package versioning works (Tomislav Makar @tmakar)

kdb

Add new changetracking API (Maximilian Irlinger @atmaxinger)

Fix unwanted removal of subkeys when using mv (Hannes Laimer @hannes99)

Fix inconsistent return values in code, tests and man pages (Hannes Laimer @hannes99)

Remove smount alias (Hannes Laimer @hannes99)

Bindings

Bindings allow you to utilize Elektra using various programming languages. This section keeps you up-to-date with the multi-language support provided by Elektra.

jna

Updated Java binding related dependencies. (Michael Tucek @tucek)

Updated KDBException to only access error key at construction time. (Michael Tucek @tucek)

Removed public naive resource release API. To migrate just remove calls to the affected methods Key#release(), KeySet#release() and KDBException#releaseErrorKey() (Michael Tucek @tucek)

Enabled strict javadoc checking for Gradle build (Michael Tucek @tucek)

add merging based on elektraMerge (Maximilian Irlinger @atmaxinger)

Added support for ksIncRef for KeySet (Michael Tucek @tucek)

Enabled ReferenceCleaner (Michael Tucek @tucek)

go-elektra

Move go-elektra binding from repository into bindings folder of libelektra (Tomislav Makar @tmakar)

Change module for go-elektra (Tomislav Makar @tmakar)

Rename go-elektra module (Tomislav Makar @tmakar)

Adapt README for go-elektra and change module name to match github.com (Tomislav Makar @tmakar)

Tools

elektrad

Implemented new request to add multiple metakeys for one key (Tomislav Makar @tmakar)

Adding bulk creation request for configuration keys (Tomislav Makar @tmakar)

webd

Implemented new request to add multiple metakeys for one key (Tomislav Makar @tmakar)

Adding bulk creation request for configuration keys (Tomislav Makar @tmakar)

Scripts

Jenkins

Use only v prefix for tags not in real version (Tomislav Makar @tmakar)

Release

Exclude v prefix from populate-release-notes.sh script (Tomislav Makar @tmakar)

Handle tag prefix v correctly in release.sh (Tomislav Makar @tmakar)

Check for v prefix in make-source-package script and Jenkinsfile.release (Tomislav Makar @tmakar)

Use correct tags for git-release-stats script (Tomislav Makar @tmakar)

Documentation

Adapt and remove outdated docs https://issues.libelektra.org/4882 (Tomislav Makar @tmakar)

Added missing dependencies in COMPILE.md for APT-based systems (Michael Tucek @tucek)

Add default namespace to namespaces documentation (Tomislav Makar @tmakar)

Added Tomislav Makar to AUTHORS.md (Tomislav Makar @tmakar)

Added Florian Lindner to AUTHORS.md (Florian Lindner @flo91)

.github rework (Markus Raab)

Added hook to placements contract in CONTRACT.ini (Tomislav Makar @tmakar)

Added hook information to hooks.md

Added Hannes Laimer to AUTHORS.md (Hannes Laimer @hannes99)

Add README to tools/kdb (Hannes Laimer @hannes99)

Fixed shell-recorder test in install-webui.md (Tomislav Makar @tmakar)

Add new shell-recorder test in install-webui.md for newly implemented request for adding multiple metakeys for one key (Tomislav Makar @tmakar)

Small fixes in decisions. (Markus Raab)

Remove wikipedia from release todos in RELEASE.md (Tomislav Makar @tmakar)

Update AUTHORS.md info (@kodebach)

Add Stefan Hanreich to AUTHORS.md (Stefan Hanreich @lawli3t)

Use Cases

Add specification use case for array-specification (Tomislav Makar @tmakar)

Add specification use case for underline-specification (Tomislav Makar @tmakar)

Add specification use case for simple-specification (Tomislav Makar @tmakar)

Add specification use case for enum-specification (Tomislav Makar @tmakar)

Add complete specification for dockerd configuration file (daemon.json) (Tomislav Makar @tmakar)

Decisions

Decide and implement decision process (Markus Raab)

Decided future library split (@kodebach)

Decided decision process (Markus Raab)

Draft for man pages (Markus Raab)

Add decision for change tracking (Maximilian Irlinger @atmaxinger)

Create decision for allowed and prohibited operation seqences (Maximilian Irlinger @atmaxinger)

Add decisions about location of headers and use of #include in the repo (@kodebach)

Add decision about metadata semantics (@kodebach)

Many small fixes to adapt to documentation guidelines and new decision process. (Markus Raab)

Add decision for read-only keynames (Maximilian Irlinger @atmaxinger)

Revive keyname decision (@kodebach)

Add decision for copy-on-write and provide implementation suggestions. (Maximilian Irlinger @atmaxinger)

Added explanation on why we wanted to migrate from Maven to Gradle for Java-related build facilities. (Michael Tucek @tucek)

Tutorials

Add basic tutorial about changetracking (Maximilian Irlinger @atmaxinger)

Man Pages

Tests

Add shell test to verify correct behavior for https://github.com/ElektraInitiative/libelektra/issues/4061 (Tomislav Makar @tmakar)

Add link to linkchecker.whitelist (Tomislav Makar @tmakar)

Build

Docker

CentOS 8 Stream: manually install config-manager DNF plugin. (Maximilian Irlinger @atmaxinger)

Infrastructure

Cirrus

Rename deprecated d-bus to dbus in macOS.yml and .cirrus.yml Issue-#4900 (Tomislav Makar @tmakar)

Push FreeBSD 12.3 to 12.4 since 12.3 is end of life. (Richard Stöckl @eiskasten)

GitHub Actions

Website

The website is generated from the repository, so all information about plugins, bindings and tools are always up-to-date. Furthermore, we changed:

Miscellaneous

Many global variables that where used as constants have been made fully const (@kodebach)

Outlook

We are currently working on following topics:

Rewriting tools in C (@hannes99)

Elektrify KDE and GNOME (Mihael Pranjić @mpranj)

Elektrify XFCE (Richard Stöckl @Eiskasten)

Mounting SQL databases (Florian Lindner @flo91)

Recording Configuration (Maximilian Irlinger)

Ansible-Elektra (Maximilian Irlinger)

Configure Olimex Base Images (Maximilian Irlinger)

Improving Build Server Infrastructure (Lukas Hartl)

Improve Java Development Experience (Michael Tucek)

Statistics

About 9 authors changed 309 files with 10024 insertions(+) and 4025 deletions(-) in 402 commits.

Thanks to all authors for making this release possible!

Join the Initiative!

We welcome new contributors! Read here about how to get started.

As first step, you could give us feedback about these release notes. Contact us via our issue tracker.

Get the Release!

You can download the release from

here or

GitHub

The hashsums are:

name: elektra-0.10.0.tar.gz

size: 9230228

md5sum: 39ac04c8a0b07061bea781fd73cb13aa

sha1: 846dcfa22410403b575a4d4d87970aa4841aafdd

sha256: cb56e40b37c42e1e235cf9e76c9250024f912cbb61cca1a2888f9305f5228dcd

The release tarball is also available signed using GnuPG from

here or

GitHub

The following GPG Key was used to sign this release: 12CC44541E1B8AD9B66AFAD55262E7353324914A

Already built API documentation can be found

here or

GitHub.

Stay tuned!

Subscribe to the RSS feed to always get the release notifications.

If you also want to participate, or for any questions and comments, please contact us via our issue tracker on GitHub.

Permalink to this NEWS entry

For more information, see https://libelektra.org.