lyber-core 7.6.0 → 7.7.0

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
  SHA256:
3
- metadata.gz: b9ed0c812c1f67354df3b5a866533d133505b97a009fd564a28bd7b66fda7e4f
4
- data.tar.gz: 2fd1a9458a2cb649c28ec0b9c7fe3f32486aa9ad55212be9dbd470fd06096f8c
3
+ metadata.gz: 06b40bbb06d992835959637eaab8a0319a8ea093cc9b8c883b39a6a0df6a1e70
4
+ data.tar.gz: d2ca21bec9e898cf98f72db0c21637d6f33fd48bc8e69fcc571d9b621679e802
5
5
  SHA512:
6
- metadata.gz: a18f87bf3bdd09a609698b64e27f3e1093d90c0f8d1bb81ae94a4576002c0a14cc669c606c841a32061796a309610c0242f07173c58c50518565477c9af2959d
7
- data.tar.gz: 10e08bd6f4804d7caa15fdf24adbc2fe73b6752f626458bebaeb42a5c2258e3205cf6a2038e2b6ffaaafd43c93f10cd1ee2af094f139785573d881d9a70c7c7e
6
+ metadata.gz: 796bb15551fa5bd9995237781b73dd78ff81ea0d9db36afa92ad7ebd4aa56a2552cc436d5759ca4d9c95ce66fb3a6e4cef3098ef3ec227e2430ddd93517999d0
7
+ data.tar.gz: a84a27a79cc73bd1e368352eae2a4412acc35d9d7951db5c61cfcf2e61b1760e641a7c8d7529acc5805df79d2a78830f35f91bc919fdcd18f332ea2302893b79
data/README.md CHANGED
@@ -26,9 +26,7 @@ module Robots
26
26
  def perform_work
27
27
  cocina_object.shelve
28
28
  end
29
-
30
29
  end
31
-
32
30
  end
33
31
  end
34
32
  end
@@ -59,9 +57,27 @@ module Robots
59
57
  # return LyberCore::ReturnState.new(status: 'skipped', note: 'some custom note to pass back to workflow') # set the final state to skipped with a custom note
60
58
  end
61
59
  end
62
-
63
60
  end
61
+ end
62
+ end
63
+ end
64
+ ```
65
+
66
+ By default, a robot will not retry. To enable retries for specific errors:
67
+ ```ruby
68
+ module Robots
69
+ module DorRepo
70
+ module Accession
71
+
72
+ class Shelve < LyberCore::Robot
73
+ def initialize
74
+ super('accessionWF', 'shelve', retriable_exceptions: [Dor::Services::Client::Error])
75
+ end
64
76
 
77
+ def perform_work
78
+ cocina_object.shelve
79
+ end
80
+ end
65
81
  end
66
82
  end
67
83
  end
@@ -3,19 +3,32 @@
3
3
  module LyberCore
4
4
  # Base class for all robots.
5
5
  # Subclasses should implement the #perform_work method.
6
+ # To enable retries provide the retriable exceptions in the initializer.
6
7
  class Robot
7
8
  include Sidekiq::Job
8
- sidekiq_options retry: 0
9
+ # Setting sidekiq_options here won't work.
10
+ # Instead pass options when enqueueing the job with Sidekiq::Client.push. (Currently in Workflow's QueueService.)
11
+
12
+ sidekiq_retries_exhausted do |job, ex|
13
+ # When all the retries are exhausted, update the workflow to error.
14
+ robot = job['class'].constantize.new
15
+ workflow = Workflow.new(workflow_service: WorkflowClientFactory.build,
16
+ druid: job['args'].first,
17
+ workflow_name: robot.workflow_name,
18
+ process: robot.process)
19
+ workflow.error!(ex.message, Socket.gethostname)
20
+ end
9
21
 
10
- attr_reader :workflow_name, :process, :druid
22
+ attr_reader :workflow_name, :process, :druid, :retriable_exceptions
11
23
  attr_accessor :check_queued_status
12
24
 
13
25
  delegate :lane_id, to: :workflow
14
26
 
15
- def initialize(workflow_name, process, check_queued_status: true)
27
+ def initialize(workflow_name, process, check_queued_status: true, retriable_exceptions: [])
16
28
  @workflow_name = workflow_name
17
29
  @process = process
18
30
  @check_queued_status = check_queued_status
31
+ @retriable_exceptions = retriable_exceptions
19
32
  end
20
33
 
21
34
  def workflow_service
@@ -43,7 +56,7 @@ module LyberCore
43
56
  Honeybadger.context(druid:, process:, workflow_name:)
44
57
 
45
58
  logger.info "#{druid} processing #{process} (#{workflow_name})"
46
- return unless check_item_queued?
59
+ return unless check_item_queued_or_retry?
47
60
 
48
61
  # this is the default note to pass back to workflow service,
49
62
  # but it can be overriden by a robot that uses the Robots::ReturnState
@@ -73,8 +86,13 @@ module LyberCore
73
86
  workflow.complete!(workflow_state, elapsed, note) unless workflow_state == 'noop'
74
87
 
75
88
  logger.info "Finished #{druid} in #{format('%0.4f', elapsed)}s"
89
+ rescue *retriable_exceptions => e
90
+ handle_error(e)
91
+ workflow.retrying!
92
+ raise
76
93
  rescue StandardError => e
77
94
  handle_error(e)
95
+ workflow.error!(e.message, Socket.gethostname)
78
96
  end
79
97
  # rubocop:enable Metrics/AbcSize
80
98
  # rubocop:enable Metrics/MethodLength
@@ -91,16 +109,10 @@ module LyberCore
91
109
 
92
110
  private
93
111
 
94
- # rubocop:disable Metrics/AbcSize
95
112
  def handle_error(error)
96
113
  Honeybadger.notify(error)
97
114
  logger.error "#{error.message}\n#{error.backtrace.join("\n")}"
98
- workflow.error!(error.message, Socket.gethostname)
99
- rescue StandardError => e
100
- logger.error "Cannot set #{druid} to status='error'\n#{e.message}\n#{e.backtrace.join("\n")}"
101
- raise e # send exception to Sidekiq failed queue
102
115
  end
103
- # rubocop:enable Metrics/AbcSize
104
116
 
105
117
  def workflow
106
118
  @workflow ||= Workflow.new(workflow_service:,
@@ -109,10 +121,11 @@ module LyberCore
109
121
  process:)
110
122
  end
111
123
 
112
- def check_item_queued?
124
+ def check_item_queued_or_retry?
113
125
  return true unless check_queued_status
114
126
 
115
127
  return true if /queued/i.match?(workflow.status)
128
+ return true if /retrying/i.match?(workflow.status)
116
129
 
117
130
  msg = "Item #{druid} is not queued for #{process} (#{workflow_name}), " \
118
131
  "but has status of '#{workflow.status}'. Will skip processing"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LyberCore
4
- VERSION = '7.6.0'
4
+ VERSION = '7.7.0'
5
5
  end
@@ -28,6 +28,15 @@ module LyberCore
28
28
  note:)
29
29
  end
30
30
 
31
+ def retrying!
32
+ workflow_service.update_status(druid:,
33
+ workflow: workflow_name,
34
+ process:,
35
+ status: 'retrying',
36
+ elapsed: 1.0,
37
+ note: nil)
38
+ end
39
+
31
40
  def error!(error_msg, error_text)
32
41
  workflow_service.update_error_status(druid:,
33
42
  workflow: workflow_name,
@@ -3,7 +3,7 @@
3
3
  module LyberCore
4
4
  # Factory for creating a workflow client
5
5
  class WorkflowClientFactory
6
- def self.build(logger:)
6
+ def self.build(logger: Sidekiq.logger)
7
7
  Dor::Workflow::Client.new(url: Settings.workflow.url, logger:, timeout: Settings.workflow.timeout)
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lyber-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.6.0
4
+ version: 7.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alpana Pande
@@ -16,7 +16,7 @@ authors:
16
16
  autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
- date: 2024-10-07 00:00:00.000000000 Z
19
+ date: 2024-10-31 00:00:00.000000000 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: activesupport
@@ -50,30 +50,30 @@ dependencies:
50
50
  name: dor-services-client
51
51
  requirement: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - "~>"
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
- version: '15.0'
55
+ version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
58
  version_requirements: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - "~>"
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: '15.0'
62
+ version: '0'
63
63
  - !ruby/object:Gem::Dependency
64
64
  name: dor-workflow-client
65
65
  requirement: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: '7.4'
69
+ version: '7.6'
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - ">="
75
75
  - !ruby/object:Gem::Version
76
- version: '7.4'
76
+ version: '7.6'
77
77
  - !ruby/object:Gem::Dependency
78
78
  name: druid-tools
79
79
  requirement: !ruby/object:Gem::Requirement
@@ -265,7 +265,8 @@ files:
265
265
  homepage: http://github.com/sul-dlss/lyber-core
266
266
  licenses:
267
267
  - Apache-2.0
268
- metadata: {}
268
+ metadata:
269
+ rubygems_mfa_required: 'true'
269
270
  post_install_message:
270
271
  rdoc_options: []
271
272
  require_paths:
@@ -281,7 +282,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
281
282
  - !ruby/object:Gem::Version
282
283
  version: 1.3.6
283
284
  requirements: []
284
- rubygems_version: 3.5.15
285
+ rubygems_version: 3.5.11
285
286
  signing_key:
286
287
  specification_version: 4
287
288
  summary: Core services used by the SUL Digital Library