www.nico.schottelius.org/blog/cdist-shell-scripts-functio...

44 lines
1.5 KiB
Markdown

[[!meta title="Cdist: The scripts vs. functions and local variables problem"]]
Today I've found a very nasty problem during development of
[[cdist|software/cdist]] 1.8.0,
related to shell functions and the non-local variables.
## Background
cdist, up to version 1.7.x, is implemented in shell scripts. As it turned out,
most of the time during a cdist call is spent within the kernel, which seems
to be related to some thousands of forks we do for each run (you can use
oprofile to verify this yourself). To speedup cdist, the idea was to rewrite
cdist to use functions for internal functionality, instead of the shell
scripts.
## The implementation
So the idea was very simple:
* Take all existing shell scripts
* Add a function header
* Move shell script from bin/ to core/
* Source all functions from core/
But the first problem that came up is that the **local** keyword had been removed
from the POSIX standard. Thus I began to eliminate global variables by
either prefixing them with the function name or by removing them completly.
## The problem
After a some time I realised that the __cdist_object_run() function calls itself
recursively. This leads to subsequent overwritten variables, which in turn leads
to unwanted behaviour.
## The question
I'm aware that the **local** keyword is still supported by some shells, but I am
wondering, whether you have a good idea, on how to speedup cdist (having fast
fork()s would be great!) without violating the POSIX standard?
[[!tag config eth unix]]