dynflow 1.4.1 → 1.4.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 727176abc78b46f7b0f0381806561496fba8cdb9e31c5cdea473b5bd6de7bcf0
4
- data.tar.gz: aa1d255d09123e50d1d7c718c4738e87fa88741ad23e1f548f0444bdb98fc534
3
+ metadata.gz: dfb6db078bac6d7bb006fa9cdc7ccb30a5eaa507d5c5fde11723c5295fe7990c
4
+ data.tar.gz: 7959053035ed970863493c066622e51ca16733d17be8869458ef79c6ccfe4244
5
5
  SHA512:
6
- metadata.gz: 98f12bd5c1cd06b925601b6c9e6fc5dda7f2f81ecba805251cfb987c9b131bd88be59f57098d8bab4c856b33743815fa2338524ffe3804d4d1dda0e44f73fadc
7
- data.tar.gz: 8747b3e08c259a94dd025acb4cfc97654ff8c1ec5782b8bf7876b455187fb789f91d467e1ca9468e48c1a16d745fe3279911652f669b84f4864df8af3066b3cf
6
+ metadata.gz: 219901624a304846e8d8b3e70e274e2b291923db9f43ae482816b02caa3b967985fc75f936283e5647f98415d788235e7521ac26f28b59dde625084ed9599bf5
7
+ data.tar.gz: d1a32c183a574de8e3a0aeeb875bafa6082f2a2971a0f8755f441ab5d350cba2de19e2df22c93109335244f8e84ac65b5dc100abd3517c098bc37e7231751ce2
@@ -2,6 +2,7 @@ language: ruby
2
2
 
3
3
  services:
4
4
  - postgresql
5
+ - redis
5
6
 
6
7
  rvm:
7
8
  - "2.3.1"
@@ -18,6 +19,7 @@ matrix:
18
19
  env: "DB=mysql DB_CONN_STRING=mysql2://root@localhost/travis_ci_test"
19
20
  services:
20
21
  - mysql
22
+ - redis
21
23
  - rvm: "2.4.0"
22
24
  env: "DB=sqlite3 DB_CONN_STRING=sqlite:/"
23
25
  - rvm: "2.4.0"
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  s.add_development_dependency "rack-test"
31
31
  s.add_development_dependency "minitest"
32
32
  s.add_development_dependency "minitest-reporters"
33
+ s.add_development_dependency "minitest-stub-const"
33
34
  s.add_development_dependency "activerecord"
34
35
  s.add_development_dependency 'activejob'
35
36
  s.add_development_dependency "sqlite3"
@@ -32,7 +32,8 @@ Sequel.migration do
32
32
  primary_key [:execution_plan_uuid, :id]
33
33
  index [:execution_plan_uuid, :id], :unique => true
34
34
  column :action_id, Integer
35
- foreign_key [:execution_plan_uuid, :action_id], :dynflow_actions
35
+ foreign_key [:execution_plan_uuid, :action_id], :dynflow_actions,
36
+ name: :dynflow_steps_execution_plan_uuid_fkey1
36
37
  index [:execution_plan_uuid, :action_id]
37
38
 
38
39
  column :data, String, text: true
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Dynflow
3
- VERSION = '1.4.1'
3
+ VERSION = '1.4.2'
4
4
  end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'test_helper'
3
+ require 'mocha/minitest'
4
+ require 'minitest/stub_const'
5
+ require 'ostruct'
6
+ require 'sidekiq'
7
+ require 'dynflow/executors/sidekiq/core'
8
+
9
+ module Dynflow
10
+ module RedisLockingTest
11
+ describe Executors::Sidekiq::RedisLocking do
12
+ class Orchestrator
13
+ include Executors::Sidekiq::RedisLocking
14
+
15
+ attr_accessor :logger
16
+
17
+ def initialize(world, logger)
18
+ @world = world
19
+ @logger = logger
20
+ end
21
+ end
22
+
23
+ class Logger
24
+ attr_reader :logs
25
+ def initialize
26
+ @logs = []
27
+ end
28
+
29
+ [:info, :error, :fatal].each do |key|
30
+ define_method key do |message|
31
+ @logs << [key, message]
32
+ end
33
+ end
34
+ end
35
+
36
+ after do
37
+ ::Sidekiq.redis do |conn|
38
+ conn.del Executors::Sidekiq::RedisLocking::REDIS_LOCK_KEY
39
+ end
40
+ end
41
+
42
+ def redis_orchestrator_id
43
+ ::Sidekiq.redis do |conn|
44
+ conn.get Executors::Sidekiq::RedisLocking::REDIS_LOCK_KEY
45
+ end
46
+ end
47
+
48
+ let(:world) { OpenStruct.new(:id => '12345') }
49
+ let(:world2) { OpenStruct.new(:id => '67890') }
50
+ let(:orchestrator) { Orchestrator.new(world, Logger.new) }
51
+ let(:orchestrator2) { Orchestrator.new(world2, Logger.new) }
52
+
53
+ it 'acquires the lock when it is not taken' do
54
+ orchestrator.wait_for_orchestrator_lock
55
+ logs = orchestrator.logger.logs
56
+ _(redis_orchestrator_id).must_equal world.id
57
+ _(logs).must_equal [[:info, 'Acquired orchestrator lock, entering active mode.']]
58
+ end
59
+
60
+ it 'reacquires the lock if it was lost' do
61
+ orchestrator.reacquire_orchestrator_lock
62
+ logs = orchestrator.logger.logs
63
+ _(redis_orchestrator_id).must_equal world.id
64
+ _(logs).must_equal [[:error, 'The orchestrator lock was lost, reacquired']]
65
+ end
66
+
67
+ it 'terminates the process if lock was stolen' do
68
+ orchestrator.wait_for_orchestrator_lock
69
+ Process.expects(:kill)
70
+ orchestrator2.reacquire_orchestrator_lock
71
+ logs = orchestrator2.logger.logs
72
+ _(redis_orchestrator_id).must_equal world.id
73
+ _(logs).must_equal [[:fatal, 'The orchestrator lock was stolen by 12345, aborting.']]
74
+ end
75
+
76
+ it 'polls for the lock availability' do
77
+ Executors::Sidekiq::RedisLocking.stub_const(:REDIS_LOCK_TTL, 1) do
78
+ Executors::Sidekiq::RedisLocking.stub_const(:REDIS_LOCK_POLL_INTERVAL, 0.5) do
79
+ orchestrator.wait_for_orchestrator_lock
80
+ _(redis_orchestrator_id).must_equal world.id
81
+ orchestrator2.wait_for_orchestrator_lock
82
+ end
83
+ end
84
+
85
+ _(redis_orchestrator_id).must_equal world2.id
86
+ passive, active = orchestrator2.logger.logs
87
+ _(passive).must_equal [:info, 'Orchestrator lock already taken, entering passive mode.']
88
+ _(active).must_equal [:info, 'Acquired orchestrator lock, entering active mode.']
89
+ end
90
+ end
91
+ end
92
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Necas
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-10-25 00:00:00.000000000 Z
12
+ date: 2019-12-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -151,6 +151,20 @@ dependencies:
151
151
  - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: minitest-stub-const
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
154
168
  - !ruby/object:Gem::Dependency
155
169
  name: activerecord
156
170
  requirement: !ruby/object:Gem::Requirement
@@ -566,6 +580,7 @@ files:
566
580
  - test/middleware_test.rb
567
581
  - test/persistence_test.rb
568
582
  - test/prepare_travis_env.sh
583
+ - test/redis_locking_test.rb
569
584
  - test/rescue_test.rb
570
585
  - test/round_robin_test.rb
571
586
  - test/semaphores_test.rb
@@ -648,6 +663,7 @@ test_files:
648
663
  - test/middleware_test.rb
649
664
  - test/persistence_test.rb
650
665
  - test/prepare_travis_env.sh
666
+ - test/redis_locking_test.rb
651
667
  - test/rescue_test.rb
652
668
  - test/round_robin_test.rb
653
669
  - test/semaphores_test.rb