1
1
# encoding: utf-8
2
+ require "java"
2
3
require "concurrent"
3
- require "concurrent/map"
4
4
require "concurrent/timer_task"
5
5
require "logstash/util"
6
6
7
+ java_import "java.util.concurrent.ConcurrentHashMap"
8
+
7
9
module LogStash
8
10
module Outputs
9
11
class S3
@@ -28,14 +30,18 @@ def with_lock
28
30
def stale?
29
31
with_lock { |factory | factory . current . size == 0 && ( Time . now - factory . current . ctime > @stale_time ) }
30
32
end
33
+
34
+ def apply ( prefix )
35
+ return self
36
+ end
31
37
end
32
38
33
39
def initialize ( tags , encoding , temporary_directory ,
34
40
stale_time = DEFAULT_STALE_TIME_SECS ,
35
41
sweeper_interval = DEFAULT_STATE_SWEEPER_INTERVAL_SECS )
36
42
# The path need to contains the prefix so when we start
37
43
# logtash after a crash we keep the remote structure
38
- @prefixed_factories = Concurrent :: Map . new
44
+ @prefixed_factories = ConcurrentHashMap . new
39
45
40
46
@tags = tags
41
47
@encoding = encoding
@@ -48,19 +54,20 @@ def initialize(tags, encoding, temporary_directory,
48
54
end
49
55
50
56
def keys
51
- @prefixed_factories . keys
57
+ arr = [ ]
58
+ @prefixed_factories . keySet . each { |k | arr << k }
59
+ arr
52
60
end
53
61
54
62
def each_files
55
- @prefixed_factories . each_value do |prefixed_file |
63
+ @prefixed_factories . values do |prefixed_file |
56
64
prefixed_file . with_lock { |factory | yield factory . current }
57
65
end
58
66
end
59
67
60
68
# Return the file factory
61
69
def get_factory ( prefix_key )
62
- @prefixed_factories . compute_if_absent ( prefix_key ) { PrefixedValue . new ( TemporaryFileFactory . new ( prefix_key , @tags , @encoding , @temporary_directory ) , @stale_time ) }
63
- . with_lock { |factory | yield factory }
70
+ @prefixed_factories . computeIfAbsent ( prefix_key , PrefixedValue . new ( TemporaryFileFactory . new ( prefix_key , @tags , @encoding , @temporary_directory ) , @stale_time ) ) . with_lock { |factory | yield factory }
64
71
end
65
72
66
73
def get_file ( prefix_key )
@@ -79,8 +86,10 @@ def start_stale_sweeper
79
86
@stale_sweeper = Concurrent ::TimerTask . new ( :execution_interval => @sweeper_interval ) do
80
87
LogStash ::Util . set_thread_name ( "S3, Stale factory sweeper" )
81
88
82
- @prefixed_factories . each_pair do |k , v |
83
- @prefixed_factories . delete_pair ( k , v ) if v . stale?
89
+ @prefixed_factories . entrySet . each do |s |
90
+ if s . getValue . stale?
91
+ @prefixed_factories . remove ( s . getKey , s . getValue )
92
+ end
84
93
end
85
94
end
86
95
0 commit comments