lib/puppet/util/pidlock.rb in puppet-2.7.26 vs lib/puppet/util/pidlock.rb in puppet-3.0.0.rc4

- old
+ new

@@ -1,117 +1,53 @@ require 'fileutils' +require 'puppet/util/lockfile' class Puppet::Util::Pidlock - attr_reader :lockfile def initialize(lockfile) - @lockfile = lockfile + @lockfile = Puppet::Util::Lockfile.new(lockfile) end def locked? clear_if_stale - return true if File.exists? @lockfile - - # HACK! There was a temporary change to the lockfile behavior introduced in 2.7.10 and 2.7.11, and reverted - # in 2.7.12. We need to pull some chicanery to be backwards-compatible with those versions. For more info, - # see the comments on the method... and this hack should be removed for the 3.x series. - handle_2_7_10_disabled_lockfile - File.exists? @lockfile + @lockfile.locked? end def mine? Process.pid == lock_pid end - def anonymous? - return false unless File.exists?(@lockfile) - File.read(@lockfile) == "" - end + def lock + return mine? if locked? - def lock(opts = {}) - opts = {:anonymous => false}.merge(opts) - - if locked? - mine? - else - if opts[:anonymous] - File.open(@lockfile, 'w') { |fd| true } - else - File.open(@lockfile, "w") { |fd| fd.write(Process.pid) } - end - true - end + @lockfile.lock(Process.pid) end - def unlock(opts = {}) - return false unless locked? - - opts = {:anonymous => false}.merge(opts) - - if mine? or (opts[:anonymous] and anonymous?) - File.unlink(@lockfile) - true + def unlock() + if mine? + return @lockfile.unlock else false end end - private def lock_pid - if File.exists? @lockfile - File.read(@lockfile).to_i - else - nil - end + @lockfile.lock_data.to_i end + def clear_if_stale return if lock_pid.nil? errors = [Errno::ESRCH] # Process::Error can only happen, and is only defined, on Windows errors << Process::Error if defined? Process::Error begin Process.kill(0, lock_pid) rescue *errors - File.unlink(@lockfile) + @lockfile.unlock end end + private :clear_if_stale - - ###################################################################################### - # Backwards compatibility hack - ###################################################################################### - # A change to lockfile behavior was introduced in 2.7.10 and 2.7.11; basically, - # instead of using a single lockfile to indicate both administrative disabling of - # the agent *and* the case where an agent run is already in progress, we started using - # two separate lockfiles: the 'normal' one for the "run in progress" case, and a - # separate one with a ".disabled" extension to indicate administrative disabling. - # - # This was determined to cause incompatibilities with mcollective, so the behavior - # was reverted for 2.7.12. Unfortunately this leaves the possibility that someone - # may have run "agent --disable" to administratively disable a 2.7.10 or 2.7.11 - # agent, and then upgraded to a newer version. This method exists only to - # provide backwards compatibility. Basically, it just recognizes the 2.7.10/2.7.11 - # ".disabled" lock file, warns, and cleans it up. - # - # This should be removed for the 3.x series. - # - # For more information, please see tickets #12844, #3757, #4836, and #11057 - # - # -- cprice 2012-03-01 - # - def handle_2_7_10_disabled_lockfile - disabled_lockfile_path = @lockfile + ".disabled" - if (File.exists?(disabled_lockfile_path)) - Puppet.warning("Found special lockfile '#{disabled_lockfile_path}'; this file was " + - "generated by a call to 'puppet agent --disable' in puppet 2.7.10 or 2.7.11. " + - "The expected lockfile path is '#{@lockfile}'; renaming the lock file.") - File.rename(disabled_lockfile_path, @lockfile) - end - end - private :handle_2_7_10_disabled_lockfile - ###################################################################################### - # End backwards compatibility hack - ###################################################################################### end