fairy 0.6.0 → 0.6.5

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 (70) hide show
  1. data/Makefile +1 -0
  2. data/bin/fairy +35 -5
  3. data/ext/extconf.rb +3 -0
  4. data/ext/fairy.c +180 -0
  5. data/ext/fairy.h +94 -0
  6. data/ext/fiber_mon.h +32 -0
  7. data/ext/fixnum-buffer.c +483 -0
  8. data/ext/p-group-by.c +529 -0
  9. data/ext/p-xgroup-by.c +467 -0
  10. data/ext/simple-hash.c +44 -0
  11. data/ext/string-buffer.c +286 -0
  12. data/ext/xmarshaled-queue.c +699 -0
  13. data/ext/xsized-queue.c +528 -0
  14. data/ext/xthread.h +65 -0
  15. data/fairy.gemspec +5 -2
  16. data/lib/fairy.rb +10 -1
  17. data/lib/fairy/client/group-by.rb +57 -2
  18. data/lib/fairy/client/here.rb +2 -1
  19. data/lib/fairy/controller.rb +25 -4
  20. data/lib/fairy/master.rb +17 -3
  21. data/lib/fairy/master/c-basic-group-by.rb +4 -2
  22. data/lib/fairy/master/c-cat.rb +3 -2
  23. data/lib/fairy/master/c-direct-product.rb +5 -3
  24. data/lib/fairy/master/c-filter.rb +5 -3
  25. data/lib/fairy/master/c-group-by.rb +13 -0
  26. data/lib/fairy/master/c-junction.rb +3 -2
  27. data/lib/fairy/master/c-seg-join.rb +3 -1
  28. data/lib/fairy/master/c-seg-shuffle.rb +3 -2
  29. data/lib/fairy/master/c-seg-split.rb +1 -1
  30. data/lib/fairy/master/c-seg-zip.rb +3 -1
  31. data/lib/fairy/master/c-sort.rb +7 -2
  32. data/lib/fairy/master/c-wc.rb +5 -3
  33. data/lib/fairy/node.rb +13 -2
  34. data/lib/fairy/node/p-barrier.rb +1 -1
  35. data/lib/fairy/node/p-basic-group-by.rb +22 -12
  36. data/lib/fairy/node/p-direct-product.rb +4 -2
  37. data/lib/fairy/node/p-filter.rb +8 -7
  38. data/lib/fairy/node/p-find.rb +2 -1
  39. data/lib/fairy/node/p-group-by.rb +17 -6
  40. data/lib/fairy/node/p-inject.rb +3 -2
  41. data/lib/fairy/node/p-output-file.rb +1 -1
  42. data/lib/fairy/node/p-seg-join.rb +2 -1
  43. data/lib/fairy/node/p-seg-zip.rb +2 -1
  44. data/lib/fairy/node/p-single-exportable.rb +3 -1
  45. data/lib/fairy/node/p-sort.rb +4 -2
  46. data/lib/fairy/node/p-task.rb +1 -1
  47. data/lib/fairy/node/p-wc.rb +5 -2
  48. data/lib/fairy/processor.rb +25 -18
  49. data/lib/fairy/share/block-source.rb +12 -2
  50. data/lib/fairy/share/conf.rb +35 -5
  51. data/lib/fairy/share/hash-simple-hash.rb +1 -1
  52. data/lib/fairy/share/log.rb +11 -4
  53. data/lib/fairy/share/pool-dictionary.rb +2 -1
  54. data/lib/fairy/share/port-marshaled-queue.rb +8 -1
  55. data/lib/fairy/share/port.rb +55 -45
  56. data/lib/fairy/share/reference.rb +2 -1
  57. data/lib/fairy/share/varray.rb +3 -1
  58. data/lib/fairy/share/vfile.rb +4 -2
  59. data/lib/fairy/version.rb +1 -1
  60. data/sample/sort.rb +69 -3
  61. data/spec/fairy8_spec.rb +1 -1
  62. data/test/testc.rb +380 -2
  63. data/tools/cap_recipe/Capfile +3 -3
  64. data/tools/fairy_conf_wizard.rb +375 -0
  65. data/tools/fairy_perf_graph.rb +15 -3
  66. data/tools/git-tag +1 -0
  67. data/tools/log-analysis.rb +59 -11
  68. metadata +33 -34
  69. data/ext/simple_hash/extconf.rb +0 -4
  70. data/ext/simple_hash/simple_hash.c +0 -42
@@ -2,8 +2,9 @@
2
2
  #
3
3
  # Copyright (C) 2007-2010 Rakuten, Inc.
4
4
  #
5
+ require "xthread"
5
6
 
6
- require "fairy/node/p-filter"
7
+ require "fairy/node/p-io-filter"
7
8
  require "fairy/node/p-single-exportable"
8
9
 
9
10
  module Fairy
@@ -72,7 +73,7 @@ module Fairy
72
73
 
73
74
  @value = :__FAIRY_NO_VALUE__
74
75
  @value_mutex = Mutex.new
75
- @value_cv = ConditionVariable.new
76
+ @value_cv = XThread::ConditionVariable.new
76
77
  end
77
78
 
78
79
  def input=(input)
@@ -17,7 +17,7 @@ module Fairy
17
17
  super
18
18
  @vfile = vf
19
19
 
20
- # @imports = Queue.new
20
+ # @imports = XThread::Queue.new
21
21
  end
22
22
 
23
23
  def input=(input)
@@ -2,6 +2,7 @@
2
2
  #
3
3
  # Copyright (C) 2007-2010 Rakuten, Inc.
4
4
  #
5
+ require "xthread"
5
6
 
6
7
  require "fairy/node/p-io-filter"
7
8
  require "fairy/node/p-single-exportable"
@@ -16,7 +17,7 @@ module Fairy
16
17
 
17
18
  @join_imports = nil
18
19
  @join_imports_mutex = Mutex.new
19
- @join_imports_cv = ConditionVariable.new
20
+ @join_imports_cv = XThread::ConditionVariable.new
20
21
  end
21
22
 
22
23
  def join_imports
@@ -2,6 +2,7 @@
2
2
  #
3
3
  # Copyright (C) 2007-2010 Rakuten, Inc.
4
4
  #
5
+ require "xthread"
5
6
 
6
7
  require "fairy/node/p-io-filter"
7
8
  require "fairy/node/p-single-exportable"
@@ -20,7 +21,7 @@ module Fairy
20
21
 
21
22
  @zip_imports = nil
22
23
  @zip_imports_mutex = Mutex.new
23
- @zip_imports_cv = ConditionVariable.new
24
+ @zip_imports_cv = XThread::ConditionVariable.new
24
25
  end
25
26
 
26
27
  def zip_imports
@@ -75,7 +75,9 @@ module Fairy
75
75
 
76
76
  def wait_export_finish
77
77
  self.status = ST_WAIT_EXPORT_FINISH
78
- @export.fib_wait_finish(@wait_cv)
78
+ @terminate_mon.synchronize do
79
+ @export.fib_wait_finish(@wait_cv)
80
+ end
79
81
  self.status = ST_EXPORT_FINISH
80
82
  end
81
83
  end
@@ -2,9 +2,11 @@
2
2
  #
3
3
  # Copyright (C) 2007-2010 Rakuten, Inc.
4
4
  #
5
+ require "xthread"
5
6
 
6
7
  require "fairy/node/p-io-filter"
7
8
  require "fairy/node/p-basic-group-by"
9
+ require "fairy/node/p-single-exportable"
8
10
 
9
11
  module Fairy
10
12
  module PSort
@@ -25,7 +27,7 @@ module Fairy
25
27
  block.call(idx, item) if item
26
28
  end
27
29
  end
28
- @exports_queue = Queue.new
30
+ @exports_queue = XThread::Queue.new
29
31
 
30
32
  @counter = []
31
33
 
@@ -130,7 +132,7 @@ Log::debugf(self, "%s", @pvs.inspect)
130
132
  return
131
133
  end
132
134
 
133
- unless idx = @pvs.find_index{|pv| key < @key_proc.call(pv)}
135
+ unless idx = @pvs.find_index{|pv| key < pv}
134
136
  idx = @pvs.size
135
137
  end
136
138
 
@@ -24,7 +24,7 @@ module Fairy
24
24
  @njob_seq_mutex = Mutex.new
25
25
 
26
26
  @status = ST_INIT
27
- @status_mon = processor.njob_mon
27
+ @status_mon = processor.njob_mon.new_mon
28
28
  @status_cv = @status_mon.new_cv
29
29
 
30
30
  start_watch_status
@@ -2,6 +2,7 @@
2
2
  #
3
3
  # Copyright (C) 2007-2010 Rakuten, Inc.
4
4
  #
5
+ require "xthread"
5
6
 
6
7
  require "fairy/node/p-io-filter"
7
8
 
@@ -25,7 +26,7 @@ module Fairy
25
26
  @file = nil
26
27
 
27
28
  @exports = {}
28
- @exports_queue = Queue.new
29
+ @exports_queue = XThread::Queue.new
29
30
 
30
31
  @counter = {}
31
32
 
@@ -145,7 +146,9 @@ Log::debug(self, "G3")
145
146
  Log::debug(self, "G4")
146
147
  for key, export in @exports
147
148
  Log::debug(self, "G4.WAIT #{key}")
148
- export.fib_wait_finish(@wait_cv)
149
+ @terminate_mon.synchronze do
150
+ export.fib_wait_finish(@wait_cv)
151
+ end
149
152
  end
150
153
  Log::debug(self, "G5")
151
154
  self.status = ST_EXPORT_FINISH
@@ -3,7 +3,9 @@
3
3
  # Copyright (C) 2007-2010 Rakuten, Inc.
4
4
  #
5
5
 
6
+ require "xthread"
6
7
  require "fiber-mon"
8
+
7
9
  require "deep-connect"
8
10
 
9
11
  require "fairy/version"
@@ -11,6 +13,7 @@ require "fairy/share/conf"
11
13
  require "fairy/share/stdout"
12
14
 
13
15
 
16
+
14
17
  #DeepConnect::Organizer.immutable_classes.push Array
15
18
 
16
19
  # require "node/nfile"
@@ -47,8 +50,8 @@ module Fairy
47
50
  ERR::Raise ERR::INTERNAL::CantDefExport, obj.to_s
48
51
  end
49
52
  end
50
-
51
53
  EXPORTS.push [name, obj]
54
+
52
55
  end
53
56
 
54
57
  def initialize(id)
@@ -87,16 +90,14 @@ module Fairy
87
90
 
88
91
  @deepconnect = DeepConnect.start(service)
89
92
  @deepconnect.register_service("Processor", self)
93
+ # DeepConnect::Conf.DISPLAY_KEEP_ALIVE = true
90
94
 
91
95
  @deepconnect.when_disconnected do |deepspace, opts|
92
96
  when_disconnected(deepspace, opts)
93
97
  end
94
98
 
95
- for name, obj in EXPORTS
96
- export(name, obj)
97
- end
98
99
 
99
- @njob_mon.start
100
+ #@njob_mon.start
100
101
 
101
102
  require "fairy/share/inspector"
102
103
  @deepconnect.export("Inspector", Inspector.new(self))
@@ -112,6 +113,17 @@ module Fairy
112
113
  Log::info(self, "\tfairy version: #{Version}")
113
114
  Log::info(self, "\t[Powered By #{RUBY_DESCRIPTION}]")
114
115
 
116
+ begin
117
+ require "fairy.so"
118
+ Log::warn self, "\t Load fairy.so"
119
+ rescue LoadError
120
+ Log::warn self, "Can't load fairy.so. Can't use this feature"
121
+ end
122
+
123
+ for name, obj in EXPORTS
124
+ export(name, obj)
125
+ end
126
+
115
127
  start_watch_status
116
128
 
117
129
 
@@ -138,8 +150,10 @@ module Fairy
138
150
  end
139
151
 
140
152
  $stdout = Stdout.new(controller)
153
+
154
+ sprintf("%s %s#%d", Log::host, Log::type, Log::pid)
141
155
  end
142
- DeepConnect.def_method_spec(self, "REF connect_controller(REF, DVAL)")
156
+ DeepConnect.def_method_spec(self, "DVAL connect_controller(REF, DVAL)")
143
157
 
144
158
  def terminate
145
159
  # clientが終了したときの終了処理
@@ -290,8 +304,8 @@ module Fairy
290
304
  @status = :ST_WAIT
291
305
  @ntask_status = {}
292
306
 
293
- # @status_mutex = Mutex.new
294
- @status_cv = @njob_mon.new_cv
307
+ @status_mx = @njob_mon.new_mon
308
+ @status_cv = @status_mx.new_cv
295
309
 
296
310
  end
297
311
 
@@ -354,41 +368,35 @@ module Fairy
354
368
 
355
369
 
356
370
  def update_status(ntask, st)
357
- Log::debug(self, "UPDATE_STATUS: #{ntask}, #{st}")
358
- @njob_mon.synchronize do
371
+ Log::debug(self, "UPDATE_STATUS: #{ntask}, #{st}")
372
+ @status_mx.synchronize do
359
373
  @ntask_status[ntask] = st
360
374
 
361
375
  case st
362
376
  when :ST_INIT
363
377
  # do nothing
364
378
  if all_ntasks_semiactivated?(:no_lock)
365
- Log::debug(self, "UPDATE_STATUS A: #{st}")
366
379
  @status = :ST_SEMIACTIVATE
367
380
  end
368
381
  when :ST_WAIT_IMPORT
369
382
  if all_ntasks_semiactivated?(:no_lock)
370
- Log::debug(self, "UPDATE_STATUS B: #{st}")
371
383
  @status = :ST_SEMIACTIVATE
372
384
  end
373
385
  when :ST_ACTIVATE
374
- Log::debug(self, "UPDATE_STATUS C: #{st}")
375
386
  @status = :ST_ACTIVATE
376
387
  when :ST_ALL_IMPORTED,
377
388
  :ST_WAIT_EXPORT_FINISH,
378
389
  :ST_EXPORT_FINISH,
379
390
  :ST_OUTPUT_FINISH
380
391
  if all_ntasks_semiactivated?(:no_lock)
381
- Log::debug(self, "UPDATE_STATUS D: #{st}")
382
392
  @status = :ST_SEMIACTIVATE
383
393
  end
384
394
  when :ST_FINISH
385
395
  if all_ntasks_finished?(:no_lock)
386
- Log::debug(self, "UPDATE_STATUS E: #{st}")
387
396
  @status = :ST_WAIT
388
397
  end
389
398
  else
390
399
  if @status == :ST_WAIT
391
- Log::debug(self, "UPDATE_STATUS F: #{st}")
392
400
  @status = :ST_ACTIVATE
393
401
  end
394
402
  end
@@ -399,9 +407,8 @@ Log::debug(self, "UPDATE_STATUS F: #{st}")
399
407
  def start_watch_status
400
408
  # 初期状態通知
401
409
  notice_status(@status)
402
-
403
410
  @njob_mon.entry do
404
- @njob_mon.synchronize do
411
+ @status_mx.synchronize do
405
412
  old_status = nil
406
413
  old_no_active_ntasks = 0
407
414
  loop do
@@ -108,7 +108,9 @@ module Fairy
108
108
  else
109
109
  bt = $!.backtrace
110
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)
111
+ unless bt.empty?
112
+ bt.first.sub!("bind", @block_source.caller_method)
113
+ end
112
114
  bt.push *@block_source.backtrace.dc_deep_copy
113
115
  $!.set_backtrace(bt)
114
116
 
@@ -125,7 +127,9 @@ module Fairy
125
127
  end
126
128
  bt = $!.backtrace
127
129
  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)
130
+ unless bt.empty?
131
+ bt.first.sub!("bind", @block_source.caller_method)
132
+ end
129
133
  bt.push *@block_source.backtrace.dc_deep_copy
130
134
  $!.set_backtrace(bt)
131
135
 
@@ -163,6 +167,9 @@ module Fairy
163
167
  else
164
168
  bt = $!.backtrace
165
169
  bt = bt.select{|l| /fairy.*(share|job|backend|node|processor|controller)|deep-connect|__FORWARDABLE__|bin.*processor/ !~ l} unless CONF.DEBUG_FULL_BACKTRACE
170
+ unless bt.empty?
171
+ bt.first.sub!("bind", @block_source.caller_method)
172
+ end
166
173
  bt.first.sub!("bind", @block_source.caller_method)
167
174
  bt.push *@block_source.backtrace.dc_deep_copy
168
175
  $!.set_backtrace(bt)
@@ -181,6 +188,9 @@ module Fairy
181
188
  bt = $!.backtrace
182
189
  bt = bt.select{|l| /fairy.*(share|job|backend|node|processor|controller)|deep-connect|__FORWARDABLE__|bin.*processor/ !~ l} unless CONF.DEBUG_FULL_BACKTRACE
183
190
  bt.first.sub!("bind", @block_source.caller_method)
191
+ unless bt.empty?
192
+ bt.first.sub!("bind", @block_source.caller_method)
193
+ end
184
194
  bt.push *@block_source.backtrace.dc_deep_copy
185
195
  $!.set_backtrace(bt)
186
196
 
@@ -111,6 +111,16 @@ module Fairy
111
111
  def_prop :MARSHAL_QUEUE_MIN_CHUNK_NO
112
112
  def_prop :SIZEDMARSHAL_QUEUE_MAX_CHUNK_NO
113
113
 
114
+ def_prop :XMARSHAL_QUEUE_CHUNK_SIZE
115
+ def_prop :XMARSHAL_QUEUE_MIN_CHUNK_NO
116
+ def_prop :XMARSHAL_QUEUE_BUFFERS_CACHE_LIMIT
117
+ def_prop :XMARSHAL_QUEUE_USE_STRING_BUFFER
118
+ def_prop :XMARSHAL_QUEUE_LOG_MSTORE
119
+
120
+ def_prop :XSIZED_QUEUE_CHUNK_SIZE
121
+ def_prop :XSIZED_QUEUE_QUEUES_LIMIT
122
+ def_prop :XSIZED_QUEUE_USE_STRING_BUFFER
123
+
114
124
  def_prop :SORTEDQUEUE_POOL_THRESHOLD
115
125
  def_prop :SORTEDQUEUE_THRESHOLD
116
126
  def_prop :SORTEDQUEUE_SORTBY
@@ -119,6 +129,7 @@ module Fairy
119
129
  def_prop :HERE_POOL_THRESHOLD
120
130
  #def_prop :OUTPUT_LOCAL_POOL_THRESHOLD
121
131
 
132
+ def_prop :GROUP_BY
122
133
  def_prop :GROUP_BY_NO_SEGMENT
123
134
  def_prop :GROUP_BY_HASH_MODULE
124
135
  def_prop :GROUP_BY_GROUPING_OPTIMIZE
@@ -127,6 +138,8 @@ module Fairy
127
138
  def_prop :GROUP_BY_CMSB_THRESHOLD
128
139
  def_prop :GROUP_BY_CMSB_CHUNK_SIZE
129
140
 
141
+ def_prop :XGROUP_BY_BUFFERING_POLICY
142
+
130
143
  def_prop :BARRIER_MEMORY_BUFFERING_POLICY
131
144
 
132
145
  def_prop :SORT_BUFFERING_POLICY
@@ -288,19 +301,32 @@ module Fairy
288
301
 
289
302
  DEFAULT_CONF.POSTMAPPING_POLICY = nil
290
303
 
291
- DEFAULT_CONF.PREQUEUING_POLICY = {:queuing_class => :FileMarshaledQueue}
292
- DEFAULT_CONF.POSTQUEUING_POLICY = {:queuing_class => :FileMarshaledQueue}
304
+ DEFAULT_CONF.PREQUEUING_POLICY = {:queuing_class => :XSizedQueue}
305
+ DEFAULT_CONF.POSTQUEUING_POLICY = {:queuing_class => :XMarshaledQueue}
293
306
 
294
307
  DEFAULT_CONF.POSTQUEUE_MAX_TRANSFER_SIZE = 100000
295
- DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD = 10000
308
+ DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD = 100000
296
309
  DEFAULT_CONF.ONMEMORY_SIZEDQUEUE_SIZE = 10000
297
310
  DEFAULT_CONF.FILEBUFFEREDQUEUE_THRESHOLD = 10000/2
298
311
 
299
312
  DEFAULT_CONF.MARSHAL_QUEUE_CHUNK_SIZE = DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
300
313
  DEFAULT_CONF.MARSHAL_QUEUE_MIN_CHUNK_NO = DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
301
314
  DEFAULT_CONF.SIZEDMARSHAL_QUEUE_MAX_CHUNK_NO = 10
315
+
316
+ DEFAULT_CONF.XMARSHAL_QUEUE_CHUNK_SIZE = DEFAULT_CONF.MARSHAL_QUEUE_CHUNK_SIZE
317
+ DEFAULT_CONF.XMARSHAL_QUEUE_MIN_CHUNK_NO = DEFAULT_CONF.MARSHAL_QUEUE_MIN_CHUNK_NO
318
+ DEFAULT_CONF.XMARSHAL_QUEUE_BUFFERS_CACHE_LIMIT = 1000
319
+ DEFAULT_CONF.XMARSHAL_QUEUE_USE_STRING_BUFFER = true
320
+ DEFAULT_CONF.XMARSHAL_QUEUE_LOG_MSTORE = false
321
+
322
+ DEFAULT_CONF.XSIZED_QUEUE_CHUNK_SIZE = DEFAULT_CONF.XMARSHAL_QUEUE_CHUNK_SIZE
323
+ DEFAULT_CONF.XSIZED_QUEUE_QUEUES_LIMIT =
324
+ DEFAULT_CONF.XMARSHAL_QUEUE_BUFFERS_CACHE_LIMIT
325
+ DEFAULT_CONF.XSIZED_QUEUE_USE_STRING_BUFFER =
326
+ DEFAULT_CONF.XMARSHAL_QUEUE_USE_STRING_BUFFER
302
327
 
303
- DEFAULT_CONF.SORTEDQUEUE_POOL_THRESHOLD = DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
328
+ DEFAULT_CONF.SORTEDQUEUE_POOL_THRESHOLD =
329
+ DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
304
330
  DEFAULT_CONF.SORTEDQUEUE_THRESHOLD = 10000/2
305
331
  DEFAULT_CONF.SORTEDQUEUE_SORTBY = %{|v| v}
306
332
 
@@ -308,6 +334,8 @@ module Fairy
308
334
  DEFAULT_CONF.HERE_POOL_THRESHOLD = 32000
309
335
  #DEFAULT_CONF.OUTPUT_LOCAL_POOL_THRESHOLD = 32000
310
336
 
337
+ DEFAULT_CONF.GROUP_BY = :XGroupBy
338
+
311
339
  DEFAULT_CONF.GROUP_BY_NO_SEGMENT = 4
312
340
  DEFAULT_CONF.GROUP_BY_HASH_MODULE = "fairy/share/hash-md5"
313
341
  DEFAULT_CONF.GROUP_BY_GROUPING_OPTIMIZE = false
@@ -316,9 +344,11 @@ module Fairy
316
344
  DEFAULT_CONF.GROUP_BY_CMSB_THRESHOLD = 400_000
317
345
  DEFAULT_CONF.GROUP_BY_CMSB_CHUNK_SIZE = 1000
318
346
 
347
+ DEFAULT_CONF.XGROUP_BY_BUFFERING_POLICY = {:buffering_class => :XDirectMergeSortBuffer}
348
+
319
349
  DEFAULT_CONF.BARRIER_MEMORY_BUFFERING_POLICY = {:queuing_class => :PoolQueue}
320
350
 
321
- DEFAULT_CONF.SORT_BUFFERING_POLICY = {:buffering_class => "PGroupBy::DirectMergeSortBuffer"}
351
+ DEFAULT_CONF.SORT_BUFFERING_POLICY = {:buffering_class => "PGroupBy::XDirectMergeSortBuffer"}
322
352
  DEFAULT_CONF.SORT_SAMPLING_MIN = 100
323
353
  DEFAULT_CONF.SORT_SAMPLING_MAX = 10000
324
354
  DEFAULT_CONF.SORT_SAMPLING_RATIO_1_TO = 100
@@ -3,7 +3,7 @@
3
3
  # Copyright (C) 2007-2010 Rakuten, Inc.
4
4
  #
5
5
 
6
- require "simple_hash"
6
+ #require "simple_hash"
7
7
 
8
8
  module Fairy
9
9
  module HValueGenerator
@@ -4,6 +4,7 @@
4
4
  #
5
5
 
6
6
  require "thread"
7
+ require "xthread"
7
8
  require "stringio"
8
9
 
9
10
  require "forwardable"
@@ -30,7 +31,7 @@ module Fairy
30
31
 
31
32
  @buffer = []
32
33
  @buffer_mutex = Mutex.new
33
- @buffer_cv = ConditionVariable.new
34
+ @buffer_cv = XThread::ConditionVariable.new
34
35
 
35
36
  set_local_output_dev
36
37
 
@@ -163,9 +164,15 @@ module Fairy
163
164
  sender = "UNDEF"
164
165
  end
165
166
  log(sender) do |sio|
166
- sio.puts "#{exception.message}: #{exception.class}"
167
- for l in exception.backtrace
168
- sio.puts l
167
+ if exception.kind_of?(Exception)
168
+ sio.puts "#{exception.message}: #{exception.class}"
169
+ for l in exception.backtrace
170
+ sio.puts l
171
+ end
172
+ else
173
+ sio.puts "Unknown exception rised!!(Exp=#{exception.inspect})"
174
+ sio.puts "Backtorace: "
175
+ log_backtrace(sender)
169
176
  end
170
177
  end
171
178
  end