roma 0.8.2 → 0.8.10
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANG +326 -0
- data/CHANGELOG +132 -0
- data/{README.rdoc → FETCH_HEAD} +0 -0
- data/{LICENSE.rdoc → LICENSE} +0 -1
- data/README +17 -0
- data/Rakefile +33 -18
- data/ruby/server/bin/chg_redundancy +10 -0
- data/ruby/server/bin/key_access +7 -0
- data/ruby/server/bin/key_list +7 -0
- data/ruby/server/bin/mkconfig +19 -0
- data/{bin → ruby/server/bin}/mkrecent +0 -1
- data/{bin → ruby/server/bin}/mkroute +0 -1
- data/ruby/server/bin/multi_commander +19 -0
- data/ruby/server/bin/recoverlost +10 -0
- data/ruby/server/bin/recoverlost_alist +10 -0
- data/ruby/server/bin/recoverlost_alist_all +10 -0
- data/ruby/server/bin/recoverlost_alist_keys +10 -0
- data/{bin/recoverlost → ruby/server/bin/roma_watcher} +1 -2
- data/ruby/server/bin/romad +36 -0
- data/{bin → ruby/server/bin}/sample_watcher +0 -1
- data/{bin → ruby/server/bin}/sample_watcher2 +0 -1
- data/{bin/simple_bench → ruby/server/bin/sample_watcher3} +1 -2
- data/ruby/server/bin/simple_bench +26 -0
- data/{bin → ruby/server/bin}/ssroute +0 -1
- data/ruby/server/bin/test-scenario +11 -0
- data/{bin → ruby/server/bin}/tribunus +0 -1
- data/{lib → ruby/server/lib}/roma/async_process.rb +67 -15
- data/{lib → ruby/server/lib}/roma/command/bg_command_receiver.rb +1 -1
- data/ruby/server/lib/roma/command/command_definition.rb +422 -0
- data/ruby/server/lib/roma/command/mh_command_receiver.rb +127 -0
- data/ruby/server/lib/roma/command/receiver.rb +64 -0
- data/{lib → ruby/server/lib}/roma/command/rt_command_receiver.rb +6 -1
- data/ruby/server/lib/roma/command/sys_command_receiver.rb +609 -0
- data/{lib → ruby/server/lib}/roma/command/util_command_receiver.rb +15 -5
- data/{lib → ruby/server/lib}/roma/command/vn_command_receiver.rb +12 -4
- data/{lib → ruby/server/lib}/roma/command_plugin.rb +0 -0
- data/ruby/server/lib/roma/config.rb +84 -0
- data/{lib → ruby/server/lib}/roma/event/con_pool.rb +12 -1
- data/ruby/server/lib/roma/event/handler.rb +256 -0
- data/ruby/server/lib/roma/live_patch-20120302-001.rb +107 -0
- data/ruby/server/lib/roma/logging/rlogger.rb +163 -0
- data/ruby/server/lib/roma/messaging/con_pool.rb +92 -0
- data/{lib → ruby/server/lib}/roma/plugin/plugin_alist.rb +118 -240
- data/ruby/server/lib/roma/plugin/plugin_debug.rb +31 -0
- data/ruby/server/lib/roma/plugin/plugin_map.rb +177 -0
- data/ruby/server/lib/roma/plugin/plugin_mapcount.rb +185 -0
- data/{lib/roma/command/st_command_receiver.rb → ruby/server/lib/roma/plugin/plugin_storage.rb} +170 -146
- data/ruby/server/lib/roma/plugin/plugin_stub.rb +283 -0
- data/{lib → ruby/server/lib}/roma/plugin/plugin_test.rb +0 -0
- data/{lib → ruby/server/lib}/roma/romad.rb +221 -94
- data/{lib → ruby/server/lib}/roma/routing/cb_rttable.rb +4 -6
- data/{lib → ruby/server/lib}/roma/routing/merkle_tree.rb +0 -0
- data/ruby/server/lib/roma/routing/routing_data.rb +307 -0
- data/{lib → ruby/server/lib}/roma/routing/rttable.rb +4 -0
- data/{lib → ruby/server/lib}/roma/stats.rb +19 -3
- data/{lib → ruby/server/lib}/roma/storage/basic_storage.rb +25 -26
- data/{lib → ruby/server/lib}/roma/storage/dbm_storage.rb +1 -23
- data/{lib → ruby/server/lib}/roma/storage/dummy_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/rh_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/sqlite3_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/tc_storage.rb +62 -2
- data/ruby/server/lib/roma/tools/chg_redundancy.rb +36 -0
- data/ruby/server/lib/roma/tools/key_access.rb +105 -0
- data/ruby/server/lib/roma/tools/key_list.rb +94 -0
- data/ruby/server/lib/roma/tools/mkconfig.rb +535 -0
- data/{lib → ruby/server/lib}/roma/tools/mkrecent.rb +0 -0
- data/{lib → ruby/server/lib}/roma/tools/mkroute.rb +0 -0
- data/ruby/server/lib/roma/tools/multi_commander.rb +45 -0
- data/{lib → ruby/server/lib}/roma/tools/recoverlost.rb +0 -0
- data/{lib → ruby/server/lib}/roma/tools/recoverlost_alist.rb +0 -0
- data/ruby/server/lib/roma/tools/recoverlost_alist_all.rb +8 -0
- data/ruby/server/lib/roma/tools/recoverlost_alist_keys.rb +16 -0
- data/ruby/server/lib/roma/tools/recoverlost_lib.rb +349 -0
- data/ruby/server/lib/roma/tools/roma_watcher.rb +150 -0
- data/ruby/server/lib/roma/tools/roma_watcher_config.yml.example +20 -0
- data/{lib → ruby/server/lib}/roma/tools/sample_watcher.rb +3 -1
- data/{lib → ruby/server/lib}/roma/tools/sample_watcher2.rb +3 -1
- data/ruby/server/lib/roma/tools/sample_watcher3.rb +49 -0
- data/{lib → ruby/server/lib}/roma/tools/simple_bench.rb +2 -0
- data/ruby/server/lib/roma/tools/simple_bench2.rb +78 -0
- data/{lib → ruby/server/lib}/roma/tools/ssroute.rb +0 -0
- data/ruby/server/lib/roma/tools/test-scenario.rb +327 -0
- data/{lib → ruby/server/lib}/roma/tools/tribunus.rb +0 -0
- data/ruby/server/lib/roma/version.rb +4 -0
- data/{lib → ruby/server/lib}/roma/write_behind.rb +1 -0
- data/ruby/server/test/config4mhash.rb +68 -0
- data/ruby/server/test/config4storage_error.rb +69 -0
- data/{lib/roma/config.rb → ruby/server/test/config4test.rb} +6 -3
- data/{test → ruby/server/test}/rcirb.rb +0 -1
- data/{test → ruby/server/test}/roma-test-utils.rb +21 -8
- data/{test → ruby/server/test}/run-test.rb +3 -2
- data/ruby/server/test/storage_error_storage.rb +37 -0
- data/ruby/server/test/t_command_definition.rb +326 -0
- data/{test → ruby/server/test}/t_cpdata.rb +9 -3
- data/{test → ruby/server/test}/t_listplugin.rb +48 -12
- data/ruby/server/test/t_mapcountplugin.rb +231 -0
- data/ruby/server/test/t_mapplugin.rb +131 -0
- data/ruby/server/test/t_mhash.rb +222 -0
- data/ruby/server/test/t_rclient.rb +199 -0
- data/{test → ruby/server/test}/t_routing_data.rb +56 -0
- data/{test → ruby/server/test}/t_storage.rb +107 -111
- data/ruby/server/test/t_storage_error.rb +61 -0
- data/ruby/server/test/t_writebehind.rb +374 -0
- metadata +150 -82
- data/bin/recoverlost_alist +0 -8
- data/bin/romad +0 -7
- data/lib/roma/command/mh_command_receiver.rb +0 -117
- data/lib/roma/command/receiver.rb +0 -287
- data/lib/roma/event/handler.rb +0 -159
- data/lib/roma/plugin/plugin_debug.rb +0 -19
- data/lib/roma/tools/recoverlost_lib.rb +0 -217
- data/lib/roma/version.rb +0 -4
- data/test/t_rclient.rb +0 -318
- data/test/t_writebehind.rb +0 -200
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
module Roma
|
3
|
+
module CommandPlugin
|
4
|
+
|
5
|
+
module PluginOperation
|
6
|
+
include ::Roma::CommandPlugin
|
7
|
+
|
8
|
+
# DANGER!!
|
9
|
+
def ev_eval(s)
|
10
|
+
cmd = s[1..-1].join(' ')
|
11
|
+
@log.debug("eval(#{cmd})")
|
12
|
+
send_data("#{eval(cmd)}\r\n")
|
13
|
+
rescue Exception =>e
|
14
|
+
send_data("#{e}\r\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_key_info(key)
|
18
|
+
d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits
|
19
|
+
vn = @rttable.get_vnode_id(d)
|
20
|
+
nodes = @rttable.search_nodes_for_write(vn)
|
21
|
+
s = sprintf("d = %s 0x%x\r\n",d,d)
|
22
|
+
send_data(s)
|
23
|
+
s = sprintf("vn = %s 0x%x\r\n",vn,vn)
|
24
|
+
send_data(s)
|
25
|
+
send_data("nodes = #{nodes.inspect}\r\n")
|
26
|
+
"END"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'roma/messaging/con_pool'
|
2
|
+
require 'roma/command/command_definition'
|
3
|
+
|
4
|
+
module Roma
|
5
|
+
module CommandPlugin
|
6
|
+
|
7
|
+
module PluginMap
|
8
|
+
include Roma::CommandPlugin
|
9
|
+
include Roma::Command::Definition
|
10
|
+
|
11
|
+
# map_set <key> <mapkey> <flags> <expt> <bytes> [forward]\r\n
|
12
|
+
# <data block>\r\n
|
13
|
+
#
|
14
|
+
# (STORED|NOT_STORED|SERVER_ERROR <error message>)\r\n
|
15
|
+
def_write_command_with_key_value :map_set, 5 do |ctx|
|
16
|
+
v = {}
|
17
|
+
v = Marshal.load(ctx.stored.value) if ctx.stored
|
18
|
+
|
19
|
+
v[ctx.argv[2]] = ctx.params.value
|
20
|
+
expt = chg_time_expt(ctx.argv[4].to_i)
|
21
|
+
|
22
|
+
# [flags, expire time, value, kind of counter(:write/:delete), result message]
|
23
|
+
[0, expt, Marshal.dump(v), :write, 'STORED']
|
24
|
+
end
|
25
|
+
|
26
|
+
# map_get <key> <mapkey> [forward]\r\n
|
27
|
+
#
|
28
|
+
# (
|
29
|
+
# [VALUE <key> 0 <value length>\r\n
|
30
|
+
# <value>\r\n]
|
31
|
+
# END\r\n
|
32
|
+
# |SERVER_ERROR <error message>\r\n)
|
33
|
+
def_read_command_with_key :map_get, :multi_line do |ctx|
|
34
|
+
if ctx.stored
|
35
|
+
v = Marshal.load(ctx.stored.value)[ctx.argv[2]]
|
36
|
+
send_data("VALUE #{ctx.params.key} 0 #{v.length}\r\n#{v}\r\n") if v
|
37
|
+
end
|
38
|
+
send_data("END\r\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
# map_delete <key> <mapkey> [forward]\r\n
|
42
|
+
#
|
43
|
+
# (DELETED|NOT_DELETED|NOT_FOUND|SERVER_ERROR <error message>)\r\n
|
44
|
+
def_write_command_with_key :map_delete do |ctx|
|
45
|
+
next send_data("NOT_FOUND\r\n") unless ctx.stored
|
46
|
+
|
47
|
+
v = Marshal.load(ctx.stored.value)
|
48
|
+
next send_data("NOT_DELETED\r\n") unless v.key?(ctx.argv[2])
|
49
|
+
|
50
|
+
v.delete(ctx.argv[2])
|
51
|
+
|
52
|
+
[0, ctx.stored.expt, Marshal.dump(v), :delete, 'DELETED']
|
53
|
+
end
|
54
|
+
|
55
|
+
# map_clear <key> [forward]\r\n
|
56
|
+
#
|
57
|
+
# (CLEARED|NOT_CLEARED|NOT_FOUND|SERVER_ERROR <error message>)\r\n
|
58
|
+
def_write_command_with_key :map_clear do |ctx|
|
59
|
+
next send_data("NOT_FOUND\r\n") unless ctx.stored
|
60
|
+
|
61
|
+
[0, ctx.stored.expt, Marshal.dump({}), :delete, 'CLEARED']
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
# map_size <key> [forward]\r\n
|
66
|
+
#
|
67
|
+
# (<length>|NOT_FOUND|SERVER_ERROR <error message>)\r\n
|
68
|
+
def_read_command_with_key :map_size do |ctx|
|
69
|
+
if ctx.stored
|
70
|
+
ret = Marshal.load(ctx.stored.value).size
|
71
|
+
send_data("#{ret}\r\n")
|
72
|
+
else
|
73
|
+
send_data("NOT_FOUND\r\n")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# map_key? <key> <mapkey> [forward]\r\n
|
78
|
+
#
|
79
|
+
# (true|false|NOT_FOUND|SERVER_ERROR <error message>)\r\n
|
80
|
+
def_read_command_with_key :map_key? do |ctx|
|
81
|
+
if ctx.stored
|
82
|
+
ret = Marshal.load(ctx.stored.value).key? ctx.argv[2]
|
83
|
+
send_data("#{ret}\r\n")
|
84
|
+
else
|
85
|
+
send_data("NOT_FOUND\r\n")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# map_value? <key> <bytes> [forward]\r\n
|
90
|
+
# <data block>\r\n
|
91
|
+
#
|
92
|
+
# (true|false|NOT_FOUND|SERVER_ERROR <error message>)\r\n
|
93
|
+
def_read_command_with_key_value :map_value?, 2 do |ctx|
|
94
|
+
if ctx.stored
|
95
|
+
ret = Marshal.load(ctx.stored.value).value? ctx.params.value
|
96
|
+
send_data("#{ret}\r\n")
|
97
|
+
else
|
98
|
+
send_data("NOT_FOUND\r\n")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# map_empty? <key> [forward]\r\n
|
103
|
+
#
|
104
|
+
# (true|false|NOT_FOUND|SERVER_ERROR <error message>)\r\n
|
105
|
+
def_read_command_with_key :map_empty? do |ctx|
|
106
|
+
if ctx.stored
|
107
|
+
v = Marshal.load(ctx.stored.value)
|
108
|
+
send_data("#{v.empty?}\r\n")
|
109
|
+
else
|
110
|
+
send_data("NOT_FOUND\r\n")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# map_keys <key> [forward]\r\n
|
115
|
+
#
|
116
|
+
# (
|
117
|
+
# [VALUE <key> 0 <length of length string>\r\n
|
118
|
+
# <length string>\r\n
|
119
|
+
# (VALUE <key> 0 <value length>\r\n
|
120
|
+
# <value>\r\n)*
|
121
|
+
# ]
|
122
|
+
# END\r\n
|
123
|
+
# |SERVER_ERROR <error message>\r\n)
|
124
|
+
def_read_command_with_key :map_keys, :multi_line do |ctx|
|
125
|
+
if ctx.stored
|
126
|
+
v = Marshal.load(ctx.stored.value).keys
|
127
|
+
len = v.length
|
128
|
+
send_data("VALUE #{ctx.params.key} 0 #{len.to_s.length}\r\n#{len.to_s}\r\n")
|
129
|
+
v.each{|val|
|
130
|
+
send_data("VALUE #{ctx.params.key} 0 #{val.length}\r\n#{val}\r\n")
|
131
|
+
}
|
132
|
+
end
|
133
|
+
send_data("END\r\n")
|
134
|
+
end
|
135
|
+
|
136
|
+
# map_values <key> [forward]\r\n
|
137
|
+
#
|
138
|
+
# (
|
139
|
+
# [VALUE <key> 0 <length of length string>\r\n
|
140
|
+
# <length string>\r\n
|
141
|
+
# (VALUE <key> 0 <value length>\r\n
|
142
|
+
# <value>\r\n)*
|
143
|
+
# ]
|
144
|
+
# END\r\n
|
145
|
+
# |SERVER_ERROR <error message>\r\n)
|
146
|
+
def_read_command_with_key :map_values, :multi_line do |ctx|
|
147
|
+
if ctx.stored
|
148
|
+
v = Marshal.load(ctx.stored.value).values
|
149
|
+
len = v.length
|
150
|
+
send_data("VALUE #{ctx.params.key} 0 #{len.to_s.length}\r\n#{len.to_s}\r\n")
|
151
|
+
v.each{|val|
|
152
|
+
send_data("VALUE #{ctx.params.key} 0 #{val.length}\r\n#{val}\r\n")
|
153
|
+
}
|
154
|
+
end
|
155
|
+
send_data("END\r\n")
|
156
|
+
end
|
157
|
+
|
158
|
+
# map_to_s <key> [forward]\r\n
|
159
|
+
#
|
160
|
+
# (
|
161
|
+
# [VALUE <key> 0 <value length>\r\n
|
162
|
+
# <value>\r\n]
|
163
|
+
# END\r\n
|
164
|
+
# |SERVER_ERROR <error message>\r\n)
|
165
|
+
def_read_command_with_key :map_to_s, :multi_line do |ctx|
|
166
|
+
if ctx.stored
|
167
|
+
v = Marshal.load(ctx.stored.value).inspect
|
168
|
+
send_data("VALUE #{ctx.params.key} 0 #{v.length}\r\n#{v}\r\n")
|
169
|
+
end
|
170
|
+
send_data("END\r\n")
|
171
|
+
end
|
172
|
+
|
173
|
+
end # module PluginMap
|
174
|
+
end # module CommandPlugin
|
175
|
+
end # module Roma
|
176
|
+
|
177
|
+
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'roma/command/command_definition'
|
3
|
+
|
4
|
+
module Roma
|
5
|
+
module CommandPlugin
|
6
|
+
|
7
|
+
module PluginMapCount
|
8
|
+
include ::Roma::CommandPlugin
|
9
|
+
include ::Roma::Command::Definition
|
10
|
+
|
11
|
+
# mapcount_countup <key> <expt> <sub_keys_length>\r\n
|
12
|
+
# <sub_keys> \r\n
|
13
|
+
#
|
14
|
+
# (
|
15
|
+
# VALUE <key> 0 <length of json string>\r\n
|
16
|
+
# <json string>\r\n
|
17
|
+
# END\r\n
|
18
|
+
# |CLIENT_ERROR invalid sub_keys format: <sub_keys>\r\n
|
19
|
+
# |SERVER_ERROR <error message>\r\n)
|
20
|
+
def_write_command_with_key_value :mapcount_countup, 3, :multi_line do |ctx|
|
21
|
+
countup(ctx, :json)
|
22
|
+
end
|
23
|
+
|
24
|
+
# mapcount_countup_ms <key> <expt> <sub_keys_length>\r\n
|
25
|
+
# <sub_keys> \r\n
|
26
|
+
#
|
27
|
+
# (
|
28
|
+
# VALUE <key> 0 <length of Marshal string>\r\n
|
29
|
+
# <Marshal string>\r\n
|
30
|
+
# END\r\n
|
31
|
+
# |CLIENT_ERROR invalid sub_keys format: <sub_keys>\r\n
|
32
|
+
# |SERVER_ERROR <error message>\r\n)
|
33
|
+
def_write_command_with_key_value :mapcount_countup_ms, 3, :multi_line do |ctx|
|
34
|
+
countup(ctx, :marshal)
|
35
|
+
end
|
36
|
+
|
37
|
+
# mapcount_update <key> <expt> <sub_keys_length>\r\n
|
38
|
+
# <sub_keys>\r\n
|
39
|
+
#
|
40
|
+
# (
|
41
|
+
# [VALUE <key> 0 <length of json string>\r\n
|
42
|
+
# <json string>\r\n]
|
43
|
+
# END\r\n
|
44
|
+
# |SERVER_ERROR <error message>\r\n)
|
45
|
+
def_write_command_with_key_value :mapcount_update, 3, :multi_line do |ctx|
|
46
|
+
update(ctx, :json)
|
47
|
+
end
|
48
|
+
|
49
|
+
# mapcount_update_ms <key> <expt> <sub_keys_length>\r\n
|
50
|
+
# <sub_keys>\r\n
|
51
|
+
#
|
52
|
+
# (
|
53
|
+
# [VALUE <key> 0 <length of Marshal string>\r\n
|
54
|
+
# <Marshal string>\r\n]
|
55
|
+
# END\r\n
|
56
|
+
# |SERVER_ERROR <error message>\r\n)
|
57
|
+
def_write_command_with_key_value :mapcount_update_ms, 3, :multi_line do |ctx|
|
58
|
+
update(ctx, :marshal)
|
59
|
+
end
|
60
|
+
|
61
|
+
# mapcount_get <key> 0 <sub_keys_str_len>\r\n
|
62
|
+
# <sub_keys>\r\n
|
63
|
+
#
|
64
|
+
# (
|
65
|
+
# [VALUE <key> 0 <length of json string>\r\n
|
66
|
+
# <json string>\r\n]
|
67
|
+
# END\r\n
|
68
|
+
# |SERVER_ERROR <error message>\r\n)
|
69
|
+
def_read_command_with_key_value :mapcount_get, 3, :multi_line do |ctx|
|
70
|
+
get(ctx, :json)
|
71
|
+
end
|
72
|
+
|
73
|
+
# mapcount_get_ms <key> 0 <sub_keys_str_len>\r\n
|
74
|
+
# <sub_keys>\r\n
|
75
|
+
#
|
76
|
+
# (
|
77
|
+
# [VALUE <key> 0 <length of Marshal string>\r\n
|
78
|
+
# <Marshal string>\r\n]
|
79
|
+
# END\r\n
|
80
|
+
# |SERVER_ERROR <error message>\r\n)
|
81
|
+
def_read_command_with_key_value :mapcount_get_ms, 3, :multi_line do |ctx|
|
82
|
+
get(ctx, :marshal)
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
def countup(ctx, stype)
|
87
|
+
v = {}
|
88
|
+
v = data_load(ctx.stored.value) if ctx.stored
|
89
|
+
|
90
|
+
args = ctx.params.value.split(/\s*,\s*/)
|
91
|
+
args.each do |arg|
|
92
|
+
if arg =~ /^([A-Za-z0-9]+)(:(\-?[\d]+))?$/
|
93
|
+
key = $1
|
94
|
+
count = 1
|
95
|
+
count = $3.to_i if $3
|
96
|
+
v[key] ||= 0
|
97
|
+
v[key] += count
|
98
|
+
else
|
99
|
+
raise ClientErrorException, "invalid sub_keys format: #{ctx.params.value}"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
v["last_updated_date"] = Time.now.gmtime.strftime(DATE_FORMAT)
|
104
|
+
expt = chg_time_expt(ctx.argv[2].to_i)
|
105
|
+
|
106
|
+
ret_str = return_str(v, stype)
|
107
|
+
ret_msg = "VALUE #{ctx.params.key} 0 #{ret_str.length}\r\n#{ret_str}\r\nEND"
|
108
|
+
[0, expt, Marshal.dump(v), :write, ret_msg]
|
109
|
+
end
|
110
|
+
|
111
|
+
def update(ctx, stype)
|
112
|
+
if !ctx.stored
|
113
|
+
send_data("END\r\n")
|
114
|
+
return
|
115
|
+
end
|
116
|
+
|
117
|
+
v = {}
|
118
|
+
v = data_load(ctx.stored.value)
|
119
|
+
v["last_updated_date"] = Time.now.gmtime.strftime(DATE_FORMAT)
|
120
|
+
|
121
|
+
if v.is_a?(Hash)
|
122
|
+
args = ctx.params.value.split(/\s*,\s*/)
|
123
|
+
if args.count == 0
|
124
|
+
ret = return_str(v, stype)
|
125
|
+
else
|
126
|
+
ret = {}
|
127
|
+
ret["last_updated_date"] = v["last_updated_date"]
|
128
|
+
args.each do |arg|
|
129
|
+
ret[arg] = v[arg] if v[arg] != nil
|
130
|
+
end
|
131
|
+
ret = return_str(ret, stype)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
expt = chg_time_expt(ctx.argv[2].to_i)
|
136
|
+
|
137
|
+
ret_msg = "VALUE #{ctx.params.key} 0 #{ret.length}\r\n#{ret}\r\nEND"
|
138
|
+
[0, expt, Marshal.dump(v), :write, ret_msg]
|
139
|
+
end
|
140
|
+
|
141
|
+
def get(ctx, stype)
|
142
|
+
ret = nil
|
143
|
+
if ctx.stored
|
144
|
+
ret_val = data_load(ctx.stored.value)
|
145
|
+
|
146
|
+
if ret_val.is_a?(Hash)
|
147
|
+
args = ctx.params.value.split(/\s*,\s*/)
|
148
|
+
if args.count == 0
|
149
|
+
ret = return_str(ret_val, stype)
|
150
|
+
else
|
151
|
+
ret = {}
|
152
|
+
ret["last_updated_date"] = ret_val["last_updated_date"]
|
153
|
+
args.each do |arg|
|
154
|
+
ret[arg] = ret_val[arg] if ret_val[arg] != nil
|
155
|
+
end
|
156
|
+
ret = return_str(ret, stype)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
send_data("VALUE #{ctx.params.key} 0 #{ret.length}\r\n#{ret}\r\n") if ret
|
162
|
+
send_data("END\r\n")
|
163
|
+
end
|
164
|
+
|
165
|
+
def return_str(data, stype)
|
166
|
+
return Marshal.dump(data) if stype == :marshal
|
167
|
+
data.to_json
|
168
|
+
end
|
169
|
+
|
170
|
+
def data_load(data)
|
171
|
+
begin
|
172
|
+
Marshal.load(data)
|
173
|
+
rescue => e
|
174
|
+
msg = "SERVER_ERROR #{e} #{$@}".tr("\r\n"," ")
|
175
|
+
send_data("#{msg}\r\n")
|
176
|
+
@log.error("#{e} #{$@}")
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
DATE_FORMAT = "%Y-%m-%dT%H:%M:%S +00"
|
181
|
+
|
182
|
+
PLUGIN_MAPCOUNT_VERSION = "1.0.1"
|
183
|
+
end # PluginMapCount
|
184
|
+
end # CommandPlugin
|
185
|
+
end # Roma
|
data/{lib/roma/command/st_command_receiver.rb → ruby/server/lib/roma/plugin/plugin_storage.rb}
RENAMED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'zlib'
|
2
2
|
require 'digest/sha1'
|
3
|
-
require "roma/config"
|
4
3
|
require 'roma/async_process'
|
5
4
|
|
6
5
|
module Roma
|
7
|
-
module
|
6
|
+
module CommandPlugin
|
8
7
|
|
9
|
-
module
|
8
|
+
module PluginStorage
|
9
|
+
include ::Roma::CommandPlugin
|
10
10
|
|
11
11
|
# "set" means "store this data".
|
12
12
|
# <command name> <key> <flags> <exptime> <bytes> [noreply]\r\n
|
@@ -14,91 +14,58 @@ module Roma
|
|
14
14
|
def ev_set(s); set(:set,s); end
|
15
15
|
def ev_fset(s); fset(:set,s); end
|
16
16
|
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
def ev_rset(s)
|
17
|
+
# get <key>*\r\n
|
18
|
+
def ev_get(s)
|
19
|
+
return ev_gets(s) if s.length > 2
|
20
|
+
|
22
21
|
key,hname = s[1].split("\e")
|
23
22
|
hname ||= @defhash
|
24
|
-
d =
|
25
|
-
d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits if d == 0
|
26
|
-
data = read_bytes(s[5].to_i)
|
27
|
-
read_bytes(2)
|
23
|
+
d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits
|
28
24
|
vn = @rttable.get_vnode_id(d)
|
29
|
-
|
30
|
-
|
25
|
+
nodes = @rttable.search_nodes(vn)
|
26
|
+
|
27
|
+
unless nodes.include?(@nid)
|
28
|
+
@log.warn("forward get #{s[1]}")
|
29
|
+
res = forward_get(nodes[0], s[1], d)
|
30
|
+
if res
|
31
|
+
send_data(res)
|
32
|
+
else
|
33
|
+
send_data("SERVER_ERROR Message forward failed.\r\n")
|
34
|
+
end
|
31
35
|
return
|
32
36
|
end
|
33
|
-
if @storages[hname].rset(vn, key, d, s[3].to_i, s[4].to_i, data)
|
34
|
-
send_data("STORED\r\n")
|
35
|
-
else
|
36
|
-
@log.error("rset NOT_STORED:#{@storages[hname].error_message} #{vn} #{s[1]} #{d} #{s[3]} #{s[4]}")
|
37
|
-
send_data("NOT_STORED\r\n")
|
38
|
-
end
|
39
|
-
@stats.redundant_count += 1
|
40
|
-
end
|
41
37
|
|
42
|
-
# <command name> <key> <digest> <exptime> <bytes> [noreply]\r\n
|
43
|
-
# <compressed data block>\r\n
|
44
|
-
def ev_rzset(s)
|
45
|
-
key,hname = s[1].split("\e")
|
46
|
-
hname ||= @defhash
|
47
|
-
d = s[2].to_i
|
48
|
-
d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits if d == 0
|
49
|
-
zdata = read_bytes(s[5].to_i)
|
50
|
-
read_bytes(2)
|
51
|
-
vn = @rttable.get_vnode_id(d)
|
52
38
|
unless @storages.key?(hname)
|
53
39
|
send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
|
54
40
|
return
|
55
41
|
end
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
else
|
61
|
-
@log.error("rzset NOT_STORED:#{@storages[hname].error_message} #{vn} #{s[1]} #{d} #{s[3]} #{s[4]}")
|
62
|
-
send_data("NOT_STORED\r\n")
|
63
|
-
end
|
64
|
-
@stats.redundant_count += 1
|
65
|
-
rescue Zlib::DataError => e
|
66
|
-
@log.error("rzset NOT_STORED:#{e} #{vn} #{s[1]} #{d} #{s[3]} #{s[4]}")
|
67
|
-
send_data("NOT_STORED\r\n")
|
42
|
+
data = @storages[hname].get(vn, key, 0)
|
43
|
+
@stats.read_count += 1
|
44
|
+
send_data("VALUE #{s[1]} 0 #{data.length}\r\n#{data}\r\n") if data
|
45
|
+
send_data("END\r\n")
|
68
46
|
end
|
69
47
|
|
70
|
-
#
|
71
|
-
def
|
72
|
-
return ev_gets(s) if s.length > 2
|
73
|
-
|
48
|
+
# fget <key>
|
49
|
+
def ev_fget(s)
|
74
50
|
key,hname = s[1].split("\e")
|
75
51
|
hname ||= @defhash
|
76
52
|
d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits
|
77
53
|
vn = @rttable.get_vnode_id(d)
|
54
|
+
nodes = @rttable.search_nodes(vn)
|
55
|
+
|
56
|
+
unless nodes.include?(@nid)
|
57
|
+
@log.error("fget failed key=#{s[1]} vn=#{vn}")
|
58
|
+
return send_data("SERVER_ERROR Routing table is inconsistent.\r\n")
|
59
|
+
end
|
60
|
+
|
78
61
|
unless @storages.key?(hname)
|
79
62
|
send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
|
80
63
|
return
|
81
64
|
end
|
82
65
|
data = @storages[hname].get(vn, key, 0)
|
83
66
|
@stats.read_count += 1
|
84
|
-
if data
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
nodes = @rttable.search_nodes(vn)
|
89
|
-
if nodes.include?(@nid)
|
90
|
-
return send_data("END\r\n")
|
91
|
-
end
|
92
|
-
|
93
|
-
nodes.delete(@nid)
|
94
|
-
if nodes.length != 0
|
95
|
-
@log.warn("forward get #{s[1]}")
|
96
|
-
res = forward_get(nodes[0], s[1], d)
|
97
|
-
if res
|
98
|
-
return send_data(res)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
send_data("SERVER_ERROR Message forward failed.\r\n")
|
67
|
+
send_data("VALUE #{s[1]} 0 #{data.length}\r\n#{data}\r\n") if data
|
68
|
+
send_data("END\r\n")
|
102
69
|
end
|
103
70
|
|
104
71
|
# gets <key>*\r\n
|
@@ -150,15 +117,15 @@ module Roma
|
|
150
117
|
vn = @rttable.get_vnode_id(d)
|
151
118
|
nodes = @rttable.search_nodes_for_write(vn)
|
152
119
|
if nodes[0] != @nid
|
153
|
-
cmd = "fdelete #{
|
120
|
+
cmd = "fdelete #{key}\e#{hname}"
|
154
121
|
s[2..-1].each{|c| cmd << " #{c}"}
|
155
122
|
cmd << "\r\n"
|
156
123
|
@log.warn("forward delete #{s[1]}")
|
157
124
|
res = send_cmd(nodes[0], cmd)
|
158
|
-
if res
|
159
|
-
return send_data("
|
125
|
+
if res == nil || res.start_with?("ERROR")
|
126
|
+
return send_data("SERVER_ERROR Message forward failed.\r\n")
|
160
127
|
end
|
161
|
-
return send_data("
|
128
|
+
return send_data("#{res}\r\n")
|
162
129
|
end
|
163
130
|
unless @storages.key?(hname)
|
164
131
|
send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
|
@@ -166,11 +133,20 @@ module Roma
|
|
166
133
|
end
|
167
134
|
res = @storages[hname].delete(vn, key, d)
|
168
135
|
@stats.delete_count += 1
|
136
|
+
|
169
137
|
return send_data("NOT_DELETED\r\n") unless res
|
170
138
|
return send_data("NOT_FOUND\r\n") if res == :deletemark
|
171
139
|
|
140
|
+
if @stats.wb_command_map.key?(:delete)
|
141
|
+
Roma::WriteBehindProcess::push(hname, @stats.wb_command_map[:delete], key, res[4])
|
142
|
+
end
|
143
|
+
|
172
144
|
nodes[1..-1].each{ |nid|
|
173
|
-
send_cmd(nid,"rdelete #{
|
145
|
+
res2 = send_cmd(nid,"rdelete #{key}\e#{hname} #{res[2]}\r\n")
|
146
|
+
unless res2
|
147
|
+
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('rdelete',[nid,hname,s[1],res[2]]))
|
148
|
+
@log.warn("rdelete failed:#{s[1]}\e#{hname} #{d} #{res[2]} -> #{nid}")
|
149
|
+
end
|
174
150
|
}
|
175
151
|
return send_data("NOT_FOUND\r\n") unless res[4]
|
176
152
|
send_data("DELETED\r\n")
|
@@ -193,12 +169,21 @@ module Roma
|
|
193
169
|
end
|
194
170
|
res = @storages[hname].delete(vn, key, d)
|
195
171
|
@stats.delete_count += 1
|
172
|
+
|
196
173
|
return send_data("NOT_DELETED\r\n") unless res
|
197
174
|
return send_data("NOT_FOUND\r\n") if res == :deletemark
|
198
175
|
|
176
|
+
if @stats.wb_command_map.key?(:delete)
|
177
|
+
Roma::WriteBehindProcess::push(hname, @stats.wb_command_map[:delete], key, res[4])
|
178
|
+
end
|
179
|
+
|
199
180
|
nodes.delete(@nid)
|
200
181
|
nodes.each{ |nid|
|
201
|
-
send_cmd(nid,"rdelete #{
|
182
|
+
res2 = send_cmd(nid,"rdelete #{key}\e#{hname} #{res[2]}\r\n")
|
183
|
+
unless res2
|
184
|
+
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('rdelete',[nid,hname,s[1],res[2]]))
|
185
|
+
@log.warn("rdelete failed:#{s[1]}\e#{hname} #{d} #{res[2]} -> #{nid}")
|
186
|
+
end
|
202
187
|
}
|
203
188
|
return send_data("NOT_FOUND\r\n") unless res[4]
|
204
189
|
send_data("DELETED\r\n")
|
@@ -221,24 +206,6 @@ module Roma
|
|
221
206
|
end
|
222
207
|
end
|
223
208
|
|
224
|
-
# out <key> <vn>
|
225
|
-
def ev_out(s)
|
226
|
-
key,hname = s[1].split("\e")
|
227
|
-
hname ||= @defhash
|
228
|
-
if s.length >= 3
|
229
|
-
vn = s[2].to_i
|
230
|
-
else
|
231
|
-
d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits
|
232
|
-
vn = @rttable.get_vnode_id(d)
|
233
|
-
end
|
234
|
-
res = @storages[hname].out(vn, key, 0)
|
235
|
-
@stats.out_message_count += 1
|
236
|
-
unless res
|
237
|
-
return send_data("NOT_DELETED\r\n")
|
238
|
-
end
|
239
|
-
send_data("DELETED\r\n")
|
240
|
-
end
|
241
|
-
|
242
209
|
# "add" means that "add a new data to a store"
|
243
210
|
# <command name> <key> <flags> <exptime> <bytes> [noreply]\r\n
|
244
211
|
# <data block>\r\n
|
@@ -277,11 +244,11 @@ module Roma
|
|
277
244
|
nodes = @rttable.search_nodes_for_write(vn)
|
278
245
|
if nodes[0] != @nid
|
279
246
|
@log.warn("forward cas key=#{key} vn=#{vn} to #{nodes[0]}")
|
280
|
-
res = send_cmd(nodes[0],"fcas #{
|
281
|
-
if res
|
282
|
-
return send_data("
|
247
|
+
res = send_cmd(nodes[0],"fcas #{key}\e#{hname} #{d} #{s[3]} #{v.length} #{s[5]}\r\n#{v}\r\n")
|
248
|
+
if res == nil || res.start_with?("ERROR")
|
249
|
+
return send_data("SERVER_ERROR Message forward failed.\r\n")
|
283
250
|
end
|
284
|
-
return send_data("
|
251
|
+
return send_data("#{res}\r\n")
|
285
252
|
end
|
286
253
|
|
287
254
|
store_cas(hname, vn, key, d, s[5].to_i, s[3].to_i, v, nodes[1..-1])
|
@@ -313,6 +280,72 @@ module Roma
|
|
313
280
|
def ev_decr(s); incr_decr(:decr,s); end
|
314
281
|
def ev_fdecr(s); fincr_fdecr(:decr,s); end
|
315
282
|
|
283
|
+
# set_expt <key> <expt>
|
284
|
+
def ev_set_expt(s)
|
285
|
+
key,hname = s[1].split("\e")
|
286
|
+
hname ||= @defhash
|
287
|
+
d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits
|
288
|
+
vn = @rttable.get_vnode_id(d)
|
289
|
+
nodes = @rttable.search_nodes_for_write(vn)
|
290
|
+
if nodes[0] != @nid
|
291
|
+
@log.warn("forward set_expt key=#{key} vn=#{vn} to #{nodes[0]}")
|
292
|
+
res = send_cmd(nodes[0],"fset_expt #{s[1]} #{s[2]}\r\n")
|
293
|
+
if res
|
294
|
+
return send_data("#{res}\r\n")
|
295
|
+
end
|
296
|
+
return send_data("SERVER_ERROR Message forward failed.\r\n")
|
297
|
+
end
|
298
|
+
|
299
|
+
unless @storages.key?(hname)
|
300
|
+
send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
|
301
|
+
return
|
302
|
+
end
|
303
|
+
|
304
|
+
expt = chg_time_expt(s[2].to_i)
|
305
|
+
ret = @storages[hname].set_expt(vn, key, d, expt)
|
306
|
+
|
307
|
+
if ret
|
308
|
+
if @stats.wb_command_map.key?(:set_export)
|
309
|
+
Roma::WriteBehindProcess::push(hname, @stats.wb_command_map[:set_expt], k, expt.to_s)
|
310
|
+
end
|
311
|
+
redundant(nodes[1..-1], hname, key, d, ret[2], ret[3], ret[4])
|
312
|
+
send_data("STORED\r\n")
|
313
|
+
else
|
314
|
+
return send_data("NOT_STORED\r\n")
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
# fset_expt <key> <expt>
|
319
|
+
def ev_fset_expt(s)
|
320
|
+
key,hname = s[1].split("\e")
|
321
|
+
hname ||= @defhash
|
322
|
+
d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits
|
323
|
+
vn = @rttable.get_vnode_id(d)
|
324
|
+
nodes = @rttable.search_nodes_for_write(vn)
|
325
|
+
if nodes.include?(@nid) == false
|
326
|
+
@log.error("fset_expt failed key = #{s[1]} vn = #{vn}")
|
327
|
+
return send_data("SERVER_ERROR Routing table is inconsistent.\r\n")
|
328
|
+
end
|
329
|
+
|
330
|
+
unless @storages.key?(hname)
|
331
|
+
send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
|
332
|
+
return
|
333
|
+
end
|
334
|
+
|
335
|
+
expt = chg_time_expt(s[2].to_i)
|
336
|
+
ret = @storages[hname].set_expt(vn, key, d, expt)
|
337
|
+
|
338
|
+
if ret
|
339
|
+
if @stats.wb_command_map.key?(:set_export)
|
340
|
+
Roma::WriteBehindProcess::push(hname, @stats.wb_command_map[:set_expt], k, expt.to_s)
|
341
|
+
end
|
342
|
+
redundant(nodes[1..-1], hname, key, d, ret[2], ret[3], ret[4])
|
343
|
+
send_data("STORED\r\n")
|
344
|
+
else
|
345
|
+
return send_data("NOT_STORED\r\n")
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
316
349
|
# set_size_of_zredundant <n>
|
317
350
|
def ev_set_size_of_zredundant(s)
|
318
351
|
if s.length != 2 || s[1].to_i == 0
|
@@ -337,18 +370,30 @@ module Roma
|
|
337
370
|
|
338
371
|
def forward_get(nid, k, d)
|
339
372
|
con = get_connection(nid)
|
340
|
-
con.send("
|
373
|
+
con.send("fget #{k}\r\n")
|
341
374
|
res = con.gets
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
375
|
+
if res == nil
|
376
|
+
@rttable.proc_failed(nid)
|
377
|
+
@log.error("forward get failed:nid=#{nid} key=#{k}")
|
378
|
+
return nil
|
379
|
+
elsif res == "END\r\n"
|
380
|
+
# value dose not found
|
381
|
+
elsif res.start_with?("ERROR")
|
382
|
+
@rttable.proc_succeed(nid)
|
383
|
+
con.close_connection
|
384
|
+
return nil
|
385
|
+
else
|
386
|
+
s = res.split(/ /)
|
387
|
+
res << con.read_bytes(s[3].to_i + 2)
|
388
|
+
res << con.gets
|
389
|
+
end
|
346
390
|
return_connection(nid, con)
|
347
391
|
@rttable.proc_succeed(nid)
|
348
392
|
res
|
349
393
|
rescue => e
|
350
|
-
@rttable.proc_failed(nid)
|
351
|
-
@log.error("
|
394
|
+
@rttable.proc_failed(nid) if e.message != "no connection"
|
395
|
+
@log.error("#{e.inspect}/#{$@}")
|
396
|
+
@log.error("forward get failed:nid=#{nid} key=#{k}")
|
352
397
|
nil
|
353
398
|
end
|
354
399
|
|
@@ -371,18 +416,18 @@ module Roma
|
|
371
416
|
end
|
372
417
|
|
373
418
|
def store(fnc, hname, vn, k, d, expt, v, nodes)
|
374
|
-
|
375
|
-
expt = 0x7fffffff
|
376
|
-
elsif expt < 2592000
|
377
|
-
expt += Time.now.to_i
|
378
|
-
end
|
419
|
+
expt = chg_time_expt(expt)
|
379
420
|
unless @storages.key?(hname)
|
380
421
|
send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
|
381
422
|
return
|
382
423
|
end
|
383
424
|
ret = @storages[hname].send(fnc, vn, k, d, expt ,v)
|
384
425
|
@stats.write_count += 1
|
426
|
+
|
385
427
|
if ret
|
428
|
+
if @stats.wb_command_map.key?(fnc)
|
429
|
+
Roma::WriteBehindProcess::push(hname, @stats.wb_command_map[fnc], k, ret[4])
|
430
|
+
end
|
386
431
|
redundant(nodes, hname, k, d, ret[2], expt, ret[4])
|
387
432
|
send_data("STORED\r\n")
|
388
433
|
else
|
@@ -392,11 +437,7 @@ module Roma
|
|
392
437
|
end
|
393
438
|
|
394
439
|
def store_cas(hname, vn, k, d, clk, expt, v, nodes)
|
395
|
-
|
396
|
-
expt = 0x7fffffff
|
397
|
-
elsif expt < 2592000
|
398
|
-
expt += Time.now.to_i
|
399
|
-
end
|
440
|
+
expt = chg_time_expt(expt)
|
400
441
|
unless @storages.key?(hname)
|
401
442
|
send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
|
402
443
|
return
|
@@ -404,6 +445,7 @@ module Roma
|
|
404
445
|
|
405
446
|
ret = @storages[hname].cas(vn, k, d, clk, expt ,v)
|
406
447
|
@stats.write_count += 1
|
448
|
+
|
407
449
|
case ret
|
408
450
|
when nil
|
409
451
|
@log.error("cas NOT_STORED:#{hname} #{vn} #{k} #{d} #{expt} #{clk}")
|
@@ -413,56 +455,34 @@ module Roma
|
|
413
455
|
when :exists
|
414
456
|
send_data("EXISTS\r\n")
|
415
457
|
else
|
458
|
+
if @stats.wb_command_map.key?(:cas)
|
459
|
+
Roma::WriteBehindProcess::push(hname, @stats.wb_command_map[:cas], k, ret[4])
|
460
|
+
end
|
416
461
|
redundant(nodes, hname, k, d, ret[2], expt, ret[4])
|
417
462
|
send_data("STORED\r\n")
|
418
463
|
end
|
419
464
|
end
|
420
465
|
|
421
466
|
def redundant(nodes, hname, k, d, clk, expt, v)
|
422
|
-
if @rttable.min_version == nil || @rttable.min_version < 0x000306 # ver.0.3.6
|
423
|
-
return redundant_older_than_000306(nodes, hname, k, d, clk, expt, v)
|
424
|
-
end
|
425
|
-
|
426
467
|
if @stats.size_of_zredundant > 0 && @stats.size_of_zredundant < v.length
|
427
468
|
return zredundant(nodes, hname, k, d, clk, expt, v)
|
428
469
|
end
|
429
470
|
|
430
471
|
nodes.each{ |nid|
|
431
472
|
res = send_cmd(nid,"rset #{k}\e#{hname} #{d} #{clk} #{expt} #{v.length}\r\n#{v}\r\n")
|
432
|
-
|
473
|
+
if res == nil || res.start_with?("ERROR")
|
433
474
|
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('redundant',[nid,hname,k,d,clk,expt,v]))
|
434
475
|
@log.warn("redundant failed:#{k}\e#{hname} #{d} #{clk} #{expt} #{v.length} -> #{nid}")
|
435
476
|
end
|
436
477
|
}
|
437
478
|
end
|
438
479
|
|
439
|
-
def redundant_older_than_000306(nodes, hname, k, d, clk, expt, v)
|
440
|
-
nodes.each{ |nid|
|
441
|
-
if @rttable.version_of_nodes[nid] >= 0x000306 &&
|
442
|
-
@stats.size_of_zredundant > 0 && @stats.size_of_zredundant < v.length
|
443
|
-
|
444
|
-
zv = Zlib::Deflate.deflate(v) unless zv
|
445
|
-
res = send_cmd(nid,"rzset #{k}\e#{hname} #{d} #{clk} #{expt} #{zv.length}\r\n#{zv}\r\n")
|
446
|
-
unless res
|
447
|
-
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('zredundant',[nid,hname,k,d,clk,expt,zv]))
|
448
|
-
@log.warn("redundant_older_than_000306 failed:#{k}\e#{hname} #{d} #{clk} #{expt} #{zv.length} -> #{nid}")
|
449
|
-
end
|
450
|
-
else
|
451
|
-
res = send_cmd(nid,"rset #{k}\e#{hname} #{d} #{clk} #{expt} #{v.length}\r\n#{v}\r\n")
|
452
|
-
unless res
|
453
|
-
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('redundant',[nid,hname,k,d,clk,expt,v]))
|
454
|
-
@log.warn("redundant_older_than_000306 failed:#{k}\e#{hname} #{d} #{clk} #{expt} #{v.length} -> #{nid}")
|
455
|
-
end
|
456
|
-
end
|
457
|
-
}
|
458
|
-
end
|
459
|
-
|
460
480
|
def zredundant(nodes, hname, k, d, clk, expt, v)
|
461
481
|
zv = Zlib::Deflate.deflate(v)
|
462
482
|
|
463
483
|
nodes.each{ |nid|
|
464
484
|
res = send_cmd(nid,"rzset #{k}\e#{hname} #{d} #{clk} #{expt} #{zv.length}\r\n#{zv}\r\n")
|
465
|
-
|
485
|
+
if res == nil || res.start_with?("ERROR")
|
466
486
|
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('zredundant',[nid,hname,k,d,clk,expt,zv]))
|
467
487
|
@log.warn("zredundant failed:#{k}\e#{hname} #{d} #{clk} #{expt} #{zv.length} -> #{nid}")
|
468
488
|
end
|
@@ -480,10 +500,10 @@ module Roma
|
|
480
500
|
if nodes[0] != @nid
|
481
501
|
@log.warn("forward #{fnc} key=#{key} vn=#{vn} to #{nodes[0]}")
|
482
502
|
res = send_cmd(nodes[0],"f#{fnc} #{s[1]} #{d} #{s[3]} #{v.length}\r\n#{v}\r\n")
|
483
|
-
if res
|
484
|
-
return send_data("
|
503
|
+
if res == nil || res.start_with?("ERROR")
|
504
|
+
return send_data("SERVER_ERROR Message forward failed.\r\n")
|
485
505
|
end
|
486
|
-
return send_data("
|
506
|
+
return send_data("#{res}\r\n")
|
487
507
|
end
|
488
508
|
|
489
509
|
store(fnc, hname, vn, key, d, s[3].to_i, v, nodes[1..-1])
|
@@ -514,7 +534,11 @@ module Roma
|
|
514
534
|
end
|
515
535
|
res = @storages[hname].send(fnc, vn, k, d, v)
|
516
536
|
@stats.write_count += 1
|
537
|
+
|
517
538
|
if res
|
539
|
+
if @stats.wb_command_map.key?(fnc)
|
540
|
+
Roma::WriteBehindProcess::push(hname, @stats.wb_command_map[fnc], k, res[4])
|
541
|
+
end
|
518
542
|
redundant(nodes, hname, k, d, res[2], res[3], res[4])
|
519
543
|
send_data("#{res[4]}\r\n")
|
520
544
|
else
|
@@ -532,10 +556,10 @@ module Roma
|
|
532
556
|
if nodes[0] != @nid
|
533
557
|
@log.debug("forward #{fnc} key=#{s[1]} vn=#{vn} to #{nodes[0]}")
|
534
558
|
res = send_cmd(nodes[0],"f#{fnc} #{s[1]} #{d} #{s[2]}\r\n")
|
535
|
-
if res
|
536
|
-
return send_data("
|
559
|
+
if res == nil || res.start_with?("ERROR")
|
560
|
+
return send_data("SERVER_ERROR Message forward failed.\r\n")
|
537
561
|
end
|
538
|
-
return send_data("
|
562
|
+
return send_data("#{res}\r\n")
|
539
563
|
end
|
540
564
|
|
541
565
|
store_incr_decr(fnc, hname, vn, key, d, v, nodes[1..-1])
|
@@ -558,7 +582,7 @@ module Roma
|
|
558
582
|
store_incr_decr(fnc, hname, vn, key, d, v, nodes)
|
559
583
|
end
|
560
584
|
|
561
|
-
end # module
|
585
|
+
end # module PluginStorage
|
562
586
|
|
563
|
-
end # module
|
587
|
+
end # module CommandPlugin
|
564
588
|
end # module Roma
|