rest-ftp-daemon 0.103.1 → 0.104.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/rest-ftp-daemon +16 -7
- data/lib/rest-ftp-daemon/api/dashboard.rb +1 -1
- data/lib/rest-ftp-daemon/api/status.rb +1 -0
- data/lib/rest-ftp-daemon/constants.rb +2 -2
- data/lib/rest-ftp-daemon/helpers.rb +16 -11
- data/lib/rest-ftp-daemon/job.rb +24 -20
- data/lib/rest-ftp-daemon/job_queue.rb +2 -1
- data/lib/rest-ftp-daemon/static/css/main.css +5 -4
- data/lib/rest-ftp-daemon/views/dashboard.haml +7 -7
- data/lib/rest-ftp-daemon/views/dashboard_counters.haml +1 -1
- data/lib/rest-ftp-daemon/views/dashboard_jobs.haml +23 -16
- data/lib/rest-ftp-daemon/views/dashboard_tokens.haml +2 -4
- data/lib/rest-ftp-daemon/views/dashboard_workers.haml +7 -7
- data/lib/rest-ftp-daemon/worker_pool.rb +54 -32
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f80c711efa90f45d67c8b2c7648b4a951b8da6b
|
4
|
+
data.tar.gz: 9dbda28ce22feaff2becdc4d0f211963569134f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bca8882c3ad0b481f7ce99e9588d6ceba5a6ab009b60f74bfbaea0bc40536e8789753527a3cfb89515bf53de4e8314c8b57bea65a8caafef38c3b116e867855
|
7
|
+
data.tar.gz: 3971446df3aa2b11007997dd9a78a094787c6ecf55e5f86102c1914c0eb48d72643ff9d3e1074a7a13fff39fa3ef70d76ccf2b8854c086d7d8ca484840438af9
|
data/bin/rest-ftp-daemon
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
# Try to load libs
|
3
|
+
# Try to load external libs
|
4
4
|
app_root = File.dirname(__FILE__) + '/../'
|
5
5
|
begin
|
6
6
|
require "thin"
|
@@ -10,14 +10,19 @@ begin
|
|
10
10
|
rescue LoadError
|
11
11
|
raise "EXITING: some of basic libs were not found: thin, optparse, socket, timeout"
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
|
+
# Load helpers and constants
|
15
|
+
[:constants, :helpers].each do |lib|
|
16
|
+
require File.expand_path("#{app_root}/lib/rest-ftp-daemon/#{lib.to_s}")
|
17
|
+
end
|
18
|
+
|
14
19
|
puts
|
15
20
|
#puts "--- #{APP_NAME} #{APP_VER}"
|
16
21
|
|
17
22
|
# Detect options from ARGV
|
18
23
|
options = {}
|
19
24
|
parser = OptionParser.new do |opts|
|
20
|
-
opts.banner = "Usage: #{File.basename $0} [options] start|stop
|
25
|
+
opts.banner = "Usage: #{File.basename $0} [options] start|stop"
|
21
26
|
opts.on("-c", "--config CONFIGFILE") { |config| APP_CONF = config }
|
22
27
|
opts.on("-e", "--environment ENV") { |env| APP_ENV = env }
|
23
28
|
opts.on("", "--dev") { APP_ENV = "development" }
|
@@ -34,7 +39,7 @@ end
|
|
34
39
|
begin
|
35
40
|
parser.order!(ARGV)
|
36
41
|
command = ARGV.shift
|
37
|
-
unless ["start", "stop"
|
42
|
+
unless ["start", "stop"].include? command
|
38
43
|
puts parser
|
39
44
|
exit 11
|
40
45
|
end
|
@@ -51,10 +56,14 @@ unless File.exists? APP_CONF
|
|
51
56
|
end
|
52
57
|
|
53
58
|
# Load helpers and config, and merge options from ARGV into settings
|
54
|
-
|
55
|
-
require File.expand_path("#{app_root}/lib/rest-ftp-daemon
|
59
|
+
begin
|
60
|
+
require File.expand_path("#{app_root}/lib/rest-ftp-daemon/config")
|
61
|
+
Settings.merge!(options)
|
62
|
+
rescue Psych::SyntaxError => e
|
63
|
+
puts "EXITING: config file syntax error: #{e.message}"
|
64
|
+
exit 16
|
56
65
|
end
|
57
|
-
|
66
|
+
|
58
67
|
|
59
68
|
# Display compiled configuration
|
60
69
|
puts "--- #{APP_NAME} #{APP_VER}"
|
@@ -17,6 +17,7 @@ module RestFtpDaemon
|
|
17
17
|
uptime: (Time.now - APP_STARTED).round(1),
|
18
18
|
counters: $queue.counters,
|
19
19
|
status: $queue.counts_by_status,
|
20
|
+
vars: $pool.worker_vars,
|
20
21
|
jobs_count: $queue.all_size,
|
21
22
|
jobs_queued: $queue.queued.collect(&:id),
|
22
23
|
jobs_popped: $queue.popped.collect(&:id),
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# Terrific constants
|
2
2
|
APP_NAME = "rest-ftp-daemon"
|
3
|
-
APP_VER = "0.
|
3
|
+
APP_VER = "0.104.5"
|
4
4
|
|
5
5
|
# Some global constants
|
6
6
|
IDENT_JOB_LEN = 4
|
7
7
|
IDENT_NOTIF_LEN = 4
|
8
8
|
IDENT_RANDOM_LEN = 8
|
9
9
|
IDENT_TEMPFILE_LEN = 8
|
10
|
-
DEFAULT_LOGS_PIPE_LEN =
|
10
|
+
DEFAULT_LOGS_PIPE_LEN = 12
|
11
11
|
DEFAULT_LOGS_ID_LEN = 8
|
12
12
|
|
13
13
|
# Some defaults
|
@@ -83,26 +83,31 @@ module RestFtpDaemon
|
|
83
83
|
when :file
|
84
84
|
'label-primary'
|
85
85
|
when :ftp
|
86
|
-
'label-danger'
|
87
|
-
when :ftps
|
88
|
-
'label-warning'
|
89
|
-
when :ftpes
|
90
86
|
'label-warning'
|
87
|
+
when :ftps, :ftpes
|
88
|
+
'label-success'
|
91
89
|
else
|
92
|
-
|
90
|
+
'label-default'
|
93
91
|
end
|
94
92
|
"<div class=\"transfer-method label #{klass}\">#{method.upcase}</div>"
|
95
93
|
end
|
96
94
|
|
97
95
|
# Dates and times: date with time generator
|
98
|
-
def self.datetime_full
|
99
|
-
return "-" if
|
100
|
-
return
|
96
|
+
def self.datetime_full datetime
|
97
|
+
return "-" if datetime.nil?
|
98
|
+
return datetime.to_datetime.strftime("%d.%m.%Y %H:%M")
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.datetime_short datetime
|
102
|
+
# return param.class
|
103
|
+
return "-" if datetime.nil?
|
104
|
+
return "?" unless datetime.respond_to? :to_date
|
105
|
+
return datetime.to_datetime.strftime("%H:%M") if datetime.to_date == Time.now.to_date
|
106
|
+
return datetime.to_datetime.strftime("%d/%m %H:%M")
|
101
107
|
end
|
102
108
|
|
103
|
-
def self.
|
104
|
-
|
105
|
-
return param.to_datetime.strftime("%d/%m %H:%M")
|
109
|
+
def self.hide_credentials_from_url url
|
110
|
+
url.sub(/([a-z]+:\/\/[^\/]+):[^\/]+\@/, '\1@' )
|
106
111
|
end
|
107
112
|
|
108
113
|
end
|
data/lib/rest-ftp-daemon/job.rb
CHANGED
@@ -78,9 +78,6 @@ module RestFtpDaemon
|
|
78
78
|
rescue RestFtpDaemon::JobMissingAttribute => exception
|
79
79
|
return oops "rftpd.started", exception, :missing_attribute
|
80
80
|
|
81
|
-
# rescue RestFtpDaemon::JobSourceNotFound => exception
|
82
|
-
# return oops "rftpd.started", exception, :job_source_not_found
|
83
|
-
|
84
81
|
rescue RestFtpDaemon::JobUnresolvedTokens => exception
|
85
82
|
return oops "rftpd.started", exception, :unresolved_tokens
|
86
83
|
|
@@ -97,7 +94,7 @@ module RestFtpDaemon
|
|
97
94
|
return oops "rftpd.started", exception, :assertion_failed
|
98
95
|
|
99
96
|
rescue RestFtpDaemon::RestFtpDaemonException => exception
|
100
|
-
return oops "rftpd.started", exception, :prepare_failed
|
97
|
+
return oops "rftpd.started", exception, :prepare_failed, true
|
101
98
|
|
102
99
|
rescue Exception => exception
|
103
100
|
return oops "rftpd.started", exception, :prepare_unhandled, true
|
@@ -134,7 +131,10 @@ module RestFtpDaemon
|
|
134
131
|
return oops "rftpd.ended", exception, :conn_openssl_error
|
135
132
|
|
136
133
|
rescue Net::FTPPermError => exception
|
137
|
-
return oops "rftpd.ended", exception, :
|
134
|
+
return oops "rftpd.ended", exception, :ftp_perm_error
|
135
|
+
|
136
|
+
rescue Net::FTPTempError => exception
|
137
|
+
return oops "rftpd.ended", exception, :ftp_temp_error
|
138
138
|
|
139
139
|
rescue Errno::EMFILE => exception
|
140
140
|
return oops "rftpd.ended", exception, :too_many_open_files
|
@@ -152,7 +152,7 @@ module RestFtpDaemon
|
|
152
152
|
return oops "rftpd.started", exception, :assertion_failed
|
153
153
|
|
154
154
|
rescue RestFtpDaemon::RestFtpDaemonException => exception
|
155
|
-
return oops "rftpd.ended", exception, :transfer_failed
|
155
|
+
return oops "rftpd.ended", exception, :transfer_failed, true
|
156
156
|
|
157
157
|
rescue Exception => exception
|
158
158
|
return oops "rftpd.ended", exception, :transfer_unhandled, true
|
@@ -192,7 +192,6 @@ module RestFtpDaemon
|
|
192
192
|
def set attribute, value
|
193
193
|
@mutex.synchronize do
|
194
194
|
@params || {}
|
195
|
-
# return unless @params.is_a? Enumerable
|
196
195
|
@updated_at = Time.now
|
197
196
|
@params[attribute] = value
|
198
197
|
end
|
@@ -271,7 +270,8 @@ module RestFtpDaemon
|
|
271
270
|
|
272
271
|
# Method assertions and init
|
273
272
|
@status = :checking_source
|
274
|
-
raise RestFtpDaemon::JobAssertionFailed unless @source_path
|
273
|
+
raise RestFtpDaemon::JobAssertionFailed, "transfer/1" unless @source_path
|
274
|
+
raise RestFtpDaemon::JobAssertionFailed, "transfer/2" unless @target_url
|
275
275
|
@transfer_sent = 0
|
276
276
|
set :source_processed, 0
|
277
277
|
|
@@ -337,7 +337,7 @@ module RestFtpDaemon
|
|
337
337
|
info "Job.oops si[#{signal_name}] er[#{error_name.to_s}] ex[#{exception.class}] #{exception.message}"
|
338
338
|
|
339
339
|
# Close ftp connexion if open
|
340
|
-
@ftp.close unless @ftp.welcome.nil?
|
340
|
+
@ftp.close unless @ftp.nil? || @ftp.welcome.nil?
|
341
341
|
|
342
342
|
# Update job's internal status
|
343
343
|
@status = :failed
|
@@ -379,7 +379,8 @@ module RestFtpDaemon
|
|
379
379
|
# Method assertions
|
380
380
|
info "Job.ftp_init asserts"
|
381
381
|
@status = :ftp_init
|
382
|
-
raise RestFtpDaemon::JobAssertionFailed if @target_method.nil?
|
382
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_init/1" if @target_method.nil?
|
383
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_init/2" if @target_url.nil?
|
383
384
|
|
384
385
|
info "Job.ftp_init target_method [#{@target_method}]"
|
385
386
|
case @target_method
|
@@ -403,23 +404,27 @@ module RestFtpDaemon
|
|
403
404
|
@status = :ftp_connect
|
404
405
|
host = @target_url.host
|
405
406
|
info "Job.ftp_connect [#{host}]"
|
406
|
-
raise RestFtpDaemon::JobAssertionFailed if @ftp.nil?
|
407
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_connect/1" if @ftp.nil?
|
408
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_connect/2" if @target_url.nil?
|
407
409
|
|
408
410
|
@ftp.connect(host)
|
409
411
|
end
|
410
412
|
|
411
413
|
def ftp_login
|
412
414
|
@status = :ftp_login
|
413
|
-
|
414
|
-
|
415
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_login/1" if @ftp.nil?
|
416
|
+
|
417
|
+
# use "anonymous" if user is empty
|
418
|
+
login = @target_url.user || "anonymous"
|
419
|
+
info "Job.ftp_login [#{login}]"
|
415
420
|
|
416
|
-
@ftp.login
|
421
|
+
@ftp.login login, @target_url.password
|
417
422
|
end
|
418
423
|
|
419
424
|
def ftp_chdir_or_buildpath path
|
420
425
|
# Method assertions
|
421
426
|
info "Job.ftp_chdir [#{path}] mkdir: #{@mkdir}"
|
422
|
-
raise RestFtpDaemon::JobAssertionFailed if path.nil?
|
427
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_chdir_or_buildpath/1" if path.nil?
|
423
428
|
@status = :ftp_chdir
|
424
429
|
|
425
430
|
# Extract directory from path
|
@@ -473,7 +478,8 @@ module RestFtpDaemon
|
|
473
478
|
|
474
479
|
# Method assertions
|
475
480
|
@status = :ftp_presence
|
476
|
-
raise RestFtpDaemon::JobAssertionFailed if @ftp.nil?
|
481
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_presence/1" if @ftp.nil?
|
482
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_presence/2" if @target_url.nil?
|
477
483
|
|
478
484
|
# Get file list, sometimes the response can be an empty value
|
479
485
|
results = @ftp.list(target_name) rescue nil
|
@@ -487,8 +493,8 @@ module RestFtpDaemon
|
|
487
493
|
def ftp_transfer source_match, target_name = nil
|
488
494
|
# Method assertions
|
489
495
|
info "Job.ftp_transfer source_match [#{source_match}]"
|
490
|
-
raise RestFtpDaemon::JobAssertionFailed if @ftp.nil?
|
491
|
-
raise RestFtpDaemon::JobAssertionFailed if source_match.nil?
|
496
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_transfer/1" if @ftp.nil?
|
497
|
+
raise RestFtpDaemon::JobAssertionFailed, "ftp_transfer/2" if source_match.nil?
|
492
498
|
|
493
499
|
# Use source filename if target path provided none (typically with multiple sources)
|
494
500
|
target_name ||= Helpers.extract_filename source_match
|
@@ -552,8 +558,6 @@ module RestFtpDaemon
|
|
552
558
|
t0 = Time.now
|
553
559
|
|
554
560
|
# Notify if requested
|
555
|
-
@status = :uploaded
|
556
|
-
info "Job.ftp_transfer uploaded"
|
557
561
|
unless notify_after_sec.nil? || (notified_at + notify_after_sec > Time.now)
|
558
562
|
notif_status = {
|
559
563
|
progress: percent1,
|
@@ -168,7 +168,8 @@ module RestFtpDaemon
|
|
168
168
|
|
169
169
|
def ordered_popped
|
170
170
|
@mutex_counters.synchronize do
|
171
|
-
@popped.sort_by { |item| [item.updated_at] }
|
171
|
+
@popped.sort_by { |item| [ item.wid.to_s, item.updated_at] }
|
172
|
+
# @popped.sort_by { |item| [item.status.to_s, item.wid.to_s, item.updated_at, - item.id.to_i] }
|
172
173
|
end
|
173
174
|
end
|
174
175
|
|
@@ -3,11 +3,11 @@
|
|
3
3
|
}
|
4
4
|
|
5
5
|
.transfer-method {
|
6
|
-
width: 35px
|
6
|
+
/*width: 35px;*/
|
7
7
|
}
|
8
8
|
|
9
9
|
.worker-label {
|
10
|
-
width: 25px
|
10
|
+
/*width: 25px;*/
|
11
11
|
}
|
12
12
|
|
13
13
|
.nobr {
|
@@ -27,8 +27,9 @@ table tr td, .fixed {
|
|
27
27
|
}
|
28
28
|
|
29
29
|
.label {
|
30
|
-
font-size:
|
31
|
-
padding:
|
30
|
+
font-size: 1em;
|
31
|
+
padding: 3px 3px 1px 3px;
|
32
|
+
margin-bottom: 1px ;
|
32
33
|
font-weight: normal;
|
33
34
|
display: inline-block;
|
34
35
|
font-family: sans-serif;
|
@@ -10,7 +10,7 @@
|
|
10
10
|
%body
|
11
11
|
|
12
12
|
.navbar.navbar-default.navbar-fixed
|
13
|
-
.container
|
13
|
+
.container-fluid
|
14
14
|
|
15
15
|
.navbar-header
|
16
16
|
%h1
|
@@ -20,7 +20,7 @@
|
|
20
20
|
= "[#{Settings.namespace}]"
|
21
21
|
|
22
22
|
|
23
|
-
.container
|
23
|
+
.container-fluid
|
24
24
|
|
25
25
|
= render :dashboard_headers
|
26
26
|
|
@@ -43,22 +43,22 @@
|
|
43
43
|
%table.table.table-striped.table-hover.table-condensed
|
44
44
|
%tr
|
45
45
|
%th ID
|
46
|
-
%th P
|
47
|
-
%th W
|
48
46
|
%th label
|
49
47
|
%th source
|
48
|
+
%th <=>
|
50
49
|
%th target
|
51
|
-
%th
|
50
|
+
%th date
|
52
51
|
%th status
|
53
52
|
%th progress
|
54
53
|
%th error
|
55
54
|
%th.text-right size
|
56
|
-
%th.text-right
|
55
|
+
%th.text-right rate
|
56
|
+
%th
|
57
57
|
|
58
58
|
- if @only.nil? && !@jobs_queued.empty?
|
59
59
|
= render :dashboard_jobs, {jobs: @jobs_queued, counts: @counts}
|
60
60
|
%tr
|
61
|
-
%th{colspan:
|
61
|
+
%th{colspan: 12}
|
62
62
|
|
63
63
|
= render :dashboard_jobs, {jobs: @jobs_current, counts: @counts}
|
64
64
|
|
@@ -6,6 +6,7 @@
|
|
6
6
|
- source_processing = job.get(:source_processing)
|
7
7
|
- presented = present job, :with => RestFtpDaemon::API::Entities::JobPresenter, hide_params: true
|
8
8
|
- errmsg = job.get :error_message
|
9
|
+
- method = job.get(:target_method)
|
9
10
|
|
10
11
|
- if !job.error.nil?
|
11
12
|
- trclass = "danger"
|
@@ -13,30 +14,25 @@
|
|
13
14
|
- trclass = "info"
|
14
15
|
- elsif job.status == :finished
|
15
16
|
- trclass = "success"
|
17
|
+
- elsif job.status == :queued
|
18
|
+
- trclass = "active"
|
16
19
|
- else
|
17
20
|
- trclass = "warning"
|
18
21
|
|
19
22
|
%tr{class: trclass}
|
20
23
|
|
21
|
-
%td{title: presented.to_json}
|
22
|
-
|
23
|
-
%td
|
24
|
-
- unless job.priority.nil?
|
25
|
-
= job.priority
|
26
|
-
|
27
|
-
%td
|
28
|
-
- unless job.wid.nil?
|
29
|
-
.label.label-default.flag.worker-label= job.wid
|
24
|
+
%td{title: presented.to_json}
|
25
|
+
%b= job.id
|
30
26
|
|
31
27
|
%td= job.label
|
32
28
|
|
33
29
|
%td{title: job.get(:source_path)}
|
34
|
-
=# Helpers.job_method_label job.get(:source_method)
|
35
30
|
= Helpers.highlight_tokens job.source
|
36
31
|
|
32
|
+
%td
|
33
|
+
= Helpers.job_method_label method
|
34
|
+
|
37
35
|
%td{title: job.get(:target_url)}
|
38
|
-
= Helpers.job_method_label job.get(:target_method)
|
39
|
-
=# job.target
|
40
36
|
= Helpers.highlight_tokens job.target
|
41
37
|
|
42
38
|
%td
|
@@ -44,8 +40,14 @@
|
|
44
40
|
|
45
41
|
%td
|
46
42
|
= job.status
|
47
|
-
|
48
|
-
|
43
|
+
|
44
|
+
-# if (source_count > 1) && (source_processed < source_count)
|
45
|
+
- if (source_processed < source_count)
|
46
|
+
%small= " (#{source_processed}/#{source_count})"
|
47
|
+
|
48
|
+
- unless source_processing.nil?
|
49
|
+
%br
|
50
|
+
%b= " #{source_processing}"
|
49
51
|
|
50
52
|
%td
|
51
53
|
- unless progress.nil?
|
@@ -57,8 +59,6 @@
|
|
57
59
|
- unless job.error || job.status == :finished
|
58
60
|
- unless progress.nil?
|
59
61
|
= "#{progress}%"
|
60
|
-
- unless source_processing.nil?
|
61
|
-
%small= " (#{source_processing})"
|
62
62
|
- else
|
63
63
|
.error{title: errmsg}
|
64
64
|
= Helpers.text_or_empty(job.error)
|
@@ -71,3 +71,10 @@
|
|
71
71
|
- if (bitrate = job.get :transfer_bitrate)
|
72
72
|
= Helpers.format_bytes(bitrate, "bps")
|
73
73
|
|
74
|
+
%td
|
75
|
+
- unless job.priority.nil?
|
76
|
+
.label.label-info.flag.worker-label= job.priority
|
77
|
+
|
78
|
+
- unless job.wid.nil?
|
79
|
+
%br
|
80
|
+
.label.label-warning.flag.worker-label= job.wid
|
@@ -8,21 +8,21 @@
|
|
8
8
|
%th ID
|
9
9
|
%th status
|
10
10
|
%th job
|
11
|
-
%th.text-right
|
11
|
+
%th.text-right updated
|
12
12
|
|
13
|
-
- @
|
14
|
-
|
13
|
+
- @worker_vars.each do |wid, vars|
|
14
|
+
-# status = vars[:status]
|
15
15
|
- style = styles[status] || ""
|
16
16
|
|
17
|
-
- if
|
18
|
-
- no_news_for = (Time.now -
|
17
|
+
- if vars[:updted_at].is_a? Time
|
18
|
+
- no_news_for = (Time.now - vars[:updted_at]).round(0)
|
19
19
|
- else
|
20
20
|
- no_news_for = "?"
|
21
21
|
|
22
22
|
%tr{class: style.to_s}
|
23
23
|
%td= wid
|
24
|
-
%td=
|
25
|
-
%td=
|
24
|
+
%td= vars[:status]
|
25
|
+
%td= vars[:jobid]
|
26
26
|
%td.text-right
|
27
27
|
= no_news_for
|
28
28
|
s
|
@@ -12,84 +12,106 @@ module RestFtpDaemon
|
|
12
12
|
|
13
13
|
# Prepare status hash
|
14
14
|
@statuses = {}
|
15
|
+
@workers = {}
|
15
16
|
|
16
17
|
# Create worker threads
|
17
18
|
info "WorkerPool initializing with #{number_threads} workers"
|
18
19
|
@mutex = Mutex.new
|
19
20
|
@counter = 0
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
number_threads.times do
|
23
|
+
# Increment counter
|
24
|
+
@mutex.synchronize do
|
25
|
+
@counter +=1
|
26
|
+
end
|
27
|
+
name = "w#{@counter}"
|
28
|
+
|
29
|
+
th = Thread.new name do
|
30
|
+
|
31
|
+
# Set thread context
|
32
|
+
Thread.current[:name] = name
|
33
|
+
Thread.current[:vars] = {
|
34
|
+
started_at: Time.now,
|
35
|
+
}
|
36
|
+
|
37
|
+
# Start working
|
38
|
+
work
|
27
39
|
end
|
40
|
+
|
41
|
+
# Add this worker to the ThreadGroup
|
42
|
+
@workers[name] = th
|
28
43
|
end
|
29
44
|
|
30
45
|
end
|
31
46
|
|
32
|
-
def work
|
33
|
-
worker_status
|
47
|
+
def work
|
48
|
+
worker_status :starting
|
49
|
+
|
34
50
|
loop do
|
35
51
|
|
36
52
|
begin
|
37
|
-
info "
|
53
|
+
info "waiting for a job"
|
38
54
|
|
39
55
|
# Wait for a job to come into the queue
|
40
|
-
worker_status
|
56
|
+
worker_status :waiting
|
41
57
|
job = $queue.pop
|
42
58
|
|
43
59
|
# Do the job
|
44
|
-
info "
|
45
|
-
|
46
|
-
job.
|
60
|
+
info "processing [#{job.id}]"
|
61
|
+
|
62
|
+
worker_status :processing, job.id
|
63
|
+
job.wid = Thread.current[:name]
|
47
64
|
job.process
|
48
|
-
info "
|
49
|
-
|
50
|
-
worker_status
|
65
|
+
info "processed [#{job.id}]"
|
66
|
+
job.wid = nil
|
67
|
+
worker_status :done
|
51
68
|
|
52
69
|
# Increment total processed jobs count
|
53
70
|
$queue.counter_inc :jobs_processed
|
54
71
|
|
55
72
|
rescue Exception => ex
|
56
|
-
worker_status
|
73
|
+
worker_status :crashed
|
57
74
|
info "UNHANDLED EXCEPTION: #{ex.message}"
|
58
75
|
ex.backtrace.each do |line|
|
59
76
|
info line, 1
|
60
77
|
end
|
61
78
|
sleep 1
|
79
|
+
|
62
80
|
else
|
81
|
+
# Clean job status
|
82
|
+
worker_status :free
|
83
|
+
job.wid = nil
|
63
84
|
|
64
|
-
# Clean job status
|
65
|
-
worker_status wid, :ready
|
66
|
-
job.wid = nil
|
67
85
|
end
|
68
86
|
|
69
87
|
end
|
70
88
|
end
|
71
89
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
90
|
+
def worker_vars
|
91
|
+
vars = {}
|
92
|
+
|
93
|
+
@workers.each do |name, thread|
|
94
|
+
#currents[thread.id] = thread.current
|
95
|
+
vars[thread[:name]] = thread[:vars]
|
75
96
|
end
|
97
|
+
|
98
|
+
vars
|
76
99
|
end
|
77
100
|
|
78
101
|
protected
|
79
102
|
|
103
|
+
def ping
|
104
|
+
end
|
105
|
+
|
80
106
|
def info message
|
81
107
|
return if @logger.nil?
|
82
|
-
@logger.info_with_id message
|
108
|
+
@logger.info_with_id message, id: Thread.current[:name]
|
83
109
|
end
|
84
110
|
|
85
|
-
def worker_status
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
@statuses[wid][:jobid] = jobid
|
90
|
-
@statuses[wid][:active_at] = Time.now
|
91
|
-
end
|
92
|
-
|
111
|
+
def worker_status status, jobid = nil
|
112
|
+
Thread.current[:vars][:status] = status
|
113
|
+
Thread.current[:vars][:jobid] = jobid
|
114
|
+
Thread.current[:vars][:updted_at] = Time.now
|
93
115
|
end
|
94
116
|
|
95
117
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.104.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno MEDICI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|