flydata 0.6.4 → 0.6.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/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/VERSION +1 -1
- data/flydata-core/lib/flydata-core/table_def/base.rb +31 -0
- data/flydata-core/lib/flydata-core/table_def/mysql_table_def.rb +9 -30
- data/flydata-core/lib/flydata-core/table_def/postgresql_table_def.rb +111 -0
- data/flydata-core/lib/flydata-core/table_def/redshift_table_def.rb +4 -1
- data/flydata-core/spec/table_def/postgresql_table_def_spec.rb +348 -0
- data/flydata-core/spec/table_def/redshift_table_def_spec.rb +25 -0
- data/flydata.gemspec +0 -0
- data/lib/flydata.rb +0 -7
- data/lib/flydata/command/base.rb +3 -2
- data/lib/flydata/fluent-plugins/flydata_plugin_ext/base.rb +5 -0
- data/lib/flydata/fluent-plugins/flydata_plugin_ext/flush_support.rb +52 -0
- data/lib/flydata/fluent-plugins/flydata_plugin_ext/flydata_sync.rb +55 -0
- data/lib/flydata/fluent-plugins/{idle_event_detector.rb → flydata_plugin_ext/idle_event_detector.rb} +0 -0
- data/lib/flydata/fluent-plugins/{preference.rb → flydata_plugin_ext/preference.rb} +2 -14
- data/lib/flydata/fluent-plugins/flydata_plugin_ext/transaction_support.rb +58 -0
- data/lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb +55 -135
- data/lib/flydata/fluent-plugins/mysql/dml_record_handler.rb +9 -4
- data/lib/flydata/helper/server.rb +7 -0
- data/lib/flydata/preference/data_entry_preference.rb +5 -13
- data/lib/flydata/source.rb +1 -1
- data/lib/flydata/source/data_entry.rb +29 -0
- data/lib/flydata/source/sync.rb +19 -0
- data/lib/flydata/source/sync_generate_table_ddl.rb +47 -7
- data/lib/flydata/source_mysql/data_entry.rb +22 -0
- data/lib/flydata/source_mysql/parser/dump_parser.rb +1 -1
- data/lib/flydata/source_mysql/parser/mysql_alter_table.treetop +8 -3
- data/lib/flydata/source_mysql/sync.rb +1 -8
- data/lib/flydata/source_mysql/sync_generate_table_ddl.rb +11 -16
- data/lib/flydata/source_postgresql/data_entry.rb +21 -0
- data/lib/flydata/source_postgresql/sync.rb +29 -0
- data/lib/flydata/source_postgresql/sync_generate_table_ddl.rb +126 -0
- data/spec/flydata/fluent-plugins/{idle_event_detector_spec.rb → flydata_plugin_ext/idle_event_detector_spec.rb} +1 -1
- data/spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb +10 -0
- data/spec/flydata/source_mysql/parser/alter_table_parser_spec.rb +119 -0
- data/spec/flydata/source_mysql/parser/dump_parser_spec.rb +32 -1
- data/spec/flydata/source_mysql/sync_generate_table_ddl_spec.rb +4 -4
- metadata +31 -5
@@ -233,6 +233,15 @@ EOT
|
|
233
233
|
let(:default_sql) { " DEFAULT #{default_value_sql}" }
|
234
234
|
it_behaves_like *examples
|
235
235
|
end
|
236
|
+
context "replaced nil default" do
|
237
|
+
before do
|
238
|
+
column[:default] = default_value
|
239
|
+
allow(subject_object).to receive(:replace_default_value).
|
240
|
+
and_return(nil)
|
241
|
+
end
|
242
|
+
let(:default_sql) { no_default_sql }
|
243
|
+
it_behaves_like *examples
|
244
|
+
end
|
236
245
|
end
|
237
246
|
|
238
247
|
shared_examples "not null values" do |*examples|
|
@@ -977,6 +986,22 @@ EOS
|
|
977
986
|
end
|
978
987
|
end
|
979
988
|
end
|
989
|
+
describe '.replace_default_value' do
|
990
|
+
subject { subject_object.replace_default_value(flydata_type, redshift_type,
|
991
|
+
default_value) }
|
992
|
+
|
993
|
+
context 'with integer type' do
|
994
|
+
let(:flydata_type) { "int8" }
|
995
|
+
let(:redshift_type) { "int8" }
|
996
|
+
|
997
|
+
context "nextval() as the value" do
|
998
|
+
let(:default_value) { "nextval('test_id_seq'::regclass)" }
|
999
|
+
it 'returns nil because Redshift does not support nextval()' do
|
1000
|
+
is_expected.to be_nil
|
1001
|
+
end
|
1002
|
+
end
|
1003
|
+
end
|
1004
|
+
end
|
980
1005
|
end
|
981
1006
|
|
982
1007
|
end
|
data/flydata.gemspec
CHANGED
Binary file
|
data/lib/flydata.rb
CHANGED
@@ -36,10 +36,3 @@ module Flydata
|
|
36
36
|
VERSION_PATH = File.join(FLYDATA_GEM_HOME, 'VERSION')
|
37
37
|
include Flydata::Heroku
|
38
38
|
end
|
39
|
-
|
40
|
-
# Require all helper files -
|
41
|
-
# TODO : Check if this should be moved else where or can be more generic (not just helper files)
|
42
|
-
lib_dir = File.dirname(File.absolute_path(__FILE__))
|
43
|
-
FileUtils.cd(lib_dir) do
|
44
|
-
Dir["flydata/helper/**/*.rb"].each { |file| require file }
|
45
|
-
end
|
data/lib/flydata/command/base.rb
CHANGED
@@ -27,10 +27,11 @@ module Flydata
|
|
27
27
|
raise "Failed to retrieve data_entries"
|
28
28
|
end
|
29
29
|
data_entries.collect do |de|
|
30
|
+
source = Source.create(de)
|
30
31
|
if Flydata::Preference::DataEntryPreference.conf_exists?(de)
|
31
|
-
Flydata::Preference::DataEntryPreference.load_conf(de)
|
32
|
+
Flydata::Preference::DataEntryPreference.load_conf(de, source)
|
32
33
|
else
|
33
|
-
Flydata::Preference::DataEntryPreference.filter_data_entry(de)
|
34
|
+
Flydata::Preference::DataEntryPreference.filter_data_entry(de, source)
|
34
35
|
de
|
35
36
|
end
|
36
37
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Fluent
|
2
|
+
|
3
|
+
#Monkey-patch fluentd class (EngineClass) to support shutdown for input plugin.
|
4
|
+
#This will be called when USR1 signal is received
|
5
|
+
class EngineClass
|
6
|
+
#Send shutdown to all the sources
|
7
|
+
def shutdown_source
|
8
|
+
@sources.map {|s|
|
9
|
+
Thread.new do
|
10
|
+
begin
|
11
|
+
s.shutdown
|
12
|
+
rescue => e
|
13
|
+
$log.warn "unexpected error while shutting down", :error_class=>e.class, :error=>e
|
14
|
+
$log.warn_backtrace
|
15
|
+
end
|
16
|
+
end
|
17
|
+
}.each {|t|
|
18
|
+
t.join
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module FlushSupport
|
24
|
+
def initialize
|
25
|
+
super
|
26
|
+
install_custom_signal_handler
|
27
|
+
end
|
28
|
+
|
29
|
+
#Hack: All that has been added here is `Fluent::Engine.shutdown_source`. This should be in
|
30
|
+
#fluentd's supervisor#install_main_process_signal_handlers
|
31
|
+
def install_custom_signal_handler
|
32
|
+
trap :USR1 do
|
33
|
+
$log.debug "fluentd main process get SIGUSR1"
|
34
|
+
$log.info "force flushing buffered events"
|
35
|
+
#@log.reopen!
|
36
|
+
|
37
|
+
# Creating new thread due to mutex can't lock
|
38
|
+
# in main thread during trap context
|
39
|
+
Thread.new {
|
40
|
+
begin
|
41
|
+
Fluent::Engine.shutdown_source
|
42
|
+
Fluent::Engine.flush!
|
43
|
+
$log.debug "flushing thread: flushed"
|
44
|
+
rescue Exception => e
|
45
|
+
$log.warn "flushing thread error: #{e}"
|
46
|
+
end
|
47
|
+
}.run
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'flydata/sync_file_manager'
|
2
|
+
require 'flydata-core/fluent/config_helper'
|
3
|
+
require 'flydata/fluent-plugins/flydata_plugin_ext/flush_support'
|
4
|
+
require 'flydata/fluent-plugins/flydata_plugin_ext/transaction_support'
|
5
|
+
|
6
|
+
module Fluent
|
7
|
+
|
8
|
+
module FlydataSync
|
9
|
+
def self.included(base)
|
10
|
+
base.class_eval do
|
11
|
+
include FlushSupport
|
12
|
+
prepend TransactionSupport
|
13
|
+
|
14
|
+
config_param :tables, :string
|
15
|
+
config_param :tables_append_only, :string
|
16
|
+
|
17
|
+
# binlog plugin
|
18
|
+
# TODO: Need to check if not configured or not
|
19
|
+
#config_param :tag, :string
|
20
|
+
#config_param :position_file, :string, :default => 'position.log'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def configure(conf)
|
25
|
+
super
|
26
|
+
|
27
|
+
@binlog_position_file = self.class::BINLOG_POSITION_FILE_CLASS.new(@position_file)
|
28
|
+
unless @binlog_position_file.exists?
|
29
|
+
raise "No position file(#{@binlog_position_file.path}). Initial synchronization is required before starting."
|
30
|
+
end
|
31
|
+
|
32
|
+
@sync_fm = Flydata::SyncFileManager.new(nil) # Passing nil for data_entry as this class does not use methods which require data_entry
|
33
|
+
sent_position_file_path = @sync_fm.sent_source_pos_path(@position_file)
|
34
|
+
@sent_position_file = self.class::BINLOG_POSITION_FILE_CLASS.new(sent_position_file_path)
|
35
|
+
|
36
|
+
# Create positions dir
|
37
|
+
positions_path = @sync_fm.table_positions_dir_path
|
38
|
+
Dir.mkdir positions_path unless File.exists? positions_path
|
39
|
+
|
40
|
+
load_custom_conf
|
41
|
+
|
42
|
+
@tables = @tables.split(/(?:\s*,\s*|\s+)/)
|
43
|
+
@omit_events = Hash.new
|
44
|
+
@tables_append_only.split(/(?:\s*,\s*|\s+)/).each do |table|
|
45
|
+
@tables << table unless @tables.include?(table)
|
46
|
+
@omit_events[table] = [:delete, :truncate_table]
|
47
|
+
end
|
48
|
+
|
49
|
+
# Remove tables that do not have pos files
|
50
|
+
new_tables = @sync_fm.get_new_table_list(@tables, "pos")
|
51
|
+
@tables -= new_tables
|
52
|
+
$log.info "Not watching these tables: #{new_tables.join(", ")}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/flydata/fluent-plugins/{idle_event_detector.rb → flydata_plugin_ext/idle_event_detector.rb}
RENAMED
File without changes
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'flydata/util/encryptor'
|
3
|
+
require 'flydata/source_mysql/data_entry'
|
3
4
|
|
4
5
|
module Fluent
|
5
6
|
module DataEntryPreferenceConfigurable
|
@@ -68,23 +69,10 @@ module Fluent
|
|
68
69
|
end
|
69
70
|
|
70
71
|
module MysqlBinlogFlydataInputPreference
|
71
|
-
CUSTOM_CONFIG_PARAMS = {
|
72
|
-
mysql_data_entry_preference: {
|
73
|
-
database: {},
|
74
|
-
tables: {},
|
75
|
-
tables_append_only: {},
|
76
|
-
host: {},
|
77
|
-
username: {},
|
78
|
-
password: {encrypted: true},
|
79
|
-
ssl_ca_content: {},
|
80
|
-
ssl_cipher: {},
|
81
|
-
},
|
82
|
-
}
|
83
|
-
|
84
72
|
def self.included(base)
|
85
73
|
base.class_eval do
|
86
74
|
include DataEntryPreferenceConfigurable
|
87
|
-
|
75
|
+
Flydata::SourceMysql::DataEntry::CONFIG_PARAMS.each do |type, custom_conf|
|
88
76
|
custom_conf.each do |key, option|
|
89
77
|
custom_config_param key, type, option
|
90
78
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Fluent
|
2
|
+
|
3
|
+
class TransactionContext
|
4
|
+
def set_transaction_broken
|
5
|
+
@transaction_broken = true
|
6
|
+
end
|
7
|
+
|
8
|
+
def transaction_broken?
|
9
|
+
@transaction_broken == true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Transaction support
|
14
|
+
# This module is expected to be prepended
|
15
|
+
module TransactionSupport
|
16
|
+
def self.included(base)
|
17
|
+
raise "This module is expected to be prepended"
|
18
|
+
end
|
19
|
+
|
20
|
+
#def self.prepended(base)
|
21
|
+
#end
|
22
|
+
|
23
|
+
def configure(conf)
|
24
|
+
@lock_file = Flydata::FLYDATA_LOCK
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def start
|
29
|
+
if File.exists?(@lock_file)
|
30
|
+
$log.error "Previous process was terminated abnormally. To start, remove the lock file after checking data integrity."
|
31
|
+
@abort = true
|
32
|
+
Process.kill(:TERM, Process.ppid)
|
33
|
+
return
|
34
|
+
end
|
35
|
+
|
36
|
+
super
|
37
|
+
end
|
38
|
+
|
39
|
+
def process_aborted?
|
40
|
+
instance_variable_defined? :@abort
|
41
|
+
end
|
42
|
+
|
43
|
+
def do_transaction
|
44
|
+
transaction_context =TransactionContext.new
|
45
|
+
File.open(@lock_file, "w") {|f| f.write(Process.pid)}
|
46
|
+
begin
|
47
|
+
yield(transaction_context)
|
48
|
+
ensure
|
49
|
+
# leave the lock file when a transaction is broken
|
50
|
+
if !transaction_context.transaction_broken? && File.exists?(@lock_file) &&
|
51
|
+
Process.pid == File.open(@lock_file, "r") {|f| f.read}.to_i
|
52
|
+
File.delete(@lock_file)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -1,54 +1,32 @@
|
|
1
|
+
require_relative 'flydata_plugin_ext/base'
|
2
|
+
|
1
3
|
module Fluent
|
2
4
|
|
3
5
|
require 'fluent/plugin/in_mysql_binlog'
|
4
6
|
require 'binlog'
|
5
7
|
require 'kodama'
|
6
8
|
|
7
|
-
# Load client library(flydata-agent/lib)
|
8
|
-
lib = File.expand_path(File.join(File.dirname(__FILE__), '../../'))
|
9
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
10
|
-
require 'flydata'
|
11
9
|
require 'flydata/sync_file_manager'
|
12
10
|
require 'flydata-core/mysql/command_generator'
|
13
|
-
require 'flydata/fluent-plugins/preference'
|
11
|
+
require 'flydata/fluent-plugins/flydata_plugin_ext/preference'
|
14
12
|
require 'flydata/fluent-plugins/mysql/binlog_position_file'
|
15
13
|
require 'flydata/fluent-plugins/mysql/binlog_record_dispatcher'
|
16
14
|
require 'flydata/fluent-plugins/mysql/context'
|
17
|
-
require 'flydata/fluent-plugins/idle_event_detector'
|
15
|
+
require 'flydata/fluent-plugins/flydata_plugin_ext/idle_event_detector'
|
18
16
|
require 'flydata/fluent-plugins/mysql/table_meta'
|
19
17
|
require 'flydata/source_mysql/table_ddl'
|
20
18
|
require 'flydata-core/fluent/config_helper'
|
21
19
|
require 'flydata-core/mysql/ssl'
|
22
|
-
|
23
|
-
#Monkey-patch fluentd class (EngineClass) to support shutdown for input plugin.
|
24
|
-
#This will be called when USR1 signal is received
|
25
|
-
class EngineClass
|
26
|
-
#Send shutdown to all the sources
|
27
|
-
def shutdown_source
|
28
|
-
@sources.map {|s|
|
29
|
-
Thread.new do
|
30
|
-
begin
|
31
|
-
s.shutdown
|
32
|
-
rescue => e
|
33
|
-
$log.warn "unexpected error while shutting down", :error_class=>e.class, :error=>e
|
34
|
-
$log.warn_backtrace
|
35
|
-
end
|
36
|
-
end
|
37
|
-
}.each {|t|
|
38
|
-
t.join
|
39
|
-
}
|
40
|
-
end
|
41
|
-
end
|
20
|
+
require 'flydata/fluent-plugins/flydata_plugin_ext/flydata_sync'
|
42
21
|
|
43
22
|
|
44
23
|
class MysqlBinlogFlydataInput < MysqlBinlogInput
|
45
24
|
include MysqlBinlogFlydataInputPreference
|
25
|
+
include FlydataSync
|
26
|
+
|
46
27
|
Plugin.register_input('mysql_binlog_flydata', self)
|
47
28
|
|
48
|
-
|
49
|
-
super
|
50
|
-
install_custom_signal_handler
|
51
|
-
end
|
29
|
+
BINLOG_POSITION_FILE_CLASS = Mysql::BinLogPositionFile
|
52
30
|
|
53
31
|
config_param :database, :string
|
54
32
|
config_param :tables, :string
|
@@ -77,19 +55,10 @@ class MysqlBinlogFlydataInput < MysqlBinlogInput
|
|
77
55
|
|
78
56
|
def configure(conf)
|
79
57
|
super
|
80
|
-
@binlog_position_file = Mysql::BinLogPositionFile.new(@position_file)
|
81
|
-
unless @binlog_position_file.exists?
|
82
|
-
raise "No position file(#{@position_file}). Initial synchronization is required before starting."
|
83
|
-
end
|
84
|
-
|
85
|
-
@sync_fm = Flydata::SyncFileManager.new(nil) # Passing nil for data_entry as this class does not use methods which require data_entry
|
86
|
-
@sent_position_file_path = @sync_fm.sent_source_pos_path(@position_file)
|
87
|
-
|
88
|
-
load_custom_conf
|
89
58
|
|
90
59
|
# SSL configuration
|
91
60
|
unless @ssl_ca_content.to_s.strip.empty?
|
92
|
-
@ssl_ca_path = @sync_fm.ssl_ca_path(@
|
61
|
+
@ssl_ca_path = @sync_fm.ssl_ca_path(@binlog_position_file.path)
|
93
62
|
@sync_fm.save_ssl_ca(FlydataCore::Fluent::ConfigHelper.unescape_conf(@ssl_ca_content), @ssl_ca_path)
|
94
63
|
end
|
95
64
|
|
@@ -108,18 +77,6 @@ class MysqlBinlogFlydataInput < MysqlBinlogInput
|
|
108
77
|
#exit 1 # causes retry loop
|
109
78
|
end
|
110
79
|
|
111
|
-
@tables = @tables.split(/,\s*/)
|
112
|
-
@omit_events = Hash.new
|
113
|
-
@tables_append_only.split(/,\s*/).each do |table|
|
114
|
-
@tables << table unless @tables.include?(table)
|
115
|
-
@omit_events[table] = [:delete, :truncate_table]
|
116
|
-
end
|
117
|
-
|
118
|
-
# Remove tables that do not have pos files
|
119
|
-
new_tables = @sync_fm.get_new_table_list(@tables, "pos")
|
120
|
-
@tables -= new_tables
|
121
|
-
$log.info "Not watching these tables: #{new_tables.join(", ")}"
|
122
|
-
|
123
80
|
table_meta = Flydata::Mysql::TableMeta.new(@db_opts.merge(tables: @tables))
|
124
81
|
|
125
82
|
table_revs = tables.inject({}) do |h, table_name|
|
@@ -135,18 +92,11 @@ class MysqlBinlogFlydataInput < MysqlBinlogInput
|
|
135
92
|
)
|
136
93
|
@record_dispatcher = Mysql::FlydataBinlogRecordDispatcher.new(@context)
|
137
94
|
@idle_event_detector = IdleEventDetector.new(@initial_idle_interval, @continuous_idle_interval, @check_interval, @idle_timeout)
|
138
|
-
@lock_file = Flydata::FLYDATA_LOCK
|
139
95
|
end
|
140
96
|
|
141
97
|
def start
|
142
|
-
if File.exists?(@lock_file)
|
143
|
-
$log.error "Previous process was terminated abnormally. To start, remove the lock file after checking data integrity."
|
144
|
-
@abort = true
|
145
|
-
Process.kill(:TERM, Process.ppid)
|
146
|
-
return
|
147
|
-
end
|
148
|
-
|
149
98
|
super
|
99
|
+
|
150
100
|
@idle_event_detector.start do |reason, timestamp|
|
151
101
|
case reason
|
152
102
|
when :event_not_coming
|
@@ -161,9 +111,6 @@ class MysqlBinlogFlydataInput < MysqlBinlogInput
|
|
161
111
|
end
|
162
112
|
end
|
163
113
|
|
164
|
-
positions_path = @context.sync_fm.table_positions_dir_path
|
165
|
-
Dir.mkdir positions_path unless File.exists? positions_path
|
166
|
-
|
167
114
|
rescue Binlog::Error
|
168
115
|
if (/basic_string::_M_replace_aux/ === $!.to_s)
|
169
116
|
# TODO Fix the root cause in mysql-replication-listener
|
@@ -181,73 +128,67 @@ EOS
|
|
181
128
|
end
|
182
129
|
|
183
130
|
def run
|
184
|
-
return if
|
131
|
+
return if process_aborted?
|
185
132
|
|
186
133
|
@context.table_meta.update
|
187
134
|
Flydata::SourceMysql::TableDdl.migrate_tables(@context.tables, @db_opts,
|
188
|
-
@context.sync_fm, @
|
135
|
+
@context.sync_fm, @binlog_position_file.path,
|
189
136
|
@context) do |event|
|
190
137
|
@record_dispatcher.dispatch(event)
|
191
138
|
end
|
192
139
|
|
193
140
|
current_ssl_cipher = @ssl_cipher
|
194
141
|
retried = false
|
195
|
-
|
196
|
-
|
197
|
-
begin
|
142
|
+
|
143
|
+
do_transaction do |transaction_context|
|
198
144
|
begin
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
145
|
+
begin
|
146
|
+
start_kodama(mysql_url) do |c|
|
147
|
+
c.binlog_position_file = @binlog_position_file.path
|
148
|
+
if @ssl_ca_path.to_s != '' && c.respond_to?(:ssl_ca=)
|
149
|
+
$log.info "SSL is enabled. (ssl_ca: #{@ssl_ca_path})"
|
150
|
+
c.ssl_ca = @ssl_ca_path
|
151
|
+
unless current_ssl_cipher.to_s.empty?
|
152
|
+
$log.info "SSL cipher is set. (ssl_cipher: #{current_ssl_cipher})"
|
153
|
+
c.ssl_cipher = current_ssl_cipher
|
154
|
+
end
|
207
155
|
end
|
208
|
-
end
|
209
156
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
157
|
+
if c.respond_to?(:sent_binlog_position_file=)
|
158
|
+
$log.info "Sent position feature is enabled. sent_position_file:#{@sent_position_file.path}"
|
159
|
+
c.sent_binlog_position_file = @sent_position_file.path
|
160
|
+
end
|
214
161
|
|
215
|
-
|
216
|
-
|
162
|
+
$log.info("Binlog position - resume_pos:'#{@binlog_position_file.read rescue IOError}' " +
|
163
|
+
"sent_pos:'#{@sent_position_file.read rescue IOError}'")
|
217
164
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
165
|
+
c.connection_retry_limit = @retry_limit
|
166
|
+
c.connection_retry_wait = @retry_wait
|
167
|
+
c.log_level = @log_level.to_sym
|
168
|
+
@listen_events.each do |event_type|
|
169
|
+
$log.trace { "registered binlog event listener '#{event_type}'" }
|
170
|
+
c.send("on_#{event_type}", &method(:event_listener))
|
171
|
+
end
|
224
172
|
end
|
173
|
+
rescue Kodama::TransactionError
|
174
|
+
$log.debug "TransactionError"
|
175
|
+
transaction_context.set_transaction_broken
|
176
|
+
raise
|
177
|
+
end
|
178
|
+
rescue Binlog::Error => e
|
179
|
+
if /dh key too small/.match(e.to_s) && !retried && !@secondary_ssl_cipher.to_s.empty?
|
180
|
+
retried = true
|
181
|
+
current_ssl_cipher = @secondary_ssl_cipher
|
182
|
+
$log.warn("Retry with secondary ssl cipher list due to '#{e}' - secondary_ssl_cipher: '#{@secondary_ssl_cipher}'")
|
183
|
+
retry
|
184
|
+
elsif /binlog file.*does not exist/.match(e.to_s)
|
185
|
+
$log.error("#{e.to_s}. Sync must be reset. Terminating the agent.")
|
186
|
+
Process.kill(:TERM, Process.ppid)
|
187
|
+
else
|
188
|
+
raise e
|
225
189
|
end
|
226
|
-
rescue Kodama::TransactionError
|
227
|
-
$log.debug "TransactionError"
|
228
|
-
transaction_broken = true
|
229
|
-
raise
|
230
|
-
end
|
231
|
-
rescue Binlog::Error => e
|
232
|
-
if /dh key too small/.match(e.to_s) && !retried && !@secondary_ssl_cipher.to_s.empty?
|
233
|
-
retried = true
|
234
|
-
current_ssl_cipher = @secondary_ssl_cipher
|
235
|
-
$log.warn("Retry with secondary ssl cipher list due to '#{e}' - secondary_ssl_cipher: '#{@secondary_ssl_cipher}'")
|
236
|
-
retry
|
237
|
-
elsif /binlog file.*does not exist/.match(e.to_s)
|
238
|
-
$log.error("#{e.to_s}. Sync must be reset. Terminating the agent.")
|
239
|
-
Process.kill(:TERM, Process.ppid)
|
240
|
-
else
|
241
|
-
raise e
|
242
|
-
end
|
243
|
-
ensure
|
244
|
-
if !transaction_broken && # leave the lock file when a transaction is broken
|
245
|
-
File.exists?(@lock_file) &&
|
246
|
-
Process.pid == File.open(@lock_file, "r") {|f| f.read}.to_i
|
247
|
-
File.delete(@lock_file)
|
248
190
|
end
|
249
191
|
end
|
250
|
-
|
251
192
|
rescue => e
|
252
193
|
# HACK: mysql-replication-listener has a network connection leak bug which doesn't release a connection
|
253
194
|
# to MySQL. Rather than fixing the bug, restarting the fluentd process for now.
|
@@ -279,7 +220,7 @@ EOS
|
|
279
220
|
end
|
280
221
|
|
281
222
|
def shutdown
|
282
|
-
return if
|
223
|
+
return if process_aborted?
|
283
224
|
|
284
225
|
@idle_event_detector.stop
|
285
226
|
if @thread and @thread.alive?
|
@@ -296,6 +237,7 @@ EOS
|
|
296
237
|
$log.warn "an error occurred during Kodama shutdown. error:'#{e.to_s}'\n#{e.backtrace.join("\n")}"
|
297
238
|
end
|
298
239
|
end
|
240
|
+
|
299
241
|
@sync_fm.close
|
300
242
|
end
|
301
243
|
|
@@ -307,28 +249,6 @@ EOS
|
|
307
249
|
end
|
308
250
|
false
|
309
251
|
end
|
310
|
-
|
311
|
-
#Hack: All that has been added here is `Fluent::Engine.shutdown_source`. This should be in
|
312
|
-
#fluentd's supervisor#install_main_process_signal_handlers
|
313
|
-
def install_custom_signal_handler
|
314
|
-
trap :USR1 do
|
315
|
-
$log.debug "fluentd main process get SIGUSR1"
|
316
|
-
$log.info "force flushing buffered events"
|
317
|
-
#@log.reopen!
|
318
|
-
|
319
|
-
# Creating new thread due to mutex can't lock
|
320
|
-
# in main thread during trap context
|
321
|
-
Thread.new {
|
322
|
-
begin
|
323
|
-
Fluent::Engine.shutdown_source
|
324
|
-
Fluent::Engine.flush!
|
325
|
-
$log.debug "flushing thread: flushed"
|
326
|
-
rescue Exception => e
|
327
|
-
$log.warn "flushing thread error: #{e}"
|
328
|
-
end
|
329
|
-
}.run
|
330
|
-
end
|
331
|
-
end
|
332
252
|
end
|
333
253
|
|
334
254
|
|