@@ -121,22 +121,46 @@ def multi_receive_encoded(events_and_encoded)
121
121
# append to the file
122
122
chunks . each { |chunk | fd . write ( chunk ) }
123
123
end
124
- fd . flush unless @flusher && @flusher . alive?
124
+ on_flush ( fd , path ) unless @flusher && @flusher . alive?
125
125
end
126
126
127
127
close_stale_files
128
128
end
129
129
end
130
130
131
+ def on_flush ( fd , path )
132
+ fd . flush
133
+ if @files [ path ] [ :isTempFile ]
134
+ copy_to_gzip ( fd , path )
135
+ end
136
+ end
137
+
138
+ def copy_to_gzip ( fd , path )
139
+ zipfd = get_file ( path )
140
+ zipfd = Zlib ::GzipWriter . new ( zipfd )
141
+ fd . seek ( 0 , IO ::SEEK_SET )
142
+ data = fd . read
143
+ fd . truncate ( 0 )
144
+ fd . seek ( 0 , IO ::SEEK_SET )
145
+ if @write_behavior == "overwrite"
146
+ zipfd . truncate ( 0 )
147
+ zipfd . seek ( 0 , IO ::SEEK_SET )
148
+ end
149
+ zipfd . write ( data )
150
+ zipfd . flush
151
+ zipfd . to_io . flush
152
+ zipfd . close
153
+ end
154
+
131
155
def close
132
156
@flusher . stop unless @flusher . nil?
133
157
@io_mutex . synchronize do
134
158
@logger . debug ( "Close: closing files" )
135
159
136
- @files . each do |path , fd |
160
+ @files . each do |path , fileObj |
137
161
begin
138
- fd . close
139
- @logger . debug ( "Closed file #{ path } " , :fd => fd )
162
+ fileObj [ :fd ] . close
163
+ @logger . debug ( "Closed file #{ fileObj [ :fd ] } " , :fd => fileObj [ :fd ] )
140
164
rescue Exception => e
141
165
@logger . error ( "Exception while flushing and closing files." , :exception => e )
142
166
end
@@ -199,9 +223,12 @@ def flush_pending_files
199
223
@io_mutex . synchronize do
200
224
@logger . debug ( "Starting flush cycle" )
201
225
202
- @files . each do |path , fd |
203
- @logger . debug ( "Flushing file" , :path => path , :fd => fd )
204
- fd . flush
226
+ @files . each do |path , fileObj |
227
+ @logger . debug ( "Flushing file" , :path => path , :fd => fileObj [ :fd ] )
228
+ fileObj [ :fd ] . flush
229
+ if fileObj [ :isTempFile ]
230
+ copy_to_gzip ( fileObj [ :fd ] , path )
231
+ end
205
232
end
206
233
end
207
234
rescue => e
@@ -215,15 +242,18 @@ def close_stale_files
215
242
return unless now - @last_stale_cleanup_cycle >= @stale_cleanup_interval
216
243
217
244
@logger . debug ( "Starting stale files cleanup cycle" , :files => @files )
218
- inactive_files = @files . select { |path , fd | not fd . active }
245
+ inactive_files = @files . select { |path , fileObj | not fileObj [ :fd ] . active }
219
246
@logger . debug ( "%d stale files found" % inactive_files . count , :inactive_files => inactive_files )
220
- inactive_files . each do |path , fd |
247
+ inactive_files . each do |path , fileObj |
221
248
@logger . info ( "Closing file %s" % path )
222
- fd . close
249
+ fileObj [ :fd ] . close
250
+ if fileObj [ :isTempFile ] && File . exist? ( fileObj [ :fd ] . path )
251
+ File . delete ( fileObj [ :fd ] . path )
252
+ end
223
253
@files . delete ( path )
224
254
end
225
255
# mark all files as inactive, a call to write will mark them as active again
226
- @files . each { |path , fd | fd . active = false }
256
+ @files . each { |path , fileObj | fileObj [ :fd ] . active = false }
227
257
@last_stale_cleanup_cycle = now
228
258
end
229
259
@@ -236,21 +266,41 @@ def deleted?(path)
236
266
end
237
267
238
268
def open ( path )
269
+ originalPath = path
239
270
if !deleted? ( path ) && cached? ( path )
240
- return @files [ path ]
271
+ return @files [ path ] [ :fd ]
241
272
end
242
273
243
274
if deleted? ( path )
244
275
if @create_if_deleted
245
276
@logger . debug ( "Required path was deleted, creating the file again" , :path => path )
246
277
@files . delete ( path )
247
278
else
248
- return @files [ path ] if cached? ( path )
279
+ return @files [ path ] [ :fd ] if cached? ( path )
280
+ end
281
+ end
282
+
283
+ #Fix for broken gzip issue.
284
+ if gzip
285
+ tmpfile = java . io . File . createTempFile ( "outfile-" , "-temp" ) ;
286
+ path = tmpfile . path
287
+ #create file at original path also, so that temp file is not created again
288
+ make_dir ( originalPath )
289
+ gzFile = get_file ( originalPath )
290
+ #if gzFile is fifo type, file writer object is returned that needs to closed.
291
+ if gzFile . class == Java ::JavaIo ::FileWriter
292
+ gzFile . close
249
293
end
250
294
end
251
295
252
296
@logger . info ( "Opening file" , :path => path )
297
+ make_dir ( path )
298
+ fd = get_file ( path )
299
+ @files [ originalPath ] = { :fd => IOWriter . new ( fd ) , :isTempFile => gzip }
300
+ return @files [ originalPath ] [ :fd ]
301
+ end
253
302
303
+ def make_dir ( path )
254
304
dir = File . dirname ( path )
255
305
if !Dir . exist? ( dir )
256
306
@logger . info ( "Creating directory" , :directory => dir )
@@ -260,7 +310,9 @@ def open(path)
260
310
FileUtils . mkdir_p ( dir )
261
311
end
262
312
end
313
+ end
263
314
315
+ def get_file ( path )
264
316
# work around a bug opening fifos (bug JRUBY-6280)
265
317
stat = File . stat ( path ) rescue nil
266
318
if stat && stat . ftype == "fifo"
@@ -272,10 +324,7 @@ def open(path)
272
324
fd = File . new ( path , "a+" )
273
325
end
274
326
end
275
- if gzip
276
- fd = Zlib ::GzipWriter . new ( fd )
277
- end
278
- @files [ path ] = IOWriter . new ( fd )
327
+ return fd
279
328
end
280
329
281
330
##
0 commit comments