ruby_reactor 0.8.5 → 0.8.6
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/.release-please-manifest.json +1 -1
- data/.specify/feature.json +1 -1
- data/.specify/memory/constitution.md +17 -14
- data/CHANGELOG.md +58 -0
- data/CLAUDE.md +1 -1
- data/README.md +23 -8
- data/lib/ruby_reactor/adapters/active_job/map_element_rollback_worker.rb +20 -0
- data/lib/ruby_reactor/adapters/active_job/router.rb +32 -4
- data/lib/ruby_reactor/adapters/sidekiq/map_element_rollback_worker.rb +16 -0
- data/lib/ruby_reactor/adapters/sidekiq/router.rb +32 -4
- data/lib/ruby_reactor/context.rb +14 -1
- data/lib/ruby_reactor/dsl/definition_warnings.rb +30 -0
- data/lib/ruby_reactor/dsl/map_builder.rb +27 -7
- data/lib/ruby_reactor/dsl/step_builder.rb +8 -21
- data/lib/ruby_reactor/error/rescuable.rb +6 -1
- data/lib/ruby_reactor/error/rollback_handed_off.rb +27 -0
- data/lib/ruby_reactor/executor/compensation_manager.rb +33 -9
- data/lib/ruby_reactor/executor/result_handler.rb +72 -52
- data/lib/ruby_reactor/executor/retry_manager.rb +4 -3
- data/lib/ruby_reactor/executor/step_executor.rb +3 -1
- data/lib/ruby_reactor/executor.rb +186 -6
- data/lib/ruby_reactor/map/collector.rb +25 -93
- data/lib/ruby_reactor/map/dispatcher.rb +38 -7
- data/lib/ruby_reactor/map/element_executor.rb +14 -10
- data/lib/ruby_reactor/map/element_rollback.rb +158 -0
- data/lib/ruby_reactor/map/helpers.rb +11 -155
- data/lib/ruby_reactor/map/step_rollback.rb +136 -0
- data/lib/ruby_reactor/map/sweeper.rb +66 -8
- data/lib/ruby_reactor/map.rb +17 -0
- data/lib/ruby_reactor/max_retries_exhausted_failure.rb +4 -2
- data/lib/ruby_reactor/reactor.rb +41 -2
- data/lib/ruby_reactor/rspec/active_job_helpers.rb +13 -2
- data/lib/ruby_reactor/rspec/matchers.rb +40 -21
- data/lib/ruby_reactor/rspec/sidekiq_helpers.rb +7 -3
- data/lib/ruby_reactor/rspec/test_subject.rb +13 -3
- data/lib/ruby_reactor/rspec.rb +3 -6
- data/lib/ruby_reactor/step/compose_step.rb +3 -0
- data/lib/ruby_reactor/step/map_step.rb +117 -114
- data/lib/ruby_reactor/storage/adapter.rb +14 -0
- data/lib/ruby_reactor/storage/redis_adapter.rb +18 -2
- data/lib/ruby_reactor/storage/redis_map_rollback.rb +153 -0
- data/lib/ruby_reactor/storage/redis_reactor_scan.rb +1 -1
- data/lib/ruby_reactor/sweeper.rb +3 -1
- data/lib/ruby_reactor/version.rb +1 -1
- data/lib/ruby_reactor/web/api.rb +11 -1
- data/lib/ruby_reactor/web/public/assets/{index-CQbgHtd0.js → index-C6ejszCQ.js} +12 -12
- data/lib/ruby_reactor/web/public/assets/index-DM5darhy.css +1 -0
- data/lib/ruby_reactor/web/public/index.html +2 -2
- data/lib/ruby_reactor/worker.rb +4 -2
- data/specs/007-execution-flow-analysis/evidence/harness.rb +2 -0
- data/specs/007-execution-flow-analysis/evidence/probes/03_map.rb +4 -1
- data/specs/009-distributed-map-undo/checklists/requirements.md +53 -0
- data/specs/009-distributed-map-undo/contracts/api-surface.md +125 -0
- data/specs/009-distributed-map-undo/contracts/rollback-protocol.md +157 -0
- data/specs/009-distributed-map-undo/data-model.md +151 -0
- data/specs/009-distributed-map-undo/plan.md +323 -0
- data/specs/009-distributed-map-undo/pr-description.md +78 -0
- data/specs/009-distributed-map-undo/quickstart.md +154 -0
- data/specs/009-distributed-map-undo/research.md +585 -0
- data/specs/009-distributed-map-undo/spec.md +360 -0
- data/specs/009-distributed-map-undo/tasks.md +1060 -0
- data/specs/future_improvements.md +18 -30
- metadata +21 -3
- data/lib/ruby_reactor/web/public/assets/index-BQvIWPdx.css +0 -1
data/lib/ruby_reactor/sweeper.rb
CHANGED
|
@@ -48,7 +48,9 @@ module RubyReactor
|
|
|
48
48
|
reenqueued = 0
|
|
49
49
|
|
|
50
50
|
@storage.scan_reactors(count: limit, include_dispatched_children: true).each do |reactor|
|
|
51
|
-
|
|
51
|
+
# Non-terminal only. A `rolling_back` run whose owner resume was lost
|
|
52
|
+
# is re-enqueued too: unsettled, it simply hands off again (009 S-5).
|
|
53
|
+
next unless %w[running rolling_back].include?(reactor[:status])
|
|
52
54
|
next if @storage.lock_held?("async:#{reactor[:id]}") # worker alive -> leave alone
|
|
53
55
|
|
|
54
56
|
@async_router.perform_async(reactor[:id], reactor[:class])
|
data/lib/ruby_reactor/version.rb
CHANGED
data/lib/ruby_reactor/web/api.rb
CHANGED
|
@@ -173,7 +173,7 @@ module RubyReactor
|
|
|
173
173
|
|
|
174
174
|
def self.reactor_status(data)
|
|
175
175
|
status = data[:status].to_s == "skipped" ? "halted" : data[:status].to_s
|
|
176
|
-
return status if %w[failed paused completed running halted pending aborted].include?(status)
|
|
176
|
+
return status if %w[failed paused completed running rolling_back halted pending aborted].include?(status)
|
|
177
177
|
return "cancelled" if data[:cancelled]
|
|
178
178
|
return "running" if data[:current_step]
|
|
179
179
|
return "completed" if execution_evidence?(data)
|
|
@@ -393,7 +393,17 @@ module RubyReactor
|
|
|
393
393
|
ref_data.merge("context" => child)
|
|
394
394
|
end
|
|
395
395
|
|
|
396
|
+
# A map that rolled back distributed also carries its progress, `{
|
|
397
|
+
# total, settled, outstanding, failed }` (009 R-15). The records outlive
|
|
398
|
+
# the run, so a client shows it only while the run is `rolling_back`.
|
|
396
399
|
def self.hydrate_map_ref(ref_data, reactor_class_name)
|
|
400
|
+
map_id = ref_data[:map_id] || ref_data["map_id"]
|
|
401
|
+
hydrated = hydrate_map_element(ref_data, reactor_class_name)
|
|
402
|
+
rollback = map_id && RubyReactor.configuration.storage_adapter.map_rollback_summary(map_id, reactor_class_name)
|
|
403
|
+
rollback ? hydrated.merge("rollback" => rollback.transform_keys(&:to_s)) : hydrated
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
def self.hydrate_map_element(ref_data, reactor_class_name)
|
|
397
407
|
storage = RubyReactor.configuration.storage_adapter
|
|
398
408
|
map_id = ref_data[:map_id] || ref_data["map_id"]
|
|
399
409
|
|