dynflow 0.8.9 → 0.8.10
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 +4 -4
- data/.travis.yml +1 -0
- data/Gemfile +1 -1
- data/dynflow.gemspec +2 -2
- data/examples/example_helper.rb +4 -1
- data/examples/future_execution.rb +4 -5
- data/examples/orchestrate.rb +1 -0
- data/examples/sub_plan_concurrency_control.rb +73 -0
- data/lib/dynflow.rb +2 -0
- data/lib/dynflow/action/with_sub_plans.rb +42 -4
- data/lib/dynflow/config.rb +8 -0
- data/lib/dynflow/delayed_plan.rb +4 -3
- data/lib/dynflow/dispatcher/executor_dispatcher.rb +11 -7
- data/lib/dynflow/execution_plan.rb +5 -5
- data/lib/dynflow/execution_plan/steps/run_step.rb +1 -1
- data/lib/dynflow/semaphores.rb +8 -0
- data/lib/dynflow/semaphores/abstract.rb +46 -0
- data/lib/dynflow/semaphores/aggregating.rb +63 -0
- data/lib/dynflow/semaphores/dummy.rb +32 -0
- data/lib/dynflow/semaphores/stateful.rb +70 -0
- data/lib/dynflow/throttle_limiter.rb +135 -0
- data/lib/dynflow/version.rb +1 -1
- data/lib/dynflow/world.rb +16 -8
- data/test/action_test.rb +2 -2
- data/test/concurrency_control_test.rb +241 -0
- data/test/future_execution_test.rb +5 -5
- data/test/middleware_test.rb +2 -2
- data/test/prepare_travis_env.sh +1 -1
- data/test/semaphores_test.rb +98 -0
- data/test/test_helper.rb +1 -1
- metadata +18 -7
@@ -69,11 +69,11 @@ module Dynflow
|
|
69
69
|
execution_plan.result.must_equal :pending
|
70
70
|
assert_planning_success execution_plan
|
71
71
|
history_names.call(execution_plan).must_equal ['delay']
|
72
|
-
|
73
|
-
executed.
|
74
|
-
executed.
|
75
|
-
executed.
|
76
|
-
executed.
|
72
|
+
delayed_plan.execute.future.wait
|
73
|
+
executed = world.persistence.load_execution_plan(delayed_plan.execution_plan_uuid)
|
74
|
+
executed.state.must_equal :stopped
|
75
|
+
executed.result.must_equal :success
|
76
|
+
executed.execution_history.count.must_equal 3
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'expired plans can be failed' do
|
data/test/middleware_test.rb
CHANGED
@@ -15,7 +15,7 @@ module Dynflow
|
|
15
15
|
delay = world.delay(Support::MiddlewareExample::LoggingAction, { :start_at => Time.now.utc - 60 }, {})
|
16
16
|
plan = world.persistence.load_delayed_plan delay.execution_plan_id
|
17
17
|
plan.plan
|
18
|
-
plan.execute.wait
|
18
|
+
plan.execute.future.wait
|
19
19
|
log.must_equal %w[LogMiddleware::before_delay
|
20
20
|
delay
|
21
21
|
LogMiddleware::after_delay
|
@@ -125,7 +125,7 @@ module Dynflow
|
|
125
125
|
delay = world.delay(Support::MiddlewareExample::Action, { :start_at => Time.now - 60 })
|
126
126
|
plan = world.persistence.load_delayed_plan delay.execution_plan_id
|
127
127
|
plan.plan
|
128
|
-
plan.execute.wait
|
128
|
+
plan.execute.future.wait
|
129
129
|
log.must_equal ["delay#set-input:#{world.id}",
|
130
130
|
"plan#input:#{world.id}",
|
131
131
|
"input#message:#{world.id}",
|
data/test/prepare_travis_env.sh
CHANGED
@@ -0,0 +1,98 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
module Dynflow
|
4
|
+
module SemaphoresTest
|
5
|
+
describe ::Dynflow::Semaphores::Stateful do
|
6
|
+
|
7
|
+
let(:semaphore_class) { ::Dynflow::Semaphores::Stateful }
|
8
|
+
let(:tickets_count) { 5 }
|
9
|
+
|
10
|
+
it 'can be used as counter' do
|
11
|
+
expected_state = { :tickets => tickets_count, :free => 4, :meta => {} }
|
12
|
+
semaphore = semaphore_class.new(tickets_count)
|
13
|
+
semaphore.tickets.must_equal tickets_count
|
14
|
+
semaphore.free.must_equal tickets_count
|
15
|
+
semaphore.waiting.must_be_empty
|
16
|
+
semaphore.get.must_equal 1
|
17
|
+
semaphore.free.must_equal tickets_count - 1
|
18
|
+
semaphore.get(3).must_equal 3
|
19
|
+
semaphore.free.must_equal tickets_count - (3 + 1)
|
20
|
+
semaphore.drain.must_equal 1
|
21
|
+
semaphore.free.must_equal tickets_count - (3 + 1 + 1)
|
22
|
+
semaphore.release
|
23
|
+
semaphore.free.must_equal tickets_count - (3 + 1)
|
24
|
+
semaphore.release 3
|
25
|
+
semaphore.free.must_equal tickets_count - 1
|
26
|
+
semaphore.to_hash.must_equal expected_state
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'can have things waiting on it' do
|
30
|
+
semaphore = semaphore_class.new 1
|
31
|
+
allowed = semaphore.wait(1)
|
32
|
+
allowed.must_equal true
|
33
|
+
semaphore.free.must_equal 0
|
34
|
+
allowed = semaphore.wait(2)
|
35
|
+
allowed.must_equal false
|
36
|
+
allowed = semaphore.wait(3)
|
37
|
+
allowed.must_equal false
|
38
|
+
waiting = semaphore.get_waiting
|
39
|
+
waiting.must_equal 2
|
40
|
+
waiting = semaphore.get_waiting
|
41
|
+
waiting.must_equal 3
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe ::Dynflow::Semaphores::Dummy do
|
47
|
+
let(:semaphore_class) { ::Dynflow::Semaphores::Dummy }
|
48
|
+
|
49
|
+
it 'always has free' do
|
50
|
+
semaphore = semaphore_class.new
|
51
|
+
semaphore.free.must_equal 1
|
52
|
+
semaphore.get(5).must_equal 5
|
53
|
+
semaphore.free.must_equal 1
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'cannot have things waiting on it' do
|
57
|
+
semaphore = semaphore_class.new
|
58
|
+
semaphore.wait(1).must_equal true
|
59
|
+
semaphore.has_waiting?.must_equal false
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe ::Dynflow::Semaphores::Aggregating do
|
64
|
+
let(:klass) { ::Dynflow::Semaphores::Aggregating }
|
65
|
+
let(:child_class) { ::Dynflow::Semaphores::Stateful }
|
66
|
+
let(:children) do
|
67
|
+
{
|
68
|
+
:child_A => child_class.new(3),
|
69
|
+
:child_B => child_class.new(2)
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
def assert_semaphore_state(semaphore, state_A, state_B)
|
74
|
+
semaphore.children[:child_A].free.must_equal state_A
|
75
|
+
semaphore.children[:child_B].free.must_equal state_B
|
76
|
+
semaphore.free.must_equal [state_A, state_B].min
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'can be used as counter' do
|
80
|
+
semaphore = klass.new(children)
|
81
|
+
assert_semaphore_state semaphore, 3, 2
|
82
|
+
semaphore.get.must_equal 1
|
83
|
+
assert_semaphore_state semaphore, 2, 1
|
84
|
+
semaphore.get.must_equal 1
|
85
|
+
assert_semaphore_state semaphore, 1, 0
|
86
|
+
semaphore.get.must_equal 0
|
87
|
+
assert_semaphore_state semaphore, 1, 0
|
88
|
+
semaphore.release
|
89
|
+
assert_semaphore_state semaphore, 2, 1
|
90
|
+
semaphore.release(1, :child_B)
|
91
|
+
assert_semaphore_state semaphore, 2, 2
|
92
|
+
semaphore.drain.must_equal 2
|
93
|
+
assert_semaphore_state semaphore, 0, 0
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
data/test/test_helper.rb
CHANGED
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: 0.8.
|
4
|
+
version: 0.8.10
|
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:
|
12
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
@@ -59,28 +59,28 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 1.0
|
62
|
+
version: '1.0'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 1.0
|
69
|
+
version: '1.0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: concurrent-ruby-edge
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: 0.2
|
76
|
+
version: '0.2'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: 0.2
|
83
|
+
version: '0.2'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: sequel
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -332,6 +332,7 @@ files:
|
|
332
332
|
- examples/orchestrate.rb
|
333
333
|
- examples/orchestrate_evented.rb
|
334
334
|
- examples/remote_executor.rb
|
335
|
+
- examples/sub_plan_concurrency_control.rb
|
335
336
|
- examples/sub_plans.rb
|
336
337
|
- lib/dynflow.rb
|
337
338
|
- lib/dynflow/action.rb
|
@@ -420,6 +421,11 @@ files:
|
|
420
421
|
- lib/dynflow/persistence_adapters/sequel_migrations/007_future_execution.rb
|
421
422
|
- lib/dynflow/persistence_adapters/sequel_migrations/008_rename_scheduled_plans_to_delayed_plans.rb
|
422
423
|
- lib/dynflow/round_robin.rb
|
424
|
+
- lib/dynflow/semaphores.rb
|
425
|
+
- lib/dynflow/semaphores/abstract.rb
|
426
|
+
- lib/dynflow/semaphores/aggregating.rb
|
427
|
+
- lib/dynflow/semaphores/dummy.rb
|
428
|
+
- lib/dynflow/semaphores/stateful.rb
|
423
429
|
- lib/dynflow/serializable.rb
|
424
430
|
- lib/dynflow/serializer.rb
|
425
431
|
- lib/dynflow/serializers.rb
|
@@ -436,6 +442,7 @@ files:
|
|
436
442
|
- lib/dynflow/testing/factories.rb
|
437
443
|
- lib/dynflow/testing/managed_clock.rb
|
438
444
|
- lib/dynflow/testing/mimic.rb
|
445
|
+
- lib/dynflow/throttle_limiter.rb
|
439
446
|
- lib/dynflow/transaction_adapters.rb
|
440
447
|
- lib/dynflow/transaction_adapters/abstract.rb
|
441
448
|
- lib/dynflow/transaction_adapters/active_record.rb
|
@@ -452,6 +459,7 @@ files:
|
|
452
459
|
- test/abnormal_states_recovery_test.rb
|
453
460
|
- test/action_test.rb
|
454
461
|
- test/clock_test.rb
|
462
|
+
- test/concurrency_control_test.rb
|
455
463
|
- test/coordinator_test.rb
|
456
464
|
- test/dispatcher_test.rb
|
457
465
|
- test/execution_plan_test.rb
|
@@ -462,6 +470,7 @@ files:
|
|
462
470
|
- test/prepare_travis_env.sh
|
463
471
|
- test/rescue_test.rb
|
464
472
|
- test/round_robin_test.rb
|
473
|
+
- test/semaphores_test.rb
|
465
474
|
- test/support/code_workflow_example.rb
|
466
475
|
- test/support/dummy_example.rb
|
467
476
|
- test/support/middleware_example.rb
|
@@ -519,7 +528,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
519
528
|
version: '0'
|
520
529
|
requirements: []
|
521
530
|
rubyforge_project:
|
522
|
-
rubygems_version: 2.
|
531
|
+
rubygems_version: 2.2.0
|
523
532
|
signing_key:
|
524
533
|
specification_version: 4
|
525
534
|
summary: DYNamic workFLOW engine
|
@@ -527,6 +536,7 @@ test_files:
|
|
527
536
|
- test/abnormal_states_recovery_test.rb
|
528
537
|
- test/action_test.rb
|
529
538
|
- test/clock_test.rb
|
539
|
+
- test/concurrency_control_test.rb
|
530
540
|
- test/coordinator_test.rb
|
531
541
|
- test/dispatcher_test.rb
|
532
542
|
- test/execution_plan_test.rb
|
@@ -537,6 +547,7 @@ test_files:
|
|
537
547
|
- test/prepare_travis_env.sh
|
538
548
|
- test/rescue_test.rb
|
539
549
|
- test/round_robin_test.rb
|
550
|
+
- test/semaphores_test.rb
|
540
551
|
- test/support/code_workflow_example.rb
|
541
552
|
- test/support/dummy_example.rb
|
542
553
|
- test/support/middleware_example.rb
|