bayserver-core 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
  3. data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
  4. data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
  5. data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
  6. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
  7. data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
  8. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
  9. data/lib/baykit/bayserver/agent/package.rb +3 -0
  10. data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
  11. data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
  12. data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
  13. data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
  14. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
  15. data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
  16. data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
  17. data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
  18. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
  19. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
  20. data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
  21. data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
  22. data/lib/baykit/bayserver/bay_dockers.rb +60 -0
  23. data/lib/baykit/bayserver/bay_exception.rb +12 -0
  24. data/lib/baykit/bayserver/bay_log.rb +148 -0
  25. data/lib/baykit/bayserver/bay_message.rb +20 -0
  26. data/lib/baykit/bayserver/bayserver.rb +529 -0
  27. data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
  28. data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
  29. data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
  30. data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
  31. data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
  32. data/lib/baykit/bayserver/bcf/package.rb +6 -0
  33. data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
  34. data/lib/baykit/bayserver/config_exception.rb +25 -0
  35. data/lib/baykit/bayserver/constants.rb +8 -0
  36. data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
  37. data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
  38. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
  39. data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
  40. data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
  41. data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
  42. data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
  43. data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
  44. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
  45. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
  46. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
  47. data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
  48. data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
  49. data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
  50. data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
  51. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
  52. data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
  53. data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
  54. data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
  55. data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
  56. data/lib/baykit/bayserver/docker/city.rb +22 -0
  57. data/lib/baykit/bayserver/docker/club.rb +45 -0
  58. data/lib/baykit/bayserver/docker/docker.rb +8 -0
  59. data/lib/baykit/bayserver/docker/harbor.rb +34 -0
  60. data/lib/baykit/bayserver/docker/log.rb +17 -0
  61. data/lib/baykit/bayserver/docker/package.rb +12 -0
  62. data/lib/baykit/bayserver/docker/permission.rb +18 -0
  63. data/lib/baykit/bayserver/docker/port.rb +39 -0
  64. data/lib/baykit/bayserver/docker/reroute.rb +17 -0
  65. data/lib/baykit/bayserver/docker/secure.rb +22 -0
  66. data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
  67. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
  68. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
  69. data/lib/baykit/bayserver/docker/town.rb +30 -0
  70. data/lib/baykit/bayserver/docker/trouble.rb +17 -0
  71. data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
  72. data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
  73. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
  74. data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
  75. data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
  76. data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
  77. data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
  78. data/lib/baykit/bayserver/http_exception.rb +33 -0
  79. data/lib/baykit/bayserver/mem_usage.rb +104 -0
  80. data/lib/baykit/bayserver/protocol/command.rb +21 -0
  81. data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
  82. data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
  83. data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
  84. data/lib/baykit/bayserver/protocol/package.rb +15 -0
  85. data/lib/baykit/bayserver/protocol/packet.rb +63 -0
  86. data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
  87. data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
  88. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
  89. data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
  90. data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
  91. data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
  92. data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
  93. data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
  94. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
  95. data/lib/baykit/bayserver/sink.rb +22 -0
  96. data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
  97. data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
  98. data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
  99. data/lib/baykit/bayserver/tours/package.rb +4 -0
  100. data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
  101. data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
  102. data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
  103. data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
  104. data/lib/baykit/bayserver/tours/tour.rb +195 -0
  105. data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
  106. data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
  107. data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
  108. data/lib/baykit/bayserver/train/train.rb +54 -0
  109. data/lib/baykit/bayserver/train/train_runner.rb +32 -0
  110. data/lib/baykit/bayserver/util/byte_array.rb +54 -0
  111. data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
  112. data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
  113. data/lib/baykit/bayserver/util/char_util.rb +22 -0
  114. data/lib/baykit/bayserver/util/cities.rb +45 -0
  115. data/lib/baykit/bayserver/util/class_util.rb +17 -0
  116. data/lib/baykit/bayserver/util/counter.rb +23 -0
  117. data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
  118. data/lib/baykit/bayserver/util/executor_service.rb +81 -0
  119. data/lib/baykit/bayserver/util/groups.rb +110 -0
  120. data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
  121. data/lib/baykit/bayserver/util/headers.rb +194 -0
  122. data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
  123. data/lib/baykit/bayserver/util/http_status.rb +60 -0
  124. data/lib/baykit/bayserver/util/http_util.rb +157 -0
  125. data/lib/baykit/bayserver/util/io_util.rb +32 -0
  126. data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
  127. data/lib/baykit/bayserver/util/key_val.rb +15 -0
  128. data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
  129. data/lib/baykit/bayserver/util/locale.rb +30 -0
  130. data/lib/baykit/bayserver/util/md5_password.rb +24 -0
  131. data/lib/baykit/bayserver/util/message.rb +56 -0
  132. data/lib/baykit/bayserver/util/mimes.rb +27 -0
  133. data/lib/baykit/bayserver/util/object_factory.rb +13 -0
  134. data/lib/baykit/bayserver/util/object_store.rb +74 -0
  135. data/lib/baykit/bayserver/util/postman.rb +35 -0
  136. data/lib/baykit/bayserver/util/reusable.rb +13 -0
  137. data/lib/baykit/bayserver/util/selector.rb +141 -0
  138. data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
  139. data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
  140. data/lib/baykit/bayserver/util/string_util.rb +73 -0
  141. data/lib/baykit/bayserver/util/sys_util.rb +138 -0
  142. data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
  143. data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
  144. data/lib/baykit/bayserver/util/valve.rb +15 -0
  145. data/lib/baykit/bayserver/version.rb +7 -0
  146. data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
  147. data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
  148. data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
  149. metadata +189 -0
@@ -0,0 +1,111 @@
1
+ require 'baykit/bayserver/agent/spin_handler'
2
+ require 'baykit/bayserver/util/string_util'
3
+ require 'baykit/bayserver/util/valve'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Agent
8
+ module Transporter
9
+ class SpinReadTransporter
10
+ include Baykit::BayServer::Agent::SpinHandler::SpinListener # implements
11
+ include Baykit::BayServer::Util::Valve # implements
12
+ include Baykit::BayServer::Util
13
+
14
+ attr :spin_handler
15
+ attr :data_listener
16
+ attr :infile
17
+ attr :read_buf
18
+ attr :total_read
19
+ attr :file_len
20
+ attr :timeout_sec
21
+ attr :eof_checker
22
+ attr :is_closed
23
+
24
+ def initialize(buf_size)
25
+ @read_buf = StringUtil.alloc(buf_size)
26
+ end
27
+
28
+ def init(spin_hnd, lis, infile, limit, timeout_sec, eof_checker)
29
+ @spin_handler = spin_hnd
30
+ @data_listener = lis
31
+ @infile = infile
32
+ @file_len = limit
33
+ @total_read = 0
34
+ @timeout_sec = timeout_sec
35
+ @eof_checker = eof_checker
36
+ @is_closed = false
37
+ end
38
+
39
+ def to_s
40
+ data_listener.to_s()
41
+ end
42
+
43
+ ######################################################
44
+ # Implements Reusable
45
+ ######################################################
46
+
47
+ def reset()
48
+ @data_listener = nil
49
+ @infile = nil
50
+ end
51
+
52
+ ######################################################
53
+ # Implements SpinListener
54
+ ######################################################
55
+
56
+ def lap()
57
+ begin
58
+ @infile.sysread(@buf_size, @read_buf)
59
+
60
+ if @read_buf.length == 0
61
+ return NextSocketAction::CONTINUE, true
62
+ end
63
+ @total_read += @read_buf.length
64
+
65
+ next_act = @yacht.notify_read(@read_buf)
66
+
67
+ if @total_read == @file_len
68
+ @data_listener.notify_eof()
69
+ close()
70
+ return NextSocketAction::CLOSE, false
71
+ end
72
+
73
+ return next_act, false
74
+ rescue Exception => e
75
+ BayLog.error_e(e)
76
+ close()
77
+ return NextSocketAction::CLOSE, false
78
+ end
79
+ end
80
+
81
+ def check_timeout(duration_sec)
82
+ return duration_sec > @timeout_sec
83
+ end
84
+
85
+ def close()
86
+ if @infile != nil
87
+ @infile.close()
88
+ end
89
+ @data_listener.notify_close()
90
+ @is_closed = true
91
+ end
92
+
93
+ ######################################################
94
+ # Implements Valve
95
+ ######################################################
96
+
97
+ def open_valve()
98
+ @spin_handler.ask_to_callback(self)
99
+ end
100
+
101
+ ######################################################
102
+ # Other methods
103
+ ######################################################
104
+
105
+
106
+ end
107
+
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,125 @@
1
+ require 'baykit/bayserver/agent/spin_handler'
2
+ require 'baykit/bayserver/util/string_util'
3
+ require 'baykit/bayserver/util/reusable'
4
+ require 'baykit/bayserver/util/valve'
5
+ require 'baykit/bayserver/util/postman'
6
+
7
+ module Baykit
8
+ module BayServer
9
+ module Agent
10
+ module Transporter
11
+ class SpinWriteTransporter < Baykit::BayServer::Agent::SpinHandler
12
+ include Baykit::BayServer::Util::Valve # implements
13
+ include Baykit::BayServer::Util::Reusable # implements
14
+ include Baykit::BayServer::Util::Postman # implements
15
+
16
+ include Baykit::BayServer::Util
17
+
18
+ attr :spin_handler
19
+ attr :data_listener
20
+ attr :outfile
21
+ attr :write_queue
22
+ attr :lock
23
+
24
+
25
+ def initialize()
26
+ @write_queue = []
27
+ @lock = Mutex.new()
28
+ end
29
+
30
+ def init(spin_hnd, outfile, lis)
31
+ @spin_handler = spin_hnd
32
+ @data_listener = lis
33
+ @outfile = outfile
34
+ end
35
+
36
+ def to_s
37
+ data_listener.to_s()
38
+ end
39
+
40
+ ######################################################
41
+ # Implements Reusable
42
+ ######################################################
43
+
44
+ def reset()
45
+ @data_listener = nil
46
+ @outfile = nil
47
+ end
48
+
49
+ ######################################################
50
+ # Implements SpinListener
51
+ ######################################################
52
+
53
+ def lap()
54
+ begin
55
+
56
+ buf = nil
57
+ @lock.synchronize do
58
+ if @write_queue.empty?
59
+ BayLog.warn("%s Write queue empty", self)
60
+ return NextSocketAction::SUSPEND
61
+ end
62
+ buf = @write_queue[0]
63
+ end
64
+
65
+ len = @outfile.syswrite(buf)
66
+
67
+ if len == 0
68
+ return NextSocketAction::CONTINUE
69
+ elsif len < buf.length
70
+ buf[0 .. len-1] = ""
71
+ return NextSocketAction::CONTINUE
72
+ end
73
+
74
+ @lock.synchronize do
75
+ @write_queue.delete_at(0)
76
+ if @write_queue.empty?
77
+ return NextSocketAction::SUSPEND
78
+ else
79
+ return NextSocketAction::CONTINUE
80
+ end
81
+ end
82
+
83
+ rescue Exception => e
84
+ BayLog.error_e(e)
85
+ close()
86
+ return NextSocketAction::CLOSE
87
+ end
88
+ end
89
+
90
+ def check_timeout(duration_sec)
91
+ return false
92
+ end
93
+
94
+ def close()
95
+ if @outfile != nil
96
+ @outfile.close()
97
+ end
98
+ end
99
+
100
+ ######################################################
101
+ # Implements Valve
102
+ ######################################################
103
+
104
+ def open_valve()
105
+ @spin_handler.ask_to_callback(self)
106
+ end
107
+
108
+ ######################################################
109
+ # Other methods
110
+ ######################################################
111
+ def post(bytes, tag)
112
+ @lock.synchronize do
113
+ empty = @write_queue.empty?
114
+ @write_queue << bytes
115
+ if empty
116
+ open_valve()
117
+ end
118
+ end
119
+ end
120
+
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,466 @@
1
+ require 'baykit/bayserver/agent/non_blocking_handler'
2
+ require 'baykit/bayserver/agent/channel_listener'
3
+ require 'baykit/bayserver/protocol/protocol_exception'
4
+ require 'baykit/bayserver/util/reusable'
5
+ require 'baykit/bayserver/util/postman'
6
+
7
+ module Baykit
8
+ module BayServer
9
+ module Agent
10
+ module Transporter
11
+ class Transporter
12
+ include Baykit::BayServer::Agent::ChannelListener # implements
13
+ include Baykit::BayServer::Util::Reusable # implements
14
+ include Baykit::BayServer::Util::Postman # implements
15
+
16
+ include Baykit::BayServer::Protocol
17
+ include Baykit::BayServer::Util
18
+
19
+ class WriteUnit
20
+ attr :buf
21
+ attr :adr
22
+ attr :tag
23
+ attr :listener
24
+
25
+ def initialize(buf, adr, tag, lis)
26
+ @buf = buf
27
+ @adr = adr
28
+ @tag = tag
29
+ @listener = lis
30
+ end
31
+
32
+ def done()
33
+ if @listener != nil
34
+ @listener.call()
35
+ end
36
+ end
37
+ end
38
+
39
+ #
40
+ # Abstract methods
41
+ #
42
+ def secure()
43
+ raise NotImplementedError()
44
+ end
45
+
46
+ def handshake_nonblock()
47
+ raise NotImplementedError()
48
+ end
49
+
50
+ def handshake_finished()
51
+ raise NotImplementedError()
52
+ end
53
+
54
+ def read_nonblock()
55
+ raise NotImplementedError()
56
+ end
57
+
58
+ def write_nonblock(buf, adr)
59
+ raise NotImplementedError()
60
+ end
61
+
62
+
63
+ attr :data_listener
64
+ attr :server_mode
65
+ attr :trace_ssl
66
+ attr :infile
67
+ attr :write_queue
68
+ attr :finale
69
+ attr :initialized
70
+ attr :ch_valid
71
+ attr :read_buf
72
+ attr :socket_io
73
+ attr :handshaked
74
+ attr :lock
75
+ attr :capacity
76
+ attr :non_blocking_handler
77
+ attr :write_only
78
+
79
+ def initialize(server_mode, bufsiz, trace_ssl, write_only = false)
80
+ @server_mode = server_mode
81
+ @write_queue = []
82
+ @lock = Monitor.new()
83
+ @capacity = bufsiz
84
+ @read_buf = StringUtil.alloc(bufsiz)
85
+ @trace_ssl = trace_ssl
86
+ reset()
87
+ @write_only = write_only
88
+ end
89
+
90
+ def to_s()
91
+ return "tpt[#{@data_listener.to_s}]"
92
+ end
93
+
94
+ def init(nb_hnd, ch, lis)
95
+ if ch == nil
96
+ raise ArgumentError.new("Channel is nil")
97
+ end
98
+ if lis == nil
99
+ raise ArgumentError.new("Data listener is nil")
100
+ end
101
+
102
+ if @initialized
103
+ BayLog.error("%s This transporter is already in use by channel: %s", self, @ch)
104
+ raise Sink.new("IllegalState")
105
+ end
106
+
107
+ if !@write_queue.empty?
108
+ raise Sink.new()
109
+ end
110
+
111
+ @channel_handler = nb_hnd
112
+ @data_listener = lis
113
+ @ch = ch
114
+ @initialized = true
115
+ set_valid(true)
116
+ @handshaked = false
117
+ @channel_handler.add_channel_listener(ch, self)
118
+ end
119
+
120
+ ######################################################
121
+ # Implements Reusable
122
+ ######################################################
123
+ def reset()
124
+
125
+ # Check write queue
126
+ if !@write_queue.empty?
127
+ raise Sink.new("Write queue is not empty")
128
+ end
129
+
130
+ @finale = false
131
+ @initialized = false
132
+ @ch = nil
133
+ set_valid(false)
134
+ @handshaked = false
135
+ @socket_io = nil
136
+ @read_buf.clear()
137
+ @write_only = false
138
+ end
139
+
140
+ ######################################################
141
+ # Implements Postman
142
+ ######################################################
143
+
144
+ def post(buf, adr, tag, &lisnr)
145
+ check_initialized()
146
+
147
+ BayLog.debug("%s post: %s len=%d", self, tag, buf.length)
148
+
149
+ @lock.synchronize do
150
+
151
+ if !@ch_valid
152
+ raise IOError.new("#{self} channel is invalid, Ignore")
153
+ else
154
+ unt = WriteUnit.new(buf, adr, tag, lisnr)
155
+ @write_queue << unt
156
+
157
+ BayLog.trace("%s sendBytes->askToWrite", self)
158
+ @channel_handler.ask_to_write(@ch)
159
+ end
160
+
161
+ end
162
+ end
163
+
164
+ ######################################################
165
+ # Implements Valve
166
+ ######################################################
167
+
168
+ def open_valve()
169
+ BayLog.debug("%s resume", self)
170
+ @channel_handler.ask_to_read(@ch)
171
+ end
172
+
173
+ def abort()
174
+ BayLog.debug("%s abort", self)
175
+ @channel_handler.ask_to_close(@ch)
176
+ end
177
+
178
+ def zombie?()
179
+ return @ch != nil && !@ch_valid
180
+ end
181
+
182
+
183
+ ######################################################
184
+ # Implements ChannelListener
185
+ ######################################################
186
+
187
+ def on_readable(chk_ch)
188
+ check_channel(chk_ch)
189
+ BayLog.trace("%s on_readable", self)
190
+
191
+ if !@handshaked
192
+ begin
193
+ handshake_nonblock()
194
+ @handshaked = true
195
+ rescue IO::WaitReadable => e
196
+ BayLog.debug("%s Handshake status: read more", @data_listener)
197
+ return NextSocketAction::CONTINUE
198
+ rescue IO::WaitWritable => e
199
+ BayLog.debug("%s Handshake status: write more", @data_listener)
200
+ @channel_handler.ask_to_write(@ch)
201
+ return NextSocketAction::CONTINUE
202
+ end
203
+ end
204
+
205
+ # read data
206
+ # If closed, EOFError is raised
207
+ if @read_buf.length == 0
208
+ eof = false
209
+ begin
210
+ adr = read_nonblock()
211
+ rescue IO::WaitReadable => e
212
+ BayLog.debug("%s Read status: read more", self)
213
+ return NextSocketAction::CONTINUE
214
+ rescue IO::WaitWritable => e
215
+ BayLog.debug("%s Read status: write more", self)
216
+ @channel_handler.ask_to_write(@ch)
217
+ return NextSocketAction::CONTINUE
218
+ rescue EOFError => e
219
+ BayLog.debug("%s EOF", self)
220
+ eof = true
221
+ rescue SystemCallError => e
222
+ BayLog.debug_e(e, "SystemCall Error")
223
+ eof = true
224
+ end
225
+
226
+ if eof
227
+ return @data_listener.notify_eof()
228
+ end
229
+ end
230
+
231
+ BayLog.debug("%s read %d bytes", self, @read_buf.length)
232
+
233
+ begin
234
+ begin
235
+ next_action = @data_listener.notify_read(@read_buf, adr)
236
+ BayLog.trace("%s returned from notify_read(). next action=%d", @ship, next_action)
237
+ return next_action
238
+ rescue UpgradeException => e
239
+ BayLog.debug("%s Protocol upgrade", @ship)
240
+ return @data_listener.notify_read(@read_buf, adr)
241
+ ensure
242
+ @read_buf.clear()
243
+ end
244
+
245
+
246
+ rescue ProtocolException => e
247
+ close = @data_listener.notify_protocol_error(e)
248
+ if !close && @server_mode
249
+ return NextSocketAction::CONTINUE
250
+ else
251
+ return NextSocketAction::CLOSE
252
+ end
253
+ end
254
+ end
255
+
256
+ def on_writable(chk_ch)
257
+ check_channel(chk_ch)
258
+
259
+ BayLog.trace("%s Writable", self)
260
+
261
+ if !@handshaked
262
+ begin
263
+ handshake_nonblock
264
+ BayLog.debug("#{@ship} Handshake done")
265
+ @handshaked = true
266
+ rescue IO::WaitReadable => e
267
+ BayLog.debug("#{@ship} Handshake status: read more")
268
+ return NextSocketAction::READ
269
+ rescue IO::WaitWritable => e
270
+ BayLog.debug("#{@ship} Handshake status: write more")
271
+ return NextSocketAction::CONTINUE
272
+ rescue StandardError => e
273
+ BayLog.error_e(e, " Error on handshaking: %s", self, e);
274
+ set_valid(false)
275
+ return NextSocketAction::CLOSE
276
+ end
277
+ end
278
+
279
+ if !@ch_valid
280
+ return NextSocketAction::CLOSE
281
+ end
282
+
283
+ empty = false
284
+ while true
285
+ #BayLog.debug "#{self} Send queue len=#{@write_queue.length}"
286
+ wunit = nil
287
+ @lock.synchronize do
288
+ if @write_queue.empty?
289
+ empty = true
290
+ break
291
+ end
292
+ wunit = @write_queue[0]
293
+ end
294
+
295
+ if empty
296
+ break
297
+ end
298
+
299
+ BayLog.debug("%s Try to write: pkt=%s buflen=%d chValid=%s", self, wunit.tag, wunit.buf.length, @ch_valid)
300
+
301
+ if @ch_valid && wunit.buf.length > 0
302
+ begin
303
+ len = write_nonblock(wunit.buf, wunit.adr)
304
+ wunit.buf[0, len] = ""
305
+ if wunit.buf.length > 0
306
+ # Data remains
307
+ break
308
+ end
309
+ rescue IO::WaitWritable => e
310
+ BayLog.debug_e(e, "%s Write will be pended", self)
311
+ break
312
+ end
313
+ end
314
+
315
+ # packet send complete
316
+ wunit.done()
317
+
318
+ @lock.synchronize do
319
+ @write_queue.delete_at(0)
320
+ empty = @write_queue.empty?
321
+ end
322
+
323
+ if empty
324
+ break
325
+ end
326
+ end
327
+
328
+ if empty
329
+ if @finale
330
+ BayLog.trace("%s finale return Close", self)
331
+ state = NextSocketAction::CLOSE
332
+ elsif @write_only
333
+ state = NextSocketAction::SUSPEND
334
+ else
335
+ state = NextSocketAction::READ # will be handled as "Write Off"
336
+ end
337
+ else
338
+ state = NextSocketAction::CONTINUE
339
+ end
340
+
341
+ return state
342
+ end
343
+
344
+
345
+ def on_connectable(chk_ch)
346
+ check_channel(chk_ch)
347
+ BayLog.trace("%s onConnectable", self)
348
+
349
+ # check connected
350
+ begin
351
+ buf = ""
352
+ @ch.syswrite(buf)
353
+ rescue => e
354
+ BayLog.error("Connect failed: %s", e)
355
+ return NextSocketAction::CLOSE
356
+ end
357
+
358
+ return @data_listener.notify_connect()
359
+ end
360
+
361
+ def check_timeout(chk_ch, duration)
362
+ check_channel(chk_ch)
363
+
364
+ return @data_listener.check_timeout(duration)
365
+ end
366
+
367
+ def on_error(chk_ch, e)
368
+ check_channel(chk_ch)
369
+ BayLog.trace("%s onError: %s", self, e)
370
+
371
+ begin
372
+ raise e
373
+ rescue OpenSSL::SSL::SSLError => e
374
+ if @trace_ssl
375
+ BayLog.error_e(e, "%s SSL Error: %s", self, e)
376
+ else
377
+ BayLog.debug_e(e, "%s SSL Error: %s", self, e)
378
+ end
379
+ rescue => e
380
+ BayLog.error_e(e)
381
+ end
382
+ end
383
+
384
+ def on_closed(chk_ch)
385
+ begin
386
+ check_channel(chk_ch)
387
+ rescue => e
388
+ BayLog.error_e(e)
389
+ return
390
+ end
391
+
392
+ set_valid(false)
393
+
394
+ @lock.synchronize do
395
+ # Clear queue
396
+ @write_queue.each do |write_unit|
397
+ write_unit.done()
398
+ end
399
+ @write_queue.clear()
400
+
401
+ @data_listener.notify_close()
402
+ end
403
+ end
404
+
405
+ def flush()
406
+ check_initialized()
407
+
408
+ BayLog.debug("%s flush", self)
409
+
410
+ if @ch_valid
411
+ empty = false
412
+ @lock.synchronize do
413
+ empty = @write_queue.empty?
414
+ end
415
+
416
+ if !empty
417
+ BayLog.debug("%s flush->askToWrite", self)
418
+ @channel_handler.ask_to_write(@ch)
419
+ end
420
+ end
421
+ end
422
+
423
+ def post_end()
424
+ check_initialized()
425
+
426
+ BayLog.debug("%s postEnd vld=%s", self, self.ch_valid)
427
+
428
+ # setting order is QUITE important finalState->finale
429
+ @finale = true
430
+
431
+ if @ch_valid
432
+ empty = nil
433
+ @lock.synchronize do
434
+ empty = @write_queue.empty?
435
+ end
436
+
437
+ if !empty
438
+ BayLog.debug("%s Tpt: sendEnd->askToWrite", self)
439
+ @channel_handler.ask_to_write(@ch)
440
+ end
441
+ end
442
+ end
443
+
444
+ protected
445
+ def check_channel(chk_ch)
446
+ if chk_ch != @ch
447
+ raise Sink.new("Invalid transporter instance (ship was returned?): #{chk_ch}")
448
+ end
449
+ end
450
+
451
+ def check_initialized
452
+ if !@initialized
453
+ raise Sink.new("Illegal State")
454
+ end
455
+ end
456
+
457
+ def set_valid(valid)
458
+ @ch_valid = valid
459
+ end
460
+
461
+ end
462
+ end
463
+ end
464
+ end
465
+ end
466
+
@@ -0,0 +1,11 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Agent
5
+ class UpgradeException < StandardError
6
+
7
+ end
8
+ end
9
+ end
10
+ end
11
+