Issue #20865 has been updated by Christian Flamm.
Subject changed from Random behavior when notifying exec ressources having
"onlyif" parameter set to (Now) consistent unexpected behavior when notifying
exec ressources having "onlyif" parameter set
Affected Puppet version changed from 3.1.1 to 3.3.0
Charlie Sharpsteen wrote:
> Using 1.9.x isn't a good "fix" because we're depending on the coincidence
> that `Hash.keys` appears to be returning checks in an order that puts
> `onlyif` last. This is fragile and definitely not something that our QA and
> testing system will be looking for.
>
> I wish I had a solid workaround to recommend, but the root of the issue is
> that `refreshonly` needs to be re-designed. Ref: #5876 for a list of the
> kinks and quirks that plague the current implementation.
Tried version 3.3.0 which solved another bug affecting us.
The problem here previously described as "random behavior" ("sometimes"
unnecessary execution of onlyif-checks ) is at v3.3.0 taking place **every**
catalog run. While I appreciate the consistency, this is now consistently bad
and adds unnecessary 15-20 sec (+ almost 100%) to every catalog run (referring
to our biggest catalog).
This might have already been introduced in an earlier version - anyway it's not
present in v3.1.1.
----------------------------------------
Bug #20865: (Now) consistent unexpected behavior when notifying exec ressources
having "onlyif" parameter set
https://projects.puppetlabs.com/issues/20865#change-97527
* Author: Christian Flamm
* Status: Accepted
* Priority: High
* Assignee:
* Category: transactions
* Target version: 3.x
* Affected Puppet version: 3.3.0
* Keywords: exec onlyif notify
* Branch:
----------------------------------------
Please have a look at this simplified example.
class runtimevariation {
# dummy file ressources that should represent
# some real software deployment
file { '/tmp/software-v1': ensure => present, }
file { '/tmp/software-v2': ensure => present, }
file { '/tmp/software-v3': ensure => present, }
# indicating current version in use
file { '/tmp/current':
ensure => link,
target => '/tmp/software-v2',
require => File['/tmp/software-v2'],
notify => Exec['software.restart'],
}
# whenever link target changes I want to run this - but
# only if the file exists and is executable
exec { 'software.restart':
refreshonly => true,
command => '/tmp/restart/software',
onlyif => '/usr/bin/[ -x /tmp/restart/software ]'
}
}
On the configured machine:
# ll /tmp/
total 0
lrwxrwxrwx 1 root root 16 May 23 08:41 current -> /tmp/software-v2
-rw-r--r-- 1 root root 0 May 23 08:40 software-v1
-rw-r--r-- 1 root root 0 May 23 08:41 software-v2
-rw-r--r-- 1 root root 0 May 23 08:41 software-v3
There are a couple of different '/tmp/software-v*' file resources. There's a
'/tmp/current' link pointing to either one of them. Whenever something about
the link file resource (e.g. target) changes I want to notify the
'software.restart' exec resource to run a command but only if a matching
executable exists.
**My assumption was**: if nothing about the whole catalog/class changes
(particularly the '/tmp/current' link) then the exec resource would never get
notified and so neither the onlyif check nor the command would be run.
**But: the onlyif check does sometimes get run**. I just don't understand when
and why. During the following puppet agent runs nothing about the node's
catalog (only containing class runtimevariation) changes.
# puppet agent --no-daemonize --debug --onetime | grep "/usr/bin/\[ -x "
Debug: Exec[software.restart](provider=posix): Executing check '/usr/bin/[
-x /tmp/restart/software ]'
Debug: Executing '/usr/bin/[ -x /tmp/restart/software ]'
# puppet agent --no-daemonize --debug --onetime | grep "/usr/bin/\[ -x "
nothing!
# puppet agent --no-daemonize --debug --onetime | grep "/usr/bin/\[ -x "
Debug: Exec[software.restart](provider=posix): Executing check '/usr/bin/[
-x /tmp/restart/software ]'
Debug: Executing '/usr/bin/[ -x /tmp/restart/software ]'
# puppet agent --no-daemonize --debug --onetime | grep "/usr/bin/\[ -x "
nothing!
# puppet agent --no-daemonize --debug --onetime | grep "/usr/bin/\[ -x "
nothing!
# puppet agent --no-daemonize --debug --onetime | grep "/usr/bin/\[ -x "
Debug: Exec[software.restart](provider=posix): Executing check '/usr/bin/[
-x /tmp/restart/software ]'
Debug: Executing '/usr/bin/[ -x /tmp/restart/software ]'
# puppet agent --no-daemonize --debug --onetime | grep "/usr/bin/\[ -x "
nothing!
Sometimes the onlyif check does get executed... sometimes not.
This becomes more interessting if you have a bunch of such exec ressources with
(more) expensive onlyif checks. In our setup this makes a difference of 15-20s
vs. 30-35s per catalog run.
--
You have received this notification because you have either subscribed to it,
or are involved in it.
To change your notification preferences, please click here:
http://projects.puppetlabs.com/my/account
--
You received this message because you are subscribed to the Google Groups
"Puppet Bugs" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-bugs.
For more options, visit https://groups.google.com/groups/opt_out.