@@ -36,6 +36,10 @@ class TcpInput < Input
36
36
desc "The field name of the client's address."
37
37
config_param :source_address_key , :string , default : nil
38
38
39
+ # Setting default to nil for backward compatibility
40
+ desc "The max bytes of message."
41
+ config_param :message_length_limit , :size , default : nil
42
+
39
43
config_param :blocking_timeout , :time , default : 0.5
40
44
41
45
desc 'The payload is read up to this character.'
@@ -102,6 +106,7 @@ def start
102
106
103
107
log . info "listening tcp socket" , bind : @bind , port : @port
104
108
del_size = @delimiter . length
109
+ discard_till_next_delimiter = false
105
110
if @_extract_enabled && @_extract_tag_key
106
111
server_create ( :in_tcp_server_single_emit , @port , bind : @bind , resolve_name : !!@source_hostname_key , send_keepalive_packet : @send_keepalive_packet ) do |data , conn |
107
112
unless check_client ( conn )
@@ -116,6 +121,16 @@ def start
116
121
msg = buf [ pos ...i ]
117
122
pos = i + del_size
118
123
124
+ if discard_till_next_delimiter
125
+ discard_till_next_delimiter = false
126
+ next
127
+ end
128
+
129
+ if !@message_length_limit . nil? && @message_length_limit < msg . bytesize
130
+ log . info "The received data is larger than 'message_length_limit', dropped:" , limit : @message_length_limit , size : msg . bytesize , head : msg [ ...32 ]
131
+ next
132
+ end
133
+
119
134
@parser . parse ( msg ) do |time , record |
120
135
unless time && record
121
136
log . warn "pattern not matched" , message : msg
@@ -131,6 +146,15 @@ def start
131
146
end
132
147
end
133
148
buf . slice! ( 0 , pos ) if pos > 0
149
+ # If the buffer size exceeds the limit here, it means that the next message will definitely exceed the limit.
150
+ # So we should clear the buffer here. Otherwise, it will keep storing useless data until the next delimiter comes.
151
+ if !@message_length_limit . nil? && @message_length_limit < buf . bytesize
152
+ log . info "The buffer size exceeds 'message_length_limit', cleared:" , limit : @message_length_limit , size : buf . bytesize , head : buf [ ...32 ]
153
+ buf . clear
154
+ # We should discard the subsequent data until the next delimiter comes.
155
+ discard_till_next_delimiter = true
156
+ next
157
+ end
134
158
end
135
159
else
136
160
server_create ( :in_tcp_server_batch_emit , @port , bind : @bind , resolve_name : !!@source_hostname_key , send_keepalive_packet : @send_keepalive_packet ) do |data , conn |
@@ -147,6 +171,16 @@ def start
147
171
msg = buf [ pos ...i ]
148
172
pos = i + del_size
149
173
174
+ if discard_till_next_delimiter
175
+ discard_till_next_delimiter = false
176
+ next
177
+ end
178
+
179
+ if !@message_length_limit . nil? && @message_length_limit < msg . bytesize
180
+ log . info "The received data is larger than 'message_length_limit', dropped:" , limit : @message_length_limit , size : msg . bytesize , head : msg [ ...32 ]
181
+ next
182
+ end
183
+
150
184
@parser . parse ( msg ) do |time , record |
151
185
unless time && record
152
186
log . warn "pattern not matched" , message : msg
@@ -161,6 +195,15 @@ def start
161
195
end
162
196
router . emit_stream ( @tag , es )
163
197
buf . slice! ( 0 , pos ) if pos > 0
198
+ # If the buffer size exceeds the limit here, it means that the next message will definitely exceed the limit.
199
+ # So we should clear the buffer here. Otherwise, it will keep storing useless data until the next delimiter comes.
200
+ if !@message_length_limit . nil? && @message_length_limit < buf . bytesize
201
+ log . info "The buffer size exceeds 'message_length_limit', cleared:" , limit : @message_length_limit , size : buf . bytesize , head : buf [ ...32 ]
202
+ buf . clear
203
+ # We should discard the subsequent data until the next delimiter comes.
204
+ discard_till_next_delimiter = true
205
+ next
206
+ end
164
207
end
165
208
end
166
209
end
0 commit comments