[augeas-devel] load specific lens

Frederik Wagner fnerdwq at googlemail.com
Sun Mar 14 15:35:36 UTC 2010


On Fri, Mar 12, 2010 at 2:15 AM, David Lutterkort <lutter at redhat.com> wrote:
> On Wed, 2010-03-10 at 16:25 +0100, Frederik Wagner wrote:
>> On Wed, Mar 10, 2010 at 9:46 AM, Frederik Wagner <fnerdwq at googlemail.com> wrote:
>> > 2. Would there be a way to inlcude the 'string' array handling into
>> > the shellvars lens? Probably only by handling specific entries of
>> > specific files (how do I test for the scanned file in a lens?)
>> > diferently, I suppose?
>>
>> As a (working) test I included the functionality into the shellvars
>> lens to treat specific keywords as an array of words.
>> This works fine (even if one has to keep an explicit list of keywords
>> which have to be treated in this way), but for the fact that the lensaugeas-devel at redhat.com
>> is _incredibly_ slow now and using a _lot_ of memory.
>
> Where are you seeing the slowdown ? With augtool or augparse ?

in both. It is due to the this line:

 let key_re = /[A-Za-z0-9_]+(\[[0-9]+\])?/ - "unset" - "export" - key_wa

each additional word which is 'substracted' (so each additional word
in "key_wa"), it becomes slower, using up more and more memory (an
makes my poor old laptop swap like mad)

I do not find a way around this construct...

> Generally, these kinds of lenses cause the typechecker to work very hard
> - the typechecker is only run by augparse. You can bypass it with
> 'augparse --notypecheck'; though before declaring any changes 'done',
> you need to typecheck the lens at least once.
>
>> To filter or the keywords I'm using - just showing the relevant adjustments:
>>
>> ...
>>   (* keywords from files which should be treaded as array of words *)
>>   let key_wa =
>>                (* from /etc/sysconfig/kernel *)
>>                "MODULES_LOADED_ON_BOOT"
>>              | "DOMU_INITRD_MODULES"
>>              | "INITRD_MODULES"
>>                (* from /etc/sysconfig/bootloader *)
>>              | "DEFAULT_APPEND"
>>              | "FAILSAFE_APPEND"
>>              | "XEN_KERNEL_APPEND"
>>              | "XEN_APPEND"
>>              | "RT_APPEND"
>>
>>   let key_re = /[A-Za-z0-9_]+(\[[0-9]+\])?/ - "unset" - "export" - key_wa
>> ...
>>
>> and later in the lens I'm applying extras steps to the filtered keywords:
>>
>> ...
>>   let char_wa = /[^ "\t\n]/
>>
>>   (* for the keywords in key_wa treat the values as an array of words *)
>>   let wa_array = f
>>     let wa_array_value = store char_wa+ in
>>     del /\"[ \t]*/ "\"" . counter "wa_val" .
>>       [ seq "wa_val" .wa_array_value ] .
>>       [ del /[ \t\n]+/ " "  . seq "wa_val" . wa_array_value ] *
>>       . del /[ \t]*\"/ "\""
>>
>>   (* lens for the array of words, extra handling of empty strings "" *)
>>   let wa_kv = [ key key_wa . eq . (del "\"\"" "\"\""|wa_array) . eol ]
>>
>>   let lns = ( comment | empty | source | kv | unset | wa_kv ) *
>> ...
>>
>> Since I change the fast working original shellvars lens, I suppose the
>> filtering construct is the problem.
>>
>> Am I doing something wrong? Or is the adjustment of the shellvars lens
>> generally not usefull anyway? (if it is I would submit the patch, when
>> I'm ready).
>
> Another way to structure this is to make the current lens 'lns' a
> function that takes the special variables as an argument, so that you'd
> have
>
>  let wa (keys:regexp) =
>    ( comment | empty | source | kv | unset | wa_kv keys) *
>
> and change wa_kv to pass keys respectively (key_re - key_wa) to the
> right parts of the lens.
>

I don't completely understand what you mean by 'the right parts of the
lens', but this does not solve the problem above, does it?

> Then, write separate transforms and filters for each file, e.g.
>
>  let kernel_xfm =
>    let wa_keys = /MODULES_LOADED_ON_BOOT|DOMU_INITRD_MODULES|INITRD_MODULES/ in
>    transform (wa wa_keys) (incl "/etc/sysconfig/kernel")
>
> There's one minor hitch though: Augeas right now only allows one
> autoload statement per module. That will force you to have separate

may I ask, what does the autoload stand for? (xfm?)

> modules for each file that you want to handle that way, e.g.
>
>        module Shellvars_kernel =
>          autoload xfm
>
>          let lns = Shellvars.wa /MODULES_LOADED_ON_BOOT|DOMU_INITRD_MODULES|INITRD_MODULES/
>          let xfm = transform lns (incl "/etc/sysconfig/kernel")

this would not be the worst thing :-)

Bye,
Frederik




More information about the augeas-devel mailing list