A
Ara.T.Howard
URLS
http://raa.ruby-lang.org/project/lockfile/
http://www.codeforpeople.com/lib/ruby/lockfile/
SYNOPSIS
lib/lockfile.rb : a ruby library for creating NFS safe lockfiles
bin/rlock : ruby command line tool which uses this library to create
lockfiles. run 'rlock -h' for more info
INSTALL
sudo ruby install.rb
BASIC ALGORITHIM
* create a globally uniq filename in the same filesystem as the desired
lockfile - this can be nfs mounted
* link(2) this file to the desired lockfile, ignore all errors
* stat the uniq filename and desired lockfile to determine is they are the
same, use only stat.rdev and stat.ino - ignore stat.nlink as NFS can cause
this report incorrect values
* iff same, you have lock. either return or run optional code block with
optional refresher thread keeping lockfile fresh during execution of code
block, ensuring that the lockfile is removed..
* iff not same try again a few times in rapid succession (poll), then, iff
this fails, sleep using incremental backoff time. optionally remove
lockfile if it is older than a certain time, timeout if more than a certain
amount of time has passed attempting to lock file.
BASIC USAGE
1)
lockfile = Lockfile.new 'file.lock'
begin
lockfile.lock
p 42
ensure
lockfile.unlock
end
2)
require 'pstore' # which is NOT nfs safe on it's own
opts = { # the keys can be symbols or strings
:retries => 42, # we will try 42 times to aquire the lock
:sleep_inc => 2, # we will sleep 2 seconds longer than the
# previous sleep after each retry
:max_sleep => 30, # we will never sleep longer than 30 seconds
# however
:max_age => 3600, # we will blow away any files found to be older
# than this (this sets lockfile.thief? == true)
:suspend => 16, # iff we steal the lock from someone else - wait
# this long to give them a chance to realize it
:refresh => 8, # we will spawn a bg thread that touches file
# every 8 sec. this thread also causes a
# StolenLockError to be thrown if the lock
# disappears from under us - note that the
# 'detection' rate is limited to the refresh
# interval - a race condition
:timeout => 300, # we simply will not wait longer than five
# minutes
oll_retries => 16, # the initial attempt to grab a lock is done in a
# polling fashion, this number controls how many
# times this is done - the total polling attempts
# are considered ONE actual attempt (see retries
# above)
oll_max_sleep => 0.42, # when polling a very brief sleep is issued
# between attempts, this is the upper limit of
# that sleep timeout
}
pstore = PStore.new 'file.db'
lockfile = Lockfile.new 'file.db.lock', opts
lockfile.lock do
pstore.transaction do
pstore[:last_update_time] = Time.now
end
end
3) same as 1 above - Lockfile.new takes a block and ensures unlock is called
Lockfile.new('file.lock') do
p 42
end
4) watch locking algorithim in action
Lockfile.debug = true
Lockfile.new('file.lock') do
p 42
end
you can also set debugging via the ENV var LOCKFILE_DEBUG
SAMPLES
* see samples/a.rb
* see samples/nfsstore.rb
* see bin/rlock
enjoy.
-a
--
===============================================================================
| EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
| PHONE :: 303.497.6469
| ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
| URL :: http://www.ngdc.noaa.gov/stp/
| TRY :: for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done
===============================================================================
http://raa.ruby-lang.org/project/lockfile/
http://www.codeforpeople.com/lib/ruby/lockfile/
SYNOPSIS
lib/lockfile.rb : a ruby library for creating NFS safe lockfiles
bin/rlock : ruby command line tool which uses this library to create
lockfiles. run 'rlock -h' for more info
INSTALL
sudo ruby install.rb
BASIC ALGORITHIM
* create a globally uniq filename in the same filesystem as the desired
lockfile - this can be nfs mounted
* link(2) this file to the desired lockfile, ignore all errors
* stat the uniq filename and desired lockfile to determine is they are the
same, use only stat.rdev and stat.ino - ignore stat.nlink as NFS can cause
this report incorrect values
* iff same, you have lock. either return or run optional code block with
optional refresher thread keeping lockfile fresh during execution of code
block, ensuring that the lockfile is removed..
* iff not same try again a few times in rapid succession (poll), then, iff
this fails, sleep using incremental backoff time. optionally remove
lockfile if it is older than a certain time, timeout if more than a certain
amount of time has passed attempting to lock file.
BASIC USAGE
1)
lockfile = Lockfile.new 'file.lock'
begin
lockfile.lock
p 42
ensure
lockfile.unlock
end
2)
require 'pstore' # which is NOT nfs safe on it's own
opts = { # the keys can be symbols or strings
:retries => 42, # we will try 42 times to aquire the lock
:sleep_inc => 2, # we will sleep 2 seconds longer than the
# previous sleep after each retry
:max_sleep => 30, # we will never sleep longer than 30 seconds
# however
:max_age => 3600, # we will blow away any files found to be older
# than this (this sets lockfile.thief? == true)
:suspend => 16, # iff we steal the lock from someone else - wait
# this long to give them a chance to realize it
:refresh => 8, # we will spawn a bg thread that touches file
# every 8 sec. this thread also causes a
# StolenLockError to be thrown if the lock
# disappears from under us - note that the
# 'detection' rate is limited to the refresh
# interval - a race condition
:timeout => 300, # we simply will not wait longer than five
# minutes
# polling fashion, this number controls how many
# times this is done - the total polling attempts
# are considered ONE actual attempt (see retries
# above)
# between attempts, this is the upper limit of
# that sleep timeout
}
pstore = PStore.new 'file.db'
lockfile = Lockfile.new 'file.db.lock', opts
lockfile.lock do
pstore.transaction do
pstore[:last_update_time] = Time.now
end
end
3) same as 1 above - Lockfile.new takes a block and ensures unlock is called
Lockfile.new('file.lock') do
p 42
end
4) watch locking algorithim in action
Lockfile.debug = true
Lockfile.new('file.lock') do
p 42
end
you can also set debugging via the ENV var LOCKFILE_DEBUG
SAMPLES
* see samples/a.rb
* see samples/nfsstore.rb
* see bin/rlock
enjoy.
-a
--
===============================================================================
| EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
| PHONE :: 303.497.6469
| ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
| URL :: http://www.ngdc.noaa.gov/stp/
| TRY :: for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done
===============================================================================