drbqs 0.0.10 → 0.0.11
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.
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/bin/drbqs-manage +3 -5
- data/bin/drbqs-node +3 -4
- data/bin/drbqs-server +15 -1
- data/drbqs.gemspec +9 -6
- data/example/error/error.rb +5 -0
- data/example/error/server_def.rb +8 -0
- data/example/server/server.rb +2 -0
- data/example/transfer/file.rb +0 -2
- data/example/transfer/server_def.rb +1 -1
- data/lib/drbqs/client.rb +40 -6
- data/lib/drbqs/config.rb +41 -7
- data/lib/drbqs/connection.rb +19 -4
- data/lib/drbqs/manage.rb +9 -2
- data/lib/drbqs/message.rb +30 -8
- data/lib/drbqs/node_list.rb +6 -2
- data/lib/drbqs/queue.rb +4 -5
- data/lib/drbqs/server.rb +83 -18
- data/lib/drbqs/server_define.rb +2 -2
- data/lib/drbqs/ssh/shell.rb +1 -1
- data/lib/drbqs/ssh/transfer.rb +48 -5
- data/lib/drbqs/task_client.rb +3 -3
- data/lib/drbqs/utils.rb +19 -0
- data/lib/drbqs.rb +7 -2
- data/spec/connection_spec.rb +10 -0
- data/spec/server_spec.rb +40 -1
- metadata +20 -11
- data/lib/drbqs/utils/filename.rb +0 -118
- data/spec/filename_spec.rb +0 -44
data/Rakefile
CHANGED
@@ -23,6 +23,7 @@ Jeweler::Tasks.new do |gem|
|
|
23
23
|
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
24
24
|
gem.add_runtime_dependency 'net-ssh', '>= 2.1.3'
|
25
25
|
gem.add_runtime_dependency 'net-ssh-shell', '>= 0.1.0'
|
26
|
+
gem.add_runtime_dependency 'filename', '>= 0.0.5'
|
26
27
|
gem.add_development_dependency 'rspec', '>= 2.5.0'
|
27
28
|
end
|
28
29
|
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.11
|
data/bin/drbqs-manage
CHANGED
@@ -82,17 +82,15 @@ when 'exit-signal'
|
|
82
82
|
when 'status'
|
83
83
|
check_argument_size(argv, :==, 2)
|
84
84
|
uri = argv[1]
|
85
|
-
|
85
|
+
if status = manage.get_status(uri)
|
86
|
+
$stdout.puts status
|
87
|
+
end
|
86
88
|
when 'initialize'
|
87
89
|
check_argument_size(argv, :==, 1)
|
88
90
|
manage.create_config
|
89
91
|
when 'ssh'
|
90
92
|
dest = argv[1]
|
91
93
|
manage.execute_over_ssh(dest, options, command_args)
|
92
|
-
when 'new-filename'
|
93
|
-
check_argument_size(argv, :==, 2)
|
94
|
-
fname = DRbQS::FileName.new(argv[1], :add => :auto, :type => :time, :position => :suffix)
|
95
|
-
$stdout.puts fname.create(:directory => true)
|
96
94
|
else
|
97
95
|
raise "Invalid command: #{command}"
|
98
96
|
end
|
data/bin/drbqs-node
CHANGED
@@ -82,18 +82,17 @@ puts "Connect to #{uri}"
|
|
82
82
|
puts "Execute #{process_num} processes"
|
83
83
|
|
84
84
|
if options[:log_prefix]
|
85
|
-
require 'fileutils'
|
86
85
|
if /\/$/ =~ options[:log_prefix]
|
87
86
|
options[:log_prefix] += 'out'
|
88
87
|
end
|
89
|
-
options[:log_prefix] = File.expand_path(options[:log_prefix])
|
90
|
-
FileUtils.mkdir_p(File.dirname(options[:log_prefix]))
|
91
88
|
end
|
92
89
|
|
93
90
|
process_num.times do |i|
|
94
91
|
fork do
|
95
92
|
if options[:log_prefix]
|
96
|
-
logfile =
|
93
|
+
logfile = FileName.create(options[:log_prefix], :position => :suffix, :type => :time,
|
94
|
+
:add => :always, :directory => true,
|
95
|
+
:format => lambda { |t| t.strftime("%Y%m%d_%H%M_#{Process.pid}.log") })
|
97
96
|
else
|
98
97
|
logfile = STDOUT
|
99
98
|
end
|
data/bin/drbqs-server
CHANGED
@@ -18,6 +18,8 @@ options = {
|
|
18
18
|
:acl => DRbQS::Config.get_acl_file
|
19
19
|
}
|
20
20
|
|
21
|
+
test_opts = {}
|
22
|
+
|
21
23
|
command_argv, server_argv = DRbQS::Manage.split_arguments(ARGV)
|
22
24
|
|
23
25
|
begin
|
@@ -39,6 +41,18 @@ begin
|
|
39
41
|
raise "Invalid log level."
|
40
42
|
end
|
41
43
|
end
|
44
|
+
opt.on('--file-directory DIR', String, 'Set the file archive directory.') do |v|
|
45
|
+
options[:file_directory] = v
|
46
|
+
end
|
47
|
+
opt.on('--scp-user USER', String, 'Set the user of scp destination.') do |v|
|
48
|
+
options[:scp_user] = v
|
49
|
+
end
|
50
|
+
opt.on('--scp-host HOST', String, 'Set the host of scp destination.') do |v|
|
51
|
+
options[:scp_host] = v
|
52
|
+
end
|
53
|
+
opt.on('--profile', 'Use profile for test exec.') do |v|
|
54
|
+
test_opts[:profile] = true
|
55
|
+
end
|
42
56
|
opt.on('--debug', 'Set $DEBUG true.') do |v|
|
43
57
|
$DEBUG = true
|
44
58
|
end
|
@@ -75,7 +89,7 @@ case options[:command_type]
|
|
75
89
|
when /^test/
|
76
90
|
s = options[:command_type].split('_')[1].split(',')
|
77
91
|
type = s[0].intern
|
78
|
-
DRbQS.test_server(options, type, s[1..-1])
|
92
|
+
DRbQS.test_server(options, type, s[1..-1], test_opts)
|
79
93
|
else
|
80
94
|
DRbQS.start_server(options)
|
81
95
|
end
|
data/drbqs.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{drbqs}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.11"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Takayuki YAMAGUCHI"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-04-09}
|
13
13
|
s.description = %q{Task queuing system over network that is implemented by dRuby.}
|
14
14
|
s.email = %q{d@ytak.info}
|
15
15
|
s.executables = ["drbqs-manage", "drbqs-node", "drbqs-server"]
|
@@ -34,6 +34,8 @@ Gem::Specification.new do |s|
|
|
34
34
|
"example/drbqs-manage-test.rb",
|
35
35
|
"example/drbqs-node-test.rb",
|
36
36
|
"example/drbqs-server-test.rb",
|
37
|
+
"example/error/error.rb",
|
38
|
+
"example/error/server_def.rb",
|
37
39
|
"example/server/server.rb",
|
38
40
|
"example/sum/server_def.rb",
|
39
41
|
"example/sum/sum.rb",
|
@@ -60,12 +62,11 @@ Gem::Specification.new do |s|
|
|
60
62
|
"lib/drbqs/task.rb",
|
61
63
|
"lib/drbqs/task_client.rb",
|
62
64
|
"lib/drbqs/task_generator.rb",
|
63
|
-
"lib/drbqs/utils
|
65
|
+
"lib/drbqs/utils.rb",
|
64
66
|
"spec/acl_file_spec.rb",
|
65
67
|
"spec/config_spec.rb",
|
66
68
|
"spec/connection_spec.rb",
|
67
69
|
"spec/data/acl.txt",
|
68
|
-
"spec/filename_spec.rb",
|
69
70
|
"spec/history_spec.rb",
|
70
71
|
"spec/manage_spec.rb",
|
71
72
|
"spec/message_spec.rb",
|
@@ -88,13 +89,12 @@ Gem::Specification.new do |s|
|
|
88
89
|
s.homepage = %q{http://github.com/ytaka/drbqs}
|
89
90
|
s.licenses = ["GPL3"]
|
90
91
|
s.require_paths = ["lib"]
|
91
|
-
s.rubygems_version = %q{1.
|
92
|
+
s.rubygems_version = %q{1.7.2}
|
92
93
|
s.summary = %q{dRuby Queueing System}
|
93
94
|
s.test_files = [
|
94
95
|
"spec/acl_file_spec.rb",
|
95
96
|
"spec/config_spec.rb",
|
96
97
|
"spec/connection_spec.rb",
|
97
|
-
"spec/filename_spec.rb",
|
98
98
|
"spec/history_spec.rb",
|
99
99
|
"spec/manage_spec.rb",
|
100
100
|
"spec/message_spec.rb",
|
@@ -126,6 +126,7 @@ Gem::Specification.new do |s|
|
|
126
126
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
127
127
|
s.add_runtime_dependency(%q<net-ssh>, [">= 2.1.3"])
|
128
128
|
s.add_runtime_dependency(%q<net-ssh-shell>, [">= 0.1.0"])
|
129
|
+
s.add_runtime_dependency(%q<filename>, [">= 0.0.5"])
|
129
130
|
s.add_development_dependency(%q<rspec>, [">= 2.5.0"])
|
130
131
|
else
|
131
132
|
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
@@ -135,6 +136,7 @@ Gem::Specification.new do |s|
|
|
135
136
|
s.add_dependency(%q<rcov>, [">= 0"])
|
136
137
|
s.add_dependency(%q<net-ssh>, [">= 2.1.3"])
|
137
138
|
s.add_dependency(%q<net-ssh-shell>, [">= 0.1.0"])
|
139
|
+
s.add_dependency(%q<filename>, [">= 0.0.5"])
|
138
140
|
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
139
141
|
end
|
140
142
|
else
|
@@ -145,6 +147,7 @@ Gem::Specification.new do |s|
|
|
145
147
|
s.add_dependency(%q<rcov>, [">= 0"])
|
146
148
|
s.add_dependency(%q<net-ssh>, [">= 2.1.3"])
|
147
149
|
s.add_dependency(%q<net-ssh-shell>, [">= 0.1.0"])
|
150
|
+
s.add_dependency(%q<filename>, [">= 0.0.5"])
|
148
151
|
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
149
152
|
end
|
150
153
|
end
|
data/example/server/server.rb
CHANGED
@@ -7,6 +7,8 @@ end
|
|
7
7
|
|
8
8
|
server = DRbQS::Server.new(:port => 13501, :finish_exit => true)
|
9
9
|
server.add_task_generator(task_generator)
|
10
|
+
server.set_initialization_task(DRbQS::Task.new(Kernel, :puts, ['hook: initialize']))
|
11
|
+
server.set_finalization_task(DRbQS::Task.new(Kernel, :puts, ['hook: finalize']))
|
10
12
|
server.set_signal_trap
|
11
13
|
server.start
|
12
14
|
server.wait
|
data/example/transfer/file.rb
CHANGED
data/lib/drbqs/client.rb
CHANGED
@@ -9,15 +9,16 @@ module DRbQS
|
|
9
9
|
PRIORITY_RESPOND = 10
|
10
10
|
PRIORITY_CALCULATE = 0
|
11
11
|
OUTPUT_NOT_SEND_RESULT = 'not_send_result'
|
12
|
+
DEFAULT_LOG_FILE = 'drbqs_client.log'
|
12
13
|
|
13
14
|
# :continue
|
14
15
|
def initialize(access_uri, opts = {})
|
15
16
|
@access_uri = access_uri
|
16
|
-
@logger =
|
17
|
-
@logger.level = opts[:log_level] || Logger::ERROR
|
17
|
+
@logger = DRbQS::Utils.create_logger(opts[:log_file] || DEFAULT_LOG_FILE, opts[:log_level])
|
18
18
|
@connection = nil
|
19
19
|
@task_client = nil
|
20
20
|
@process_continue = opts[:continue]
|
21
|
+
@signal_queue = Queue.new
|
21
22
|
end
|
22
23
|
|
23
24
|
def transfer_file
|
@@ -72,12 +73,39 @@ module DRbQS
|
|
72
73
|
end
|
73
74
|
private :process_exit
|
74
75
|
|
76
|
+
def execute_finalization
|
77
|
+
if ary = @connection.get_finalization
|
78
|
+
execute_task(*ary)
|
79
|
+
end
|
80
|
+
rescue => err
|
81
|
+
output_error(err)
|
82
|
+
end
|
83
|
+
private :execute_finalization
|
84
|
+
|
85
|
+
def send_error(err)
|
86
|
+
output_error(err)
|
87
|
+
@connection.send_node_error("#{err.to_s}\n#{err.backtrace.join("\n")}")
|
88
|
+
end
|
89
|
+
private :send_error
|
90
|
+
|
75
91
|
def communicate_with_server
|
76
92
|
@task_client.add_new_task
|
77
|
-
|
93
|
+
case @connection.respond_signal
|
94
|
+
when :exit
|
95
|
+
return nil
|
96
|
+
when :finalize
|
97
|
+
execute_finalization
|
78
98
|
return nil
|
79
99
|
end
|
80
100
|
@task_client.send_result
|
101
|
+
until @signal_queue.empty?
|
102
|
+
signal, obj = @signal_queue.pop
|
103
|
+
case signal
|
104
|
+
when :node_error
|
105
|
+
send_error(obj)
|
106
|
+
process_exit
|
107
|
+
end
|
108
|
+
end
|
81
109
|
return true
|
82
110
|
end
|
83
111
|
private :communicate_with_server
|
@@ -98,7 +126,7 @@ module DRbQS
|
|
98
126
|
sleep(WAIT_NEW_TASK)
|
99
127
|
end
|
100
128
|
rescue => err
|
101
|
-
|
129
|
+
send_error(err)
|
102
130
|
ensure
|
103
131
|
process_exit
|
104
132
|
end
|
@@ -113,14 +141,20 @@ module DRbQS
|
|
113
141
|
calculate_task
|
114
142
|
end
|
115
143
|
rescue => err
|
116
|
-
|
117
|
-
process_exit
|
144
|
+
@signal_queue.push([:node_error, err])
|
118
145
|
end
|
119
146
|
end
|
120
147
|
end
|
121
148
|
private :thread_calculate
|
122
149
|
|
150
|
+
def set_signal_trap
|
151
|
+
Signal.trap(:TERM) do
|
152
|
+
process_exit
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
123
156
|
def calculate(opts = {})
|
157
|
+
set_signal_trap
|
124
158
|
cn = thread_communicate
|
125
159
|
exec = thread_calculate
|
126
160
|
cn.priority = PRIORITY_RESPOND
|
data/lib/drbqs/config.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'fileutils'
|
2
1
|
require 'singleton'
|
3
2
|
|
4
3
|
module DRbQS
|
@@ -6,6 +5,9 @@ module DRbQS
|
|
6
5
|
ACL_DEFAULT_PATH = 'acl.txt'
|
7
6
|
ACL_SAMPLE_PATH = 'acl.txt.sample'
|
8
7
|
HOST_FILE_DIRECTORY = 'host'
|
8
|
+
HOST_FILE_SAMPLE_PATH = 'host.yaml.sample'
|
9
|
+
SHELL_FILE_DIRECTORY = 'shell'
|
10
|
+
SHELL_BASHRC = 'bashrc'
|
9
11
|
|
10
12
|
class Config
|
11
13
|
|
@@ -17,6 +19,22 @@ module DRbQS
|
|
17
19
|
deny all
|
18
20
|
allow localhost
|
19
21
|
allow 127.0.0.1
|
22
|
+
SAMPLE
|
23
|
+
|
24
|
+
HOST_YAML_SAMPLE =<<SAMPLE
|
25
|
+
---
|
26
|
+
:dest: user@example.com
|
27
|
+
:dir:
|
28
|
+
:shell: bash --noprofile --init-file ~/.drbqs/shell/bashrc
|
29
|
+
:rvm:
|
30
|
+
:rvm_init: ~/.rvm/scripts/rvm
|
31
|
+
:output:
|
32
|
+
SAMPLE
|
33
|
+
|
34
|
+
BASHRC_SAMPLE = <<SAMPLE
|
35
|
+
HISTFILE=$HOME/.drbqs/shell/bash_history
|
36
|
+
HISTSIZE=10000
|
37
|
+
HISTFILESIZE=20000
|
20
38
|
SAMPLE
|
21
39
|
|
22
40
|
class << self
|
@@ -33,23 +51,39 @@ SAMPLE
|
|
33
51
|
get_path(HOST_FILE_DIRECTORY)
|
34
52
|
end
|
35
53
|
|
54
|
+
def get_shell_file_directory
|
55
|
+
get_path(SHELL_FILE_DIRECTORY)
|
56
|
+
end
|
57
|
+
|
58
|
+
def make_directory(dir)
|
59
|
+
unless File.exist?(dir)
|
60
|
+
FileUtils.mkdir_p(dir)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
private :make_directory
|
64
|
+
|
36
65
|
def check_directory_create
|
37
66
|
unless File.exist?(@@data[:dir])
|
38
67
|
FileUtils.mkdir_p(@@data[:dir])
|
39
68
|
FileUtils.chmod(0700, @@data[:dir])
|
40
69
|
end
|
41
|
-
|
42
|
-
|
43
|
-
FileUtils.mkdir_p(host)
|
70
|
+
[get_host_file_directory, get_shell_file_directory].each do |dir|
|
71
|
+
make_directory(dir)
|
44
72
|
end
|
45
73
|
end
|
46
74
|
|
47
|
-
def
|
48
|
-
path = get_path(ACL_SAMPLE_PATH)
|
75
|
+
def output_to_file(path, content)
|
49
76
|
unless File.exist?(path)
|
50
|
-
open(path, 'w') { |f| f.print
|
77
|
+
open(path, 'w') { |f| f.print content }
|
51
78
|
end
|
52
79
|
end
|
80
|
+
private :output_to_file
|
81
|
+
|
82
|
+
def save_sample
|
83
|
+
output_to_file(get_path(ACL_SAMPLE_PATH), ACL_SAMPLE)
|
84
|
+
output_to_file("#{get_host_file_directory}/#{HOST_FILE_SAMPLE_PATH}", HOST_YAML_SAMPLE)
|
85
|
+
output_to_file("#{get_shell_file_directory}/#{SHELL_BASHRC}", BASHRC_SAMPLE)
|
86
|
+
end
|
53
87
|
|
54
88
|
def get_acl_file
|
55
89
|
path = File.join(@@data[:dir], ACL_DEFAULT_PATH)
|
data/lib/drbqs/connection.rb
CHANGED
@@ -25,14 +25,23 @@ module DRbQS
|
|
25
25
|
@id_number
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def get_special_task(label)
|
29
29
|
begin
|
30
|
-
ary = @message.read([
|
30
|
+
ary = @message.read([label, nil, Symbol, nil], 0)
|
31
31
|
ary[1..-1]
|
32
32
|
rescue Rinda::RequestExpiredError
|
33
33
|
nil
|
34
34
|
end
|
35
35
|
end
|
36
|
+
private :get_special_task
|
37
|
+
|
38
|
+
def get_initialization
|
39
|
+
get_special_task(:initialize)
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_finalization
|
43
|
+
get_special_task(:finalize)
|
44
|
+
end
|
36
45
|
|
37
46
|
def respond_signal
|
38
47
|
begin
|
@@ -42,11 +51,17 @@ module DRbQS
|
|
42
51
|
when :alive_p
|
43
52
|
@message.write([:server, :alive, @id_number])
|
44
53
|
@logger.info("Send alive signal of node id #{@id_number}") if @logger
|
45
|
-
when :exit
|
46
|
-
return
|
54
|
+
when :exit, :finalize
|
55
|
+
return sym
|
56
|
+
else
|
57
|
+
raise "Get invalid signal: #{sym.inspect}"
|
47
58
|
end
|
48
59
|
rescue Rinda::RequestExpiredError
|
49
60
|
end
|
50
61
|
end
|
62
|
+
|
63
|
+
def send_node_error(error_message)
|
64
|
+
@message.write([:server, :node_error, [@id_number, error_message]])
|
65
|
+
end
|
51
66
|
end
|
52
67
|
end
|
data/lib/drbqs/manage.rb
CHANGED
@@ -53,15 +53,22 @@ module DRbQS
|
|
53
53
|
def command_client(access_uri)
|
54
54
|
obj = DRbObject.new_with_uri(access_uri)
|
55
55
|
DRbQS::SendCommand.new(obj[:message])
|
56
|
+
rescue DRb::DRbConnError
|
57
|
+
$stderr.puts "Can not access #{access_uri}"
|
58
|
+
nil
|
56
59
|
end
|
57
60
|
private :command_client
|
58
61
|
|
59
62
|
def send_exit_signal(access_uri)
|
60
|
-
command_client(access_uri)
|
63
|
+
if client = command_client(access_uri)
|
64
|
+
client.send_exit_signal
|
65
|
+
end
|
61
66
|
end
|
62
67
|
|
63
68
|
def get_status(access_uri)
|
64
|
-
command_client(access_uri)
|
69
|
+
if client = command_client(access_uri)
|
70
|
+
client.get_status
|
71
|
+
end
|
65
72
|
end
|
66
73
|
|
67
74
|
def execute_over_ssh(dest, opts, command)
|
data/lib/drbqs/message.rb
CHANGED
@@ -32,11 +32,15 @@ module DRbQS
|
|
32
32
|
@logger.info("Get exit message from #{arg.to_s}") if @logger
|
33
33
|
when :request_status
|
34
34
|
@logger.info("Get status request from #{arg.to_s}") if @logger
|
35
|
+
when :node_error
|
36
|
+
@node_list.delete(arg[0])
|
37
|
+
@logger.info("Node Error (#{arg[0]})") { arg[1] } if @logger
|
38
|
+
return [mes, arg[0]]
|
35
39
|
else
|
36
40
|
@logger.error("Invalid message from #{arg.to_s}") if @logger
|
37
41
|
return nil
|
38
42
|
end
|
39
|
-
return mes
|
43
|
+
return [mes]
|
40
44
|
end
|
41
45
|
private :manage_message
|
42
46
|
|
@@ -50,11 +54,21 @@ module DRbQS
|
|
50
54
|
deleted
|
51
55
|
end
|
52
56
|
|
53
|
-
def
|
57
|
+
def send_signal_to_all_nodes(signal)
|
54
58
|
@node_list.each do |node_id, id_str|
|
55
|
-
@message.write([node_id,
|
59
|
+
@message.write([node_id, signal])
|
56
60
|
end
|
57
61
|
end
|
62
|
+
private :send_signal_to_all_nodes
|
63
|
+
|
64
|
+
def send_exit
|
65
|
+
send_signal_to_all_nodes(:exit)
|
66
|
+
end
|
67
|
+
|
68
|
+
def send_finalization(task)
|
69
|
+
set_finalization(task)
|
70
|
+
send_signal_to_all_nodes(:finalize)
|
71
|
+
end
|
58
72
|
|
59
73
|
def send_status(calculating_task_id)
|
60
74
|
s = ''
|
@@ -82,16 +96,24 @@ module DRbQS
|
|
82
96
|
@node_list.empty?
|
83
97
|
end
|
84
98
|
|
85
|
-
|
86
|
-
# the method overwrite old task of initialization by new task.
|
87
|
-
def set_initialization(task)
|
99
|
+
def set_special_task(label, task)
|
88
100
|
begin
|
89
|
-
@message.take([
|
101
|
+
@message.take([label, nil, Symbol, nil], 0)
|
90
102
|
rescue Rinda::RequestExpiredError
|
91
103
|
end
|
92
|
-
@message.write(task.drb_args(
|
104
|
+
@message.write(task.drb_args(label))
|
93
105
|
end
|
106
|
+
private :set_special_task
|
94
107
|
|
108
|
+
# If the task has already set,
|
109
|
+
# the method overwrite old task of initialization by new task.
|
110
|
+
def set_initialization(task)
|
111
|
+
set_special_task(:initialize, task)
|
112
|
+
end
|
113
|
+
|
114
|
+
def set_finalization(task)
|
115
|
+
set_special_task(:finalization, task)
|
116
|
+
end
|
95
117
|
end
|
96
118
|
|
97
119
|
end
|
data/lib/drbqs/node_list.rb
CHANGED
@@ -26,10 +26,14 @@ module DRbQS
|
|
26
26
|
@check = @list.keys
|
27
27
|
end
|
28
28
|
|
29
|
+
def delete(id)
|
30
|
+
@list.delete(id)
|
31
|
+
@history.set(id, :disconnect)
|
32
|
+
end
|
33
|
+
|
29
34
|
def delete_not_alive
|
30
35
|
@check.each do |id|
|
31
|
-
|
32
|
-
@history.set(id, :disconnect)
|
36
|
+
delete(id)
|
33
37
|
end
|
34
38
|
deleted = @check
|
35
39
|
@check = []
|
data/lib/drbqs/queue.rb
CHANGED
@@ -72,19 +72,18 @@ module DRbQS
|
|
72
72
|
end
|
73
73
|
private :delete_task_id
|
74
74
|
|
75
|
-
def exec_task_hook(task_id, result)
|
75
|
+
def exec_task_hook(main_server, task_id, result)
|
76
76
|
if task = @cache.delete(task_id)
|
77
77
|
if hook = task.hook
|
78
78
|
@history.set(task_id, :hook)
|
79
|
-
hook.call(
|
79
|
+
hook.call(main_server, result)
|
80
80
|
end
|
81
81
|
else
|
82
82
|
@logger.error("Task #{task_id} is not cached.") if @logger
|
83
83
|
end
|
84
84
|
end
|
85
|
-
private :exec_task_hook
|
86
85
|
|
87
|
-
def get_result
|
86
|
+
def get_result(main_server)
|
88
87
|
count = 0
|
89
88
|
begin
|
90
89
|
loop do
|
@@ -94,7 +93,7 @@ module DRbQS
|
|
94
93
|
@history.set(task_id, :result, node_id)
|
95
94
|
@logger.info("Get: result of #{task_id} from node #{node_id}.") if @logger
|
96
95
|
delete_task_id(node_id, task_id)
|
97
|
-
exec_task_hook(task_id, result)
|
96
|
+
exec_task_hook(main_server, task_id, result)
|
98
97
|
end
|
99
98
|
rescue Rinda::RequestExpiredError
|
100
99
|
@logger.debug("Get: #{count} results.") if @logger
|
data/lib/drbqs/server.rb
CHANGED
@@ -28,6 +28,7 @@ module DRbQS
|
|
28
28
|
# empty_queue_hook is prior to task_generator.
|
29
29
|
class Server
|
30
30
|
WAIT_TIME_NODE_EXIT = 3
|
31
|
+
WAIT_TIME_NODE_FINALIZE = 10
|
31
32
|
WAIT_TIME_NEW_RESULT = 1
|
32
33
|
|
33
34
|
attr_reader :queue
|
@@ -46,6 +47,12 @@ module DRbQS
|
|
46
47
|
# Exit programs in finish_hook.
|
47
48
|
# :signal_trap
|
48
49
|
# Set trapping signal.
|
50
|
+
# :scp_user
|
51
|
+
# Set user of scp.
|
52
|
+
# :scp_host
|
53
|
+
# Set host of scp.
|
54
|
+
# :file_directory
|
55
|
+
# Set the setting of file directory.
|
49
56
|
def initialize(opts = {})
|
50
57
|
@port = opts[:port] || ROOT_DEFAULT_PORT
|
51
58
|
@acl = acl_init(opts[:acl])
|
@@ -55,20 +62,30 @@ module DRbQS
|
|
55
62
|
:result => Rinda::TupleSpace.new,
|
56
63
|
:transfer => nil
|
57
64
|
}
|
58
|
-
|
59
|
-
@logger = Logger.new(opts[:log_file])
|
60
|
-
@logger.level = opts[:log_level] || Logger::ERROR
|
61
|
-
else
|
62
|
-
@logger = nil
|
63
|
-
end
|
65
|
+
@logger = DRbQS::Utils.create_logger(opts[:log_file], opts[:log_level])
|
64
66
|
@message = MessageServer.new(@ts[:message], @logger)
|
65
67
|
@queue= QueueServer.new(@ts[:queue], @ts[:result], @logger)
|
66
68
|
@check_alive = CheckAlive.new(opts[:check_alive])
|
67
69
|
@task_generator = []
|
68
70
|
hook_init(opts[:finish_exit])
|
69
71
|
set_signal_trap if opts[:signal_trap]
|
72
|
+
@finalization_task = nil
|
73
|
+
@transfer_setting = get_transfer_setting(opts[:scp_host], opts[:scp_user], opts[:file_directory])
|
74
|
+
end
|
75
|
+
|
76
|
+
def transfer_directory
|
77
|
+
@ts[:transfer] && @ts[:transfer].directory
|
70
78
|
end
|
71
79
|
|
80
|
+
def get_transfer_setting(host, user, directory)
|
81
|
+
setting = { :directory => directory, :user => user, :host => host, :set => true }
|
82
|
+
if host || user || directory
|
83
|
+
setting[:set] = true
|
84
|
+
end
|
85
|
+
setting
|
86
|
+
end
|
87
|
+
private :get_transfer_setting
|
88
|
+
|
72
89
|
def acl_init(acl_arg)
|
73
90
|
case acl_arg
|
74
91
|
when Array
|
@@ -88,6 +105,9 @@ module DRbQS
|
|
88
105
|
private :hook_init
|
89
106
|
|
90
107
|
def start
|
108
|
+
if @transfer_setting[:set] && @transfer_setting[:directory] && !@ts[:transfer]
|
109
|
+
set_file_transfer(@transfer_setting[:directory])
|
110
|
+
end
|
91
111
|
DRb.install_acl(@acl) if @acl
|
92
112
|
uri = "druby://:#{@port}"
|
93
113
|
DRb.start_service(uri, @ts)
|
@@ -128,6 +148,10 @@ module DRbQS
|
|
128
148
|
@message.set_initialization(task)
|
129
149
|
end
|
130
150
|
|
151
|
+
def set_finalization_task(task)
|
152
|
+
@finalization_task = task
|
153
|
+
end
|
154
|
+
|
131
155
|
# +key+ is :empty_queue or :finish_exit.
|
132
156
|
# &block takes self as an argument.
|
133
157
|
def add_hook(key, name = nil, &block)
|
@@ -138,6 +162,12 @@ module DRbQS
|
|
138
162
|
@hook.delete(key, name)
|
139
163
|
end
|
140
164
|
|
165
|
+
def exec_finish_hook
|
166
|
+
@logger.info("Execute finish hook.") if @logger
|
167
|
+
@hook.exec(:finish, self)
|
168
|
+
end
|
169
|
+
private :exec_finish_hook
|
170
|
+
|
141
171
|
def exec_hook
|
142
172
|
if @queue.empty?
|
143
173
|
@logger.info("Execute empty queue hook.") if @logger
|
@@ -145,16 +175,21 @@ module DRbQS
|
|
145
175
|
end
|
146
176
|
add_tasks_from_generator
|
147
177
|
if @queue.finished?
|
148
|
-
|
149
|
-
@hook.exec(:finish, self)
|
178
|
+
exec_finish_hook
|
150
179
|
end
|
151
180
|
end
|
152
181
|
private :exec_hook
|
153
182
|
|
154
183
|
def exit
|
155
|
-
@
|
184
|
+
if @finalization_task
|
185
|
+
@message.send_finalization(@finalization_task)
|
186
|
+
wait_time = WAIT_TIME_NODE_FINALIZE
|
187
|
+
else
|
188
|
+
@message.send_exit
|
189
|
+
wait_time = WAIT_TIME_NODE_EXIT
|
190
|
+
end
|
156
191
|
until @message.node_not_exist?
|
157
|
-
sleep(
|
192
|
+
sleep(wait_time)
|
158
193
|
check_connection(true)
|
159
194
|
end
|
160
195
|
@logger.info("History of tasks") { "\n" + @queue.all_logs } if @logger
|
@@ -167,17 +202,24 @@ module DRbQS
|
|
167
202
|
end
|
168
203
|
end
|
169
204
|
|
170
|
-
def set_file_transfer(
|
205
|
+
def set_file_transfer(directory, opts = {})
|
206
|
+
user = opts[:user] || @transfer_setting[:user] || ENV['USER']
|
207
|
+
host = opts[:host] || @transfer_setting[:host] || 'localhost'
|
171
208
|
@ts[:transfer] = DRbQS::Transfer.new(user, host, directory)
|
209
|
+
@logger.info("File transfer") { @ts[:transfer].information } if @logger
|
172
210
|
end
|
173
211
|
|
174
212
|
def check_message
|
175
|
-
while
|
213
|
+
while mes_arg = @message.get_message
|
214
|
+
mes, arg = mes_arg
|
176
215
|
case mes
|
177
216
|
when :exit_server
|
178
217
|
self.exit
|
179
218
|
when :request_status
|
180
219
|
@message.send_status(@queue.calculating)
|
220
|
+
when :node_error
|
221
|
+
@queue.get_accept_signal
|
222
|
+
@queue.requeue_for_deleted_node_id([arg])
|
181
223
|
end
|
182
224
|
end
|
183
225
|
end
|
@@ -193,7 +235,7 @@ module DRbQS
|
|
193
235
|
loop do
|
194
236
|
check_message
|
195
237
|
check_connection
|
196
|
-
count_results = @queue.get_result
|
238
|
+
count_results = @queue.get_result(self)
|
197
239
|
exec_hook
|
198
240
|
@logger.debug("Calculating tasks: #{@queue.calculating_task_number}") if @logger
|
199
241
|
if count_results <= 1
|
@@ -202,25 +244,48 @@ module DRbQS
|
|
202
244
|
end
|
203
245
|
end
|
204
246
|
|
247
|
+
def start_profile
|
248
|
+
require 'ruby-prof'
|
249
|
+
RubyProf.start
|
250
|
+
end
|
251
|
+
private :start_profile
|
252
|
+
|
253
|
+
def finish_profile
|
254
|
+
result = RubyProf.stop
|
255
|
+
printer = RubyProf::FlatPrinter.new(result)
|
256
|
+
# printer = RubyProf::GraphPrinter.new(result)
|
257
|
+
# printer = RubyProf::CallTreePrinter.new(result)
|
258
|
+
printer.print(STDOUT)
|
259
|
+
end
|
260
|
+
private :finish_profile
|
261
|
+
|
205
262
|
def test_exec(opts = {})
|
206
263
|
task_generator_init
|
207
264
|
dummy_client = DRbQS::Client.new(nil, :log_file => $stdout, :log_level => opts[:log_level])
|
208
265
|
dummy_task_client = DRbQS::TaskClient.new(nil, @ts[:queue], nil)
|
266
|
+
if @ts[:transfer]
|
267
|
+
dummy_client.instance_variable_set(:@transfer, DRbQS::TransferTest.new(@ts[:transfer].directory))
|
268
|
+
end
|
209
269
|
num = 0
|
270
|
+
start_profile if opts[:profile]
|
210
271
|
loop do
|
211
|
-
num += 1
|
212
272
|
exec_hook
|
213
273
|
if ary = dummy_task_client.get_task
|
214
274
|
task_id, marshal_obj, method_sym, args = ary
|
215
275
|
result = dummy_client.instance_eval { execute_task(marshal_obj, method_sym, args) }
|
216
|
-
@queue.
|
217
|
-
exec_task_hook(task_id, result)
|
218
|
-
end
|
276
|
+
@queue.exec_task_hook(self, task_id, result)
|
219
277
|
end
|
220
|
-
|
278
|
+
num += 1
|
279
|
+
if opts[:limit] && num >= opts[:limit]
|
221
280
|
break
|
222
281
|
end
|
223
282
|
end
|
283
|
+
finish_profile if opts[:profile]
|
284
|
+
if @finalization_task
|
285
|
+
args = @finalization_task.drb_args(nil)[1..-1]
|
286
|
+
dummy_client.instance_eval { execute_task(*args) }
|
287
|
+
end
|
288
|
+
exec_finish_hook
|
224
289
|
end
|
225
290
|
|
226
291
|
def test_task_generator(opts = {})
|
data/lib/drbqs/server_define.rb
CHANGED
@@ -57,14 +57,14 @@ HELP
|
|
57
57
|
server.wait
|
58
58
|
end
|
59
59
|
|
60
|
-
def test_server(options, type, arg = [])
|
60
|
+
def test_server(options, type, arg = [], test_opts = {})
|
61
61
|
server = create_server(options)
|
62
62
|
case type
|
63
63
|
when :task
|
64
64
|
puts "*** Test of Task Generators ***"
|
65
65
|
server.test_task_generator(:limit => arg[0] ? arg[0].to_i : nil, :progress => true)
|
66
66
|
when :exec
|
67
|
-
server.test_exec(:limit => arg[0] ? arg[0].to_i : nil)
|
67
|
+
server.test_exec(:limit => arg[0] ? arg[0].to_i : nil, :profile => test_opts[:profile])
|
68
68
|
else
|
69
69
|
puts "*** Not be yet implemented ***"
|
70
70
|
end
|
data/lib/drbqs/ssh/shell.rb
CHANGED
@@ -129,7 +129,7 @@ module DRbQS
|
|
129
129
|
end
|
130
130
|
execute_command do |sh|
|
131
131
|
if @nohup
|
132
|
-
pr, path = shell_exec_check(sh, "
|
132
|
+
pr, path = shell_exec_check(sh, "filename-create new -p middle -D parent -t time #{@nohup_output}")
|
133
133
|
cmd = "nohup #{cmd} > #{path.strip} 2>&1 &"
|
134
134
|
end
|
135
135
|
shell_exec(sh, cmd)
|
data/lib/drbqs/ssh/transfer.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
|
3
1
|
module DRbQS
|
4
2
|
|
5
3
|
# Transfer files to directory on DRbQS server.
|
6
4
|
# In this class we use scp command.
|
7
5
|
# Note that after we transfer files we delete the files.
|
8
6
|
class Transfer
|
7
|
+
attr_reader :user, :host, :directory
|
9
8
|
|
10
9
|
# options
|
11
10
|
# :mkdir true or nil
|
@@ -16,17 +15,43 @@ module DRbQS
|
|
16
15
|
FileUtils.mkdir_p(@directory)
|
17
16
|
end
|
18
17
|
|
18
|
+
def transfer_file(path, name)
|
19
|
+
system("scp -r #{path} #{@user}@#{@host}:#{File.join(@directory, name)} > /dev/null 2>&1")
|
20
|
+
end
|
21
|
+
private :transfer_file
|
22
|
+
|
19
23
|
def scp(path)
|
20
24
|
name = File.basename(path)
|
21
25
|
unless File.exist?(path)
|
22
26
|
raise ArgumentError, "File #{path} does not exist."
|
23
27
|
end
|
24
|
-
if
|
28
|
+
if transfer_file(path, name)
|
25
29
|
FileUtils.rm_r(path)
|
26
30
|
return true
|
27
31
|
end
|
28
32
|
return false
|
29
33
|
end
|
34
|
+
|
35
|
+
def information
|
36
|
+
"#{@user}@#{@host} #{@directory}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class TransferTest < Transfer
|
41
|
+
def initialize(directory)
|
42
|
+
@directory = File.expand_path(directory)
|
43
|
+
FileUtils.mkdir_p(@directory)
|
44
|
+
end
|
45
|
+
|
46
|
+
def transfer_file(path, name)
|
47
|
+
FileUtils.cp(path, File.join(@directory, name))
|
48
|
+
true
|
49
|
+
end
|
50
|
+
private :transfer_file
|
51
|
+
|
52
|
+
def information
|
53
|
+
@directory
|
54
|
+
end
|
30
55
|
end
|
31
56
|
|
32
57
|
# To compress files, we use gzip and tar command.
|
@@ -49,10 +74,12 @@ module DRbQS
|
|
49
74
|
raise "Can not compress: #{path}"
|
50
75
|
end
|
51
76
|
FileUtils.rm_r(path) if File.exist?(path)
|
52
|
-
|
77
|
+
path_to_send = gz_path
|
53
78
|
else
|
54
|
-
|
79
|
+
path_to_send = path
|
55
80
|
end
|
81
|
+
@@files.enq(path_to_send)
|
82
|
+
File.basename(path_to_send)
|
56
83
|
end
|
57
84
|
|
58
85
|
def self.compress_enqueue(path)
|
@@ -66,5 +93,21 @@ module DRbQS
|
|
66
93
|
def self.empty?
|
67
94
|
@@files.empty?
|
68
95
|
end
|
96
|
+
|
97
|
+
def self.decompress(server, filename)
|
98
|
+
dir = server.transfer_directory
|
99
|
+
path = File.join(dir, filename)
|
100
|
+
if File.exist?(path)
|
101
|
+
case path
|
102
|
+
when /\.tar\.gz$/
|
103
|
+
cmd = "tar xvzf #{path} -C #{dir} > /dev/null 2>&1"
|
104
|
+
when /\.gz$/
|
105
|
+
cmd = "gunzip #{path} > /dev/null 2>&1"
|
106
|
+
else
|
107
|
+
cmd = nil
|
108
|
+
end
|
109
|
+
system(cmd) if cmd
|
110
|
+
end
|
111
|
+
end
|
69
112
|
end
|
70
113
|
end
|
data/lib/drbqs/task_client.rb
CHANGED
@@ -30,8 +30,8 @@ module DRbQS
|
|
30
30
|
private :dequeue_result
|
31
31
|
|
32
32
|
def queue_task(task_id, ary)
|
33
|
-
@task_queue.enq(ary)
|
34
33
|
@calculating_task = task_id
|
34
|
+
@task_queue.enq(ary)
|
35
35
|
end
|
36
36
|
|
37
37
|
def dequeue_task
|
@@ -50,9 +50,9 @@ module DRbQS
|
|
50
50
|
unless @calculating_task
|
51
51
|
if ary = get_task
|
52
52
|
task_id, obj, method_sym, args = ary
|
53
|
+
@logger.info("Send accept signal: node #{@node_id} caluclating #{task_id}") if @logger
|
54
|
+
@result.write([:accept, task_id, @node_id])
|
53
55
|
queue_task(task_id, [obj, method_sym, args])
|
54
|
-
@logger.info("Send accept signal: node #{@node_id} caluclating #{@calculating_task}") if @logger
|
55
|
-
@result.write([:accept, @calculating_task, @node_id])
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
data/lib/drbqs/utils.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module DRbQS
|
2
|
+
module Utils
|
3
|
+
def create_logger(log_file, log_level)
|
4
|
+
if log_file
|
5
|
+
if IO === log_file
|
6
|
+
log_output = log_file
|
7
|
+
else
|
8
|
+
log_output = FileName.create(log_file, :position => :middle, :directory => :parent, :type => :number)
|
9
|
+
end
|
10
|
+
logger = Logger.new(log_output)
|
11
|
+
logger.level = log_level || Logger::ERROR
|
12
|
+
return logger
|
13
|
+
end
|
14
|
+
return nil
|
15
|
+
end
|
16
|
+
module_function :create_logger
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/lib/drbqs.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'thread'
|
2
|
-
require 'logger'
|
3
2
|
require 'drb'
|
4
3
|
require 'drb/acl'
|
5
4
|
require 'rinda/tuplespace'
|
@@ -7,6 +6,12 @@ require 'rinda/rinda'
|
|
7
6
|
|
8
7
|
require 'drbqs/server_define'
|
9
8
|
|
9
|
+
autoload :Logger, 'logger'
|
10
|
+
autoload :FileUtils, 'fileutils'
|
11
|
+
|
12
|
+
gem 'filename'
|
13
|
+
autoload :FileName, 'filename'
|
14
|
+
|
10
15
|
module DRbQS
|
11
16
|
autoload :Server, 'drbqs/server'
|
12
17
|
autoload :Client, 'drbqs/client'
|
@@ -18,9 +23,9 @@ module DRbQS
|
|
18
23
|
autoload :SSHHost, 'drbqs/ssh/host'
|
19
24
|
autoload :CommandTask, 'drbqs/task'
|
20
25
|
autoload :CommandExecute, 'drbqs/task'
|
21
|
-
autoload :FileName, 'drbqs/utils/filename'
|
22
26
|
autoload :Transfer, 'drbqs/ssh/transfer'
|
23
27
|
autoload :FileTransfer, 'drbqs/ssh/transfer'
|
28
|
+
autoload :Utils, 'drbqs/utils'
|
24
29
|
|
25
30
|
ROOT_DEFAULT_PORT = 13500
|
26
31
|
end
|
data/spec/connection_spec.rb
CHANGED
@@ -26,6 +26,16 @@ describe DRbQS::ConnectionClient do
|
|
26
26
|
@connection.get_initialization.should == ary[1..-1]
|
27
27
|
end
|
28
28
|
|
29
|
+
it "should get no finalization method." do
|
30
|
+
@connection.get_finalization.should be_nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should get finalization" do
|
34
|
+
ary = [:finalize, [1, 2], :size, []]
|
35
|
+
@message.write(ary)
|
36
|
+
@connection.get_finalization.should == ary[1..-1]
|
37
|
+
end
|
38
|
+
|
29
39
|
it "should respond :alive_p signal" do
|
30
40
|
@message.write([@node_id, :alive_p])
|
31
41
|
@connection.respond_signal
|
data/spec/server_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe DRbQS::Server do
|
4
|
-
context "when we
|
4
|
+
context "when we initialize DRbQS::Server" do
|
5
5
|
it "should initialize an ACL object by ACLFile.load" do
|
6
6
|
path = File.dirname(__FILE__) + '/data/acl.txt'
|
7
7
|
DRbQS::ACLFile.should_receive(:load).with(path)
|
@@ -14,4 +14,43 @@ describe DRbQS::Server do
|
|
14
14
|
DRbQS::Server.new(:acl => ary, :log_file => nil)
|
15
15
|
end
|
16
16
|
end
|
17
|
+
|
18
|
+
context "when we start DRbQS::Server" do
|
19
|
+
it "should not set DRbQS::FileTransfer" do
|
20
|
+
server = DRbQS::Server.new
|
21
|
+
DRbQS::Transfer.should_not_receive(:new)
|
22
|
+
DRb.should_receive(:start_service).once
|
23
|
+
server.start
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should set defalt settings of DRbQS::FileTransfer" do
|
27
|
+
server = DRbQS::Server.new(:file_directory => '/tmp')
|
28
|
+
DRbQS::Transfer.should_receive(:new).with(ENV['USER'], 'localhost', '/tmp')
|
29
|
+
DRb.should_receive(:start_service).once
|
30
|
+
server.start
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should set DRbQS::FileTransfer" do
|
34
|
+
server = DRbQS::Server.new(:file_directory => '/tmp', :scp_user => 'hello', :scp_host => 'example.com')
|
35
|
+
DRbQS::Transfer.should_receive(:new).with('hello', 'example.com', '/tmp')
|
36
|
+
DRb.should_receive(:start_service).once
|
37
|
+
server.start
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should set DRbQS::FileTransfer by DRbQS::Server#set_file_transfer" do
|
41
|
+
server = DRbQS::Server.new
|
42
|
+
DRbQS::Transfer.should_receive(:new).with(ENV['USER'], 'localhost', '/tmp')
|
43
|
+
DRb.should_receive(:start_service).once
|
44
|
+
server.set_file_transfer('/tmp')
|
45
|
+
server.start
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should set DRbQS::FileTransfer by DRbQS::Server#set_file_transfer with optional arguments" do
|
49
|
+
server = DRbQS::Server.new
|
50
|
+
DRbQS::Transfer.should_receive(:new).with('hello', 'example.com', '/tmp')
|
51
|
+
DRb.should_receive(:start_service).once
|
52
|
+
server.set_file_transfer('/tmp', :user => 'hello', :host => 'example.com')
|
53
|
+
server.start
|
54
|
+
end
|
55
|
+
end
|
17
56
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: drbqs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.11
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Takayuki YAMAGUCHI
|
@@ -10,8 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
14
|
-
default_executable:
|
13
|
+
date: 2011-04-09 00:00:00 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: rspec
|
@@ -91,8 +90,19 @@ dependencies:
|
|
91
90
|
prerelease: false
|
92
91
|
version_requirements: *id007
|
93
92
|
- !ruby/object:Gem::Dependency
|
94
|
-
name:
|
93
|
+
name: filename
|
95
94
|
requirement: &id008 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.0.5
|
100
|
+
type: :runtime
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: *id008
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rspec
|
105
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
96
106
|
none: false
|
97
107
|
requirements:
|
98
108
|
- - ">="
|
@@ -100,7 +110,7 @@ dependencies:
|
|
100
110
|
version: 2.5.0
|
101
111
|
type: :development
|
102
112
|
prerelease: false
|
103
|
-
version_requirements: *
|
113
|
+
version_requirements: *id009
|
104
114
|
description: Task queuing system over network that is implemented by dRuby.
|
105
115
|
email: d@ytak.info
|
106
116
|
executables:
|
@@ -129,6 +139,8 @@ files:
|
|
129
139
|
- example/drbqs-manage-test.rb
|
130
140
|
- example/drbqs-node-test.rb
|
131
141
|
- example/drbqs-server-test.rb
|
142
|
+
- example/error/error.rb
|
143
|
+
- example/error/server_def.rb
|
132
144
|
- example/server/server.rb
|
133
145
|
- example/sum/server_def.rb
|
134
146
|
- example/sum/sum.rb
|
@@ -155,12 +167,11 @@ files:
|
|
155
167
|
- lib/drbqs/task.rb
|
156
168
|
- lib/drbqs/task_client.rb
|
157
169
|
- lib/drbqs/task_generator.rb
|
158
|
-
- lib/drbqs/utils
|
170
|
+
- lib/drbqs/utils.rb
|
159
171
|
- spec/acl_file_spec.rb
|
160
172
|
- spec/config_spec.rb
|
161
173
|
- spec/connection_spec.rb
|
162
174
|
- spec/data/acl.txt
|
163
|
-
- spec/filename_spec.rb
|
164
175
|
- spec/history_spec.rb
|
165
176
|
- spec/manage_spec.rb
|
166
177
|
- spec/message_spec.rb
|
@@ -179,7 +190,6 @@ files:
|
|
179
190
|
- spec/test1_spec.rb
|
180
191
|
- spec/test2_spec.rb
|
181
192
|
- spec/transfer_spec.rb
|
182
|
-
has_rdoc: true
|
183
193
|
homepage: http://github.com/ytaka/drbqs
|
184
194
|
licenses:
|
185
195
|
- GPL3
|
@@ -193,7 +203,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
193
203
|
requirements:
|
194
204
|
- - ">="
|
195
205
|
- !ruby/object:Gem::Version
|
196
|
-
hash:
|
206
|
+
hash: -783083245369623093
|
197
207
|
segments:
|
198
208
|
- 0
|
199
209
|
version: "0"
|
@@ -206,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
216
|
requirements: []
|
207
217
|
|
208
218
|
rubyforge_project:
|
209
|
-
rubygems_version: 1.
|
219
|
+
rubygems_version: 1.7.2
|
210
220
|
signing_key:
|
211
221
|
specification_version: 3
|
212
222
|
summary: dRuby Queueing System
|
@@ -214,7 +224,6 @@ test_files:
|
|
214
224
|
- spec/acl_file_spec.rb
|
215
225
|
- spec/config_spec.rb
|
216
226
|
- spec/connection_spec.rb
|
217
|
-
- spec/filename_spec.rb
|
218
227
|
- spec/history_spec.rb
|
219
228
|
- spec/manage_spec.rb
|
220
229
|
- spec/message_spec.rb
|
data/lib/drbqs/utils/filename.rb
DELETED
@@ -1,118 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
|
3
|
-
module DRbQS
|
4
|
-
class FileName
|
5
|
-
|
6
|
-
# The options are following:
|
7
|
-
# * :start
|
8
|
-
# Fixnum
|
9
|
-
# If ID string type is number, the ID starts from the specified number.
|
10
|
-
#
|
11
|
-
# * :digit
|
12
|
-
# Fixnum
|
13
|
-
# ID number converted to a string with specified digit.
|
14
|
-
#
|
15
|
-
# * :delimiter
|
16
|
-
# String
|
17
|
-
#
|
18
|
-
# * :type
|
19
|
-
# :number or :time
|
20
|
-
# If the value is :number, use a number for ID string.
|
21
|
-
# If the value is :time, use current time.
|
22
|
-
#
|
23
|
-
# * :position
|
24
|
-
# :prefix, :suffix, or :middle
|
25
|
-
# Set the position of an ID string.
|
26
|
-
def initialize(basepath, opts = {})
|
27
|
-
@basepath = File.expand_path(basepath)
|
28
|
-
@number = opts[:start] || 0
|
29
|
-
@digit = opts[:digit] || 2
|
30
|
-
@type = opts[:type] || :number
|
31
|
-
@position = opts[:position] || :suffix
|
32
|
-
@delimiter = opts[:delimiter] || (@position == :suffix ? '.' : '_')
|
33
|
-
end
|
34
|
-
|
35
|
-
def get_basepath(extension = nil)
|
36
|
-
if extension
|
37
|
-
extension = '.' + extension unless extension[0] == '.'
|
38
|
-
oldext = File.extname(@basepath)
|
39
|
-
if oldext.size > 0
|
40
|
-
@basepath.sub(Regexp.new("\\#{oldext}$"), extension)
|
41
|
-
else
|
42
|
-
@basepath + extension
|
43
|
-
end
|
44
|
-
else
|
45
|
-
@basepath
|
46
|
-
end
|
47
|
-
end
|
48
|
-
private :get_basepath
|
49
|
-
|
50
|
-
def get_addition(add, filename)
|
51
|
-
if add != :prohibit && (add == :always || File.exist?(filename))
|
52
|
-
case @type
|
53
|
-
when :time
|
54
|
-
t = Time.now
|
55
|
-
return t.strftime("%Y%m%d_%H%M%S_") + sprintf("%06d", t.usec)
|
56
|
-
when :number
|
57
|
-
s = sprintf("%0#{@digit}d", @number)
|
58
|
-
@number += 1
|
59
|
-
return s
|
60
|
-
else
|
61
|
-
raise "Invalid type of addition."
|
62
|
-
end
|
63
|
-
end
|
64
|
-
nil
|
65
|
-
end
|
66
|
-
private :get_addition
|
67
|
-
|
68
|
-
def add_addition(filename, addition)
|
69
|
-
case @position
|
70
|
-
when :prefix
|
71
|
-
dir, base = File.split(filename)
|
72
|
-
dir + '/' + addition + @delimiter + base
|
73
|
-
when :middle
|
74
|
-
dir, base = File.split(filename)
|
75
|
-
ext = File.extname(base)
|
76
|
-
if ext.size > 0
|
77
|
-
filename.sub(Regexp.new("\\#{ext}$"), @delimiter + addition + ext)
|
78
|
-
else
|
79
|
-
filename + @delimiter + addition
|
80
|
-
end
|
81
|
-
else # :suffix
|
82
|
-
filename + @delimiter + addition
|
83
|
-
end
|
84
|
-
end
|
85
|
-
private :add_addition
|
86
|
-
|
87
|
-
# The options are following:
|
88
|
-
# * :extension
|
89
|
-
# String of extension
|
90
|
-
# Use the extension if the value is specified.
|
91
|
-
#
|
92
|
-
# * :add
|
93
|
-
# :always Always add an ID string.
|
94
|
-
# :auto If some file exists, add an ID string.
|
95
|
-
# :prohibit Even if some file exists, add no ID string.
|
96
|
-
#
|
97
|
-
# * :directory
|
98
|
-
# If the value is true and the parent directory does not exist,
|
99
|
-
# create the directory.
|
100
|
-
def create(opts = {})
|
101
|
-
base = get_basepath(opts[:extension])
|
102
|
-
FileUtils.mkdir_p(File.dirname(base)) if opts[:directory]
|
103
|
-
if addition = get_addition(opts[:add], base)
|
104
|
-
path = add_addition(base, addition)
|
105
|
-
while File.exist?(path)
|
106
|
-
if addition = get_addition(opts[:add], base)
|
107
|
-
path = add_addition(base, addition)
|
108
|
-
else
|
109
|
-
raise "Can not create new filename."
|
110
|
-
end
|
111
|
-
end
|
112
|
-
path
|
113
|
-
else
|
114
|
-
base
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
data/spec/filename_spec.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe DRbQS::FileName do
|
4
|
-
it "should return unchanged filename" do
|
5
|
-
filename = DRbQS::FileName.new("abc.txt")
|
6
|
-
filename.create.should == File.expand_path(File.dirname('.') + '/abc.txt')
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should return new filename with number" do
|
10
|
-
filename = DRbQS::FileName.new(__FILE__)
|
11
|
-
path = filename.create
|
12
|
-
File.exist?(path).should_not be_true
|
13
|
-
path.should match(/\.\d+$/)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should return new filename with time" do
|
17
|
-
filename = DRbQS::FileName.new(__FILE__, :type => :time)
|
18
|
-
path = filename.create
|
19
|
-
File.exist?(path).should_not be_true
|
20
|
-
path.should match(/\.[\d_]+$/)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should return same filename" do
|
24
|
-
filename = DRbQS::FileName.new(__FILE__)
|
25
|
-
path = filename.create(:add => :prohibit)
|
26
|
-
path.should == File.expand_path(__FILE__)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should return filename with prefix" do
|
30
|
-
filename = DRbQS::FileName.new(__FILE__, :position => :prefix)
|
31
|
-
path = filename.create
|
32
|
-
dir, name = File.split(path)
|
33
|
-
name.should match(/^\d+_/)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should return filename with addition before extension" do
|
37
|
-
filename = DRbQS::FileName.new(__FILE__, :position => :middle)
|
38
|
-
path = filename.create
|
39
|
-
dir, name = File.split(path)
|
40
|
-
ext = File.extname(name)
|
41
|
-
name.should match(Regexp.new("_\\d+\\#{ext}"))
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|