rest-ftp-daemon 0.214.0 → 0.220.0
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/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/bin/rest-ftp-daemon +1 -1
- data/config.ru +1 -1
- data/lib/rest-ftp-daemon.rb +9 -5
- data/lib/rest-ftp-daemon/api/dashboard.rb +1 -1
- data/lib/rest-ftp-daemon/api/debug.rb +6 -19
- data/lib/rest-ftp-daemon/api/jobs.rb +11 -11
- data/lib/rest-ftp-daemon/api/root.rb +8 -5
- data/lib/rest-ftp-daemon/api/status.rb +1 -1
- data/lib/rest-ftp-daemon/constants.rb +7 -3
- data/lib/rest-ftp-daemon/exceptions.rb +1 -0
- data/lib/rest-ftp-daemon/job.rb +40 -39
- data/lib/rest-ftp-daemon/job_queue.rb +10 -17
- data/lib/rest-ftp-daemon/logger.rb +58 -17
- data/lib/rest-ftp-daemon/logger_helper.rb +26 -0
- data/lib/rest-ftp-daemon/logger_pool.rb +13 -13
- data/lib/rest-ftp-daemon/notification.rb +14 -14
- data/lib/rest-ftp-daemon/settings.rb +3 -3
- data/lib/rest-ftp-daemon/worker.rb +58 -0
- data/lib/rest-ftp-daemon/worker_conchita.rb +49 -0
- data/lib/rest-ftp-daemon/worker_job.rb +64 -0
- data/lib/rest-ftp-daemon/worker_pool.rb +48 -104
- data/rest-ftp-daemon.yml.sample +1 -4
- metadata +5 -3
- data/lib/rest-ftp-daemon/api/routes.rb +0 -16
- data/lib/rest-ftp-daemon/conchita.rb +0 -65
@@ -1,5 +1,7 @@
|
|
1
1
|
module RestFtpDaemon
|
2
2
|
class WorkerPool
|
3
|
+
include LoggerHelper
|
4
|
+
attr_reader :logger
|
3
5
|
|
4
6
|
attr_reader :wid
|
5
7
|
|
@@ -7,28 +9,24 @@ module RestFtpDaemon
|
|
7
9
|
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
8
10
|
end
|
9
11
|
|
10
|
-
def initialize
|
12
|
+
def initialize
|
11
13
|
# Logger
|
12
14
|
@logger = RestFtpDaemon::LoggerPool.instance.get :workers
|
13
|
-
|
14
|
-
#
|
15
|
-
|
15
|
+
# log_info "WorkerPool: log_info"
|
16
|
+
# log_error "WorkerPool: log_error"
|
17
|
+
# log_error "WorkerPool: log_error + lines", ['line1', 'line2']
|
16
18
|
|
17
19
|
# Prepare status hash and vars
|
18
20
|
@statuses = {}
|
19
21
|
@workers = {}
|
20
22
|
@conchita = nil
|
21
23
|
@mutex = Mutex.new
|
22
|
-
@counter = 0
|
23
|
-
@timeout = (Settings.transfer.timeout rescue nil) || DEFAULT_WORKER_TIMEOUT
|
24
24
|
|
25
|
-
#
|
26
|
-
|
27
|
-
create_worker_threads number_threads
|
25
|
+
# Identifiers generator
|
26
|
+
@last_id = 0
|
28
27
|
|
29
|
-
# Create
|
30
|
-
|
31
|
-
create_conchita_thread
|
28
|
+
# Create worker threads
|
29
|
+
create_threads
|
32
30
|
end
|
33
31
|
|
34
32
|
def worker_variables
|
@@ -47,119 +45,65 @@ module RestFtpDaemon
|
|
47
45
|
|
48
46
|
private
|
49
47
|
|
50
|
-
def
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
48
|
+
def generate_id
|
49
|
+
@mutex.synchronize do
|
50
|
+
@last_id += 1
|
51
|
+
end
|
52
|
+
"w#{@last_id}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_threads
|
56
|
+
# Read configuration
|
57
|
+
number_threads = (Settings.workers || APP_WORKERS)
|
58
|
+
|
59
|
+
if number_threads < 1
|
60
|
+
log_error "create_threads: one worker is the minimum possible number (#{number_threads} configured)"
|
61
|
+
raise InvalidWorkerNumber
|
62
|
+
end
|
57
63
|
|
58
|
-
|
59
|
-
|
64
|
+
# Create workers
|
65
|
+
log_info "WorkerPool creating #{number_threads}x JobWorker, 1x ConchitaWorker"
|
66
|
+
|
67
|
+
# Start worker threads
|
68
|
+
number_threads.times do
|
69
|
+
wid = generate_id
|
60
70
|
@workers[wid] = create_worker_thread wid
|
61
71
|
end
|
72
|
+
|
73
|
+
# Start conchita thread
|
74
|
+
@conchita = create_conchita_thread
|
75
|
+
|
76
|
+
rescue Exception => ex
|
77
|
+
log_error "UNHDNALED EXCEPTION: #{ex.message}", ex.backtrace
|
78
|
+
|
62
79
|
end
|
63
80
|
|
64
81
|
def create_worker_thread wid
|
65
82
|
Thread.new wid do
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
# Start working
|
72
|
-
loop do
|
73
|
-
begin
|
74
|
-
work
|
75
|
-
rescue Exception => ex
|
76
|
-
puts "WORKER UNEXPECTED CRASH: #{ex.message}", lines: ex.backtrace
|
77
|
-
sleep 1
|
78
|
-
end
|
83
|
+
begin
|
84
|
+
worker = JobWorker.new wid
|
85
|
+
log_info "JobWorker [#{wid}]: #{worker}"
|
86
|
+
rescue Exception => ex
|
87
|
+
log_error "EXCEPTION: #{ex.message}"
|
79
88
|
end
|
80
|
-
|
81
|
-
# We should never get here
|
82
89
|
end
|
83
90
|
end
|
84
91
|
|
85
92
|
def create_conchita_thread
|
86
93
|
Thread.new do
|
87
94
|
begin
|
88
|
-
|
89
|
-
|
90
|
-
|
95
|
+
worker = ConchitaWorker.new :conchita
|
96
|
+
log_info "ConchitaWorker: #{worker}"
|
97
|
+
rescue Exception => ex
|
98
|
+
log_error "EXCEPTION: #{ex.message}"
|
91
99
|
end
|
92
100
|
end
|
93
101
|
end
|
94
102
|
|
95
|
-
def work
|
96
|
-
# Wait for a job to come into the queue
|
97
|
-
worker_status :waiting
|
98
|
-
info "waiting for a job"
|
99
|
-
job = $queue.pop
|
100
|
-
|
101
|
-
# Prepare the job for processing
|
102
|
-
worker_status :working
|
103
|
-
worker_jid job.id
|
104
|
-
info "working"
|
105
|
-
job.wid = Thread.current.thread_variable_get :wid
|
106
|
-
|
107
|
-
# Processs this job protected by a timeout
|
108
|
-
Timeout::timeout(@timeout, RestFtpDaemon::JobTimeout) do
|
109
|
-
job.process
|
110
|
-
end
|
111
|
-
|
112
|
-
# Processing done
|
113
|
-
worker_status :finished
|
114
|
-
info "finished"
|
115
|
-
worker_jid nil
|
116
|
-
job.wid = nil
|
117
|
-
|
118
|
-
# Increment total processed jobs count
|
119
|
-
$queue.counter_inc :jobs_processed
|
120
|
-
|
121
|
-
rescue RestFtpDaemon::JobTimeout => ex
|
122
|
-
info "JOB TIMED OUT", lines: ex.backtrace
|
123
|
-
worker_status :timeout
|
124
|
-
job.oops_you_stop_now ex unless job.nil?
|
125
|
-
sleep 1
|
126
|
-
|
127
|
-
rescue Exception => ex
|
128
|
-
info "UNHDNALED EXCEPTION: #{ex.message}", lines: ex.backtrace
|
129
|
-
worker_status :crashed
|
130
|
-
job.oops_after_crash ex unless job.nil?
|
131
|
-
sleep 1
|
132
|
-
|
133
|
-
else
|
134
|
-
# Clean job status
|
135
|
-
worker_status :free
|
136
|
-
job.wid = nil
|
137
|
-
|
138
|
-
end
|
139
|
-
|
140
103
|
protected
|
141
104
|
|
142
|
-
def info message, context = {}
|
143
|
-
return if @logger.nil?
|
144
|
-
|
145
|
-
# Forward to logger
|
146
|
-
@logger.info_with_id message,
|
147
|
-
wid: Thread.current.thread_variable_get(:wid),
|
148
|
-
jid: Thread.current.thread_variable_get(:jid),
|
149
|
-
origin: self.class.to_s
|
150
|
-
end
|
151
|
-
|
152
|
-
def worker_status status
|
153
|
-
Thread.current.thread_variable_set :status, status
|
154
|
-
Thread.current.thread_variable_set :updted_at, Time.now
|
155
|
-
end
|
156
|
-
|
157
|
-
def worker_jid jid
|
158
|
-
Thread.current.thread_variable_set :jid, jid
|
159
|
-
Thread.current.thread_variable_set :updted_at, Time.now
|
160
|
-
end
|
161
|
-
|
162
105
|
if Settings.newrelic_enabled?
|
106
|
+
add_transaction_tracer :create_conchita_thread, :category => :task
|
163
107
|
add_transaction_tracer :create_worker_thread, :category => :task
|
164
108
|
add_transaction_tracer :work, :category => :task
|
165
109
|
end
|
data/rest-ftp-daemon.yml.sample
CHANGED
@@ -15,10 +15,6 @@ defaults: &defaults
|
|
15
15
|
overwrite: false
|
16
16
|
timeout: 1800
|
17
17
|
|
18
|
-
# newrelic:
|
19
|
-
# appname: rftpd-testing
|
20
|
-
# license: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
21
|
-
|
22
18
|
conchita:
|
23
19
|
timer: 60
|
24
20
|
# garbage_collector: true
|
@@ -28,6 +24,7 @@ defaults: &defaults
|
|
28
24
|
|
29
25
|
debug:
|
30
26
|
ftp: false
|
27
|
+
# license: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
31
28
|
|
32
29
|
logs:
|
33
30
|
thin: "/var/log/rftpd-environment-thin.log"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-ftp-daemon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.220.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno MEDICI
|
@@ -229,15 +229,14 @@ files:
|
|
229
229
|
- lib/rest-ftp-daemon/api/job_presenter.rb
|
230
230
|
- lib/rest-ftp-daemon/api/jobs.rb
|
231
231
|
- lib/rest-ftp-daemon/api/root.rb
|
232
|
-
- lib/rest-ftp-daemon/api/routes.rb
|
233
232
|
- lib/rest-ftp-daemon/api/status.rb
|
234
|
-
- lib/rest-ftp-daemon/conchita.rb
|
235
233
|
- lib/rest-ftp-daemon/constants.rb
|
236
234
|
- lib/rest-ftp-daemon/exceptions.rb
|
237
235
|
- lib/rest-ftp-daemon/helpers.rb
|
238
236
|
- lib/rest-ftp-daemon/job.rb
|
239
237
|
- lib/rest-ftp-daemon/job_queue.rb
|
240
238
|
- lib/rest-ftp-daemon/logger.rb
|
239
|
+
- lib/rest-ftp-daemon/logger_helper.rb
|
241
240
|
- lib/rest-ftp-daemon/logger_pool.rb
|
242
241
|
- lib/rest-ftp-daemon/notification.rb
|
243
242
|
- lib/rest-ftp-daemon/paginate.rb
|
@@ -252,6 +251,9 @@ files:
|
|
252
251
|
- lib/rest-ftp-daemon/views/dashboard_table.haml
|
253
252
|
- lib/rest-ftp-daemon/views/dashboard_tokens.haml
|
254
253
|
- lib/rest-ftp-daemon/views/dashboard_workers.haml
|
254
|
+
- lib/rest-ftp-daemon/worker.rb
|
255
|
+
- lib/rest-ftp-daemon/worker_conchita.rb
|
256
|
+
- lib/rest-ftp-daemon/worker_job.rb
|
255
257
|
- lib/rest-ftp-daemon/worker_pool.rb
|
256
258
|
- rest-ftp-daemon.gemspec
|
257
259
|
- rest-ftp-daemon.yml.sample
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module RestFtpDaemon
|
2
|
-
class Conchita
|
3
|
-
|
4
|
-
def initialize
|
5
|
-
# Logger
|
6
|
-
@logger = RestFtpDaemon::LoggerPool.instance.get :workers
|
7
|
-
|
8
|
-
# Conchita configuration
|
9
|
-
@conchita = Settings.conchita
|
10
|
-
if @conchita.nil?
|
11
|
-
return info "conchita: missing conchita.* configuration"
|
12
|
-
elsif @conchita[:timer].nil?
|
13
|
-
return info "conchita: missing conchita.timer value"
|
14
|
-
end
|
15
|
-
|
16
|
-
# Start main loop
|
17
|
-
info "initialized #{@conchita.inspect}"
|
18
|
-
cleanup
|
19
|
-
end
|
20
|
-
|
21
|
-
protected
|
22
|
-
|
23
|
-
def maxage status
|
24
|
-
@conchita["clean_#{status.to_s}"] || 0
|
25
|
-
end
|
26
|
-
|
27
|
-
def cleanup
|
28
|
-
loop do
|
29
|
-
#info "cleanup"
|
30
|
-
# info "conchita_loop: cleanup "
|
31
|
-
$queue.expire JOB_STATUS_FINISHED, maxage(JOB_STATUS_FINISHED)
|
32
|
-
$queue.expire JOB_STATUS_FAILED, maxage(JOB_STATUS_FAILED)
|
33
|
-
$queue.expire JOB_STATUS_QUEUED, maxage(JOB_STATUS_QUEUED)
|
34
|
-
|
35
|
-
# Force garbage collector
|
36
|
-
GC.start if @conchita["garbage_collector"]
|
37
|
-
|
38
|
-
# Sleep for a few seconds
|
39
|
-
sleep @conchita[:timer]
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# def conchita_gc
|
44
|
-
# # Read config state
|
45
|
-
# proceed = @conchita["clean_garbage"] || false
|
46
|
-
# #info "conchita_clean status[#{status.to_s}] \t maxage[#{maxage}] s"
|
47
|
-
# return unless proceed
|
48
|
-
|
49
|
-
# # Trig Ruby's garbage collector
|
50
|
-
# info "conchita_gc forced garbage collecting"
|
51
|
-
# GC.start
|
52
|
-
# end
|
53
|
-
|
54
|
-
def info message, lines = []
|
55
|
-
return if @logger.nil?
|
56
|
-
|
57
|
-
# Forward to logger
|
58
|
-
@logger.info_with_id message,
|
59
|
-
wid: :conchita,
|
60
|
-
lines: lines,
|
61
|
-
origin: self.class.to_s
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|