herdst_worker 0.2.18 → 0.2.19

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: 1cb8f2fe78959dcc72ddb5262d5f775f7e2c8894e4cea3079df5574bc9afa469
4
- data.tar.gz: 26a30f925cd508910027e86449fc2ed0832dd64232c94f1992b0743a6f108046
3
+ metadata.gz: 6654d05e7c9d7f3a3060096bbc9acf651360fb25e3e2527292632518537f61f5
4
+ data.tar.gz: 98ce22ba4604f0c889bdfd27d6627ae63c36e45746e5c38697518c6675f993c2
5
5
  SHA512:
6
- metadata.gz: 72a91bfab0fd4e3c19a6c98eb5c1cbca69c0d07950165145ec15d9c877593f8a497d7c21b931d4ad356141edafe0908556612da24e574352289d38f6fcc9449c
7
- data.tar.gz: 013a1ef632e3f4fb751399e86fb2004bef44bd84d3fcc17a22a11919f4ba986c2428ee8c48ed38e5c4de7d9fd427de9bc7cd29276e2c487fd69aa02469c3360b
6
+ metadata.gz: 6f21d913498e7514c5a9fc591bdfc2fa65054692a0780fd075614824fed061c6eaf383f6e6133132b6674c2dc6ff7ef27215e3c35f877dbf5b0771a739e81613
7
+ data.tar.gz: e112479b119fce002f93b26b1a2931f6b1e24294210751446974f63f0b1450d8e50ba1aa8645093244d9d9a66eccd8306a66e59c137dd2ea7dfd89993932e024
@@ -1,4 +1,5 @@
1
1
  require "concurrent-ruby"
2
+ require "aws-sdk-ecs"
2
3
 
3
4
  require_relative '../configuration/facade'
4
5
  require_relative '../log/facade'
@@ -73,12 +74,14 @@ module HerdstWorker
73
74
 
74
75
  Kernel.exit(exit_code)
75
76
  end
76
-
77
77
 
78
- def force_stop(delay = 1)
79
- self.logger.warn "Application force stopping in #{delay} seconds."
78
+
79
+ def force_stop(delay = nil)
80
+ delay = 600 if delay == nil # 10 minutes
80
81
  process_id = "#{$$}"
81
-
82
+
83
+ self.logger.warn "Application force stopping in #{delay} seconds."
84
+
82
85
  Concurrent::ScheduledTask.execute(delay) do
83
86
  self.logger.warn "Application force stopping."
84
87
 
@@ -86,7 +89,34 @@ module HerdstWorker
86
89
  end
87
90
  end
88
91
 
89
-
92
+
93
+ def register_new_task
94
+ # TODO
95
+ end
96
+
97
+
98
+ def deregister_task
99
+ begin
100
+ info = self.config.metadata.get_service_config
101
+ credentials = self.config.metadata.get_aws_credentials!
102
+ ecs_client = Aws::ECS::Client.new(
103
+ :region => info[:region],
104
+ :credentials => credentials
105
+ )
106
+
107
+ ecs_client.stop_task({
108
+ cluster: info[:cluster],
109
+ reason: "Task expired.",
110
+ task: info[:task_id]
111
+ })
112
+
113
+ rescue Exception => ex
114
+ self.force_stop(30)
115
+
116
+ end
117
+ end
118
+
119
+
90
120
  def config_for(name)
91
121
  self.config.config_for(name)
92
122
  end
@@ -85,13 +85,13 @@ module HerdstWorker
85
85
 
86
86
 
87
87
  def get_tasks_info
88
- metadata = make_request!(get_task_metadata_uri)
88
+ metadata = make_request!(self.get_task_metadata_uri)
89
89
 
90
90
  ecs_client = Aws::ECS::Client.new(
91
91
  :region => self.secrets["AWS_REGION"],
92
92
  :credentials => self.aws_credentials
93
93
  )
94
-
94
+
95
95
  ecs_client.describe_tasks(
96
96
  :cluster => metadata["Cluster"],
97
97
  :tasks => [
@@ -120,6 +120,20 @@ module HerdstWorker
120
120
  end
121
121
 
122
122
 
123
+ def get_service_config
124
+ metadata = make_request!(self.get_task_metadata_uri_v4)
125
+
126
+ {
127
+ :task_id => metadata["TaskARN"].split("/").last,
128
+ :task_arn => metadata["TaskARN"],
129
+ :cluster => metadata["Cluster"].split("/").last,
130
+ :service_name => metadata["ServiceName"],
131
+ :region => self.secrets["AWS_REGION"],
132
+ :task_definition => metadata["Family"] + ":" + metadata["Revision"]
133
+ }
134
+ end
135
+
136
+
123
137
  def get_aws_credentials!
124
138
  credentials = self.is_prod? ?
125
139
  make_request!(get_credentials_uri) :
@@ -230,6 +244,10 @@ module HerdstWorker
230
244
  def get_task_metadata_uri
231
245
  ENV["ECS_CONTAINER_METADATA_URI"].to_s + "/task"
232
246
  end
247
+
248
+ def get_task_metadata_uri_v4
249
+ ENV["ECS_CONTAINER_METADATA_URI_V4"].to_s + "/task"
250
+ end
233
251
 
234
252
  def get_credentials_uri
235
253
  "http://169.254.170.2" + ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"].to_s
@@ -9,7 +9,7 @@ module HerdstWorker
9
9
 
10
10
 
11
11
  attr_accessor :app, :enabled, :queue_url, :queue_wait_time, :poller
12
- attr_accessor :start_time, :restart_time, :run_time, :force_stop_delay
12
+ attr_accessor :start_time, :stop_processing_at, :stop_at, :run_duration, :stop_suration
13
13
  attr_accessor :processor_status, :job_count, :max_jobs
14
14
  attr_accessor :attempt_threshold, :visibility_timeout, :ignored_notifications
15
15
 
@@ -29,8 +29,8 @@ module HerdstWorker
29
29
  ]
30
30
 
31
31
  # Set the start time
32
- self.run_time = (3600 * 4) + (rand * 600).floor # Four hours + bit more (< 10 minutes)
33
- self.force_stop_delay = 600 # 10 minutes
32
+ self.run_duration = (3600 * 4) + (rand * 900).floor # Four hours + bit more (< 15 minutes)
33
+ self.stop_suration = 300 # 5 minutes
34
34
  self.reset_time
35
35
 
36
36
  # Start the processor as working
@@ -49,10 +49,8 @@ module HerdstWorker
49
49
  self.poller.poll(:wait_time_seconds => self.queue_wait_time, :skip_delete => false) do |msg|
50
50
  process_message(msg)
51
51
  end
52
-
53
- if self.processor_status == "stopped"
54
- self.app.stop(0)
55
- end
52
+
53
+ self.app.deregister_task
56
54
  else
57
55
  raise "Cannot start a queue which is not enabled"
58
56
  end
@@ -77,7 +75,7 @@ module HerdstWorker
77
75
  # Sets the processor status to finishing. The sqs before action will
78
76
  # take care of setting the idle state once all jobs have finished.
79
77
  def halt
80
- return if self.processor_status === "finishing"
78
+ return if self.processor_status == "finishing"
81
79
  set_status "finishing"
82
80
  end
83
81
 
@@ -120,12 +118,14 @@ module HerdstWorker
120
118
  # After hours of running terminate application.
121
119
  # The app will automatically restart in production
122
120
  current_time = Time.now.utc.to_i
123
- if (self.processor_status == "working") && (current_time >= self.restart_time)
124
- runtime = current_time - self.start_time
125
- self.app.logger.queue.warn "Preparing to stop after #{runtime} seconds of work"
126
- self.app.force_stop(self.force_stop_delay)
121
+
122
+ if (self.processor_status == "stopping") && (current_time >= self.stop_at)
123
+ self.app.deregister_task
124
+
125
+ elsif (self.processor_status == "working") && (current_time >= self.stop_processing_at)
126
+ self.app.register_new_task
127
127
 
128
- set_status "stopping"
128
+ set_status "stopping"
129
129
 
130
130
  # On finishing wait for jobs to complete and then set status to idle
131
131
  elsif self.processor_status == "finishing"
@@ -133,7 +133,7 @@ module HerdstWorker
133
133
  self.app.logger.queue.warn "Setting processor status to idle"
134
134
  set_status "idle"
135
135
  end
136
-
136
+
137
137
  end
138
138
 
139
139
  # On stopping wait for jobs to complete and then set status
@@ -222,7 +222,7 @@ module HerdstWorker
222
222
  self.job_count -= 1
223
223
  }.execute
224
224
  else
225
- self.poller.change_message_visibility_timeout(msg, self.visibility_timeout * 2)
225
+ self.poller.change_message_visibility_timeout(msg, 5)
226
226
  throw :skip_delete
227
227
  end
228
228
  end
@@ -231,7 +231,8 @@ module HerdstWorker
231
231
  private
232
232
  def reset_time
233
233
  self.start_time = Time.now.utc.to_i
234
- self.restart_time = self.start_time + self.run_time
234
+ self.stop_processing_at = self.start_time + self.run_duration
235
+ self.stop_at = self.stop_processing_at + self.stop_suration
235
236
  end
236
237
 
237
238
  end
@@ -1,3 +1,3 @@
1
1
  module HerdstWorker
2
- VERSION = '0.2.18'
2
+ VERSION = '0.2.19'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: herdst_worker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.18
4
+ version: 0.2.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Herd.St
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-01-26 00:00:00.000000000 Z
11
+ date: 2026-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport