roma 0.8.2 → 0.8.10

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 (114) hide show
  1. data/CHANG +326 -0
  2. data/CHANGELOG +132 -0
  3. data/{README.rdoc → FETCH_HEAD} +0 -0
  4. data/{LICENSE.rdoc → LICENSE} +0 -1
  5. data/README +17 -0
  6. data/Rakefile +33 -18
  7. data/ruby/server/bin/chg_redundancy +10 -0
  8. data/ruby/server/bin/key_access +7 -0
  9. data/ruby/server/bin/key_list +7 -0
  10. data/ruby/server/bin/mkconfig +19 -0
  11. data/{bin → ruby/server/bin}/mkrecent +0 -1
  12. data/{bin → ruby/server/bin}/mkroute +0 -1
  13. data/ruby/server/bin/multi_commander +19 -0
  14. data/ruby/server/bin/recoverlost +10 -0
  15. data/ruby/server/bin/recoverlost_alist +10 -0
  16. data/ruby/server/bin/recoverlost_alist_all +10 -0
  17. data/ruby/server/bin/recoverlost_alist_keys +10 -0
  18. data/{bin/recoverlost → ruby/server/bin/roma_watcher} +1 -2
  19. data/ruby/server/bin/romad +36 -0
  20. data/{bin → ruby/server/bin}/sample_watcher +0 -1
  21. data/{bin → ruby/server/bin}/sample_watcher2 +0 -1
  22. data/{bin/simple_bench → ruby/server/bin/sample_watcher3} +1 -2
  23. data/ruby/server/bin/simple_bench +26 -0
  24. data/{bin → ruby/server/bin}/ssroute +0 -1
  25. data/ruby/server/bin/test-scenario +11 -0
  26. data/{bin → ruby/server/bin}/tribunus +0 -1
  27. data/{lib → ruby/server/lib}/roma/async_process.rb +67 -15
  28. data/{lib → ruby/server/lib}/roma/command/bg_command_receiver.rb +1 -1
  29. data/ruby/server/lib/roma/command/command_definition.rb +422 -0
  30. data/ruby/server/lib/roma/command/mh_command_receiver.rb +127 -0
  31. data/ruby/server/lib/roma/command/receiver.rb +64 -0
  32. data/{lib → ruby/server/lib}/roma/command/rt_command_receiver.rb +6 -1
  33. data/ruby/server/lib/roma/command/sys_command_receiver.rb +609 -0
  34. data/{lib → ruby/server/lib}/roma/command/util_command_receiver.rb +15 -5
  35. data/{lib → ruby/server/lib}/roma/command/vn_command_receiver.rb +12 -4
  36. data/{lib → ruby/server/lib}/roma/command_plugin.rb +0 -0
  37. data/ruby/server/lib/roma/config.rb +84 -0
  38. data/{lib → ruby/server/lib}/roma/event/con_pool.rb +12 -1
  39. data/ruby/server/lib/roma/event/handler.rb +256 -0
  40. data/ruby/server/lib/roma/live_patch-20120302-001.rb +107 -0
  41. data/ruby/server/lib/roma/logging/rlogger.rb +163 -0
  42. data/ruby/server/lib/roma/messaging/con_pool.rb +92 -0
  43. data/{lib → ruby/server/lib}/roma/plugin/plugin_alist.rb +118 -240
  44. data/ruby/server/lib/roma/plugin/plugin_debug.rb +31 -0
  45. data/ruby/server/lib/roma/plugin/plugin_map.rb +177 -0
  46. data/ruby/server/lib/roma/plugin/plugin_mapcount.rb +185 -0
  47. data/{lib/roma/command/st_command_receiver.rb → ruby/server/lib/roma/plugin/plugin_storage.rb} +170 -146
  48. data/ruby/server/lib/roma/plugin/plugin_stub.rb +283 -0
  49. data/{lib → ruby/server/lib}/roma/plugin/plugin_test.rb +0 -0
  50. data/{lib → ruby/server/lib}/roma/romad.rb +221 -94
  51. data/{lib → ruby/server/lib}/roma/routing/cb_rttable.rb +4 -6
  52. data/{lib → ruby/server/lib}/roma/routing/merkle_tree.rb +0 -0
  53. data/ruby/server/lib/roma/routing/routing_data.rb +307 -0
  54. data/{lib → ruby/server/lib}/roma/routing/rttable.rb +4 -0
  55. data/{lib → ruby/server/lib}/roma/stats.rb +19 -3
  56. data/{lib → ruby/server/lib}/roma/storage/basic_storage.rb +25 -26
  57. data/{lib → ruby/server/lib}/roma/storage/dbm_storage.rb +1 -23
  58. data/{lib → ruby/server/lib}/roma/storage/dummy_storage.rb +0 -0
  59. data/{lib → ruby/server/lib}/roma/storage/rh_storage.rb +0 -0
  60. data/{lib → ruby/server/lib}/roma/storage/sqlite3_storage.rb +0 -0
  61. data/{lib → ruby/server/lib}/roma/storage/tc_storage.rb +62 -2
  62. data/ruby/server/lib/roma/tools/chg_redundancy.rb +36 -0
  63. data/ruby/server/lib/roma/tools/key_access.rb +105 -0
  64. data/ruby/server/lib/roma/tools/key_list.rb +94 -0
  65. data/ruby/server/lib/roma/tools/mkconfig.rb +535 -0
  66. data/{lib → ruby/server/lib}/roma/tools/mkrecent.rb +0 -0
  67. data/{lib → ruby/server/lib}/roma/tools/mkroute.rb +0 -0
  68. data/ruby/server/lib/roma/tools/multi_commander.rb +45 -0
  69. data/{lib → ruby/server/lib}/roma/tools/recoverlost.rb +0 -0
  70. data/{lib → ruby/server/lib}/roma/tools/recoverlost_alist.rb +0 -0
  71. data/ruby/server/lib/roma/tools/recoverlost_alist_all.rb +8 -0
  72. data/ruby/server/lib/roma/tools/recoverlost_alist_keys.rb +16 -0
  73. data/ruby/server/lib/roma/tools/recoverlost_lib.rb +349 -0
  74. data/ruby/server/lib/roma/tools/roma_watcher.rb +150 -0
  75. data/ruby/server/lib/roma/tools/roma_watcher_config.yml.example +20 -0
  76. data/{lib → ruby/server/lib}/roma/tools/sample_watcher.rb +3 -1
  77. data/{lib → ruby/server/lib}/roma/tools/sample_watcher2.rb +3 -1
  78. data/ruby/server/lib/roma/tools/sample_watcher3.rb +49 -0
  79. data/{lib → ruby/server/lib}/roma/tools/simple_bench.rb +2 -0
  80. data/ruby/server/lib/roma/tools/simple_bench2.rb +78 -0
  81. data/{lib → ruby/server/lib}/roma/tools/ssroute.rb +0 -0
  82. data/ruby/server/lib/roma/tools/test-scenario.rb +327 -0
  83. data/{lib → ruby/server/lib}/roma/tools/tribunus.rb +0 -0
  84. data/ruby/server/lib/roma/version.rb +4 -0
  85. data/{lib → ruby/server/lib}/roma/write_behind.rb +1 -0
  86. data/ruby/server/test/config4mhash.rb +68 -0
  87. data/ruby/server/test/config4storage_error.rb +69 -0
  88. data/{lib/roma/config.rb → ruby/server/test/config4test.rb} +6 -3
  89. data/{test → ruby/server/test}/rcirb.rb +0 -1
  90. data/{test → ruby/server/test}/roma-test-utils.rb +21 -8
  91. data/{test → ruby/server/test}/run-test.rb +3 -2
  92. data/ruby/server/test/storage_error_storage.rb +37 -0
  93. data/ruby/server/test/t_command_definition.rb +326 -0
  94. data/{test → ruby/server/test}/t_cpdata.rb +9 -3
  95. data/{test → ruby/server/test}/t_listplugin.rb +48 -12
  96. data/ruby/server/test/t_mapcountplugin.rb +231 -0
  97. data/ruby/server/test/t_mapplugin.rb +131 -0
  98. data/ruby/server/test/t_mhash.rb +222 -0
  99. data/ruby/server/test/t_rclient.rb +199 -0
  100. data/{test → ruby/server/test}/t_routing_data.rb +56 -0
  101. data/{test → ruby/server/test}/t_storage.rb +107 -111
  102. data/ruby/server/test/t_storage_error.rb +61 -0
  103. data/ruby/server/test/t_writebehind.rb +374 -0
  104. metadata +150 -82
  105. data/bin/recoverlost_alist +0 -8
  106. data/bin/romad +0 -7
  107. data/lib/roma/command/mh_command_receiver.rb +0 -117
  108. data/lib/roma/command/receiver.rb +0 -287
  109. data/lib/roma/event/handler.rb +0 -159
  110. data/lib/roma/plugin/plugin_debug.rb +0 -19
  111. data/lib/roma/tools/recoverlost_lib.rb +0 -217
  112. data/lib/roma/version.rb +0 -4
  113. data/test/t_rclient.rb +0 -318
  114. data/test/t_writebehind.rb +0 -200
File without changes
@@ -1,4 +1,3 @@
1
- = LICENSE
2
1
  GNU GENERAL PUBLIC LICENSE
3
2
  Version 3, 29 June 2007
4
3
 
data/README ADDED
@@ -0,0 +1,17 @@
1
+ ================================================================
2
+ ROMA: A Distributed Key-Value Store in Ruby
3
+ Copyright (C) 2009 Rakuten, Inc.
4
+ ================================================================
5
+
6
+ ROMA is one of the data storing systems for distributed key-value
7
+ stores. It is a completely decentralized distributed system that
8
+ consists of multiple processes, called nodes, on several machines. It
9
+ is based on pure P2P architecture like a distributed hash table, thus
10
+ it provides high availability and scalability.
11
+
12
+ ROMA is written in Ruby. However, following choices are available to
13
+ access to ROMA.
14
+
15
+ * Client libraries of Ruby and Java are available.
16
+ * ROMA protocol is compatible with memcached text-based one so that
17
+ any memcached client libraries allows users to interact with ROMA.
data/Rakefile CHANGED
@@ -1,31 +1,44 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require 'rubygems'
3
3
  require 'rake'
4
- require 'rake/gempackagetask'
5
- require 'rake/rdoctask'
4
+
5
+ begin
6
+ require 'rubygems/package_task'
7
+ PackageTask = Gem::PackageTask
8
+ rescue LoadError
9
+ require 'rake/gempackagetask'
10
+ PackageTask = Rake::GemPackageTask
11
+ end
12
+
13
+ begin
14
+ require 'rdoc/task'
15
+ rescue LoadError
16
+ require 'rake/rdoctask'
17
+ end
6
18
 
7
19
  RDOC_OPTIONS = [
8
20
  '--line-numbers',
9
21
  '--inline-source',
10
- "--main", "README.rdoc",
22
+ "--main", "README",
11
23
  "-c UTF-8",
12
24
  ]
13
25
 
14
26
  # gem tasks
27
+ base = 'ruby/server/'
15
28
  PKG_FILES = FileList[
16
29
  '[A-Z]*',
17
- 'bin/**/*',
18
- 'lib/**/*.rb',
19
- 'test/**/*.rb',
20
- 'spec/**/*.rb',
21
- 'doc/**/*',
22
- 'examples/**/*',
30
+ base + 'bin/**/*',
31
+ base + 'lib/**/*',
32
+ base + 'test/**/*.rb',
33
+ base + 'spec/**/*.rb',
34
+ base + 'doc/**/*',
35
+ base + 'examples/**/*',
23
36
  ]
24
37
 
25
- EXEC_TABLE = Dir.entries('bin').reject{ |d| d =~ /^\.+$/ || d =~ /^sample_/ }
26
-
38
+ EXEC_TABLE = Dir.entries(base + 'bin').reject{ |d| d =~ /^\.+$/ || d =~ /^sample_/ }
27
39
 
28
- VER_NUM = `ruby -Ilib -e 'require "roma/version"; puts Roma::VERSION'`
40
+ require File.expand_path(File.join('ruby', 'server', 'lib', 'roma', 'version'), File.dirname(__FILE__))
41
+ VER_NUM = Roma::VERSION
29
42
 
30
43
  if VER_NUM =~ /([0-9.]+)$/
31
44
  CURRENT_VERSION = $1
@@ -34,6 +47,8 @@ else
34
47
  end
35
48
 
36
49
  SPEC = Gem::Specification.new do |s|
50
+ s.authors = ["Junji Torii", "Hiroki Matsue"]
51
+ s.homepage = 'http://code.google.com/p/roma-prj/'
37
52
  s.name = "roma"
38
53
  s.version = CURRENT_VERSION
39
54
  s.summary = "ROMA server"
@@ -43,21 +58,21 @@ SPEC = Gem::Specification.new do |s|
43
58
  s.files = PKG_FILES.to_a
44
59
 
45
60
  # Use these for libraries.
46
- s.require_path = 'lib'
61
+ s.require_path = base + 'lib'
47
62
 
48
63
  # Use these for applications.
49
- s.bindir = "bin"
64
+ s.bindir = base + "bin"
50
65
  s.executables = EXEC_TABLE
51
66
  s.default_executable = "romad"
52
67
 
53
68
  s.has_rdoc = true
54
69
  s.rdoc_options.concat RDOC_OPTIONS
55
- s.extra_rdoc_files = ["README.rdoc"]
70
+ s.extra_rdoc_files = ["README", "CHANGELOG"]
56
71
 
57
- s.add_dependency('roma-commons')
72
+ s.add_dependency('eventmachine')
58
73
  end
59
74
 
60
- package_task = Rake::GemPackageTask.new(SPEC) do |pkg|
75
+ package_task = PackageTask.new(SPEC) do |pkg|
61
76
  end
62
77
 
63
78
 
@@ -66,5 +81,5 @@ Rake::RDocTask.new("doc") { |rdoc|
66
81
  rdoc.title = "ROMA documents"
67
82
  rdoc.options.concat RDOC_OPTIONS
68
83
  rdoc.rdoc_files.include('lib/**/*.rb')
69
- rdoc.rdoc_files.include("README.rdoc")
84
+ rdoc.rdoc_files.include("README")
70
85
  }
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
8
+ $LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
9
+
10
+ require 'roma/tools/chg_redundancy'
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ require 'roma/tools/key_access'
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ require 'roma/tools/key_list'
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__)))
4
+
5
+ require 'optparse'
6
+ require 'roma/tools/mkconfig'
7
+
8
+ opt = OptionParser.new
9
+ opt.on("-m","--with_menu", "Show menu to setup configurations individually.") { |v| Roma::Mkconfig.new(:with_menu)}
10
+
11
+ if ARGV.count == 0
12
+ Roma::Mkconfig.new
13
+ elsif
14
+ begin
15
+ opt.parse!(ARGV)
16
+ rescue OptionParser::InvalidOption
17
+ puts opt.help
18
+ end
19
+ end
@@ -2,6 +2,5 @@
2
2
 
3
3
  path = File.dirname(File.expand_path($PROGRAM_NAME))
4
4
  $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
5
 
7
6
  require 'roma/tools/mkrecent'
@@ -2,6 +2,5 @@
2
2
 
3
3
  path = File.dirname(File.expand_path($PROGRAM_NAME))
4
4
  $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
5
 
7
6
  require 'roma/tools/mkroute'
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
8
+ $LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
9
+
10
+ require 'roma/tools/multi_commander'
11
+
12
+ if ARGV.length < 2
13
+ STDERR.puts "usage:#{File.basename($0)} addr_port command args..."
14
+ exit
15
+ end
16
+
17
+ w = Roma::MultiCommander.new(ARGV[0])
18
+ STDOUT.puts w.send_cmd_all(ARGV[1..-1].join(' '))
19
+
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
8
+ $LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
9
+
10
+ require 'roma/tools/recoverlost'
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
8
+ $LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
9
+
10
+ require 'roma/tools/recoverlost_alist'
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
8
+ $LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
9
+
10
+ require 'roma/tools/recoverlost_alist_all'
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
8
+ $LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
9
+
10
+ require 'roma/tools/recoverlost_alist_keys'
@@ -2,7 +2,6 @@
2
2
 
3
3
  path = File.dirname(File.expand_path($PROGRAM_NAME))
4
4
  $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
5
  $LOAD_PATH << path + "/../../client/lib"
7
6
 
8
- require 'roma/tools/recoverlost'
7
+ require 'roma/tools/roma_watcher'
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ path = File.dirname(File.expand_path($PROGRAM_NAME))
4
+ $LOAD_PATH << path + "/../lib"
5
+
6
+ require 'roma/romad'
7
+
8
+ def daemonize
9
+ p = Process.fork {
10
+ pid=Process.setsid
11
+ Signal.trap(:INT){
12
+ exit! 0
13
+ }
14
+ Signal.trap(:TERM){
15
+ exit! 0
16
+ }
17
+ Signal.trap(:HUP){
18
+ exit! 0
19
+ }
20
+ File.open("/dev/null","r+"){|f|
21
+ STDIN.reopen f
22
+ STDOUT.reopen f
23
+ STDERR.reopen f
24
+ }
25
+ yield
26
+ }
27
+ $stderr.puts p
28
+ exit! 0
29
+ end
30
+
31
+ $roma = Roma::Romad.new(ARGV)
32
+ if $roma.daemon?
33
+ daemonize{ $roma.start }
34
+ else
35
+ $roma.start
36
+ end
@@ -2,7 +2,6 @@
2
2
 
3
3
  path = File.dirname(File.expand_path($PROGRAM_NAME))
4
4
  $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
5
  $LOAD_PATH << path + "/../../client/lib"
7
6
 
8
7
  require 'roma/tools/sample_watcher'
@@ -2,7 +2,6 @@
2
2
 
3
3
  path = File.dirname(File.expand_path($PROGRAM_NAME))
4
4
  $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
5
  $LOAD_PATH << path + "/../../client/lib"
7
6
 
8
7
  require 'roma/tools/sample_watcher2'
@@ -2,7 +2,6 @@
2
2
 
3
3
  path = File.dirname(File.expand_path($PROGRAM_NAME))
4
4
  $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
5
  $LOAD_PATH << path + "/../../client/lib"
7
6
 
8
- require 'roma/tools/simple_bench'
7
+ require 'roma/tools/sample_watcher3'
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
8
+ $LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
9
+
10
+ require 'roma/tools/simple_bench'
11
+
12
+ if ARGV.length == 0
13
+ STDERR.puts "usage:simple_bench addr:port"
14
+ exit
15
+ end
16
+
17
+ tn=10
18
+ t=[]
19
+ tn.times{
20
+ t << Thread.new{
21
+ random_rquest_sender(ARGV)
22
+ }
23
+ }
24
+
25
+ t[0].join
26
+
@@ -2,6 +2,5 @@
2
2
 
3
3
  path = File.dirname(File.expand_path($PROGRAM_NAME))
4
4
  $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
5
 
7
6
  require 'roma/tools/ssroute'
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
5
+ $LOAD_PATH.unshift("#{base_path}/server/lib")
6
+
7
+ client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
8
+ $LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
9
+
10
+ require 'roma/tools/test-scenario'
11
+
@@ -2,6 +2,5 @@
2
2
 
3
3
  path = File.dirname(File.expand_path($PROGRAM_NAME))
4
4
  $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
5
 
7
6
  require 'roma/tools/tribunus'
@@ -1,3 +1,4 @@
1
+
1
2
  # -*- coding: utf-8 -*-
2
3
  require 'thread'
3
4
  require 'digest/sha1'
@@ -43,6 +44,7 @@ module Roma
43
44
  @async_thread = Thread.new{
44
45
  async_process_loop
45
46
  }
47
+ @async_thread[:name] = __method__
46
48
  rescue =>e
47
49
  @log.error("#{e}\n#{$@}")
48
50
  end
@@ -65,11 +67,12 @@ module Roma
65
67
  msg.callback.call(msg,true) if msg.callback
66
68
  else
67
69
  if msg.retry?
68
- Thread.new{
70
+ t = Thread.new{
69
71
  msg.wait
70
72
  msg.incr_count
71
73
  @@async_queue.push(msg)
72
74
  }
75
+ t[:name] = __method__
73
76
  else
74
77
  @log.error("async process retry out:#{msg.inspect}")
75
78
  msg.callback.call(msg,false) if msg.callback
@@ -85,9 +88,10 @@ module Roma
85
88
  def asyncev_broadcast_cmd(args)
86
89
  @log.debug("asyncev_broadcast_cmd #{args.inspect}")
87
90
  cmd, nids, tout = args
88
- Thread::new{
91
+ t = Thread::new{
89
92
  async_broadcast_cmd("#{cmd}\r\n", nids, tout)
90
93
  }
94
+ t[:name] = __method__
91
95
  true
92
96
  end
93
97
 
@@ -98,7 +102,7 @@ module Roma
98
102
  return true
99
103
  end
100
104
  @stats.run_acquire_vnodes = true
101
- Thread::new{
105
+ t = Thread::new{
102
106
  begin
103
107
  acquire_vnodes_process
104
108
  rescue =>e
@@ -108,6 +112,7 @@ module Roma
108
112
  @stats.join_ap = nil
109
113
  end
110
114
  }
115
+ t[:name] = __method__
111
116
  true
112
117
  end
113
118
 
@@ -115,7 +120,7 @@ module Roma
115
120
  @log.debug("asyncev_start_dumpfile_process #{args.inspect}")
116
121
  key, path, cmd = args
117
122
  path = Roma::Config::STORAGE_DUMP_PATH + '/' + path
118
- Thread.new{
123
+ t = Thread.new{
119
124
  begin
120
125
  except_vnh = {}
121
126
  @rttable.each_vnode{|vn,nids|
@@ -138,6 +143,7 @@ module Roma
138
143
  @log.error("#{e}\n#{$@}")
139
144
  end
140
145
  }
146
+ t[:name] = __method__
141
147
  true
142
148
  end
143
149
 
@@ -176,7 +182,7 @@ module Roma
176
182
  return true # no retry
177
183
  end
178
184
  res = async_send_cmd(nid,"rset #{k}\e#{hname} #{d} #{clk} #{expt} #{v.length}\r\n#{v}\r\n",10)
179
- unless res
185
+ if res == nil || res.start_with?("ERROR")
180
186
  @log.warn("async redundant failed:#{k}\e#{hname} #{d} #{clk} #{expt} #{v.length} -> #{nid}")
181
187
  return false # retry
182
188
  end
@@ -191,27 +197,43 @@ module Roma
191
197
  return true # no retry
192
198
  end
193
199
  res = async_send_cmd(nid,"rzset #{k}\e#{hname} #{d} #{clk} #{expt} #{zv.length}\r\n#{zv}\r\n",10)
194
- unless res
200
+ if res == nil || res.start_with?("ERROR")
195
201
  @log.warn("async zredundant failed:#{k}\e#{hname} #{d} #{clk} #{expt} #{v.length} -> #{nid}")
196
202
  return false # retry
197
203
  end
198
204
  true
199
205
  end
200
206
 
207
+ def asyncev_rdelete(args)
208
+ nid,hname,k,clk = args
209
+ @log.debug("asyncev_rdelete #{args.inspect}")
210
+ unless @rttable.nodes.include?(nid)
211
+ @log.warn("async rdelete failed:#{nid} dose not found in routing table.#{k}\e#{hname} #{clk}")
212
+ return true # no retry
213
+ end
214
+ res = async_send_cmd(nid,"rdelete #{k}\e#{hname} #{clk}\r\n",10)
215
+ unless res
216
+ @log.warn("async redundant failed:#{k}\e#{hname} #{clk} -> #{nid}")
217
+ return false # retry
218
+ end
219
+ true
220
+ end
221
+
201
222
  def asyncev_reqpushv(args)
202
223
  vn, nid, p = args
203
224
  @log.debug("asyncev_reqpushv #{args.inspect}")
204
- Thread::new{
225
+ t = Thread::new{
205
226
  sync_a_vnode(vn.to_i, nid, p == 'true')
206
227
  }
228
+ t[:name] = __method__
207
229
  end
208
230
 
209
231
  def asyncev_start_recover_process(args)
210
232
  @log.debug("asyncev_start_recover_process #{args.inspect}")
211
233
  @stats.run_recover = true
212
- Thread::new{
234
+ t = Thread::new{
213
235
  begin
214
- if args != nil
236
+ if args == nil || args.length == 0
215
237
  acquired_recover_process
216
238
  elsif args[0] == '-s'
217
239
  recover_process
@@ -225,12 +247,13 @@ module Roma
225
247
  end
226
248
  @stats.run_recover = false
227
249
  }
250
+ t[:name] = __method__
228
251
  end
229
252
 
230
253
  def asyncev_start_release_process(args)
231
254
  @log.debug("asyncev_start_release_process #{args}")
232
255
  @stats.run_release = true
233
- Thread::new{
256
+ t = Thread::new{
234
257
  begin
235
258
  release_process
236
259
  rescue => e
@@ -238,15 +261,17 @@ module Roma
238
261
  end
239
262
  @stats.run_relase = false
240
263
  }
264
+ t[:name] = __method__
241
265
  end
242
266
 
243
267
  def asyncev_start_sync_process(args)
244
268
  @log.debug("asyncev_start_sync_process")
245
269
  @stats.run_recover = true
246
- Thread::new{
270
+ t = Thread::new{
247
271
  sync_process(args)
248
272
  @stats.run_recover = false
249
273
  }
274
+ t[:name] = __method__
250
275
  end
251
276
 
252
277
  def sync_process(st)
@@ -354,9 +379,13 @@ module Roma
354
379
  def req_push_a_vnode(vn, src_nid, is_primary)
355
380
  con = Roma::Messaging::ConPool.instance.get_connection(src_nid)
356
381
  con.write("reqpushv #{vn} #{@stats.ap_str} #{is_primary}\r\n")
357
- res = con.gets # receive 'PUSHED\r\n' | 'REJECTED\r\n'
382
+ res = con.gets # receive 'PUSHED\r\n' | 'REJECTED\r\n' | 'ERROR\r\n'
358
383
  if res == "REJECTED\r\n"
359
384
  @log.warn("req_push_a_vnode:request was rejected from #{src_nid}.")
385
+ Roma::Messaging::ConPool.instance.return_connection(src_nid,con)
386
+ return :rejected
387
+ elsif res.start_with?("ERROR")
388
+ @log.warn("req_push_a_vnode:#{src_nid} busy.")
360
389
  return :rejected
361
390
  end
362
391
  Roma::Messaging::ConPool.instance.return_connection(src_nid,con)
@@ -606,9 +635,24 @@ module Roma
606
635
 
607
636
  def push_a_vnode_stream(hname, vn, nid)
608
637
  @stats.run_iterate_storage = true
609
- @log.info("push_a_vnode_stream:hname=#{hname} vn=#{vn} nid=#{nid}")
638
+ @log.info("#{__method__}:hname=#{hname} vn=#{vn} nid=#{nid}")
639
+
640
+ while(@stats.run_storage_clean_up)
641
+ @log.info("#{__method__}:stop clean up storage process")
642
+ @storages.each_value{|st| st.stop_clean_up}
643
+ sleep 0.1
644
+ end
645
+
610
646
  con = Roma::Messaging::ConPool.instance.get_connection(nid)
611
647
 
648
+ @do_push_a_vnode_stream = true
649
+
650
+ while(@stats.run_storage_clean_up)
651
+ @log.info("#{__method__}:stop_clean_up")
652
+ @storages.each_value{|st| st.stop_clean_up}
653
+ sleep 0.5
654
+ end
655
+
612
656
  con.write("spushv #{hname} #{vn}\r\n")
613
657
 
614
658
  res = con.gets # READY\r\n or error string
@@ -618,6 +662,13 @@ module Roma
618
662
  end
619
663
 
620
664
  @storages[hname].each_vn_dump(vn){|data|
665
+
666
+ unless @do_push_a_vnode_stream
667
+ con.close
668
+ @log.error("#{__method__}:canceled in hname=#{hname} vn=#{vn} nid=#{nid}")
669
+ return "CANCELED"
670
+ end
671
+
621
672
  @stats.run_iterate_storage = true
622
673
  con.write(data)
623
674
  sleep @stats.stream_copy_wait_param
@@ -643,7 +694,7 @@ module Roma
643
694
  return
644
695
  end
645
696
  @stats.run_storage_clean_up = true
646
- Thread::new{
697
+ t = Thread::new{
647
698
  begin
648
699
  storage_clean_up_process
649
700
  rescue =>e
@@ -652,6 +703,7 @@ module Roma
652
703
  @stats.run_storage_clean_up = false
653
704
  end
654
705
  }
706
+ t[:name] = __method__
655
707
  end
656
708
 
657
709
  def storage_clean_up_process
@@ -675,7 +727,7 @@ module Roma
675
727
  @stats.out_count += 1
676
728
  # @log.debug("#{__method__}:key=#{key} vn=#{vn}")
677
729
  nodes = @rttable.search_nodes_for_write(vn)
678
- next if(nodes.length <= 1)
730
+ next if(nodes == nil || nodes.length <= 1)
679
731
  nodes[1..-1].each{|nid|
680
732
  res = async_send_cmd(nid,"out #{key}\e#{hname} #{vn}\r\n")
681
733
  unless res