rims 0.2.4 → 0.2.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.
- checksums.yaml +4 -4
- data/ChangeLog +65 -0
- data/lib/rims.rb +0 -2
- data/lib/rims/cksum_kvs.rb +1 -1
- data/lib/rims/cmd.rb +67 -8
- data/lib/rims/lock.rb +2 -2
- data/lib/rims/mail_store.rb +38 -52
- data/lib/rims/protocol/decoder.rb +1274 -789
- data/lib/rims/protocol/parser.rb +79 -39
- data/lib/rims/rfc822.rb +31 -24
- data/lib/rims/service.rb +67 -20
- data/lib/rims/test.rb +4 -1
- data/lib/rims/version.rb +1 -1
- data/test/cmd/test_command.rb +1103 -108
- data/test/test_mail_store.rb +23 -137
- data/test/test_protocol_auth.rb +8 -1
- data/test/test_protocol_decoder.rb +615 -175
- data/test/test_protocol_fetch.rb +276 -147
- data/test/test_protocol_request.rb +6 -0
- data/test/test_protocol_search.rb +27 -1
- data/test/test_service.rb +99 -6
- metadata +2 -3
- data/lib/rims/pool.rb +0 -85
data/lib/rims/protocol/parser.rb
CHANGED
@@ -50,11 +50,16 @@ module RIMS
|
|
50
50
|
def scan_line(line)
|
51
51
|
atom_list = line.scan(/BODY(?:\.\S+)?\[.*?\](?:<\d+\.\d+>)?|[\[\]()]|".*?"|[^\[\]()\s]+/i).map{|s|
|
52
52
|
case (s)
|
53
|
-
when '(', ')', '[', ']', /\
|
53
|
+
when '(', ')', '[', ']', /\A NIL \z/ix
|
54
54
|
s.upcase.intern
|
55
|
-
when /\A"/
|
56
|
-
s.sub(/\A"
|
57
|
-
when
|
55
|
+
when /\A "/x
|
56
|
+
s.sub(/\A "/x, '').sub(/" \z/x, '')
|
57
|
+
when /
|
58
|
+
\A
|
59
|
+
(?<body_symbol>BODY) (?:\. (?<body_option>\S+))? \[ (?<body_section>.*) \]
|
60
|
+
(?:< (?<partial_origin>\d+) \. (?<partial_size>\d+) >)?
|
61
|
+
\z
|
62
|
+
/ix
|
58
63
|
body_symbol = $~[:body_symbol]
|
59
64
|
body_option = $~[:body_option]
|
60
65
|
body_section = $~[:body_section]
|
@@ -71,7 +76,7 @@ module RIMS
|
|
71
76
|
s
|
72
77
|
end
|
73
78
|
}
|
74
|
-
if ((atom_list[-1].is_a? String) && (atom_list[-1] =~ /\A{\d+}\z/)) then
|
79
|
+
if ((atom_list[-1].is_a? String) && (atom_list[-1] =~ /\A {\d+} \z/x)) then
|
75
80
|
next_size = $&[1..-2].to_i
|
76
81
|
@logger.debug("found literal: #{next_size} octets.") if @logger.debug?
|
77
82
|
@output.write("+ continue\r\n")
|
@@ -107,7 +112,7 @@ module RIMS
|
|
107
112
|
end
|
108
113
|
|
109
114
|
if (atom == nil && last_atom != nil) then
|
110
|
-
raise
|
115
|
+
raise SyntaxError, "not found a terminator: `#{last_atom}'"
|
111
116
|
end
|
112
117
|
|
113
118
|
syntax_list
|
@@ -121,7 +126,7 @@ module RIMS
|
|
121
126
|
if (atom_list.length < 2) then
|
122
127
|
raise 'need for tag and command.'
|
123
128
|
end
|
124
|
-
if (atom_list[0] =~ /\A[*+]/) then
|
129
|
+
if (atom_list[0] =~ /\A [*+]/x) then
|
125
130
|
raise "invalid command tag: #{atom_list[0]}"
|
126
131
|
end
|
127
132
|
return parse(atom_list)
|
@@ -132,10 +137,10 @@ module RIMS
|
|
132
137
|
end
|
133
138
|
|
134
139
|
class AuthenticationReader
|
135
|
-
def initialize(auth,
|
140
|
+
def initialize(auth, input_gets, output_write, logger)
|
136
141
|
@auth = auth
|
137
|
-
@
|
138
|
-
@
|
142
|
+
@input_gets = input_gets
|
143
|
+
@output_write = output_write
|
139
144
|
@logger = logger
|
140
145
|
end
|
141
146
|
|
@@ -168,15 +173,13 @@ module RIMS
|
|
168
173
|
if (server_challenge_data) then
|
169
174
|
server_challenge_data_base64 = Protocol.encode_base64(server_challenge_data)
|
170
175
|
@logger.debug("authenticate command: server challenge data: #{Protocol.io_data_log(server_challenge_data_base64)}") if @logger.debug?
|
171
|
-
@
|
172
|
-
@output.flush
|
176
|
+
@output_write.call([ "+ #{server_challenge_data_base64}\r\n" ])
|
173
177
|
else
|
174
178
|
@logger.debug("authenticate command: server challenge data is nil.") if @logger.debug?
|
175
|
-
@
|
176
|
-
@output.flush
|
179
|
+
@output_write.call([ "+ \r\n" ])
|
177
180
|
end
|
178
181
|
|
179
|
-
if (client_response_data_base64 = @
|
182
|
+
if (client_response_data_base64 = @input_gets.call) then
|
180
183
|
client_response_data_base64.strip!
|
181
184
|
@logger.debug("authenticate command: client response data: #{Protocol.io_data_log(client_response_data_base64)}") if @logger.debug?
|
182
185
|
if (client_response_data_base64 == '*') then
|
@@ -326,7 +329,7 @@ module RIMS
|
|
326
329
|
d = search_time.to_date
|
327
330
|
proc{|next_cond|
|
328
331
|
proc{|msg|
|
329
|
-
yield(@mail_store.msg_date(@folder.mbox_id, msg.uid).to_date, d) && next_cond.call(msg)
|
332
|
+
yield(@mail_store.msg_date(@folder.mbox_id, msg.uid).utc.to_date, d) && next_cond.call(msg)
|
330
333
|
}
|
331
334
|
}
|
332
335
|
end
|
@@ -337,7 +340,7 @@ module RIMS
|
|
337
340
|
proc{|next_cond|
|
338
341
|
proc{|msg|
|
339
342
|
if (mail_datetime = get_mail(msg).date) then
|
340
|
-
yield(mail_datetime.to_date, d) && next_cond.call(msg)
|
343
|
+
yield(mail_datetime.getutc.to_date, d) && next_cond.call(msg)
|
341
344
|
else
|
342
345
|
false
|
343
346
|
end
|
@@ -418,12 +421,19 @@ module RIMS
|
|
418
421
|
private :parse_or
|
419
422
|
|
420
423
|
def parse_text(search_string)
|
421
|
-
|
424
|
+
search_text = proc{|message_text| string_include?(search_string, message_text) }
|
425
|
+
search_mail = proc{|mail|
|
426
|
+
if (mail.multipart?) then
|
427
|
+
search_text.call(mail.header.raw_source) || mail.parts.any?{|m| search_mail.call(m) }
|
428
|
+
else
|
429
|
+
body_text = mail_body_text(mail)
|
430
|
+
search_text.call(mail.header.raw_source) || (body_text && search_text.call(body_text))
|
431
|
+
end
|
432
|
+
}
|
422
433
|
proc{|next_cond|
|
423
434
|
proc{|msg|
|
424
435
|
mail = get_mail(msg)
|
425
|
-
|
426
|
-
(search.call(mail.header.raw_source) || (body_txt && search.call(body_txt))) && next_cond.call(msg)
|
436
|
+
search_mail.call(mail) && next_cond.call(msg)
|
427
437
|
}
|
428
438
|
}
|
429
439
|
end
|
@@ -494,7 +504,7 @@ module RIMS
|
|
494
504
|
unless (octet_size_string = search_key.shift) then
|
495
505
|
raise SyntaxError, "need for a octet size of #{operation_name}."
|
496
506
|
end
|
497
|
-
unless ((octet_size_string.is_a? String) && (octet_size_string =~ /\A\d
|
507
|
+
unless ((octet_size_string.is_a? String) && (octet_size_string =~ /\A \d+ \z/x)) then
|
498
508
|
raise SyntaxError, "#{operation_name} octet size is expected as numeric string but was <#{octet_size_string}>."
|
499
509
|
end
|
500
510
|
|
@@ -650,26 +660,56 @@ module RIMS
|
|
650
660
|
|
651
661
|
class FetchParser
|
652
662
|
module Utils
|
663
|
+
def encode_value(object)
|
664
|
+
case (object)
|
665
|
+
when Symbol
|
666
|
+
object.to_s
|
667
|
+
when String
|
668
|
+
Protocol.quote(object)
|
669
|
+
when Integer
|
670
|
+
object.to_s
|
671
|
+
when NilClass
|
672
|
+
'NIL'.b
|
673
|
+
when Array
|
674
|
+
'('.b << object.map{|v| encode_value(v) }.join(' '.b) << ')'.b
|
675
|
+
else
|
676
|
+
raise "unknown value: #{object}"
|
677
|
+
end
|
678
|
+
end
|
679
|
+
module_function :encode_value
|
680
|
+
|
653
681
|
def encode_list(array)
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
when String
|
659
|
-
Protocol.quote(v)
|
660
|
-
when Integer
|
661
|
-
v.to_s
|
662
|
-
when NilClass
|
663
|
-
'NIL'
|
664
|
-
when Array
|
665
|
-
encode_list(v)
|
666
|
-
else
|
667
|
-
raise "unknown value: #{v}"
|
668
|
-
end
|
669
|
-
}.join(' '.b) << ')'.b
|
682
|
+
unless (array.is_a? Array) then
|
683
|
+
raise TypeError, 'not a array type.'
|
684
|
+
end
|
685
|
+
encode_value(array)
|
670
686
|
end
|
671
687
|
module_function :encode_list
|
672
688
|
|
689
|
+
def encode_bodystructure(array)
|
690
|
+
if ((array.length > 0) && (array.first.is_a? Array)) then
|
691
|
+
s = '('.b
|
692
|
+
array = array.dup
|
693
|
+
while (object = array.shift)
|
694
|
+
case (object)
|
695
|
+
when Array
|
696
|
+
s << encode_bodystructure(object)
|
697
|
+
else
|
698
|
+
s << ' '.b << encode_value(object)
|
699
|
+
end
|
700
|
+
end
|
701
|
+
s << ')'.b
|
702
|
+
elsif ((array.length > 0) && (array.first.upcase == 'MESSAGE')) then
|
703
|
+
msg_body_list = array[0..7].map{|v| encode_value(v) }
|
704
|
+
msg_body_list << encode_bodystructure(array[8])
|
705
|
+
msg_body_list << array[9..-1].map{|v| encode_value(v) }
|
706
|
+
'('.b << msg_body_list.join(' '.b) << ')'.b
|
707
|
+
else
|
708
|
+
encode_list(array)
|
709
|
+
end
|
710
|
+
end
|
711
|
+
module_function :encode_bodystructure
|
712
|
+
|
673
713
|
def encode_header(name_value_pair_list)
|
674
714
|
name_value_pair_list.map{|n, v| ''.b << n << ': ' << v << "\r\n" }.join('') << "\r\n"
|
675
715
|
end
|
@@ -886,7 +926,7 @@ module RIMS
|
|
886
926
|
section_text = nil
|
887
927
|
section_index_list = []
|
888
928
|
else
|
889
|
-
if (body.section_list[0] =~ /\A(?<index>\d+(?:\.\d+)*)(?:\.(?<text>.+))
|
929
|
+
if (body.section_list[0] =~ /\A (?<index>\d+(?:\.\d+)*) (?:\.(?<text>.+))? \z/x) then
|
890
930
|
section_text = $~[:text]
|
891
931
|
section_index_list = $~[:index].split(/\./).map{|i| i.to_i }
|
892
932
|
else
|
@@ -996,7 +1036,7 @@ module RIMS
|
|
996
1036
|
|
997
1037
|
def parse_bodystructure(msg_att_name)
|
998
1038
|
proc{|msg|
|
999
|
-
''.b << msg_att_name << ' '.b <<
|
1039
|
+
''.b << msg_att_name << ' '.b << encode_bodystructure(get_bodystructure_data(get_mail(msg)))
|
1000
1040
|
}
|
1001
1041
|
end
|
1002
1042
|
private :parse_bodystructure
|
data/lib/rims/rfc822.rb
CHANGED
@@ -25,9 +25,11 @@ module RIMS
|
|
25
25
|
|
26
26
|
for _name, value in field_pair_list
|
27
27
|
value.strip!
|
28
|
+
name.freeze
|
29
|
+
value.freeze
|
28
30
|
end
|
29
31
|
|
30
|
-
field_pair_list
|
32
|
+
field_pair_list.freeze
|
31
33
|
end
|
32
34
|
module_function :parse_header
|
33
35
|
|
@@ -46,12 +48,12 @@ module RIMS
|
|
46
48
|
else
|
47
49
|
value = $~[:token]
|
48
50
|
end
|
49
|
-
params[name.downcase] = [ name, value ]
|
51
|
+
params[name.downcase] = [ name.freeze, value.freeze ].freeze
|
50
52
|
end
|
51
53
|
|
52
|
-
[ main_type, sub_type, params ]
|
54
|
+
[ main_type.freeze, sub_type.freeze, params.freeze ].freeze
|
53
55
|
else
|
54
|
-
[ 'application', 'octet-stream', {} ]
|
56
|
+
[ 'application'.freeze, 'octet-stream'.freeze, {}.freeze ].freeze
|
55
57
|
end
|
56
58
|
end
|
57
59
|
module_function :parse_content_type
|
@@ -68,12 +70,13 @@ module RIMS
|
|
68
70
|
part_txt.lstrip!
|
69
71
|
part_txt.chomp!("\n")
|
70
72
|
part_txt.chomp!("\r")
|
73
|
+
part_txt.freeze
|
71
74
|
end
|
72
|
-
return part_list
|
75
|
+
return part_list.freeze
|
73
76
|
end
|
74
77
|
end
|
75
78
|
|
76
|
-
[]
|
79
|
+
[].freeze
|
77
80
|
end
|
78
81
|
module_function :parse_multipart_body
|
79
82
|
|
@@ -119,7 +122,7 @@ module RIMS
|
|
119
122
|
end
|
120
123
|
end
|
121
124
|
|
122
|
-
dst_txt
|
125
|
+
dst_txt.freeze
|
123
126
|
end
|
124
127
|
module_function :unquote_phrase
|
125
128
|
|
@@ -138,9 +141,9 @@ module RIMS
|
|
138
141
|
then
|
139
142
|
display_name = $~[:display_name]
|
140
143
|
group_list = $~[:group_list]
|
141
|
-
addr_list << [ nil, nil, unquote_phrase(display_name), nil ]
|
144
|
+
addr_list << [ nil, nil, unquote_phrase(display_name), nil ].freeze
|
142
145
|
addr_list.concat(parse_mail_address_list(group_list))
|
143
|
-
addr_list << [ nil, nil, nil, nil ]
|
146
|
+
addr_list << [ nil, nil, nil, nil ].freeze
|
144
147
|
elsif (src_txt.sub!(%r{
|
145
148
|
\A
|
146
149
|
\s*
|
@@ -149,7 +152,7 @@ module RIMS
|
|
149
152
|
,?
|
150
153
|
}x, ''))
|
151
154
|
then
|
152
|
-
addr_list << [ nil, nil, $~[:local_part], $~[:domain] ]
|
155
|
+
addr_list << [ nil, nil, $~[:local_part].freeze, $~[:domain].freeze ].freeze
|
153
156
|
elsif (src_txt.sub!(%r{
|
154
157
|
\A
|
155
158
|
\s*
|
@@ -174,13 +177,13 @@ module RIMS
|
|
174
177
|
route = $~[:route]
|
175
178
|
local_part = $~[:local_part]
|
176
179
|
domain = $~[:domain]
|
177
|
-
addr_list << [ unquote_phrase(display_name), route, local_part, domain ]
|
180
|
+
addr_list << [ unquote_phrase(display_name), route.freeze, local_part.freeze, domain.freeze ].freeze
|
178
181
|
else
|
179
182
|
break
|
180
183
|
end
|
181
184
|
end
|
182
185
|
|
183
|
-
addr_list
|
186
|
+
addr_list.freeze
|
184
187
|
end
|
185
188
|
module_function :parse_mail_address_list
|
186
189
|
|
@@ -188,7 +191,7 @@ module RIMS
|
|
188
191
|
include Enumerable
|
189
192
|
|
190
193
|
def initialize(header_txt)
|
191
|
-
@raw_source = header_txt
|
194
|
+
@raw_source = header_txt.freeze
|
192
195
|
@field_list = nil
|
193
196
|
@field_map = nil
|
194
197
|
end
|
@@ -197,14 +200,17 @@ module RIMS
|
|
197
200
|
|
198
201
|
def setup_header
|
199
202
|
if (@field_list.nil? || @field_map.nil?) then
|
200
|
-
@field_list =
|
203
|
+
@field_list = RFC822.parse_header(@raw_source)
|
201
204
|
@field_map = {}
|
202
|
-
for name, value in
|
203
|
-
@field_list << [ name, value ]
|
205
|
+
for name, value in @field_list
|
204
206
|
key = name.downcase
|
205
207
|
@field_map[key] = [] unless (@field_map.key? key)
|
206
208
|
@field_map[key] << value
|
207
209
|
end
|
210
|
+
@field_map.each_value do |value_list|
|
211
|
+
value_list.freeze
|
212
|
+
end
|
213
|
+
@field_map.freeze
|
208
214
|
self
|
209
215
|
end
|
210
216
|
end
|
@@ -248,7 +254,7 @@ module RIMS
|
|
248
254
|
|
249
255
|
class Body
|
250
256
|
def initialize(body_txt)
|
251
|
-
@raw_source = body_txt
|
257
|
+
@raw_source = body_txt.freeze
|
252
258
|
end
|
253
259
|
|
254
260
|
attr_reader :raw_source
|
@@ -256,7 +262,7 @@ module RIMS
|
|
256
262
|
|
257
263
|
class Message
|
258
264
|
def initialize(msg_txt)
|
259
|
-
@raw_source = msg_txt
|
265
|
+
@raw_source = msg_txt.freeze
|
260
266
|
@header = nil
|
261
267
|
@body = nil
|
262
268
|
@content_type = nil
|
@@ -356,12 +362,12 @@ module RIMS
|
|
356
362
|
end
|
357
363
|
|
358
364
|
def text?
|
359
|
-
|
365
|
+
media_main_type_upcase == 'TEXT'
|
360
366
|
end
|
361
367
|
|
362
368
|
def multipart?
|
363
369
|
if (@is_multipart.nil?) then
|
364
|
-
@is_multipart = (
|
370
|
+
@is_multipart = (media_main_type_upcase == 'MULTIPART')
|
365
371
|
end
|
366
372
|
@is_multipart
|
367
373
|
end
|
@@ -371,9 +377,9 @@ module RIMS
|
|
371
377
|
if (@parts.nil?) then
|
372
378
|
if (boundary = self.boundary) then
|
373
379
|
part_list = RFC822.parse_multipart_body(boundary, body.raw_source)
|
374
|
-
@parts = part_list.map{|msg_txt| Message.new(msg_txt) }
|
380
|
+
@parts = part_list.map{|msg_txt| Message.new(msg_txt) }.freeze
|
375
381
|
else
|
376
|
-
@parts = []
|
382
|
+
@parts = [].freeze
|
377
383
|
end
|
378
384
|
end
|
379
385
|
@parts
|
@@ -382,7 +388,7 @@ module RIMS
|
|
382
388
|
|
383
389
|
def message?
|
384
390
|
if (@is_message.nil?) then
|
385
|
-
@is_message = (
|
391
|
+
@is_message = (media_main_type_upcase == 'MESSAGE')
|
386
392
|
end
|
387
393
|
@is_message
|
388
394
|
end
|
@@ -406,7 +412,7 @@ module RIMS
|
|
406
412
|
end
|
407
413
|
end
|
408
414
|
|
409
|
-
@date
|
415
|
+
@date.freeze
|
410
416
|
end
|
411
417
|
end
|
412
418
|
|
@@ -416,6 +422,7 @@ module RIMS
|
|
416
422
|
addr_list = instance_variable_get(ivar_name)
|
417
423
|
if (addr_list.nil?) then
|
418
424
|
addr_list = header.field_value_list(field_name).map{|addr_list_str| RFC822.parse_mail_address_list(addr_list_str) }.inject(:+)
|
425
|
+
addr_list.freeze
|
419
426
|
instance_variable_set(ivar_name, addr_list)
|
420
427
|
end
|
421
428
|
addr_list
|
data/lib/rims/service.rb
CHANGED
@@ -130,6 +130,10 @@ module RIMS
|
|
130
130
|
# port: 143
|
131
131
|
# backlog: 64
|
132
132
|
# accept_polling_timeout_seconds: 0.1
|
133
|
+
# process_num: 4
|
134
|
+
# process_queue_size: 20
|
135
|
+
# process_queue_polling_timeout_seconds: 0.1
|
136
|
+
# process_send_io_polling_timeout_seconds: 0.1
|
133
137
|
# thread_num: 20
|
134
138
|
# thread_queue_size: 20
|
135
139
|
# thread_queue_polling_timeout_seconds: 0.1
|
@@ -153,10 +157,13 @@ module RIMS
|
|
153
157
|
# send_buffer_limit_size: 16384
|
154
158
|
# read_polling_interval_seconds: 1
|
155
159
|
# command_wait_timeout_seconds: 1800
|
156
|
-
#
|
157
|
-
#
|
158
|
-
#
|
159
|
-
#
|
160
|
+
# drb_services:
|
161
|
+
# process_num: 4
|
162
|
+
# engine:
|
163
|
+
# bulk_response_count: 100
|
164
|
+
# read_lock_timeout_seconds: 30
|
165
|
+
# write_lock_timeout_seconds: 30
|
166
|
+
# cleanup_write_lock_timeout_seconds: 1
|
160
167
|
# storage:
|
161
168
|
# meta_key_value_store:
|
162
169
|
# type: qdbm_depot
|
@@ -455,20 +462,19 @@ module RIMS
|
|
455
462
|
end
|
456
463
|
|
457
464
|
def process_num
|
458
|
-
|
459
|
-
0
|
465
|
+
@config.dig('server', 'process_num') || 0
|
460
466
|
end
|
461
467
|
|
462
468
|
def process_queue_size
|
463
|
-
20
|
469
|
+
@config.dig('server', 'process_queue_size') || 20
|
464
470
|
end
|
465
471
|
|
466
472
|
def process_queue_polling_timeout_seconds
|
467
|
-
0.1
|
473
|
+
@config.dig('server', 'process_queue_polling_timeout_seconds') || 0.1
|
468
474
|
end
|
469
475
|
|
470
476
|
def process_send_io_polling_timeout_seconds
|
471
|
-
0.1
|
477
|
+
@config.dig('server', 'process_send_io_polling_timeout_seconds') || 0.1
|
472
478
|
end
|
473
479
|
|
474
480
|
def thread_num
|
@@ -545,20 +551,28 @@ module RIMS
|
|
545
551
|
@config.dig('connection', 'command_wait_timeout_seconds') || 60 * 30)
|
546
552
|
end
|
547
553
|
|
554
|
+
def drb_process_num
|
555
|
+
@config.dig('drb_services', 'process_num') || 0
|
556
|
+
end
|
557
|
+
|
558
|
+
def bulk_response_count
|
559
|
+
@config.dig('drb_services', 'engine', 'bulk_response_count') || 100
|
560
|
+
end
|
561
|
+
|
548
562
|
def read_lock_timeout_seconds
|
549
|
-
@config.dig('
|
563
|
+
@config.dig('drb_services', 'engine', 'read_lock_timeout_seconds') ||
|
550
564
|
@config.dig('read_lock_timeout_seconds') || # for backward compatibility
|
551
565
|
30
|
552
566
|
end
|
553
567
|
|
554
568
|
def write_lock_timeout_seconds
|
555
|
-
@config.dig('
|
569
|
+
@config.dig('drb_services', 'engine', 'write_lock_timeout_seconds') ||
|
556
570
|
@config.dig('write_lock_timeout_seconds') || # for backward compatibility
|
557
571
|
30
|
558
572
|
end
|
559
573
|
|
560
574
|
def cleanup_write_lock_timeout_seconds
|
561
|
-
@config.dig('
|
575
|
+
@config.dig('drb_services', 'engine', 'cleanup_write_lock_timeout_seconds') ||
|
562
576
|
@config.dig('cleanup_write_lock_timeout_seconds') || # for backward compatibility
|
563
577
|
1
|
564
578
|
end
|
@@ -756,7 +770,32 @@ module RIMS
|
|
756
770
|
kvs_meta_open, kvs_meta_log = make_kvs_factory.call(@config.make_meta_key_value_store_params, 'meta')
|
757
771
|
kvs_text_open, kvs_text_log = make_kvs_factory.call(@config.make_text_key_value_store_params, 'text')
|
758
772
|
auth = @config.make_authentication
|
759
|
-
|
773
|
+
|
774
|
+
drb_process_num = @config.drb_process_num
|
775
|
+
if (@config.process_num > 0) then
|
776
|
+
unless (drb_process_num > 0) then
|
777
|
+
drb_process_num = 1
|
778
|
+
logger.warn('the number of dRuby processes needs to be 1 or more when the number of server processes is 1 or more.')
|
779
|
+
logger.warn("drb_services parameter: changed process_num: #{@config.drb_process_num} -> #{drb_process_num}")
|
780
|
+
end
|
781
|
+
end
|
782
|
+
|
783
|
+
services = Riser::DRbServices.new(drb_process_num)
|
784
|
+
services.add_sticky_process_service(:engine,
|
785
|
+
Riser::ResourceSet.build{|builder|
|
786
|
+
builder.at_create{|unique_user_id|
|
787
|
+
mail_store = MailStore.build(unique_user_id, kvs_meta_open, kvs_text_open)
|
788
|
+
Protocol::Decoder::Engine.new(unique_user_id, mail_store, logger,
|
789
|
+
bulk_response_count: @config.bulk_response_count,
|
790
|
+
read_lock_timeout_seconds: @config.read_lock_timeout_seconds,
|
791
|
+
write_lock_timeout_seconds: @config.write_lock_timeout_seconds,
|
792
|
+
cleanup_write_lock_timeout_seconds: @config.cleanup_write_lock_timeout_seconds)
|
793
|
+
}
|
794
|
+
builder.at_destroy{|engine|
|
795
|
+
engine.destroy
|
796
|
+
}
|
797
|
+
builder.alias_unref(:destroy)
|
798
|
+
})
|
760
799
|
|
761
800
|
server.before_start{|server_socket|
|
762
801
|
logger.info('start server.')
|
@@ -856,6 +895,8 @@ module RIMS
|
|
856
895
|
logger.info("connection parameter: send_buffer_limit_size=#{@config.send_buffer_limit_size}")
|
857
896
|
logger.info("connection parameter: read_polling_interval_seconds=#{conn_limits.read_polling_interval_seconds}")
|
858
897
|
logger.info("connection parameter: command_wait_timeout_seconds=#{conn_limits.command_wait_timeout_seconds}")
|
898
|
+
logger.info("drb_services parameter: process_num=#{drb_process_num}")
|
899
|
+
logger.info("drb_services engine parameter: bulk_response_count=#{@config.bulk_response_count}")
|
859
900
|
logger.info("lock parameter: read_lock_timeout_seconds=#{@config.read_lock_timeout_seconds}")
|
860
901
|
logger.info("lock parameter: write_lock_timeout_seconds=#{@config.write_lock_timeout_seconds}")
|
861
902
|
logger.info("lock parameter: cleanup_write_lock_timeout_seconds=#{@config.cleanup_write_lock_timeout_seconds}")
|
@@ -863,12 +904,18 @@ module RIMS
|
|
863
904
|
kvs_text_log.call
|
864
905
|
logger.info("authentication parameter: hostname=#{auth.hostname}")
|
865
906
|
logger.info("authorization parameter: mail_delivery_user=#{@config.mail_delivery_user}")
|
907
|
+
|
908
|
+
logger.info('dRuby services: start server.')
|
909
|
+
services.start_server
|
910
|
+
}
|
911
|
+
server.at_fork{
|
912
|
+
logger.info('dRuby services: detach server.')
|
913
|
+
services.detach_server
|
866
914
|
}
|
867
|
-
# server.at_fork{}
|
868
915
|
server.at_stop{|stop_state|
|
869
916
|
case (stop_state)
|
870
917
|
when :graceful
|
871
|
-
logger.info('autologout
|
918
|
+
logger.info('autologout immediately.')
|
872
919
|
conn_limits.command_wait_timeout_seconds = 0
|
873
920
|
when :forced
|
874
921
|
logger.info('forced shutdown.')
|
@@ -878,6 +925,8 @@ module RIMS
|
|
878
925
|
logger.info("stat: #{info.to_json}")
|
879
926
|
}
|
880
927
|
server.preprocess{
|
928
|
+
logger.info('dRuby services: start client.')
|
929
|
+
services.start_client
|
881
930
|
auth.start_plug_in(logger)
|
882
931
|
}
|
883
932
|
server.dispatch{|socket|
|
@@ -898,11 +947,7 @@ module RIMS
|
|
898
947
|
stream = Riser::WriteBufferStream.new(socket, @config.send_buffer_limit_size)
|
899
948
|
end
|
900
949
|
stream = Riser::LoggingStream.new(stream, protocol_logger)
|
901
|
-
decoder = Protocol::Decoder.new_decoder(
|
902
|
-
mail_delivery_user: @config.mail_delivery_user,
|
903
|
-
read_lock_timeout_seconds: @config.read_lock_timeout_seconds,
|
904
|
-
write_lock_timeout_seconds: @config.write_lock_timeout_seconds,
|
905
|
-
cleanup_write_lock_timeout_seconds: @config.cleanup_write_lock_timeout_seconds)
|
950
|
+
decoder = Protocol::Decoder.new_decoder(services, auth, logger, mail_delivery_user: @config.mail_delivery_user)
|
906
951
|
Protocol::Decoder.repl(decoder, conn_limits, stream, stream, logger)
|
907
952
|
ensure
|
908
953
|
if (stream) then
|
@@ -934,6 +979,8 @@ module RIMS
|
|
934
979
|
auth.stop_plug_in(logger)
|
935
980
|
}
|
936
981
|
server.after_stop{
|
982
|
+
logger.info('dRuby services: stop server.')
|
983
|
+
services.stop_server
|
937
984
|
logger.info('stop server.')
|
938
985
|
}
|
939
986
|
|