summaryrefslogtreecommitdiffstats
path: root/lib/puppet/util.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/util.rb')
-rw-r--r--lib/puppet/util.rb18
1 files changed, 17 insertions, 1 deletions
diff --git a/lib/puppet/util.rb b/lib/puppet/util.rb
index 650eb484a..9974d55e3 100644
--- a/lib/puppet/util.rb
+++ b/lib/puppet/util.rb
@@ -89,13 +89,29 @@ module Util
def self.lock(*opts)
lock = opts[0] + ".lock"
while File.exists?(lock)
+ stamp = File.stat(lock).mtime.to_i
+ if Time.now.to_i - stamp > 5
+ Puppet.notice "Lock file %s is %s seconds old; removing"
+ File.delete(lock)
+ end
#Puppet.debug "%s is locked" % opts[0]
sleep 0.1
end
File.open(lock, "w") { |f| f.print " "; f.flush }
+ writing = false
+ if opts[1] == "w"
+ writing = true
+ tmp = opts[0] + ".tmp"
+ orig = opts[0]
+ opts[0] = tmp
+ end
begin
File.open(*opts) { |file| yield file }
- rescue
+ if writing
+ File.rename(tmp, orig)
+ end
+ rescue => detail
+ Puppet.err "Storage error: %s" % detail
raise
ensure
# I don't really understand how the lock file could disappear,