locker 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,4 @@
3
3
  Gemfile.lock
4
4
  pkg/*
5
5
  /spec/database.yml
6
+ .rvmrc
@@ -39,10 +39,12 @@ class Locker
39
39
 
40
40
  if @locked
41
41
  begin
42
+ parent_thread = Thread.current
43
+
42
44
  renewer = Thread.new do
43
45
  while @locked
44
46
  sleep @renew_every
45
- renew
47
+ renew(parent_thread)
46
48
  end
47
49
  end
48
50
 
@@ -67,9 +69,9 @@ class Locker
67
69
  @locked = update_all(["locked_by = NULL"],["key = ? and locked_by = ?", @key, @identifier])
68
70
  end
69
71
 
70
- def renew
72
+ def renew(thread=Thread.current)
71
73
  @locked = update_all(["locked_until = clock_timestamp() at time zone 'UTC' + #{lock_interval}"], ["key = ? and locked_by = ?", @key, @identifier])
72
- raise LockStolen unless @locked
74
+ thread.raise LockStolen unless @locked
73
75
  @locked
74
76
  end
75
77
 
@@ -1,3 +1,3 @@
1
1
  class Locker
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -76,6 +76,15 @@ describe Locker do
76
76
  lock.update_attribute(:locked_by, "someone else")
77
77
  expect{ locker.renew }.to raise_error(Locker::LockStolen)
78
78
  end
79
+
80
+ it "should raise to the parent thread when the renewer is in a thread and someone steals the lock" do
81
+ expect do
82
+ Locker.run("steal me", :renew_every => (0.1).seconds) do
83
+ Lock.find_by_key("steal me").update_attribute(:locked_by, "contrived example")
84
+ sleep(0.3)
85
+ end
86
+ end.to raise_error(Locker::LockStolen)
87
+ end
79
88
  end
80
89
 
81
90
  describe "blocking" do
@@ -11,14 +11,15 @@ ActiveRecord::Base.time_zone_aware_attributes = true
11
11
  ActiveRecord::Base.default_timezone = "UTC"
12
12
 
13
13
  config = YAML.load_file(File.join(File.dirname(__FILE__), 'database.yml'))
14
- ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
15
14
  begin
16
- ActiveRecord::Base.establish_connection(config)
17
- rescue
15
+ ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
18
16
  ActiveRecord::Base.connection.create_database(config['database'], config.merge("encoding" => config['encoding'] || ENV['CHARSET'] || 'utf8'))
19
- ActiveRecord::Base.establish_connection(config)
17
+ rescue ActiveRecord::StatementInvalid => e
18
+ raise unless e.message =~ /database "locker_test" already exists/
20
19
  end
21
20
 
21
+ ActiveRecord::Base.establish_connection(config)
22
+
22
23
  ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS locks")
23
24
  ActiveRecord::Base.connection.create_table(:locks) do |t|
24
25
  t.string :locked_by
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: locker
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nathan Sutton
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-08-31 00:00:00 Z
19
+ date: 2011-09-02 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: activerecord
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  requirements: []
137
137
 
138
138
  rubyforge_project: locker
139
- rubygems_version: 1.8.7
139
+ rubygems_version: 1.8.6
140
140
  signing_key:
141
141
  specification_version: 3
142
142
  summary: Locker is a locking mechanism for limiting the concurrency of ruby code using the database.