fairy 0.6.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.
Files changed (186) hide show
  1. data/LICENSE +674 -0
  2. data/Makefile +116 -0
  3. data/README +15 -0
  4. data/bin/fairy +582 -0
  5. data/bin/fairy-cat +74 -0
  6. data/bin/fairy-cp +128 -0
  7. data/bin/fairy-rm +122 -0
  8. data/bin/subcmd/controller +41 -0
  9. data/bin/subcmd/inspector +81 -0
  10. data/bin/subcmd/master +43 -0
  11. data/bin/subcmd/node +47 -0
  12. data/bin/subcmd/processor +54 -0
  13. data/doc/programming-interface.html +240 -0
  14. data/doc/programming-interface.rd +300 -0
  15. data/etc/fairy.conf.tmpl +118 -0
  16. data/ext/simple_hash/extconf.rb +4 -0
  17. data/ext/simple_hash/simple_hash.c +42 -0
  18. data/fairy.gemspec +60 -0
  19. data/lib/fairy/client/addins.rb +20 -0
  20. data/lib/fairy/client/barrier.rb +29 -0
  21. data/lib/fairy/client/basic-group-by.rb +52 -0
  22. data/lib/fairy/client/cat.rb +41 -0
  23. data/lib/fairy/client/direct-product.rb +51 -0
  24. data/lib/fairy/client/equijoin.rb +79 -0
  25. data/lib/fairy/client/exec.rb +54 -0
  26. data/lib/fairy/client/filter.rb +62 -0
  27. data/lib/fairy/client/find.rb +35 -0
  28. data/lib/fairy/client/group-by.rb +194 -0
  29. data/lib/fairy/client/here.rb +84 -0
  30. data/lib/fairy/client/inject.rb +70 -0
  31. data/lib/fairy/client/input-file.rb +53 -0
  32. data/lib/fairy/client/input-iota.rb +49 -0
  33. data/lib/fairy/client/input-local-file.rb +188 -0
  34. data/lib/fairy/client/input-varray.rb +30 -0
  35. data/lib/fairy/client/input.rb +42 -0
  36. data/lib/fairy/client/io-filter.rb +26 -0
  37. data/lib/fairy/client/junction.rb +31 -0
  38. data/lib/fairy/client/map.rb +34 -0
  39. data/lib/fairy/client/merge-group-by.rb +71 -0
  40. data/lib/fairy/client/output-file.rb +64 -0
  41. data/lib/fairy/client/output-local-file.rb +60 -0
  42. data/lib/fairy/client/output-null.rb +47 -0
  43. data/lib/fairy/client/output-varray.rb +50 -0
  44. data/lib/fairy/client/output.rb +29 -0
  45. data/lib/fairy/client/roma-put.rb +62 -0
  46. data/lib/fairy/client/roma.rb +156 -0
  47. data/lib/fairy/client/seg-join.rb +61 -0
  48. data/lib/fairy/client/seg-map.rb +78 -0
  49. data/lib/fairy/client/seg-shuffle.rb +35 -0
  50. data/lib/fairy/client/seg-split.rb +27 -0
  51. data/lib/fairy/client/seg-zip.rb +60 -0
  52. data/lib/fairy/client/select.rb +38 -0
  53. data/lib/fairy/client/sort.rb +48 -0
  54. data/lib/fairy/client/sort18.rb +56 -0
  55. data/lib/fairy/client/sort19.rb +61 -0
  56. data/lib/fairy/client/there.rb +47 -0
  57. data/lib/fairy/client/top_n_into_roma.rb +34 -0
  58. data/lib/fairy/client/wc.rb +92 -0
  59. data/lib/fairy/controller.rb +1103 -0
  60. data/lib/fairy/logger.rb +107 -0
  61. data/lib/fairy/master/addins.rb +20 -0
  62. data/lib/fairy/master/atom.rb +17 -0
  63. data/lib/fairy/master/c-barrier.rb +283 -0
  64. data/lib/fairy/master/c-basic-group-by.rb +250 -0
  65. data/lib/fairy/master/c-cat.rb +159 -0
  66. data/lib/fairy/master/c-direct-product.rb +203 -0
  67. data/lib/fairy/master/c-exec.rb +68 -0
  68. data/lib/fairy/master/c-filter.rb +422 -0
  69. data/lib/fairy/master/c-find.rb +138 -0
  70. data/lib/fairy/master/c-group-by.rb +64 -0
  71. data/lib/fairy/master/c-here.rb +80 -0
  72. data/lib/fairy/master/c-inject.rb +119 -0
  73. data/lib/fairy/master/c-input-file.rb +46 -0
  74. data/lib/fairy/master/c-input-iota.rb +66 -0
  75. data/lib/fairy/master/c-input-local-file.rb +117 -0
  76. data/lib/fairy/master/c-input-varray.rb +53 -0
  77. data/lib/fairy/master/c-input.rb +24 -0
  78. data/lib/fairy/master/c-inputtable.rb +31 -0
  79. data/lib/fairy/master/c-inputtable18.rb +36 -0
  80. data/lib/fairy/master/c-inputtable19.rb +35 -0
  81. data/lib/fairy/master/c-io-filter.rb +28 -0
  82. data/lib/fairy/master/c-junction.rb +54 -0
  83. data/lib/fairy/master/c-map.rb +27 -0
  84. data/lib/fairy/master/c-merge-group-by.rb +241 -0
  85. data/lib/fairy/master/c-output-file.rb +84 -0
  86. data/lib/fairy/master/c-output-local-file.rb +19 -0
  87. data/lib/fairy/master/c-output-null.rb +45 -0
  88. data/lib/fairy/master/c-output-varray.rb +57 -0
  89. data/lib/fairy/master/c-output.rb +20 -0
  90. data/lib/fairy/master/c-seg-join.rb +141 -0
  91. data/lib/fairy/master/c-seg-map.rb +26 -0
  92. data/lib/fairy/master/c-seg-shuffle.rb +87 -0
  93. data/lib/fairy/master/c-seg-split.rb +110 -0
  94. data/lib/fairy/master/c-seg-zip.rb +132 -0
  95. data/lib/fairy/master/c-select.rb +27 -0
  96. data/lib/fairy/master/c-sort.rb +108 -0
  97. data/lib/fairy/master/c-there.rb +57 -0
  98. data/lib/fairy/master/c-wc.rb +232 -0
  99. data/lib/fairy/master/job-interpriter.rb +19 -0
  100. data/lib/fairy/master/scheduler.rb +24 -0
  101. data/lib/fairy/master.rb +329 -0
  102. data/lib/fairy/node/addins.rb +19 -0
  103. data/lib/fairy/node/p-barrier.rb +95 -0
  104. data/lib/fairy/node/p-basic-group-by.rb +252 -0
  105. data/lib/fairy/node/p-direct-product.rb +153 -0
  106. data/lib/fairy/node/p-exec.rb +30 -0
  107. data/lib/fairy/node/p-filter.rb +363 -0
  108. data/lib/fairy/node/p-find.rb +111 -0
  109. data/lib/fairy/node/p-group-by.rb +1534 -0
  110. data/lib/fairy/node/p-here.rb +21 -0
  111. data/lib/fairy/node/p-identity.rb +24 -0
  112. data/lib/fairy/node/p-inject.rb +127 -0
  113. data/lib/fairy/node/p-input-file.rb +108 -0
  114. data/lib/fairy/node/p-input-iota.rb +39 -0
  115. data/lib/fairy/node/p-input-local-file.rb +61 -0
  116. data/lib/fairy/node/p-input-varray.rb +26 -0
  117. data/lib/fairy/node/p-io-filter.rb +28 -0
  118. data/lib/fairy/node/p-map.rb +40 -0
  119. data/lib/fairy/node/p-merger-group-by.rb +48 -0
  120. data/lib/fairy/node/p-output-file.rb +104 -0
  121. data/lib/fairy/node/p-output-local-file.rb +14 -0
  122. data/lib/fairy/node/p-output-null.rb +32 -0
  123. data/lib/fairy/node/p-output-varray.rb +41 -0
  124. data/lib/fairy/node/p-seg-join.rb +82 -0
  125. data/lib/fairy/node/p-seg-map.rb +34 -0
  126. data/lib/fairy/node/p-seg-split.rb +61 -0
  127. data/lib/fairy/node/p-seg-zip.rb +79 -0
  128. data/lib/fairy/node/p-select.rb +40 -0
  129. data/lib/fairy/node/p-single-exportable.rb +90 -0
  130. data/lib/fairy/node/p-sort.rb +195 -0
  131. data/lib/fairy/node/p-task.rb +113 -0
  132. data/lib/fairy/node/p-there.rb +44 -0
  133. data/lib/fairy/node/p-wc.rb +266 -0
  134. data/lib/fairy/node.rb +187 -0
  135. data/lib/fairy/processor.rb +510 -0
  136. data/lib/fairy/share/base-app.rb +114 -0
  137. data/lib/fairy/share/block-source.rb +234 -0
  138. data/lib/fairy/share/conf.rb +396 -0
  139. data/lib/fairy/share/debug.rb +21 -0
  140. data/lib/fairy/share/encoding.rb +17 -0
  141. data/lib/fairy/share/fast-tempfile.rb +93 -0
  142. data/lib/fairy/share/file-place.rb +176 -0
  143. data/lib/fairy/share/hash-1.rb +20 -0
  144. data/lib/fairy/share/hash-md5.rb +28 -0
  145. data/lib/fairy/share/hash-murmur.rb +69 -0
  146. data/lib/fairy/share/hash-rb18.rb +20 -0
  147. data/lib/fairy/share/hash-simple-hash.rb +28 -0
  148. data/lib/fairy/share/inspector.rb +16 -0
  149. data/lib/fairy/share/lc/exceptions.rb +82 -0
  150. data/lib/fairy/share/lc/ja/exceptions.rb +81 -0
  151. data/lib/fairy/share/locale.rb +17 -0
  152. data/lib/fairy/share/log.rb +215 -0
  153. data/lib/fairy/share/pool-dictionary.rb +53 -0
  154. data/lib/fairy/share/port-marshaled-queue.rb +347 -0
  155. data/lib/fairy/share/port.rb +1697 -0
  156. data/lib/fairy/share/reference.rb +45 -0
  157. data/lib/fairy/share/stdout.rb +56 -0
  158. data/lib/fairy/share/tr.rb +16 -0
  159. data/lib/fairy/share/varray.rb +147 -0
  160. data/lib/fairy/share/vfile.rb +183 -0
  161. data/lib/fairy/version.rb +8 -0
  162. data/lib/fairy.rb +206 -0
  163. data/sample/grep.rb +46 -0
  164. data/sample/ping.rb +19 -0
  165. data/sample/sort.rb +102 -0
  166. data/sample/wordcount.rb +61 -0
  167. data/spec/README +12 -0
  168. data/spec/fairy1_spec.rb +31 -0
  169. data/spec/fairy2_spec.rb +42 -0
  170. data/spec/fairy3_spec.rb +126 -0
  171. data/spec/fairy4_spec.rb +63 -0
  172. data/spec/fairy5_spec.rb +45 -0
  173. data/spec/fairy6_spec.rb +52 -0
  174. data/spec/fairy7_spec.rb +58 -0
  175. data/spec/fairy8_spec.rb +48 -0
  176. data/spec/mkdat.rb +148 -0
  177. data/spec/run_all.sh +65 -0
  178. data/test/testc.rb +7111 -0
  179. data/tools/cap_recipe/Capfile +144 -0
  180. data/tools/cap_recipe/cluster.yml.sample +14 -0
  181. data/tools/fairy_perf_graph.rb +444 -0
  182. data/tools/git-tag +44 -0
  183. data/tools/log-analysis.rb +62 -0
  184. data/tools/svn-ls-diff +38 -0
  185. data/tools/svn-tags +37 -0
  186. metadata +298 -0
@@ -0,0 +1,114 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ module Fairy
7
+ class BaseAPP
8
+
9
+ def self.start
10
+ @@APP = new
11
+ @@APP.parse_arg
12
+ @@APP.load_conf
13
+ @@APP.configure_conf
14
+ @@APP.start
15
+ end
16
+
17
+ def self.start_subcommand(prog, *opts)
18
+ @@APP.start_subcommand(prog, *opts)
19
+ end
20
+ def self.start_subcommand2(prog, *opts)
21
+ Process.fork do
22
+ start_subcommand(prog, *opts)
23
+ end
24
+ end
25
+
26
+ def initialize
27
+ @home = nil
28
+ @conf = nil
29
+ @CONF = {}
30
+ end
31
+
32
+ def parse_arg
33
+ @opt = option_parser
34
+ @opt.order!(ARGV)
35
+ end
36
+
37
+ def option_parser
38
+ opt = OptionParser.new{|opt|
39
+ opt.on("--home=VAL"){|val| @home = val}
40
+ opt.on("--conf=VAL"){|val| @conf = val}
41
+ CONF.props.each do |prop|
42
+ opt.on("--CONF.#{prop}=VAL") {|val| @CONF[prop] = val}
43
+ end
44
+ }
45
+ if block_given?
46
+ yield opt
47
+ end
48
+ end
49
+
50
+ def conf_to_arg
51
+ @CONF.collect{|prop, source| "--CONF.#{prop}=#{source}"}
52
+ end
53
+
54
+ def load_conf
55
+ if @home
56
+ ENV["FAIRY_HOME"] = @home
57
+ # ENV["FAIRY_HOME"] = File.expand_path(@home)
58
+ conf = @home+"/etc/fairy.conf"
59
+ if File.exists?(conf)
60
+ CONF.load_conf conf
61
+ end
62
+ end
63
+
64
+ if @conf
65
+ ENV["FAIRY_CONF"] = @conf
66
+ CONF.load_conf @conf
67
+ end
68
+
69
+ @CONF.each do |key, value|
70
+ begin
71
+ eval "CONF.#{key}=#{value}"
72
+ rescue
73
+ puts "CONF.#{key}=#{value} が不正です."
74
+ exit 1
75
+ end
76
+ end
77
+ if ENV["RUBYLIB"]
78
+ ENV["RUBYLIB"] = CONF.LIB + ":" + ENV["RUBYLIB"]
79
+ else
80
+ ENV["RUBYLIB"] = CONF.LIB
81
+ end
82
+ end
83
+
84
+ def configure_conf
85
+ Conf.configure_common_conf
86
+ end
87
+
88
+ def start
89
+ ERR::Raise ERR::INTERNAL::ShouldDefineSubclass
90
+ end
91
+
92
+ def start_subcommand(prog, *opts)
93
+ opts.push *conf_to_arg
94
+ # Process.fork do
95
+ # Log.stop_export
96
+ # ObjectSpace.each_object(IO) do |io|
97
+ # begin
98
+ # if ![0, 1, 2].include?(io.fileno )
99
+ # io.close
100
+ # end
101
+ # rescue
102
+ # end
103
+ # end
104
+ # exec(prog, *opts)
105
+ # end
106
+
107
+ Process.spawn(prog, *opts)
108
+ # system("#{prog} #{opts.join(' ')}&")
109
+
110
+ end
111
+
112
+ end
113
+ end
114
+
@@ -0,0 +1,234 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ module Fairy
7
+ class BlockSource
8
+ def initialize(source)
9
+ @source = source
10
+ @backtrace = caller(1).select{|l| /fairy.*(share|job)/ !~ l}
11
+ l = caller(1)[caller(1).index(backtrace.first)-1]
12
+ #Log::debug_p(l)
13
+ @caller_method = (/in `(.*)'/.match(l))[1]
14
+ #Log::debug_p(@caller_method)
15
+ end
16
+
17
+ attr_reader :source
18
+ attr_reader :backtrace
19
+ attr_reader :caller_method
20
+ end
21
+
22
+ class BScript
23
+ def initialize(block_source, context, exception_handler)
24
+ @block_source = block_source.dc_deep_copy
25
+ @context = context
26
+ @exception_handler = exception_handler
27
+ end
28
+
29
+ def evaluate
30
+ match = /^(.*):([0-9]+)/.match(@block_source.backtrace.first)
31
+
32
+ begin
33
+ $stdout.replace_stdout do
34
+ eval(@block_source.source, @context.bind, match[1], match[2].to_i)
35
+ end
36
+ rescue Exception
37
+ Log::warn(self) do |sio|
38
+ sio.puts "Warn: Exception raised:"
39
+ sio.puts $!
40
+ for l in $@
41
+ sio.puts "\t#{l}"
42
+ end
43
+ end
44
+ bt = $!.backtrace
45
+ bt = bt.select{|l| /fairy.*(share|job|backend|node|processor|controller)|deep-connect|__FORWARDABLE__|bin.*processor/ !~ l} unless CONF.DEBUG_FULL_BACKTRACE
46
+ if bt.first
47
+ bt.first.sub!("bind", @block_source.caller_method)
48
+ end
49
+ bt.push *@block_source.backtrace.dc_deep_copy
50
+ $!.set_backtrace(bt)
51
+ @exception_handler.handle_exception($!)
52
+ end
53
+ end
54
+ end
55
+ BSource = BScript
56
+
57
+ class BBlock
58
+ def initialize(block_source, context, exception_handler)
59
+ @block_source = block_source.dc_deep_copy
60
+ @context = context
61
+ @exception_handler = exception_handler
62
+
63
+ match = /^(.*):([0-9]+)/.match(@block_source.backtrace.first)
64
+ begin
65
+ @block = eval("proc{#{@block_source.source}}", context.binding, match[1], match[2].to_i)
66
+ rescue ScriptError
67
+ Log::warn(self) do |sio|
68
+ sio.puts "Warn: Exception raised:"
69
+ sio.puts $!
70
+ for l in $@
71
+ sio.puts "\t#{l}"
72
+ end
73
+ end
74
+ bt = @block_source.backtrace.dc_deep_copy
75
+ $!.set_backtrace(bt)
76
+ @exception_handler.handle_exception($!)
77
+ # ここの処理がイマイチ
78
+ end
79
+ end
80
+
81
+ def yield19(*args)
82
+ begin
83
+ $stdout.replace_stdout do
84
+ @block.yield(*args)
85
+ end
86
+
87
+ rescue LocalJumpError,
88
+ @context.class::GlobalBreak,
89
+ @context.class::GlobalBreakFromOther
90
+ Log::debug(self, "CAUGHT GlobalBreak")
91
+ raise
92
+
93
+ rescue
94
+ if @context.IGNORE_EXCEPTION
95
+ Log::warn(self, "IGNORE_EXCEPTON!!")
96
+ Log::warn(self, "Block Parameters: #{args.inspect}")
97
+ end
98
+ Log::warn(self) do |sio|
99
+ sio.puts "Warn: Exception raised:"
100
+ sio.puts $!
101
+ for l in $@
102
+ sio.puts "\t#{l}"
103
+ end
104
+ end
105
+
106
+ if @context.IGNORE_EXCEPTION
107
+ return Import::TOKEN_NULLVALUE
108
+ else
109
+ bt = $!.backtrace
110
+ bt = bt.select{|l| /fairy.*(share|job|backend|node|processor|controller)|deep-connect|__FORWARDABLE__|bin.*processor/ !~ l} unless CONF.DEBUG_FULL_BACKTRACE
111
+ bt.first.sub!("bind", @block_source.caller_method)
112
+ bt.push *@block_source.backtrace.dc_deep_copy
113
+ $!.set_backtrace(bt)
114
+
115
+ @exception_handler.handle_exception($!)
116
+ end
117
+
118
+ rescue Exception
119
+ Log::warn(self) do |sio|
120
+ sio.puts "Warn: Exception raised:"
121
+ sio.puts $!
122
+ for l in $@
123
+ sio.puts "\t#{l}"
124
+ end
125
+ end
126
+ bt = $!.backtrace
127
+ bt = bt.select{|l| /fairy.*(share|job|backend|node|processor|controller)|deep-connect|__FORWARDABLE__|bin.*processor/ !~ l} unless CONF.DEBUG_FULL_BACKTRACE
128
+ bt.first.sub!("bind", @block_source.caller_method)
129
+ bt.push *@block_source.backtrace.dc_deep_copy
130
+ $!.set_backtrace(bt)
131
+
132
+ @exception_handler.handle_exception($!)
133
+ end
134
+ end
135
+
136
+ def yield19_no_use_stdout(*args)
137
+ begin
138
+
139
+ @block.yield(*args)
140
+
141
+ rescue LocalJumpError,
142
+ @context.class::GlobalBreak,
143
+ @context.class::GlobalBreakFromOther
144
+ Log::debug(self, "CAUGHT GlobalBreak")
145
+ raise
146
+ # @exception_handler.global_break
147
+
148
+ rescue
149
+ if @context.IGNORE_EXCEPTION
150
+ Log::warn(self, "IGNORE_EXCEPTON!!")
151
+ Log::warn(self, "Block Parameters: #{args.inspect}")
152
+ end
153
+ Log::warn(self) do |sio|
154
+ sio.puts "Warn: Exception raised:"
155
+ sio.puts $!
156
+ for l in $@
157
+ sio.puts "\t#{l}"
158
+ end
159
+ end
160
+
161
+ if @context.IGNORE_EXCEPTION
162
+ return Import::TOKEN_NULLVALUE
163
+ else
164
+ bt = $!.backtrace
165
+ bt = bt.select{|l| /fairy.*(share|job|backend|node|processor|controller)|deep-connect|__FORWARDABLE__|bin.*processor/ !~ l} unless CONF.DEBUG_FULL_BACKTRACE
166
+ bt.first.sub!("bind", @block_source.caller_method)
167
+ bt.push *@block_source.backtrace.dc_deep_copy
168
+ $!.set_backtrace(bt)
169
+
170
+ @exception_handler.handle_exception($!)
171
+ end
172
+
173
+ rescue Exception
174
+ Log::warn(self) do |sio|
175
+ sio.puts "Warn: Exception raised:"
176
+ sio.puts $!
177
+ for l in $@
178
+ sio.puts "\t#{l}"
179
+ end
180
+ end
181
+ bt = $!.backtrace
182
+ bt = bt.select{|l| /fairy.*(share|job|backend|node|processor|controller)|deep-connect|__FORWARDABLE__|bin.*processor/ !~ l} unless CONF.DEBUG_FULL_BACKTRACE
183
+ bt.first.sub!("bind", @block_source.caller_method)
184
+ bt.push *@block_source.backtrace.dc_deep_copy
185
+ $!.set_backtrace(bt)
186
+
187
+ @exception_handler.handle_exception($!)
188
+ end
189
+ end
190
+
191
+ def yield18(*args)
192
+ begin
193
+ if args.size == 1 && args.first.kind_of?(Array)
194
+ args = args.first.to_a
195
+ end
196
+ $stdout.replace_stdout do
197
+ @block.call(*args)
198
+ end
199
+
200
+ rescue LocalJumpError, @context.class::GlobalBreak
201
+ Log::debug(self, "CAUGHT GlobalBreak")
202
+ @exception_handler.global_break
203
+
204
+ rescue Exception
205
+ Log::warn(self) do |sio|
206
+ sio.puts "Warn: Exception raised:"
207
+ sio.puts $!
208
+ for l in $@
209
+ sio.puts "\t#{l}"
210
+ end
211
+ end
212
+ bt = $!.backtrace
213
+ bt = bt.select{|l| /fairy.*(share|job|backend|node|processor|controller)|deep-connect|__FORWARDABLE__|bin.*processor/ !~ l} unless CONF.DEBUG_FULL_BACKTRACE
214
+ bt.first.sub!("bind", @block_source.caller_method)
215
+ bt.push *@block_source.backtrace.dc_deep_copy
216
+ $!.set_backtrace(bt)
217
+
218
+ @exception_handler.handle_exception($!)
219
+ end
220
+ end
221
+
222
+ if proc{}.respond_to?(:yield)
223
+ if CONF.BLOCK_USE_STDOUT
224
+ alias yield yield19
225
+ else
226
+ alias yield yield19_no_use_stdout
227
+ end
228
+ else
229
+ alias yield yield18
230
+ end
231
+ alias call yield
232
+ end
233
+ end
234
+
@@ -0,0 +1,396 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "socket"
7
+ require "rbconfig"
8
+
9
+ module Fairy
10
+
11
+ CONF_PATH = [
12
+ "/etc/fairy.conf",
13
+ RbConfig::CONFIG["libdir"]+"/fairy/etc/fairy.conf",
14
+ ENV["FAIRY_HOME"] && ENV["FAIRY_HOME"]+"/etc/fairy.conf",
15
+ ENV["HOME"]+"/.fairyrc",
16
+ ENV["FAIRY_CONF"]
17
+ ]
18
+ # $:.each{|p|
19
+ # CONF_PATH.push p+"/fairy/etc/fairy.conf"
20
+ # }
21
+
22
+ class Conf
23
+ PROPS = []
24
+ class DefaultConf<Conf;end
25
+
26
+ def initialize(super_conf = nil, opts = {})
27
+ @super_conf = super_conf
28
+ @values = opts
29
+ end
30
+
31
+ class<<Conf
32
+ def def_prop(prop, reader = nil, setter = nil)
33
+ PROPS.push prop
34
+ reader = "def #{prop}; value(:#{prop}); end" unless reader
35
+ setter = "def #{prop}=(value); @values[:#{prop}] = value; end" unless setter
36
+ module_eval reader
37
+ module_eval setter
38
+ # DefaultConf.module_eval reader
39
+ end
40
+
41
+ def def_prop_relative_path(prop, path, base_prop = :HOME)
42
+ def_prop(prop,
43
+ "def #{prop}; value(:#{prop}) || self.#{base_prop}+'/'+'#{path}'; end")
44
+ end
45
+ alias def_rpath def_prop_relative_path
46
+ end
47
+
48
+ def value(prop)
49
+ if (v = @values[prop]).nil?
50
+ @super_conf && v = @super_conf.value(prop)
51
+ end
52
+ v
53
+ end
54
+
55
+ def props
56
+ PROPS
57
+ end
58
+
59
+ def base_conf=(conf)
60
+ if @super_conf
61
+ @super_conf.base_conf = conf
62
+ else
63
+ @super_conf = conf
64
+ end
65
+ end
66
+
67
+ def set_values(hash)
68
+ for key, value in hash
69
+ @values[key] = value
70
+ end
71
+ end
72
+
73
+ def_prop :RUBY_BIN
74
+ def_prop :MASTER_HOST
75
+ def_prop :MASTER_PORT
76
+
77
+ def_prop :HOME
78
+ def HOME
79
+ File.expand_path(value(:HOME))
80
+ end
81
+
82
+ def_rpath :BIN, "bin"
83
+ def_rpath :LIB, "lib"
84
+ def_rpath :SUBCMD, "subcmd", :BIN
85
+ def_rpath :CONTROLLER_BIN, "controller", :SUBCMD
86
+ def_rpath :PROCESSOR_BIN, "processor", :SUBCMD
87
+
88
+ def_prop :DEFAULT_EXTERNAL
89
+ def_prop :DEFAULT_INTERNAL
90
+
91
+ def_prop :IGNORE_EXCEPTION_ON_FILTER
92
+
93
+ def_prop :MASTER_MAX_ACTIVE_PROCESSORS
94
+
95
+ def_prop :CONTROLLER_INPUT_PROCESSOR_N
96
+ def_prop :CONTROLLER_MAX_ACTIVE_TASKS_IN_PROCESSOR
97
+
98
+ def_prop :CONTROLLER_ASSIGN_NEW_PROCESSOR_N_FACTOR
99
+
100
+ def_prop :PREQUEUING_POLICY
101
+ def_prop :POSTQUEUING_POLICY
102
+
103
+ def_prop :POSTMAPPING_POLICY
104
+
105
+ def_prop :POSTQUEUE_MAX_TRANSFER_SIZE
106
+ def_prop :POOLQUEUE_POOL_THRESHOLD
107
+ def_prop :ONMEMORY_SIZEDQUEUE_SIZE
108
+ def_prop :FILEBUFFEREDQUEUE_THRESHOLD
109
+
110
+ def_prop :MARSHAL_QUEUE_CHUNK_SIZE
111
+ def_prop :MARSHAL_QUEUE_MIN_CHUNK_NO
112
+ def_prop :SIZEDMARSHAL_QUEUE_MAX_CHUNK_NO
113
+
114
+ def_prop :SORTEDQUEUE_POOL_THRESHOLD
115
+ def_prop :SORTEDQUEUE_THRESHOLD
116
+ def_prop :SORTEDQUEUE_SORTBY
117
+
118
+ def_prop :INPUT_LOCAL_FILE_BUFFER_SIZE
119
+ def_prop :HERE_POOL_THRESHOLD
120
+ #def_prop :OUTPUT_LOCAL_POOL_THRESHOLD
121
+
122
+ def_prop :GROUP_BY_NO_SEGMENT
123
+ def_prop :GROUP_BY_HASH_MODULE
124
+ def_prop :GROUP_BY_GROUPING_OPTIMIZE
125
+
126
+ def_prop :GROUP_BY_BUFFERING_POLICY
127
+ def_prop :GROUP_BY_CMSB_THRESHOLD
128
+ def_prop :GROUP_BY_CMSB_CHUNK_SIZE
129
+
130
+ def_prop :BARRIER_MEMORY_BUFFERING_POLICY
131
+
132
+ def_prop :SORT_BUFFERING_POLICY
133
+ def_prop :SORT_SAMPLING_MIN
134
+ def_prop :SORT_SAMPLING_MAX
135
+ def_prop :SORT_SAMPLING_RATIO_1_TO
136
+ def_prop :SORT_NO_SEGMENT
137
+ def_prop :SORT_CMP_OPTIMIZE
138
+
139
+ def_prop :IOTA_SPLIT_NO
140
+
141
+ def_prop :TRANSFAR_MARSHAL_STRING_ARRAY_OPTIMIZE
142
+
143
+ def_rpath :VF_ROOT, "Repos"
144
+ def_prop :VF_PREFIX
145
+ def_prop :VF_BASE_NAME_CONVERTER
146
+ def_prop :VF_SPLIT_SIZE
147
+
148
+ def_prop :TMP_DIR
149
+
150
+ def_prop :LOG_FILE
151
+ def_prop :LOG_LEVEL
152
+ def_prop :LOG_FLUSH_INTERVAL
153
+ def_prop :LOG_MARK_INTERVAL
154
+ def_prop :LOG_IMPORT_NTIMES_POP
155
+ def_prop :LOG_LOCAL_OUTPUT_DEV
156
+ def_prop :LOG_ROTATE_INTERVAL
157
+ def_prop :LOG_ROTATE_N
158
+
159
+ def_prop :SUBCMD_EXEC_TIMEOUT
160
+
161
+ def_prop :PROCESSOR_MON_ON
162
+ def_prop :PROCESSOR_MON_INTERVAL
163
+ def_prop :PROCESSOR_MON_PSFORMAT
164
+ def_prop :PROCESSOR_MON_OBJECTSPACE_INSPECT_ON
165
+
166
+ def_prop :SOCK_DO_NOT_REVERSE_LOOKUP
167
+ def_prop :USE_RESOLV_REPLACE
168
+
169
+ def_prop :BLOCK_USE_STDOUT
170
+
171
+ def_prop :DEBUG_PORT_WAIT
172
+ def_prop :DEBUG_FULL_BACKTRACE
173
+ def_prop :DEBUG_THREAD_ABORT_ON_EXCEPTION
174
+ def_prop :DEBUG_MONITOR_ON
175
+ def_prop :DEBUG_PROCESSOR_TRACE_ON
176
+ def_prop :DEBUG_BUG49
177
+
178
+ def_prop :BUG234
179
+
180
+ def_prop :PROCESS_LIFE_MANAGE_INTERVAL
181
+
182
+ def_prop :THREAD_STACK_SIZE
183
+
184
+ # class JobConf<Conf
185
+ # def initialize(prefix = "", super_conf = nil, opts ={})
186
+ # @prefix = prefix.upcase
187
+ # end
188
+
189
+ # def method_missing(method, *args, &b)
190
+ # del = "#{prefix}_#{method.id2name.upcase}"
191
+ # if respond_to?(del)
192
+ # __send__(del, *args, &b)
193
+ # else
194
+ # super
195
+ # end
196
+ # end
197
+ # end
198
+ # BJobConf = JobConf
199
+ # NJobConf = JobConf
200
+
201
+ class DefaultConf
202
+
203
+ def initialize
204
+ super
205
+
206
+ @default_host = `hostname`.chomp
207
+ @hosts = {}
208
+ end
209
+
210
+ def [](host)
211
+ unless @hosts[host]
212
+ @hosts[host] = Conf.new
213
+ end
214
+ @hosts[host]
215
+ end
216
+
217
+ def value(prop)
218
+ conf = @hosts[@default_host]
219
+ v = conf && conf.value(prop)
220
+ return v if v
221
+ @values[prop]
222
+ end
223
+
224
+ def load_all_conf
225
+ loaded = false
226
+ for path in CONF_PATH
227
+ if path
228
+ if File.exist?(path)
229
+ load_conf path
230
+ loaded = true
231
+ end
232
+ end
233
+ end
234
+ # unless loaded
235
+ # puts "warnfairy.confファイルが見つかりません"
236
+ # end
237
+ end
238
+
239
+ def load_conf(conf)
240
+ begin
241
+ load conf
242
+ rescue LoadError
243
+ puts "設定ファイル #{conf} をロードできませんでした."
244
+ exit 1
245
+ rescue
246
+ puts "設定ファイル #{@conf} をロード中に例外が発生しました."
247
+ p $!
248
+ p $@
249
+ exit 2
250
+ end
251
+ end
252
+ end
253
+ end
254
+
255
+ DEFAULT_CONF = Conf::DefaultConf.new
256
+
257
+ DEFAULT_CONF.RUBY_BIN = ENV["FAIRY_RUBY"] || "ruby"
258
+
259
+ #DEFAULT_CONF.MASTER_HOST =
260
+ DEFAULT_CONF.MASTER_PORT = 19999
261
+
262
+ # DEFAULT_CONF.HOME = ENV["FAIRY_HOME"] || "/usr/lib/fairy"
263
+ home = ENV["FAIRY_HOME"]
264
+ unless home
265
+ home = File.dirname(File.dirname(File.expand_path(__FILE__)))
266
+ if File.basename(__FILE__) == "conf.rb"
267
+ home = File.dirname(File.dirname(home))
268
+ end
269
+ end
270
+ DEFAULT_CONF.HOME = home
271
+ # DEFAULT_CONF.BIN = DEFAULT_CONF.HOME+"/bin"
272
+ # DEFAULT_CONF.LIB = DEFAULT_CONF.HOME+"/lib"
273
+
274
+ # DEFAULT_CONF.CONTROLLER_BIN = DEFAULT_CONF.BIN+"/controller"
275
+ # DEFAULT_CONF.PROCESSOR_BIN = DEFAULT_CONF.BIN+"/processor"
276
+
277
+ DEFAULT_CONF.DEFAULT_EXTERNAL = nil
278
+ DEFAULT_CONF.DEFAULT_INTERNAL = nil
279
+
280
+ DEFAULT_CONF.IGNORE_EXCEPTION_ON_FILTER = false
281
+
282
+ DEFAULT_CONF.MASTER_MAX_ACTIVE_PROCESSORS = 4
283
+
284
+ DEFAULT_CONF.CONTROLLER_INPUT_PROCESSOR_N = 10
285
+ DEFAULT_CONF.CONTROLLER_MAX_ACTIVE_TASKS_IN_PROCESSOR = 4
286
+
287
+ DEFAULT_CONF.CONTROLLER_ASSIGN_NEW_PROCESSOR_N_FACTOR = 1
288
+
289
+ DEFAULT_CONF.POSTMAPPING_POLICY = nil
290
+
291
+ DEFAULT_CONF.PREQUEUING_POLICY = {:queuing_class => :FileMarshaledQueue}
292
+ DEFAULT_CONF.POSTQUEUING_POLICY = {:queuing_class => :FileMarshaledQueue}
293
+
294
+ DEFAULT_CONF.POSTQUEUE_MAX_TRANSFER_SIZE = 100000
295
+ DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD = 10000
296
+ DEFAULT_CONF.ONMEMORY_SIZEDQUEUE_SIZE = 10000
297
+ DEFAULT_CONF.FILEBUFFEREDQUEUE_THRESHOLD = 10000/2
298
+
299
+ DEFAULT_CONF.MARSHAL_QUEUE_CHUNK_SIZE = DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
300
+ DEFAULT_CONF.MARSHAL_QUEUE_MIN_CHUNK_NO = DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
301
+ DEFAULT_CONF.SIZEDMARSHAL_QUEUE_MAX_CHUNK_NO = 10
302
+
303
+ DEFAULT_CONF.SORTEDQUEUE_POOL_THRESHOLD = DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
304
+ DEFAULT_CONF.SORTEDQUEUE_THRESHOLD = 10000/2
305
+ DEFAULT_CONF.SORTEDQUEUE_SORTBY = %{|v| v}
306
+
307
+ DEFAULT_CONF.INPUT_LOCAL_FILE_BUFFER_SIZE = 1024*1024
308
+ DEFAULT_CONF.HERE_POOL_THRESHOLD = 32000
309
+ #DEFAULT_CONF.OUTPUT_LOCAL_POOL_THRESHOLD = 32000
310
+
311
+ DEFAULT_CONF.GROUP_BY_NO_SEGMENT = 4
312
+ DEFAULT_CONF.GROUP_BY_HASH_MODULE = "fairy/share/hash-md5"
313
+ DEFAULT_CONF.GROUP_BY_GROUPING_OPTIMIZE = false
314
+
315
+ DEFAULT_CONF.GROUP_BY_BUFFERING_POLICY = {:buffering_class => :DirectMergeSortBuffer}
316
+ DEFAULT_CONF.GROUP_BY_CMSB_THRESHOLD = 400_000
317
+ DEFAULT_CONF.GROUP_BY_CMSB_CHUNK_SIZE = 1000
318
+
319
+ DEFAULT_CONF.BARRIER_MEMORY_BUFFERING_POLICY = {:queuing_class => :PoolQueue}
320
+
321
+ DEFAULT_CONF.SORT_BUFFERING_POLICY = {:buffering_class => "PGroupBy::DirectMergeSortBuffer"}
322
+ DEFAULT_CONF.SORT_SAMPLING_MIN = 100
323
+ DEFAULT_CONF.SORT_SAMPLING_MAX = 10000
324
+ DEFAULT_CONF.SORT_SAMPLING_RATIO_1_TO = 100
325
+ DEFAULT_CONF.SORT_NO_SEGMENT = DEFAULT_CONF.GROUP_BY_NO_SEGMENT
326
+ DEFAULT_CONF.SORT_CMP_OPTIMIZE = false
327
+
328
+ DEFAULT_CONF.IOTA_SPLIT_NO = 4
329
+
330
+ DEFAULT_CONF.TRANSFAR_MARSHAL_STRING_ARRAY_OPTIMIZE = false
331
+
332
+ # DEFAULT_CONF.VF_ROOT = DEFAULT_CONF.HOME+"/Repos"
333
+ DEFAULT_CONF.VF_PREFIX = `hostname`.chomp
334
+ ## DEFAULT_CONF.VF_PREFIX is client setting.
335
+ DEFAULT_CONF.VF_BASE_NAME_CONVERTER = nil
336
+ DEFAULT_CONF.VF_SPLIT_SIZE = 64*1024*1024
337
+
338
+ DEFAULT_CONF.TMP_DIR = "/tmp/fairy/tmpbuf"
339
+
340
+ DEFAULT_CONF.LOG_FILE = "/tmp/fairy/log"
341
+ DEFAULT_CONF.LOG_FLUSH_INTERVAL = 1
342
+ DEFAULT_CONF.LOG_MARK_INTERVAL = 300
343
+ DEFAULT_CONF.LOG_LEVEL = :INFO
344
+ DEFAULT_CONF.LOG_IMPORT_NTIMES_POP = 100000
345
+ DEFAULT_CONF.LOG_LOCAL_OUTPUT_DEV = :$stderr
346
+ DEFAULT_CONF.LOG_ROTATE_INTERVAL = 60*60*24
347
+ DEFAULT_CONF.LOG_ROTATE_N = 7
348
+
349
+ DEFAULT_CONF.SUBCMD_EXEC_TIMEOUT = 60
350
+
351
+ DEFAULT_CONF.PROCESSOR_MON_ON = false
352
+ DEFAULT_CONF.PROCESSOR_MON_INTERVAL = 300
353
+ DEFAULT_CONF.PROCESSOR_MON_PSFORMAT = "stat,vsz,rss,sz,pmem,pcpu,nlwp,time,wchan"
354
+ DEFAULT_CONF.PROCESSOR_MON_OBJECTSPACE_INSPECT_ON = false
355
+
356
+ DEFAULT_CONF.SOCK_DO_NOT_REVERSE_LOOKUP = true
357
+ DEFAULT_CONF.USE_RESOLV_REPLACE = false
358
+
359
+ DEFAULT_CONF.BLOCK_USE_STDOUT = true
360
+
361
+ DEFAULT_CONF.DEBUG_PORT_WAIT = false
362
+ DEFAULT_CONF.DEBUG_FULL_BACKTRACE = false
363
+ DEFAULT_CONF.DEBUG_THREAD_ABORT_ON_EXCEPTION = false
364
+ DEFAULT_CONF.DEBUG_MONITOR_ON = false
365
+ DEFAULT_CONF.DEBUG_PROCESSOR_TRACE_ON = false
366
+ DEFAULT_CONF.DEBUG_BUG49 = false
367
+
368
+ DEFAULT_CONF.BUG234 = false
369
+
370
+ # DEFAULT_CONF.PROCESS_LIFE_MANAGE_INTERVAL = 60
371
+ # DEFAULT_CONF.PROCESS_LIFE_MANAGE_INTERVAL = 10
372
+ # DEFAULT_CONF.PROCESS_LIFE_MANAGE_INTERVAL = 1
373
+ DEFAULT_CONF.PROCESS_LIFE_MANAGE_INTERVAL = nil
374
+
375
+ # DEFAULT_CONF.THREAD_STACK_SIZE = 1024*100
376
+
377
+ CONF = DEFAULT_CONF
378
+ CONF.load_all_conf
379
+
380
+ def REPLACE_CONF(conf)
381
+ remove_const(:CONF)
382
+ const_set(:CONF, conf)
383
+ end
384
+ module_function :REPLACE_CONF
385
+
386
+
387
+ def Conf.configure_common_conf
388
+ Thread.abort_on_exception = CONF.DEBUG_THREAD_ABORT_ON_EXCEPTION
389
+
390
+ TCPSocket.do_not_reverse_lookup = CONF.SOCK_DO_NOT_REVERSE_LOOKUP
391
+
392
+ if CONF.USE_RESOLV_REPLACE
393
+ require "resolv-replace"
394
+ end
395
+ end
396
+ end