- 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 internalKeySet
cursor, was replaced with a custom context struct. (@kodebach)
toml
- The
flex
lexer andbison
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
andcommit
functions to satisfykdb 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 callsopenlog
before everysyslog
to avoid the use of a global variable. (@kodebach) - Fix memleak in kdb.c, #4925 (@hannes99)
loader
- Adapt target rename with
-plugin-
indl.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()
andKDBException#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
forKeySet
(Michael Tucek @tucek) - Enabled
ReferenceCleaner
(Michael Tucek @tucek)
go-elektra
- Move
go-elektra
binding from repository into bindings folder oflibelektra
(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 matchgithub.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 inrelease.sh
(Tomislav Makar @tmakar) - Check for
v
prefix inmake-source-package
script andJenkinsfile.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
toplacements
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 #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
todbus
inmacOS.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
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
The following GPG Key was used to sign this release: 12CC44541E1B8AD9B66AFAD55262E7353324914A
Already built API documentation can be found
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.
For more information, see https://libelektra.org.
Best regards,
Elektra Initiative