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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6654d05e7c9d7f3a3060096bbc9acf651360fb25e3e2527292632518537f61f5
|
|
4
|
+
data.tar.gz: 98ce22ba4604f0c889bdfd27d6627ae63c36e45746e5c38697518c6675f993c2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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, :
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
self.app.
|
|
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,
|
|
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.
|
|
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
|
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.
|
|
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-
|
|
11
|
+
date: 2026-01-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|