herdst_worker 0.2.17 → 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: 38eaf100a0f45339a420402ba0dd782cf4daa2338fe6f362c65a35dade5f3be9
4
- data.tar.gz: d07205a7ea5857f3fe4b1906526cc87043bbe28668613bd1c7e472f08480251e
3
+ metadata.gz: 6654d05e7c9d7f3a3060096bbc9acf651360fb25e3e2527292632518537f61f5
4
+ data.tar.gz: 98ce22ba4604f0c889bdfd27d6627ae63c36e45746e5c38697518c6675f993c2
5
5
  SHA512:
6
- metadata.gz: 44cfd9d0daca7cf3baf25f38f556c2fa3b1590edc111dfff3b1ab65b1db7aac02e62448f9afea1b7da97d0c41bc5ad7fa4c64fe8c7aa5135dccf98345e5f9199
7
- data.tar.gz: e1d21d8ab1e447768bc2453b724594c71e27daedff5d11333b658bc7d19c4db58b2f0b8f872b967e41d1cac68dbefb5bbd56fa0493441ca9a4a4fb27344affe8
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,8 +74,49 @@ module HerdstWorker
73
74
 
74
75
  Kernel.exit(exit_code)
75
76
  end
76
-
77
-
77
+
78
+
79
+ def force_stop(delay = nil)
80
+ delay = 600 if delay == nil # 10 minutes
81
+ process_id = "#{$$}"
82
+
83
+ self.logger.warn "Application force stopping in #{delay} seconds."
84
+
85
+ Concurrent::ScheduledTask.execute(delay) do
86
+ self.logger.warn "Application force stopping."
87
+
88
+ system("kill -9 #{process_id}")
89
+ end
90
+ end
91
+
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
+
78
120
  def config_for(name)
79
121
  self.config.config_for(name)
80
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
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,7 +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)
32
+ self.run_duration = (3600 * 4) + (rand * 900).floor # Four hours + bit more (< 15 minutes)
33
+ self.stop_suration = 300 # 5 minutes
33
34
  self.reset_time
34
35
 
35
36
  # Start the processor as working
@@ -48,10 +49,8 @@ module HerdstWorker
48
49
  self.poller.poll(:wait_time_seconds => self.queue_wait_time, :skip_delete => false) do |msg|
49
50
  process_message(msg)
50
51
  end
51
-
52
- if self.processor_status == "stopped"
53
- self.app.stop(0)
54
- end
52
+
53
+ self.app.deregister_task
55
54
  else
56
55
  raise "Cannot start a queue which is not enabled"
57
56
  end
@@ -76,7 +75,7 @@ module HerdstWorker
76
75
  # Sets the processor status to finishing. The sqs before action will
77
76
  # take care of setting the idle state once all jobs have finished.
78
77
  def halt
79
- return if self.processor_status === "finishing"
78
+ return if self.processor_status == "finishing"
80
79
  set_status "finishing"
81
80
  end
82
81
 
@@ -119,18 +118,22 @@ module HerdstWorker
119
118
  # After hours of running terminate application.
120
119
  # The app will automatically restart in production
121
120
  current_time = Time.now.utc.to_i
122
- if (self.processor_status == "working") && (current_time >= self.restart_time)
123
- runtime = current_time - self.start_time
124
- self.app.logger.queue.warn "Preparing to stop after #{runtime} seconds of work"
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
+
125
128
  set_status "stopping"
126
-
129
+
127
130
  # On finishing wait for jobs to complete and then set status to idle
128
131
  elsif self.processor_status == "finishing"
129
132
  if self.job_count == 0
130
133
  self.app.logger.queue.warn "Setting processor status to idle"
131
134
  set_status "idle"
132
135
  end
133
-
136
+
134
137
  end
135
138
 
136
139
  # On stopping wait for jobs to complete and then set status
@@ -219,7 +222,7 @@ module HerdstWorker
219
222
  self.job_count -= 1
220
223
  }.execute
221
224
  else
222
- self.poller.change_message_visibility_timeout(msg, self.visibility_timeout * 2)
225
+ self.poller.change_message_visibility_timeout(msg, 5)
223
226
  throw :skip_delete
224
227
  end
225
228
  end
@@ -228,7 +231,8 @@ module HerdstWorker
228
231
  private
229
232
  def reset_time
230
233
  self.start_time = Time.now.utc.to_i
231
- 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
232
236
  end
233
237
 
234
238
  end
@@ -1,3 +1,3 @@
1
1
  module HerdstWorker
2
- VERSION = '0.2.17'
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.17
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-13 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