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.