Subversion Info

Rev
437
Last Checked In
2008-03-28 00:49:20 (2 weeks ago)
Checked in by
deveiant

Class Index

Quicksearch

Arrow::Session::FileLock

File-based lock manager for Arrow sessions using the flock(2) system call.

Constants

SVNRev
SVN Revision
SVNId
SVN Id
DefaultLockDir
The path to the default lockdir
LockfileFormat
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.
FileMode
The mode to open the lockfile in

Attributes

lockDir[RW]
The path to the directory where session lockfiles are kept.

Public Class Methods

clean( directory=DefaultLockDir, threshold=3600 ) click to toggle source

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
new( uri, id ) click to toggle source

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

Public Instance Methods

finish() click to toggle source

Indicate to the lock that the caller will no longer be using it, and it may free any resources it had been using.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/session/filelock.rb, line 108
108:     def finish
109:         super
110:         self.close_lock_file
111:     end

Protected Instance Methods

acquire_read_lock( blocking ) click to toggle source

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_write_lock( blocking ) click to toggle source

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_lock_file() click to toggle source

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
lockfile() click to toggle source

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_read_lock() click to toggle source

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_write_lock() click to toggle source

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

secsequence

--- SEC00103

seccomment

--- ""

attributes

--- 
- name: lockDir
  rw: RW
  a_desc: |+
    
    The path to the directory where session lockfiles are kept.
    

method_list

--- 
- 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\">&lt;</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\">&quot;Removing stale lockfile '%s'&quot;</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\">&gt;</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\">&quot;Could not clean up '%s': %s&quot;</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\">#  =&gt; 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

sectitle

--- 

constants

--- 
- 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 &#8217;%s&#8217; will be replaced with a sanitized version of the
    session id.
    
  value: "&quot;arrow-session-%s.lock&quot;"
- name: FileMode
  desc: |+
    
    The mode to open the <a href="FileLock.html#M000077">lockfile</a> in
    
  value: File::RDWR|File::CREAT

[Validate]

Generated with the Darkfish Rdoc Generator.