drbqs 0.0.15 → 0.0.16
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/.document +3 -0
- data/README.md +137 -128
- data/VERSION +1 -1
- data/docs/FormatExecute.md +119 -0
- data/docs/GettingStarted.md +242 -0
- data/drbqs.gemspec +36 -13
- data/example/command/server_def.rb +4 -5
- data/example/execute/execute.rb +41 -0
- data/example/execute/server.rb +14 -0
- data/example/execute/task.rb +0 -0
- data/example/mandelbrot/README.md +15 -0
- data/example/mandelbrot/execute.rb +10 -0
- data/example/mandelbrot/mandelbrot.rb +56 -0
- data/example/mandelbrot/server.rb +49 -0
- data/example/server/server.rb +3 -6
- data/example/simple/README.md +18 -0
- data/example/simple/execute.rb +11 -0
- data/example/simple/server.rb +8 -0
- data/example/simple/task.rb +11 -0
- data/example/sum/server_def.rb +1 -1
- data/example/sum2/execute_def.rb +21 -8
- data/example/sum2/server_def.rb +8 -7
- data/example/transfer/file.rb +42 -8
- data/example/transfer/server_def.rb +43 -9
- data/lib/drbqs.rb +1 -1
- data/lib/drbqs/command_line/command_execute.rb +3 -3
- data/lib/drbqs/command_line/command_line.rb +1 -1
- data/lib/drbqs/execute/execute_node.rb +50 -0
- data/lib/drbqs/execute/process_define.rb +102 -54
- data/lib/drbqs/execute/register.rb +241 -87
- data/lib/drbqs/execute/server_define.rb +69 -58
- data/lib/drbqs/ext/task.rb +2 -0
- data/lib/drbqs/ext/task/command_task.rb +43 -0
- data/lib/drbqs/manage/manage.rb +5 -4
- data/lib/drbqs/manage/ssh_shell.rb +2 -8
- data/lib/drbqs/node/connection.rb +1 -1
- data/lib/drbqs/node/node.rb +8 -14
- data/lib/drbqs/node/task_client.rb +1 -1
- data/lib/drbqs/server/history.rb +5 -1
- data/lib/drbqs/server/message.rb +7 -34
- data/lib/drbqs/server/queue.rb +14 -2
- data/lib/drbqs/server/server.rb +86 -43
- data/lib/drbqs/server/server_hook.rb +3 -0
- data/lib/drbqs/server/test/node.rb +1 -1
- data/lib/drbqs/server/test/prof.rb +50 -0
- data/lib/drbqs/server/test/server.rb +2 -2
- data/lib/drbqs/server/transfer_setting.rb +23 -11
- data/lib/drbqs/setting/base.rb +15 -0
- data/lib/drbqs/setting/data_container.rb +1 -1
- data/lib/drbqs/setting/execute.rb +3 -3
- data/lib/drbqs/setting/node.rb +1 -1
- data/lib/drbqs/setting/server.rb +2 -2
- data/lib/drbqs/task/registrar.rb +39 -0
- data/lib/drbqs/task/task.rb +139 -59
- data/lib/drbqs/task/task_generator.rb +93 -116
- data/lib/drbqs/utility/misc.rb +15 -10
- data/lib/drbqs/utility/temporary.rb +7 -2
- data/lib/drbqs/utility/transfer/transfer.rb +81 -0
- data/lib/drbqs/utility/transfer/transfer_client.rb +68 -69
- data/lib/drbqs/utility/transfer/transfer_client_connect.rb +83 -0
- data/lib/drbqs/utility/transfer/transfer_file_list.rb +40 -0
- data/spec/execute/def/execute1.rb +4 -4
- data/spec/execute/def/execute2.rb +24 -0
- data/spec/execute/process_define_spec.rb +43 -6
- data/spec/execute/register_spec.rb +403 -9
- data/spec/execute/server_define_spec.rb +1 -1
- data/spec/ext/task/command_task_spec.rb +16 -0
- data/spec/integration_test/01_basic_usage_spec.rb +1 -1
- data/spec/integration_test/02_use_generator_spec.rb +2 -2
- data/spec/integration_test/04_use_unix_domain_spec.rb +1 -1
- data/spec/integration_test/05_server_exit_signal_spec.rb +1 -1
- data/spec/integration_test/06_node_exit_after_task_spec.rb +4 -4
- data/spec/integration_test/08_shutdown_unused_nodes_spec.rb +2 -2
- data/spec/integration_test/09_server_process_data_spec.rb +1 -1
- data/spec/integration_test/definition/server01.rb +4 -5
- data/spec/integration_test/definition/server02.rb +2 -4
- data/spec/node/node_spec.rb +34 -0
- data/spec/server/message_spec.rb +1 -1
- data/spec/server/queue_spec.rb +34 -7
- data/spec/server/server_spec.rb +21 -9
- data/spec/server/transfer_setting_spec.rb +59 -24
- data/spec/setting/base_spec.rb +11 -0
- data/spec/setting/data_container_spec.rb +8 -0
- data/spec/spec_helper.rb +1 -7
- data/spec/task/registrar_spec.rb +34 -0
- data/spec/task/task_generator_spec.rb +15 -15
- data/spec/task/task_spec.rb +132 -23
- data/spec/utility/misc_spec.rb +2 -2
- data/spec/utility/transfer/transfer_client_connect_spec.rb +90 -0
- data/spec/utility/transfer/transfer_file_list_spec.rb +27 -0
- data/spec/{task/file_transfer_spec.rb → utility/transfer/transfer_spec.rb} +24 -24
- metadata +66 -45
- data/lib/drbqs/manage/execute_node.rb +0 -50
- data/lib/drbqs/server/prof.rb +0 -48
- data/lib/drbqs/task/command_task.rb +0 -43
- data/lib/drbqs/utility/transfer/file_transfer.rb +0 -73
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Mandelbrot set
|
2
|
+
|
3
|
+
Calculate Mandelbrot set and save results to directory 'result_mandelbrot'.
|
4
|
+
|
5
|
+
## Requirements
|
6
|
+
|
7
|
+
This program requires gunzip command.
|
8
|
+
|
9
|
+
## Help
|
10
|
+
|
11
|
+
drbqs-server server.rb -h
|
12
|
+
|
13
|
+
## Execute
|
14
|
+
|
15
|
+
drbqs-server server.rb --execute-node <process_number>
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'complex'
|
2
|
+
|
3
|
+
class Mandelbrot
|
4
|
+
def initialize(iterate, threshold)
|
5
|
+
@iterate = iterate
|
6
|
+
@threshold = threshold
|
7
|
+
end
|
8
|
+
|
9
|
+
def map(z, c)
|
10
|
+
z * z + c
|
11
|
+
end
|
12
|
+
|
13
|
+
def iterate_map(z, c, &block)
|
14
|
+
z_old = z
|
15
|
+
@iterate.times do |i|
|
16
|
+
z_new = map(z_old, c)
|
17
|
+
z_old = z_new
|
18
|
+
yield(z_old) if block_given?
|
19
|
+
end
|
20
|
+
z_old
|
21
|
+
end
|
22
|
+
|
23
|
+
def diverge?(c)
|
24
|
+
iterate_map(Complex(0.0, 0.0), c) do |z|
|
25
|
+
if z.abs > @threshold
|
26
|
+
return true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class CalcMandelbrot
|
34
|
+
def initialize(mandelbrot)
|
35
|
+
@mandelbrot = mandelbrot
|
36
|
+
end
|
37
|
+
|
38
|
+
def calc(io, xrange, yrange, step_size)
|
39
|
+
xrange.step(step_size) do |x|
|
40
|
+
yrange.step(step_size) do |y|
|
41
|
+
c = Complex(x, y)
|
42
|
+
unless @mandelbrot.diverge?(c)
|
43
|
+
io.puts "#{c.real}\t#{c.imag}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def calc_save(basename, *args)
|
50
|
+
file = DRbQS::Temporary.file
|
51
|
+
open(file, 'w') do |f|
|
52
|
+
calc(f, *args)
|
53
|
+
end
|
54
|
+
DRbQS::Transfer.enqueue(file, compress: true, rename: basename) # Return basename.
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative 'mandelbrot.rb'
|
2
|
+
|
3
|
+
RESULT_DIR = 'result_mandelbrot'
|
4
|
+
|
5
|
+
DRbQS.option_parser("Calculate Mandelbrot set.") do |prs, opts|
|
6
|
+
prs.on('-s NUM', '--step NUM', Float, 'Set the step size.') do |v|
|
7
|
+
opts[:step] = v
|
8
|
+
end
|
9
|
+
prs.on('-l NUM', '--limit NUM', Float, 'Set the limit to search.') do |v|
|
10
|
+
opts[:limit] = v
|
11
|
+
end
|
12
|
+
prs.on('-i NUM', '--iterate NUM', Integer, 'Set the iterate number.') do |v|
|
13
|
+
opts[:iterate] = v
|
14
|
+
end
|
15
|
+
prs.on('-t NUM', '--threshold NUM', Float, 'Set the threshold value.') do |v|
|
16
|
+
opts[:threshold] = v
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
DRbQS.define_server(file_directory: RESULT_DIR) do |server, argv, opts|
|
21
|
+
step_size = opts[:step] || 0.1
|
22
|
+
limit = opts[:limit] || 2.0
|
23
|
+
iterate = opts[:iterate] || 1000
|
24
|
+
threshold = opts[:threshold] || 5
|
25
|
+
|
26
|
+
mandelbrot = Mandelbrot.new(iterate, threshold)
|
27
|
+
calc = CalcMandelbrot.new(mandelbrot)
|
28
|
+
|
29
|
+
ranges = [[-limit..0, -limit..0, step_size], [-limit..0, 0..limit, step_size],
|
30
|
+
[0..limit, -limit..0, step_size], [0..limit, 0..limit, step_size]]
|
31
|
+
ranges.each_with_index do |ranges, i|
|
32
|
+
args_ary = ["%02d.txt" % i] + ranges
|
33
|
+
note_str = "#{ranges[0].inspect} #{ranges[1].inspect}"
|
34
|
+
task = DRbQS::Task.new(calc, :calc_save, args: args_ary, note: note_str) do |srv, result|
|
35
|
+
DRbQS::Transfer.decompress(srv, result)
|
36
|
+
end
|
37
|
+
server.queue.add(task)
|
38
|
+
end
|
39
|
+
server.add_hook(:finish) do |srv|
|
40
|
+
puts "Save results to #{RESULT_DIR}"
|
41
|
+
result_path = File.join(RESULT_DIR, "result.txt")
|
42
|
+
Dir.glob(File.join(RESULT_DIR, "*.txt")).sort.each do |path|
|
43
|
+
open(result_path, 'a+') do |out|
|
44
|
+
out.print File.read(path)
|
45
|
+
end
|
46
|
+
FileUtils.rm(path)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/example/server/server.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
|
-
|
2
|
-
task_generator
|
1
|
+
server = DRbQS::Server.new(:port => 13501)
|
2
|
+
server.task_generator do |reg|
|
3
3
|
5.times do |i|
|
4
|
-
|
4
|
+
reg.create_add(i, :to_s)
|
5
5
|
end
|
6
6
|
end
|
7
|
-
|
8
|
-
server = DRbQS::Server.new(:port => 13501, :finish_exit => true)
|
9
|
-
server.add_task_generator(task_generator)
|
10
7
|
server.set_initialization_task(DRbQS::Task.new(Kernel, :puts, ['hook: initialize']))
|
11
8
|
server.set_finalization_task(DRbQS::Task.new(Kernel, :puts, ['hook: finalize']))
|
12
9
|
server.set_signal_trap
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Simple example
|
2
|
+
|
3
|
+
Creating one task that calculates sum of three numbers
|
4
|
+
and outputing the result.
|
5
|
+
|
6
|
+
## drbqs-server and drbqs-node
|
7
|
+
|
8
|
+
On first terminal,
|
9
|
+
|
10
|
+
drbqs-server server.rb
|
11
|
+
|
12
|
+
and then on second terminal
|
13
|
+
|
14
|
+
drbqs-node druby://:13500 -l task.rb
|
15
|
+
|
16
|
+
## drbqs-execute
|
17
|
+
|
18
|
+
drbqs-execute execute.rb
|
data/example/sum/server_def.rb
CHANGED
@@ -17,7 +17,7 @@ DRbQS.define_server(:check_alive => 5) do |server, argv, opts|
|
|
17
17
|
end_num = (argv[1] || 50).to_i
|
18
18
|
step_num = opts[:step] || 10
|
19
19
|
start_num.step(end_num, step_num) do |i|
|
20
|
-
task = DRbQS::Task.new(Sum.new(i - 10, i), :exec) do |srv, ret|
|
20
|
+
task = DRbQS::Task.new(Sum.new(i - 10, i), :exec, [], "#{i-10} to #{i}") do |srv, ret|
|
21
21
|
puts "Receive: #{ret.inspect}"
|
22
22
|
end
|
23
23
|
server.queue.add(task)
|
data/example/sum2/execute_def.rb
CHANGED
@@ -2,26 +2,39 @@ default :server => :server_local, :port => 13789, :log => '/tmp/drbqs_execute'
|
|
2
2
|
|
3
3
|
usage :message => "Calculate sum of numbers", :server => File.join(File.dirname(__FILE__), 'server_def.rb')
|
4
4
|
|
5
|
-
|
5
|
+
server :server_template, :template => true do |server, ssh|
|
6
|
+
server.load 'server_def.rb'
|
7
|
+
end
|
8
|
+
|
9
|
+
server :server_local, "localhost" do |server|
|
6
10
|
server.load File.expand_path(File.join(File.dirname(__FILE__), 'server_def.rb'))
|
7
11
|
end
|
8
12
|
|
9
|
-
|
10
|
-
|
11
|
-
|
13
|
+
ssh_localhost = "#{ENV['USER']}@localhost"
|
14
|
+
current_dir = File.expand_path(File.dirname(__FILE__))
|
15
|
+
|
16
|
+
server :server_ssh, "localhost" do |server, ssh|
|
17
|
+
ssh.connect ssh_localhost
|
18
|
+
ssh.directory current_dir
|
12
19
|
ssh.output "/tmp/drbqs_ssh/server"
|
13
20
|
server.load 'server_def.rb'
|
14
21
|
end
|
15
22
|
|
16
|
-
|
23
|
+
node :node_template, template: true do |node|
|
24
|
+
node.load 'sum.rb'
|
25
|
+
end
|
26
|
+
|
27
|
+
node :node_local do |node|
|
17
28
|
node.load File.expand_path(File.join(File.dirname(__FILE__), 'sum.rb'))
|
18
29
|
node.process 2
|
19
30
|
end
|
20
31
|
|
21
|
-
|
22
|
-
ssh.connect
|
23
|
-
ssh.directory
|
32
|
+
node :node_ssh do |node, ssh|
|
33
|
+
ssh.connect ssh_localhost
|
34
|
+
ssh.directory current_dir
|
24
35
|
ssh.output "/tmp/drbqs_ssh/node"
|
25
36
|
node.load 'sum.rb'
|
26
37
|
node.process 2
|
27
38
|
end
|
39
|
+
|
40
|
+
node :node_group, :group => [:node_local, :node_ssh]
|
data/example/sum2/server_def.rb
CHANGED
@@ -12,13 +12,14 @@ DRbQS.option_parser do |opt, hash|
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
DRbQS.define_server
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
DRbQS.define_server do |server, argv, opts|
|
16
|
+
start_num = (argv[0] || 10).to_i,
|
17
|
+
end_num = (argv[1] || 100).to_i,
|
18
|
+
step_num = opts[:step] || 10
|
19
|
+
|
20
|
+
server.task_generator do |reg|
|
21
|
+
start_num.step(end_num, step_num) do |i|
|
22
|
+
reg.create_add(Sum.new(i - 10, i), :exec) do |srv, ret|
|
22
23
|
puts "Receive: #{ret.inspect}"
|
23
24
|
end
|
24
25
|
end
|
data/example/transfer/file.rb
CHANGED
@@ -10,13 +10,15 @@ class CreateFile
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def create
|
13
|
-
|
14
|
-
|
13
|
+
path = output_to_file
|
14
|
+
DRbQS::Transfer.enqueue(path)
|
15
|
+
File.basename(path)
|
15
16
|
end
|
16
17
|
|
17
18
|
def create_compress
|
18
|
-
|
19
|
-
|
19
|
+
path = output_to_file
|
20
|
+
DRbQS::Transfer.compress_enqueue(path)
|
21
|
+
File.basename(path)
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
@@ -33,12 +35,44 @@ class CreateDirectory
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def create
|
36
|
-
|
37
|
-
|
38
|
+
dir = output_to_directory
|
39
|
+
DRbQS::Transfer.enqueue(dir)
|
40
|
+
File.basename(dir)
|
38
41
|
end
|
39
42
|
|
40
43
|
def create_compress
|
41
|
-
|
42
|
-
|
44
|
+
dir = output_to_directory
|
45
|
+
DRbQS::Transfer.compress_enqueue(dir)
|
46
|
+
File.basename(dir)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class ReceiveFile
|
51
|
+
def initialize(file_list)
|
52
|
+
@file_list = file_list
|
53
|
+
end
|
54
|
+
|
55
|
+
def read_file
|
56
|
+
ret = ''
|
57
|
+
@file_list.path.each do |path|
|
58
|
+
if File.directory?(path)
|
59
|
+
raise "Receive directory, not file."
|
60
|
+
end
|
61
|
+
ret << path << "\t" << File.read(path).strip << "\n"
|
62
|
+
end
|
63
|
+
ret
|
64
|
+
end
|
65
|
+
|
66
|
+
def read_directory
|
67
|
+
ret = ''
|
68
|
+
@file_list.path.each do |dir|
|
69
|
+
unless File.directory?(dir)
|
70
|
+
raise "Receive file, not directory."
|
71
|
+
end
|
72
|
+
Dir.glob("#{dir}/**/*.txt").each do |path|
|
73
|
+
ret << path << "\t" << File.read(path).strip << "\n"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
ret
|
43
77
|
end
|
44
78
|
end
|
@@ -5,15 +5,49 @@
|
|
5
5
|
|
6
6
|
require_relative 'file.rb'
|
7
7
|
|
8
|
-
DRbQS.define_server
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
DRbQS.define_server do |server, argv, opts|
|
9
|
+
server_directory = '/tmp/drbqs_transfer_test/'
|
10
|
+
FileUtils.rm_r(server_directory) if File.exist?(server_directory)
|
11
|
+
server_directory2 = '/tmp/drbqs_transfer_test2/'
|
12
|
+
FileUtils.rm_r(server_directory2) if File.exist?(server_directory2)
|
13
|
+
FileUtils.mkdir_p(server_directory2)
|
14
|
+
test_file = File.join(server_directory2, 'file1.txt')
|
15
|
+
open(test_file, 'w') do |f|
|
16
|
+
f.puts 'ABC'
|
17
|
+
end
|
18
|
+
test_dir = File.join(server_directory2, 'test_dir')
|
19
|
+
test_dir2 = File.join(test_dir, 'abc', 'def')
|
20
|
+
FileUtils.mkdir_p(test_dir2)
|
21
|
+
open(File.join(test_dir2, 'file2.txt'), 'w') do |f|
|
22
|
+
f.puts 'hello'
|
23
|
+
end
|
24
|
+
open(File.join(test_dir2, 'file3.txt'), 'w') do |f|
|
25
|
+
f.puts 'world'
|
15
26
|
end
|
16
|
-
server.add_task_generator(tgen)
|
17
27
|
|
18
|
-
server.
|
28
|
+
server.task_generator do |reg|
|
29
|
+
create_add(CreateFile.new(1), :create) do |srv, result|
|
30
|
+
path = File.join(server_directory, result)
|
31
|
+
puts "#{path} exist? #{File.exist?(path).inspect}"
|
32
|
+
end
|
33
|
+
create_add(CreateFile.new(2), :create_compress) do |srv, result|
|
34
|
+
path = File.join(server_directory, result + '.gz')
|
35
|
+
puts "#{path} exist? #{File.exist?(path).inspect}"
|
36
|
+
end
|
37
|
+
create_add(CreateDirectory.new(3), :create) do |srv, result|
|
38
|
+
path = File.join(server_directory, result)
|
39
|
+
puts "#{path} exist? #{File.exist?(path).inspect}"
|
40
|
+
end
|
41
|
+
create_add(CreateDirectory.new(4), :create_compress) do |srv, result|
|
42
|
+
path = File.join(server_directory, result + '.tar.gz')
|
43
|
+
puts "#{path} exist? #{File.exist?(path).inspect}"
|
44
|
+
end
|
45
|
+
create_add(ReceiveFile.new(DRbQS::Transfer::FileList.new(test_file)), :read_file) do |srv, result|
|
46
|
+
puts result
|
47
|
+
end
|
48
|
+
create_add(ReceiveFile.new(DRbQS::Transfer::FileList.new(test_dir)), :read_directory) do |srv, result|
|
49
|
+
puts result
|
50
|
+
end
|
51
|
+
end
|
52
|
+
server.set_file_transfer(server_directory)
|
19
53
|
end
|
data/lib/drbqs.rb
CHANGED
@@ -15,9 +15,9 @@ HELP
|
|
15
15
|
def parse_option(argv)
|
16
16
|
args, server_args = split_arguments(argv)
|
17
17
|
args = option_parser_base(args) do
|
18
|
-
set(:port, '--port NUM', Integer, 'Set the port number.')
|
19
|
-
set(:server, '--server STR', String, 'Set the key of server.')
|
20
|
-
set(:node, '--node STR', String, 'Set the comma sparated key of nodes.')
|
18
|
+
set(:port, '-p NUM', '--port NUM', Integer, 'Set the port number.')
|
19
|
+
set(:server, '-s STR', '--server STR', String, 'Set the key of server.')
|
20
|
+
set(:node, '-n STR', '--node STR', String, 'Set the comma sparated key of nodes.')
|
21
21
|
set(:no_server, '--no-server', 'Not execute server.')
|
22
22
|
set(:no_node, '--no-node', 'Not execute node.')
|
23
23
|
set(:information, '-i', '--information', 'Show information.')
|