chewy_kiqqer 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9bc9b696f63dde10676ef37db9dcc950ddf4cc89
4
- data.tar.gz: 5a65a9c36ded236ddd6d4b76f3711afad2750b8d
3
+ metadata.gz: 69fa520fad10a08f620c667e91f1b133ac7e8adf
4
+ data.tar.gz: 6d8ab912f3eb918570395081cc4e89720e286b7e
5
5
  SHA512:
6
- metadata.gz: e8188028f5fff23bf9dc931b5ab5bcb1488ae030140d373a0f14890990720e4cc664d593ed37a1b16084c5fceb51de7e7a935fc6a020eff477e73532944f305b
7
- data.tar.gz: 979a88a89572420ebda2b9f07efe464ff78d3dd7430b02414705e3297c062053d16c1fb1472ab0443370b1b4c64e6cb62db956df35486eb9540a552362f112e5
6
+ metadata.gz: 7459fef7cf824e5d833636876c4e09c6ad3c44ebb26e2c99e9bf7e96e775eff5845076f2ba55d4574cd75cb6b235190504e93b6547612fa204c1bc6bebbf56f1
7
+ data.tar.gz: fdf22831d0609f93fa8fc23b1d69ded783baf684af20507b708867784ae9003800db5352bc58a77e08cf7a1254a9dcc3ee17474cd914b8cc1c2b78cc1bcef0ae
data/.travis.yml CHANGED
@@ -1,4 +1,6 @@
1
1
  language: ruby
2
+ services:
3
+ - redis
2
4
  rvm:
3
5
  - 2.0.0
4
6
  - 2.1.2
data/README.md CHANGED
@@ -51,6 +51,19 @@ which will be indexed. The default is to use the current record.
51
51
 
52
52
  ## Update handling
53
53
 
54
+ The kiqqer does *not* use Chewy's `atomic` update, since that functionality is deeply linked with Chewy's syncronous update mechanism.
55
+
56
+ Instead, ChewyKiqqer will bind itself to the `#after_commit` callback, which means that it will only trigger a new job after a complete database transaction. This behaviour also ensures that only one job is enqueued per transaction.
57
+
58
+ However, if you have multiple database transactions, the kiqqer will still queue multiple jobs. The same is true when you enqueue jobs manually.
59
+
60
+ ChewyKiqqer uses locking via redis to ensure that all updates for one database record are run sequentially. This prevents race conditions which could lead to outdated data being written to the index otherwise.
61
+
62
+ ## Logging
63
+
64
+ Logging is disabled by default, but you can set `ChewyKiqqer.logger` if you need log output (e.g. `ChewyKiqqer.logger = Rails.logger`). ChewyKiqqer uses ActiveSupport notifications, which you can also subscribe to.
65
+ See `log_subscriber.rb` for more info.
66
+
54
67
  ## Contributing
55
68
 
56
69
  1. Fork it
data/chewy_kiqqer.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency 'sidekiq'
22
22
  spec.add_dependency 'chewy'
23
- spec.add_dependency 'sidekiq-lock'
23
+ spec.add_dependency 'mlanett-redis-lock'
24
24
  spec.add_dependency 'activesupport', '>= 3.2.0'
25
25
 
26
26
  spec.add_development_dependency "bundler", "~> 1.3"
@@ -3,7 +3,11 @@ module ChewyKiqqer
3
3
  class LogSubscriber < ActiveSupport::LogSubscriber
4
4
 
5
5
  def perform(event)
6
- info "ChewyKiqqer performed on #{event.payload[:index_name]} with ids #{event.payload[:ids]} - duration #{event.duration}"
6
+ info "ChewyKiqqer job ran on #{event.payload[:index_name]} with ids #{event.payload[:ids]} - duration #{event.duration}"
7
+ end
8
+
9
+ def index(event)
10
+ debug "ChewyKiqqer index updated on #{event.payload[:index_name]} with ids #{event.payload[:ids]} - duration #{event.duration}"
7
11
  end
8
12
 
9
13
  def queue_jobs(event)
@@ -1,3 +1,3 @@
1
1
  module ChewyKiqqer
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -1,27 +1,33 @@
1
1
  require 'sidekiq'
2
- require 'sidekiq-lock'
2
+ require 'redis-lock'
3
3
 
4
4
  module ChewyKiqqer
5
5
  class Worker
6
6
 
7
- class LockError < StandardError ; end
8
-
9
7
  include Sidekiq::Worker
10
- include Sidekiq::Lock::Worker
11
-
12
- sidekiq_options lock: {
13
- timeout: 3000,
14
- name: ->(index_name, ids) { "lock:chewy_kiqqer:#{index_name}-#{[ids].flatten.sort.join('-')}" }
15
- }
16
8
 
17
9
 
18
10
  def perform(index_name, ids)
19
- lock.acquire! or raise LockError
20
11
  ActiveSupport::Notifications.instrument('perform.chewy_kiqqer', index_name: index_name, ids: ids) do
12
+ with_lock(index_name, ids)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def with_lock(index_name, ids)
19
+ Sidekiq.redis do |redis|
20
+ lock_name = "#{index_name}-#{ids.join('-')}"
21
+ redis.lock(lock_name, life: 60, acquire: 5) { index(index_name, ids) }
22
+ end
23
+ end
24
+
25
+ def index(index_name, ids)
26
+ ActiveSupport::Notifications.instrument('index.chewy_kiqqer', index_name: index_name, ids: ids) do
21
27
  Chewy.derive_type(index_name).import ids
22
28
  end
23
- ensure
24
- lock.release!
25
29
  end
30
+
31
+
26
32
  end
27
33
  end
@@ -19,6 +19,14 @@ describe ChewyKiqqer::LogSubscriber do
19
19
  }.to_not raise_error
20
20
  end
21
21
 
22
+ it 'logs an index event' do
23
+ allow(subscriber).to receive(:logger).and_return(logger)
24
+ expect(logger).to receive(:debug)
25
+ expect {
26
+ subscriber.index(double(payload: { index_name: 'foo', ids: [1,2] }, duration: 0.2))
27
+ }.to_not raise_error
28
+ end
29
+
22
30
  it 'log a queue_jobs event' do
23
31
  allow(subscriber).to receive(:logger).and_return(logger)
24
32
  expect(logger).to receive(:debug)
data/spec/worker_spec.rb CHANGED
@@ -15,11 +15,4 @@ describe ChewyKiqqer::Worker do
15
15
  worker.perform('foo#bar', [17])
16
16
  end
17
17
 
18
- it 'raises a lock error if the lock cannot be acquired' do
19
- allow(lock).to receive(:acquire!).and_return(false)
20
- expect {
21
- worker.perform('foo#bar', [17])
22
- }.to raise_error(ChewyKiqqer::Worker::LockError)
23
- end
24
-
25
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chewy_kiqqer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Hahn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-29 00:00:00.000000000 Z
11
+ date: 2014-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: sidekiq-lock
42
+ name: mlanett-redis-lock
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '>='