Issue #20865 has been updated by Charlie Sharpsteen.
Hmm... I'm not sure what would cause this behavior to change from random to deterministic, other than moving from Ruby 1.8.x to 1.9.x. I'll take another look at this behavior when I get a spare moment. ---------------------------------------- Bug #20865: (Now) consistent unexpected behavior when notifying exec ressources having "onlyif" parameter set https://projects.puppetlabs.com/issues/20865#change-97707 * 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.
