Issue #20865 has been updated by Christian Flamm.

> One additional piece of info that may or may not be relevant: is there 
> anything in the crontab that is touching `/tmp/software-*` or `/tmp/current`?

On the agent used for reproducing the behavior there actually is one more 
module (basically one class) that is applied to all our puppet agents...

    class tmp_cleaner::cron {
      cron { 'nightly /tmp clean':
        command => '/bin/rm -rf /tmp/*.tgz /tmp/*.tar.gz /tmp/*.rpm /tmp/*.tar 
/tmp/*.zip 2>&1 | /usr/bin/logger -i -p cron.info',
        hour    => 3,
        minute  => 0,
        user    => root,
      }
    }

Two Comments from my side:

1. When simplifying our problem into this runtimevariation class/module I chose 
location /tmp/ not thinking a lot about it. Our actual machines where this 
problem originally occurred **do** share the same tmp_cleaner class/module 
**but don't** show this behavior inside /tmp/ but in a totally different 
location. So I cannot imagine this cronjob from tmp_cleaner class/module has 
anything to do with it.
2. Anyway, if it helps to reassure the cronjob has nothing to do with it I can 
re-test it without the tmp_cleaner module/class (so without the cronjob). No 
Problem at all.




----------------------------------------
Bug #20865: Random behavior when notifying exec ressources having "onlyif" 
parameter set
https://projects.puppetlabs.com/issues/20865#change-92105

* Author: Christian Flamm
* Status: Investigating
* Priority: Normal
* Assignee: Charlie Sharpsteen
* Category: 
* Target version: 
* Affected Puppet version: 3.1.1
* 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?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to