File-based lock manager for Arrow sessions using the flock(2) system call.
Clean the specified directory of lock files older than threshold seconds.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 55 55: def self::clean( directory=DefaultLockDir, threshold=3600 ) 56: pat = File.join( directory, LockfileFormat.gsub(/%s/, '*') ) 57: threshold = Time.now - threshold 58: Dir[ pat ].each do |file| 59: if File.mtime( file ) < threshold 60: Arrow::Logger[self].info \ 61: "Removing stale lockfile '%s'" % file 62: begin 63: fh = File.open( file, FileMode ) 64: fh.flock( File::LOCK_EX|File::LOCK_NB ) 65: File.delete( file ) 66: fh.flock( File::LOCK_UN ) 67: fh.close 68: rescue => err 69: Arrow::Logger[self].warning \ 70: "Could not clean up '%s': %s" % 71: [ file, err.message ] 72: next 73: end 74: end 75: end 76: end
Create a new Arrow::Session::FileLock object.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 85 85: def initialize( uri, id ) 86: @lockDir = uri.path || DefaultLockDir 87: super 88: 89: # 'foo de barg blag 0x1f2eca'.gsub( /\W/, '_' ) 90: # => foo_de_barg_blag_0x1f2eca 91: lockfilename = LockfileFormat % id.to_s.gsub( /\W/, '_' ) 92: File.mkpath( @lockDir ) 93: @filename = File.join( @lockDir, lockfilename ).untaint 94: @lockfile = nil 95: end
Acquire a read (shared) lock on the lockfile.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 138 138: def acquire_read_lock( blocking ) 139: flags = File::LOCK_SH 140: flags |= File::LOCK_NB if !blocking 141: 142: self.lockfile.flock( flags ) 143: end
Acquire a write (exclusive) lock on the lockfile.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 147 147: def acquire_write_lock( blocking ) 148: flags = File::LOCK_EX 149: flags |= File::LOCK_NB if !blocking 150: 151: self.lockfile.flock( flags ) 152: end
Close the lockfile and destroy the File object belonging to this lock.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 127 127: def close_lock_file 128: if @lockfile 129: path = @lockfile.path 130: @lockfile.close 131: @lockfile = nil 132: File.delete( path.untaint ) if File.exist?( path.untaint ) 133: end 134: end
Get the File object for the lockfile belonging to this lock, creating it if necessary.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 120 120: def lockfile 121: @lockfile ||= File.open( @filename, FileMode ) 122: end
Release a previously-acquired read lock.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 156 156: def release_read_lock 157: if !self.write_locked? 158: self.lockfile.flock( File::LOCK_UN ) 159: self.close_lock_file 160: end 161: end
Release a previously-acquired write lock.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 165 165: def release_write_lock 166: if self.read_locked? 167: self.lockfile.flock( File::LOCK_SH ) 168: else 169: self.lockfile.flock( File::LOCK_UN ) 170: self.close_lock_file 171: end 172: end
--- SEC00103
--- ""
--- - name: lockDir rw: RW a_desc: |+ The path to the directory where session lockfiles are kept.
--- - methods: - visibility: public aref: M000074 name: clean sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 55</span>\n\ 55: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">clean</span>( <span class=\"ruby-identifier\">directory</span>=<span class=\"ruby-constant\">DefaultLockDir</span>, <span class=\"ruby-identifier\">threshold</span>=<span class=\"ruby-value\">3600</span> )\n\ 56: <span class=\"ruby-identifier\">pat</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-identifier\">directory</span>, <span class=\"ruby-constant\">LockfileFormat</span>.<span class=\"ruby-identifier\">gsub</span>(<span class=\"ruby-regexp re\">/%s/</span>, <span class=\"ruby-value str\">'*'</span>) )\n\ 57: <span class=\"ruby-identifier\">threshold</span> = <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">threshold</span>\n\ 58: <span class=\"ruby-constant\">Dir</span>[ <span class=\"ruby-identifier\">pat</span> ].<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">file</span><span class=\"ruby-operator\">|</span>\n\ 59: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">mtime</span>( <span class=\"ruby-identifier\">file</span> ) <span class=\"ruby-operator\"><</span> <span class=\"ruby-identifier\">threshold</span>\n\ 60: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[<span class=\"ruby-keyword kw\">self</span>].<span class=\"ruby-identifier\">info</span> \\\n\ 61: <span class=\"ruby-value str\">"Removing stale lockfile '%s'"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">file</span>\n\ 62: <span class=\"ruby-keyword kw\">begin</span>\n\ 63: <span class=\"ruby-identifier\">fh</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">open</span>( <span class=\"ruby-identifier\">file</span>, <span class=\"ruby-constant\">FileMode</span> )\n\ 64: <span class=\"ruby-identifier\">fh</span>.<span class=\"ruby-identifier\">flock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_EX</span><span class=\"ruby-operator\">|</span><span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_NB</span> )\n\ 65: <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">file</span> )\n\ 66: <span class=\"ruby-identifier\">fh</span>.<span class=\"ruby-identifier\">flock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_UN</span> )\n\ 67: <span class=\"ruby-identifier\">fh</span>.<span class=\"ruby-identifier\">close</span>\n\ 68: <span class=\"ruby-keyword kw\">rescue</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">err</span>\n\ 69: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[<span class=\"ruby-keyword kw\">self</span>].<span class=\"ruby-identifier\">warning</span> \\\n\ 70: <span class=\"ruby-value str\">"Could not clean up '%s': %s"</span> <span class=\"ruby-operator\">%</span>\n\ 71: [ <span class=\"ruby-identifier\">file</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span> ]\n\ 72: <span class=\"ruby-keyword kw\">next</span>\n\ 73: <span class=\"ruby-keyword kw\">end</span>\n\ 74: <span class=\"ruby-keyword kw\">end</span>\n\ 75: <span class=\"ruby-keyword kw\">end</span>\n\ 76: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Clean the specified <tt>directory</tt> of lock files older than <tt>threshold</tt> seconds. </p> params: ( directory=DefaultLockDir, threshold=3600 ) - visibility: public aref: M000075 name: new sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 85</span>\n\ 85: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">uri</span>, <span class=\"ruby-identifier\">id</span> )\n\ 86: <span class=\"ruby-ivar\">@lockDir</span> = <span class=\"ruby-identifier\">uri</span>.<span class=\"ruby-identifier\">path</span> <span class=\"ruby-operator\">||</span> <span class=\"ruby-constant\">DefaultLockDir</span>\n\ 87: <span class=\"ruby-keyword kw\">super</span>\n\ 88: \n\ 89: <span class=\"ruby-comment cmt\"># 'foo de barg blag 0x1f2eca'.gsub( /\\W/, '_' ) </span>\n\ 90: <span class=\"ruby-comment cmt\"># => foo_de_barg_blag_0x1f2eca</span>\n\ 91: <span class=\"ruby-identifier\">lockfilename</span> = <span class=\"ruby-constant\">LockfileFormat</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">id</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">gsub</span>( <span class=\"ruby-regexp re\">/\\W/</span>, <span class=\"ruby-value str\">'_'</span> )\n\ 92: <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">mkpath</span>( <span class=\"ruby-ivar\">@lockDir</span> )\n\ 93: <span class=\"ruby-ivar\">@filename</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-ivar\">@lockDir</span>, <span class=\"ruby-identifier\">lockfilename</span> ).<span class=\"ruby-identifier\">untaint</span>\n\ 94: <span class=\"ruby-ivar\">@lockfile</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 95: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create a <a href="FileLock.html#M000075">new</a> <a href="FileLock.html">Arrow::Session::FileLock</a> object. </p> params: ( uri, id ) category: Class type: Public - methods: - visibility: public aref: M000076 name: finish sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 108</span>\n\ 108: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">finish</span>\n\ 109: <span class=\"ruby-keyword kw\">super</span>\n\ 110: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">close_lock_file</span>\n\ 111: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Indicate to the lock that the caller will no longer be using it, and it may free any resources it had been using. </p> params: () category: Instance type: Public - methods: - visibility: protected aref: M000079 name: acquire_read_lock sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 138</span>\n\ 138: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">acquire_read_lock</span>( <span class=\"ruby-identifier\">blocking</span> )\n\ 139: <span class=\"ruby-identifier\">flags</span> = <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_SH</span>\n\ 140: <span class=\"ruby-identifier\">flags</span> <span class=\"ruby-operator\">|=</span> <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_NB</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-identifier\">blocking</span>\n\ 141: \n\ 142: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">flock</span>( <span class=\"ruby-identifier\">flags</span> )\n\ 143: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Acquire a read (shared) lock on the <a href="FileLock.html#M000077">lockfile</a>. </p> params: ( blocking ) - visibility: protected aref: M000080 name: acquire_write_lock sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 147</span>\n\ 147: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">acquire_write_lock</span>( <span class=\"ruby-identifier\">blocking</span> )\n\ 148: <span class=\"ruby-identifier\">flags</span> = <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_EX</span>\n\ 149: <span class=\"ruby-identifier\">flags</span> <span class=\"ruby-operator\">|=</span> <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_NB</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-identifier\">blocking</span>\n\ 150: \n\ 151: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">flock</span>( <span class=\"ruby-identifier\">flags</span> )\n\ 152: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Acquire a write (exclusive) lock on the <a href="FileLock.html#M000077">lockfile</a>. </p> params: ( blocking ) - visibility: protected aref: M000078 name: close_lock_file sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 127</span>\n\ 127: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">close_lock_file</span>\n\ 128: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@lockfile</span>\n\ 129: <span class=\"ruby-identifier\">path</span> = <span class=\"ruby-ivar\">@lockfile</span>.<span class=\"ruby-identifier\">path</span>\n\ 130: <span class=\"ruby-ivar\">@lockfile</span>.<span class=\"ruby-identifier\">close</span>\n\ 131: <span class=\"ruby-ivar\">@lockfile</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 132: <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">untaint</span> ) <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">exist?</span>( <span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">untaint</span> )\n\ 133: <span class=\"ruby-keyword kw\">end</span>\n\ 134: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Close the <a href="FileLock.html#M000077">lockfile</a> and destroy the File object belonging to this lock. </p> params: () - visibility: protected aref: M000077 name: lockfile sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 120</span>\n\ 120: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">lockfile</span>\n\ 121: <span class=\"ruby-ivar\">@lockfile</span> <span class=\"ruby-operator\">||=</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">open</span>( <span class=\"ruby-ivar\">@filename</span>, <span class=\"ruby-constant\">FileMode</span> )\n\ 122: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Get the File object for the <a href="FileLock.html#M000077">lockfile</a> belonging to this lock, creating it if necessary. </p> params: () - visibility: protected aref: M000081 name: release_read_lock sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 156</span>\n\ 156: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">release_read_lock</span>\n\ 157: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">write_locked?</span>\n\ 158: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">flock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_UN</span> )\n\ 159: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">close_lock_file</span>\n\ 160: <span class=\"ruby-keyword kw\">end</span>\n\ 161: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Release a previously-acquired read lock. </p> params: () - visibility: protected aref: M000082 name: release_write_lock sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 165</span>\n\ 165: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">release_write_lock</span>\n\ 166: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">read_locked?</span>\n\ 167: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">flock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_SH</span> )\n\ 168: <span class=\"ruby-keyword kw\">else</span>\n\ 169: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">flock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_UN</span> )\n\ 170: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">close_lock_file</span>\n\ 171: <span class=\"ruby-keyword kw\">end</span>\n\ 172: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Release a previously-acquired write lock. </p> params: () category: Instance type: Protected
---
--- - name: SVNRev desc: |+ SVN Revision value: "%q$Rev: 437 $" - name: SVNId desc: |+ SVN <a href="Id.html">Id</a> value: "%q$Id: filelock.rb 437 2008-03-28 00:49:20Z deveiant $" - name: DefaultLockDir desc: |+ The path to the default lockdir value: "'/tmp'" - name: LockfileFormat desc: |+ The format string that will be used for the name of the lock file. The first ’%s’ will be replaced with a sanitized version of the session id. value: ""arrow-session-%s.lock"" - name: FileMode desc: |+ The mode to open the <a href="FileLock.html#M000077">lockfile</a> in value: File::RDWR|File::CREAT
Generated with the Darkfish Rdoc Generator.