Issue #4579 has been updated by Nigel Kersten.
This was all with 0.25.4 by the way. Do you know if much relevant code has changed in 2.6.x off the top of your head Markus? I am planning to dig into this and sort it out, as I think we can improve this, possibly by erring on the side of possibly extraneous lstats rather than stats in some cases, but wanted to get this filed away. ---------------------------------------- Bug #4579: Symlink file type can issue potentially expensive stat calls rather than lstat http://projects.puppetlabs.com/issues/4579 Author: Nigel Kersten Status: Needs more information Priority: Normal Assignee: Nigel Kersten Category: Target version: Affected version: Keywords: Branch: I've only briefly looked at the relevant Puppet code here, but wanted to get this bug in as it took a little while for us to work out what was triggering this. Given the following simple manifest saved to /tmp/test.pp <pre> file { "/tmp/symlink": ensure => symlink, target => "/tmp/target", force => true, } </pre> There are a bunch of cases that can cause Puppet to stat the symlink rather than lstat'ing it. If the symlink target is on a slow filesystem, this can be very expensive. Shell script to indicate issue: <pre> #!/bin/bash # SYM=/tmp/symlink TAR=/tmp/target touch $TAR if stat $SYM &>/dev/null ; then echo "Symlink exists" # check if target exists if stat -L $SYM &>/dev/null; then # output target stat -c "%N" $SYM # output target type echo "Target is a $(stat -L -c "%F" $SYM)" else echo "Target is missing" fi else echo "Symlink missing" fi strace -e trace=stat,lstat -f /usr/bin/puppet /tmp/test.pp 2>&1 | grep -E "/tmp/(symlink|target)" </pre> Some examples: Symlink doesn't exist, target does. lstat: 1 stat: 1 <pre> nig...@wittgenstein:~ $ rm -f /tmp/{symlink,target} nig...@wittgenstein:~ $ ~/symlink-test.sh Symlink missing [pid 30115] lstat("/tmp/symlink", 0x7fff33457420) = -1 ENOENT (No such file or directory) [pid 30115] stat("/tmp/symlink", 0x7fff334549b0) = -1 ENOENT (No such file or directory) notice: //File[/tmp/symlink]/ensure: created </pre> Symlink exists, points to desired target. lstat: 1 <pre> nig...@wittgenstein:~ $ ~/symlink-test.sh Symlink exists `/tmp/symlink' -> `/tmp/target' Target is a regular empty file [pid 30435] lstat("/tmp/symlink", {st_mode=S_IFLNK|0777, st_size=11, ...}) = 0 </pre> Symlink exists, points to undesired file. lstat: 1 stat: 4 <pre> nig...@wittgenstein:~ $ ~/symlink-test.sh Symlink exists `/tmp/symlink' -> `/etc/fstab' Target is a regular file [pid 30524] lstat("/tmp/symlink", {st_mode=S_IFLNK|0777, st_size=10, ...}) = 0 [pid 30524] stat("/tmp/symlink", {st_mode=S_IFREG|0644, st_size=811, ...}) = 0 [pid 30524] stat("/tmp/symlink", {st_mode=S_IFREG|0644, st_size=811, ...}) = 0 [pid 30524] stat("/tmp/symlink", {st_mode=S_IFREG|0644, st_size=811, ...}) = 0 [pid 30524] stat("/tmp/symlink", 0x7fffb5d1b370) = -1 ENOENT (No such file or directory) notice: //File[/tmp/symlink]/target: target changed '/etc/fstab' to '/tmp/target' </pre> Symlink exists, points to undesired directory. lstat: 2 stat: 5 <pre> nig...@wittgenstein:~ $ ~/symlink-test.sh Symlink exists `/tmp/symlink' -> `/usr' Target is a directory [pid 30790] lstat("/tmp/symlink", {st_mode=S_IFLNK|0777, st_size=4, ...}) = 0 [pid 30790] stat("/tmp/symlink", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 30790] stat("/tmp/symlink", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 30790] stat("/tmp/symlink", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 30790] stat("/tmp/symlink", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 30790] lstat("/tmp/symlink", {st_mode=S_IFLNK|0777, st_size=4, ...}) = 0 [pid 30790] stat("/tmp/symlink", 0x7fff06901ab0) = -1 ENOENT (No such file or directory) notice: //File[/tmp/symlink]/target: target changed '/usr' to '/tmp/target' </pre> -- 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 post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-bugs?hl=en.
