lockfile 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
metadata CHANGED
@@ -1,19 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: "0.8"
2
+ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: lockfile
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.1.0
7
- date: 2004-11-01
8
- summary: A ruby library for creating NFS safe lockfiles
6
+ version: 1.3.0
7
+ date: 2005-11-03 00:00:00.000000 -07:00
8
+ summary: lockfile
9
9
  require_paths:
10
- - "."
11
10
  - lib
12
- author: "-a"
13
- email: Ara.T.Howard@noaa.gov
14
- homepage: http://www.codeforpeople.com/lib/ruby/lockfile/
11
+ email: ara.t.howard@noaa.gov
12
+ homepage: http://codeforpeople.com/lib/ruby/lockfile/
15
13
  rubyforge_project:
16
- description: A ruby library for creating NFS safe lockfiles
14
+ description:
17
15
  autorequire: lockfile
18
16
  default_executable:
19
17
  bindir: bin
@@ -26,34 +24,19 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
26
24
  version: 0.0.0
27
25
  version:
28
26
  platform: ruby
27
+ signing_key:
28
+ cert_chain:
29
+ authors:
30
+ - Ara T. Howard
29
31
  files:
30
- - install.rb
31
- - VERSION
32
- - BUGS
33
- - lib
34
- - bin
35
- - samples
36
- - doc
37
- - lockfile.gemspec
38
- - lockfile-1.1.0.gem
39
- - README
40
32
  - lib/lockfile.rb
41
- - lib/lockfile-1.1.0.rb
33
+ - lib/lockfile-1.3.0.rb
42
34
  - bin/rlock
43
- - samples/a.rb
44
- - samples/nfsstore.rb
45
- - samples/test.db
46
- - samples/test.db~
47
- - doc/rlock.help
35
+ - bin/rlock-1.3.0
48
36
  test_files: []
49
- rdoc_options:
50
- - "--main"
51
- - README
52
- extra_rdoc_files:
53
- - README
54
- - doc/rlock.help
55
- executables:
56
- - rlock
37
+ rdoc_options: []
38
+ extra_rdoc_files: []
39
+ executables: []
57
40
  extensions: []
58
41
  requirements: []
59
42
  dependencies: []
data/BUGS DELETED
@@ -1,3 +0,0 @@
1
- none known
2
-
3
- email Ara.T.Howard@noaa.gov with any reports please!
data/README DELETED
@@ -1,165 +0,0 @@
1
- = URLS
2
-
3
- http://raa.ruby-lang.org/project/lockfile/
4
- http://www.codeforpeople.com/lib/ruby/lockfile/
5
-
6
- = SYNOPSIS
7
-
8
- lib/lockfile.rb : a ruby library for creating NFS safe lockfiles
9
-
10
- bin/rlock : ruby command line tool which uses this library to create
11
- lockfiles. run 'rlock -h' for more info
12
-
13
- = INSTALL
14
-
15
- sudo ruby install.rb
16
-
17
-
18
- = BASIC ALGORITHIM
19
-
20
- * create a globally uniq filename in the same filesystem as the desired
21
- lockfile - this can be nfs mounted
22
-
23
- * link(2) this file to the desired lockfile, ignore all errors
24
-
25
- * stat the uniq filename and desired lockfile to determine is they are the
26
- same, use only stat.rdev and stat.ino - ignore stat.nlink as NFS can cause
27
- this report incorrect values
28
-
29
- * iff same, you have lock. either return or run optional code block with
30
- optional refresher thread keeping lockfile fresh during execution of code
31
- block, ensuring that the lockfile is removed..
32
-
33
- * iff not same try again a few times in rapid succession (poll), then, iff
34
- this fails, sleep using incremental backoff time. optionally remove
35
- lockfile if it is older than a certain time, timeout if more than a certain
36
- amount of time has passed attempting to lock file.
37
-
38
-
39
- = BASIC USAGE
40
-
41
- 1)
42
- lockfile = Lockfile.new 'file.lock'
43
- begin
44
- lockfile.lock
45
- p 42
46
- ensure
47
- lockfile.unlock
48
- end
49
-
50
-
51
- 2)
52
- require 'pstore' # which is NOT nfs safe on it's own
53
-
54
- opts = { # the keys can be symbols or strings
55
-
56
- :retries => nil, # we will try forever to aquire the lock
57
-
58
- :sleep_inc => 2, # we will sleep 2 seconds longer than the
59
- # previous sleep after each retry, cycling from
60
- # min_sleep upto max_sleep downto min_sleep upto
61
- # max_sleep, etc., etc.
62
-
63
- :min_sleep => 2, # we will never sleep less than 2 seconds
64
-
65
- :max_sleep => 32, # we will never sleep longer than 32 seconds
66
-
67
- :max_age => 1024, # we will blow away any files found to be older
68
- # than this (lockfile.thief? #=> true)
69
-
70
- :suspend => 64, # iff we steal the lock from someone else - wait
71
- # this long to give them a chance to realize it
72
-
73
- :refresh => 8, # we will spawn a bg thread that touches file
74
- # every 8 sec. this thread also causes a
75
- # StolenLockError to be thrown if the lock
76
- # disappears from under us - note that the
77
- # 'detection' rate is limited to the refresh
78
- # interval - this is a race condition
79
-
80
- :timeout => nil, # we will wait forever
81
-
82
- :poll_retries => 16, # the initial attempt to grab a lock is done in a
83
- # polling fashion, this number controls how many
84
- # times this is done - the total polling attempts
85
- # are considered ONE actual attempt (see retries
86
- # above)
87
-
88
- :poll_max_sleep => 0.08, # when polling a very brief sleep is issued
89
- # between attempts, this is the upper limit of
90
- # that sleep timeout
91
-
92
- :debug => true, # trace execution step on stdout
93
- }
94
-
95
- pstore = PStore.new 'file.db'
96
- lockfile = Lockfile.new 'file.db.lock', opts
97
- lockfile.lock do
98
- pstore.transaction do
99
- pstore[:last_update_time] = Time.now
100
- end
101
- end
102
-
103
- 3) same as 1 above - Lockfile.new takes a block and ensures unlock is called
104
-
105
- Lockfile.new('file.lock') do
106
- p 42
107
- end
108
-
109
- 4) watch locking algorithim in action
110
-
111
- Lockfile.debug = true
112
- Lockfile.new('file.lock') do
113
- p 42
114
- end
115
-
116
- you can also set debugging via the ENV var LOCKFILE_DEBUG, eg.
117
-
118
- ~ > LOCKFILE_DEBUG=true rlock lockfile
119
-
120
- = SAMPLES
121
-
122
- * see samples/a.rb
123
- * see samples/nfsstore.rb
124
- * see bin/rlock
125
-
126
- = AUTHOR
127
-
128
- -a
129
-
130
- = EMAIL
131
-
132
- Ara.T.Howard@noaa.gov
133
-
134
- = BUGS
135
-
136
- > 1
137
-
138
- further notifications to email above
139
-
140
- = HISTORY
141
-
142
- 1.0.1:
143
- - fixed bugette in sleep cycle where repeated locks with same lockfile would
144
- not reset the cycle at the start of each lock
145
- 1.0.0:
146
- - allow rertries to be nil, meaning to try forever
147
- - default timeout is now nil - never timeout
148
- - default refresh is now 8
149
- - fixed bug where refresher thread was not actually touching lockfile! (ouch)
150
- - added cycle method to timeouts
151
- 1-2-3-2-1-2-3-1...
152
- pattern is constructed using min_sleep, sleep_inc, max_sleep
153
- 0.3.0:
154
- - removed use of yaml in favour of hand parsing the lockfile contents, the
155
- file as so small it just wasn't worth and i have had one core dump when yaml
156
- failed to parse a (corrupt) file
157
- 0.2.0:
158
- - added an initial polling style attempt to grab lock before entering normal
159
- sleep/retry loop. this has really helped performance when lock is under
160
- heavy contention: i see almost no sleeping done by any of in the interested
161
- processes
162
- 0.1.0:
163
- - added ability of Lockfile.new to accept a block
164
- 0.0.0:
165
- - initial version
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.1.0
data/doc/rlock.help DELETED
@@ -1,88 +0,0 @@
1
- = NAME
2
- rlock v0.0.0
3
-
4
- = SYNOPSIS
5
- rlock [options]+ file.lock [program [-- [options]+] [args]+]
6
-
7
- = DESCRIPTTION
8
- rlock creates NFS resistent lockfiles
9
-
10
- = ENVIRONMENT
11
- LOCKFILE_DEBUG=1 will show internal actions of the library
12
-
13
- = DIAGNOSTICS
14
- success => $? == 0
15
- failure => $? != 0
16
-
17
- = AUTHOR
18
- ara.t.howard@noaa.gov
19
-
20
- = BUGS
21
- > 1
22
-
23
- = OPTIONS
24
-
25
- -r, --retries=n
26
- -a, --max_age=n
27
- -s, --sleep_inc=n
28
- -p, --max_sleep=n
29
- -u, --suspend=n
30
- -t, --timeout=n
31
- -f, --refresh=n
32
- -d, --debug
33
- -v=0-4|debug|info|warn|error|fatal
34
- --verbosity
35
- -l, --log=path
36
- --log_age=log_age
37
- --log_size=log_size
38
- -h, --help
39
-
40
- = EXAMPLES
41
-
42
- 0) simple usage - just create a file.lock in an atomic fashion
43
-
44
- ~ > rlock file.lock
45
-
46
- 1) safe usage - create a file.lock, execute a command, and remove file.lock
47
-
48
- ~ > rlock file.lock ls file.lock
49
-
50
- 2) same as above, but logging verbose messages
51
-
52
- ~ > rlock -v4 file.lock ls file.lock
53
-
54
- 3) same as above, but logging verbose messages and showing actions internal to
55
- lockfile library
56
-
57
- ~ > rlock -v4 -d file.lock ls file.lock
58
-
59
- 4) same as above
60
-
61
- ~ > LOCKFILE_DEBUG=1 rlock -v4 file.lock ls file.lock
62
-
63
- 5) same as above
64
-
65
- ~ > export LOCKFILE_DEBUG=1
66
- ~ > rlock -v4 file.lock ls file.lock
67
-
68
- 6) note that you need to tell the option parser to stop parsing rlock options if
69
- you intend to pass options to 'program'
70
-
71
- ~ > rlock -v4 -d file.lock -- ls -ltar file.lock
72
-
73
- without the '--' rlock would consume the '-ltar' options, parsing it
74
- as the logfile name 'tar'
75
-
76
- 7) lock file.lock and exec 'program' - remove the file.lock if it is older than 4242 seconds
77
-
78
- ~ > rlock --max_age=4242 file.lock program
79
-
80
- 8) lock file.lock and exec 'program' - remove the file.lock if it is older
81
- than 4242 seconds, also spawn a background thread which will refresh
82
- file.lock every 8 seonds will 'program' is executing
83
-
84
- ~ > rlock --max_age=4242 --refresh=8 file.lock program
85
-
86
- 9) same as above, but fail if file.lock cannot be obtained within 1 minute
87
-
88
- ~ > rlock --max_age=4242 --refresh=8 --timeout=60 file.lock program
data/install.rb DELETED
@@ -1,143 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'rbconfig'
3
- require 'find'
4
- require 'ftools'
5
- require 'tempfile'
6
- include Config
7
-
8
- LIBDIR = "lib"
9
- LIBDIR_MODE = 0644
10
-
11
- BINDIR = "bin"
12
- BINDIR_MODE = 0755
13
-
14
-
15
- $srcdir = CONFIG["srcdir"]
16
- $version = CONFIG["MAJOR"]+"."+CONFIG["MINOR"]
17
- $libdir = File.join(CONFIG["libdir"], "ruby", $version)
18
- $archdir = File.join($libdir, CONFIG["arch"])
19
- $site_libdir = $:.find {|x| x =~ /site_ruby$/}
20
- $bindir = CONFIG["bindir"]
21
- $ruby_install_name = CONFIG['ruby_install_name'] || CONFIG['RUBY_INSTALL_NAME']
22
- $ruby = File.join($bindir, $ruby_install_name || 'ruby')
23
-
24
- if !$site_libdir
25
- $site_libdir = File.join($libdir, "site_ruby")
26
- elsif $site_libdir !~ %r/#{Regexp.quote($version)}/
27
- $site_libdir = File.join($site_libdir, $version)
28
- end
29
-
30
- def install_rb(srcdir=nil, destdir=nil, mode=nil, bin=nil)
31
- #{{{
32
- path = []
33
- dir = []
34
- Find.find(srcdir) do |f|
35
- next unless FileTest.file?(f)
36
- next if (f = f[srcdir.length+1..-1]) == nil
37
- next if (/CVS$/ =~ File.dirname(f))
38
- path.push f
39
- dir |= [File.dirname(f)]
40
- end
41
- for f in dir
42
- next if f == "."
43
- next if f == "CVS"
44
- File::makedirs(File.join(destdir, f))
45
- end
46
- for f in path
47
- next if (/\~$/ =~ f)
48
- next if (/^\./ =~ File.basename(f))
49
- unless bin
50
- File::install(File.join(srcdir, f), File.join(destdir, f), mode, true)
51
- else
52
- from = File.join(srcdir, f)
53
- to = File.join(destdir, f)
54
- shebangify(from) do |sf|
55
- $deferr.print from, " -> ", File::catname(from, to), "\n"
56
- $deferr.printf "chmod %04o %s\n", mode, to
57
- File::install(sf, to, mode, false)
58
- end
59
- end
60
- end
61
- #}}}
62
- end
63
- def shebangify f
64
- #{{{
65
- open(f) do |fd|
66
- buf = fd.read 42
67
- if buf =~ %r/^\s*#\s*!.*ruby/o
68
- ftmp = Tempfile::new("#{ $$ }_#{ File::basename(f) }")
69
- begin
70
- fd.rewind
71
- ftmp.puts "#!#{ $ruby }"
72
- while((buf = fd.read(8192)))
73
- ftmp.write buf
74
- end
75
- ftmp.close
76
- yield ftmp.path
77
- ensure
78
- ftmp.close!
79
- end
80
- else
81
- yield f
82
- end
83
- end
84
- #}}}
85
- end
86
- def ARGV.switch
87
- #{{{
88
- return nil if self.empty?
89
- arg = self.shift
90
- return nil if arg == '--'
91
- if arg =~ /^-(.)(.*)/
92
- return arg if $1 == '-'
93
- raise 'unknown switch "-"' if $2.index('-')
94
- self.unshift "-#{$2}" if $2.size > 0
95
- "-#{$1}"
96
- else
97
- self.unshift arg
98
- nil
99
- end
100
- #}}}
101
- end
102
- def ARGV.req_arg
103
- #{{{
104
- self.shift || raise('missing argument')
105
- #}}}
106
- end
107
-
108
-
109
- #
110
- # main program
111
- #
112
-
113
- libdir = $site_libdir
114
- bindir = $bindir
115
-
116
- begin
117
- while switch = ARGV.switch
118
- case switch
119
- when '-d', '--destdir'
120
- libdir = ARGV.req_arg
121
- when '-l', '--libdir'
122
- libdir = ARGV.req_arg
123
- when '-b', '--bindir'
124
- bindir = ARGV.req_arg
125
- when '-r', '--ruby'
126
- $ruby = ARGV.req_arg
127
- else
128
- raise "unknown switch #{switch.dump}"
129
- end
130
- end
131
- rescue
132
- STDERR.puts $!.to_s
133
- STDERR.puts File.basename($0) +
134
- " -d <destdir>" +
135
- " -l <libdir>" +
136
- " -b <bindir>"
137
- " -r <ruby>"
138
- exit 1
139
- end
140
-
141
- install_rb(LIBDIR, libdir, LIBDIR_MODE)
142
- install_rb(BINDIR, bindir, BINDIR_MODE, bin=true)
143
-