flydata 0.6.11 → 0.6.12

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +4 -4
  4. data/VERSION +1 -1
  5. data/flydata-core/lib/flydata-core/postgresql/source_pos.rb +34 -0
  6. data/flydata-core/lib/flydata-core/table_def/base.rb +10 -0
  7. data/flydata-core/lib/flydata-core/table_def/postgresql_table_def.rb +20 -4
  8. data/flydata-core/spec/postgresql/source_pos_spec.rb +43 -0
  9. data/flydata-core/spec/table_def/base_spec.rb +51 -0
  10. data/flydata.gemspec +0 -0
  11. data/lib/flydata/command/sender.rb +9 -6
  12. data/lib/flydata/command/setup.rb +6 -12
  13. data/lib/flydata/command/sync.rb +31 -17
  14. data/lib/flydata/fluent-plugins/flydata_plugin_ext/flydata_sync.rb +2 -3
  15. data/lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb +15 -14
  16. data/lib/flydata/parser/source_table.rb +4 -3
  17. data/lib/flydata/plugin_support/context.rb +46 -0
  18. data/lib/flydata/plugin_support/sync_record_emittable.rb +69 -0
  19. data/lib/flydata/source/component.rb +1 -1
  20. data/lib/flydata/source/generate_source_dump.rb +3 -2
  21. data/lib/flydata/source_mysql/mysql_compatibility_check.rb +12 -11
  22. data/lib/flydata/source_mysql/parser/dump_parser.rb +0 -4
  23. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/alter_table_query_handler.rb +8 -2
  24. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/binlog_position_file.rb +7 -1
  25. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/binlog_query_dispatcher.rb +10 -4
  26. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/binlog_query_handler.rb +8 -2
  27. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/binlog_record_dispatcher.rb +9 -3
  28. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/binlog_record_handler.rb +16 -34
  29. data/lib/flydata/source_mysql/plugin_support/context.rb +7 -0
  30. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/ddl_query_handler.rb +11 -19
  31. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/dml_record_handler.rb +8 -2
  32. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/drop_database_query_handler.rb +8 -2
  33. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/table_meta.rb +5 -1
  34. data/lib/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/truncate_table_query_handler.rb +8 -2
  35. data/lib/flydata/source_postgresql/generate_source_dump.rb +175 -0
  36. data/lib/flydata/source_postgresql/parse_dump_and_send.rb +126 -0
  37. data/lib/flydata/source_postgresql/pg_client.rb +43 -0
  38. data/lib/flydata/source_postgresql/postgresql_component.rb +12 -0
  39. data/lib/flydata/source_postgresql/setup.rb +24 -0
  40. data/lib/flydata/source_postgresql/source_pos.rb +18 -0
  41. data/lib/flydata/source_postgresql/sync_generate_table_ddl.rb +7 -15
  42. data/lib/flydata/sync_file_manager.rb +39 -28
  43. data/spec/flydata/command/setup_spec.rb +0 -1
  44. data/spec/flydata/command/sync_spec.rb +2 -2
  45. data/spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb +5 -6
  46. data/spec/flydata/plugin_support/context_spec.rb +27 -0
  47. data/spec/flydata/source_mysql/parser/dump_parser_spec.rb +4 -4
  48. data/spec/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/alter_table_query_handler_spec.rb +3 -3
  49. data/spec/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/binlog_query_dispatcher_spec.rb +5 -5
  50. data/spec/flydata/source_mysql/plugin_support/context_spec.rb +26 -0
  51. data/spec/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/ddl_query_handler_spec.rb +3 -3
  52. data/spec/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/dml_record_handler_spec.rb +2 -2
  53. data/spec/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/drop_database_query_handler_spec.rb +3 -3
  54. data/spec/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/shared_query_handler_context.rb +3 -1
  55. data/spec/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/table_meta_spec.rb +3 -3
  56. data/spec/flydata/{fluent-plugins/mysql → source_mysql/plugin_support}/truncate_query_handler_spec.rb +7 -4
  57. data/spec/flydata/source_postgresql/generate_source_dump_spec.rb +144 -0
  58. data/spec/flydata/sync_file_manager_spec.rb +1 -1
  59. metadata +38 -24
  60. data/lib/flydata/fluent-plugins/mysql/context.rb +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa75cb40b7d49f2aeb912086e3e2e35e837cb2e0
4
- data.tar.gz: 5234a32b9c3f7e2a40702d4cbeb305e3dbed548b
3
+ metadata.gz: 181cbcfe32036e4e5e580f5208c183c2aeede5d5
4
+ data.tar.gz: d74e286636bafd5a3ade8482cd808c69597ff723
5
5
  SHA512:
6
- metadata.gz: 5482b2ef22c8b0b0e0c49841190fd02829a74811adb8a95f487e2dc9c2f6447bbb2a5e3d6a108a81c035c8886cc11132903cd57f90ccf4b9c076dba4312e7ea2
7
- data.tar.gz: 01ccf0a83e53aac78ca543e2b422c0163d9d5775250b7e61317f24d8fd915f1bd8e8cd4d0dcf2bcad7512b89bb7e5c07a51f66392e41898ecf95ba2b2f72e96e
6
+ metadata.gz: d01fd1622e3573ed4b2989af7ad77a1fd9f8c945bc6d8f959e65818a4733c161e32793c908c51ce71974066bc86db80d69aabff904d18a4336ddc60f95bd40bf
7
+ data.tar.gz: f829d5633875735e6fef04eec4fadd7778b9e35eedbc7decbcbea150ebb4a2bf64d91bfcc50550f14f4a59ff8aecc2599cae93bb249e8ec775d2b58a71927f43
data/Gemfile CHANGED
@@ -14,7 +14,7 @@ gem "slop", '~> 3.4', '>= 3.4.6'
14
14
  gem "treetop", '~> 1.5', '>= 1.5.3'
15
15
  gem "sys-filesystem", '~> 1.1', '>= 1.1.3'
16
16
  gem "io-console", '~> 0.4.2', '>= 0.4.2'
17
- gem "kodama", '~> 0.1', '>= 0.1.10'
17
+ gem "kodama", '~> 0.1', '>= 0.1.11'
18
18
  gem "serverengine", '~> 1.5'
19
19
 
20
20
  group :development do
@@ -61,8 +61,8 @@ GEM
61
61
  rdoc
62
62
  json (1.8.1)
63
63
  jwt (1.0.0)
64
- kodama (0.1.10)
65
- ruby-binlog (~> 1.0, >= 1.0.8)
64
+ kodama (0.1.11)
65
+ ruby-binlog (~> 1.0, >= 1.0.9)
66
66
  method_source (0.8.2)
67
67
  mime-types (2.3)
68
68
  minitest (4.7.5)
@@ -108,7 +108,7 @@ GEM
108
108
  rspec-mocks (3.0.3)
109
109
  rspec-support (~> 3.0.0)
110
110
  rspec-support (3.0.3)
111
- ruby-binlog (1.0.8)
111
+ ruby-binlog (1.0.9)
112
112
  ruby-prof (0.15.1)
113
113
  serverengine (1.5.10)
114
114
  sigdump (~> 0.2.2)
@@ -138,7 +138,7 @@ DEPENDENCIES
138
138
  io-console (~> 0.4.2, >= 0.4.2)
139
139
  jeweler (~> 1.8, >= 1.8.8)
140
140
  json (~> 1.8, >= 1.8.0)
141
- kodama (~> 0.1, >= 0.1.10)
141
+ kodama (~> 0.1, >= 0.1.11)
142
142
  mysql2 (~> 0.3, >= 0.3.17)
143
143
  pg (~> 0.18.4)
144
144
  protected_attributes (~> 1.0, >= 1.0.8)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.11
1
+ 0.6.12
@@ -0,0 +1,34 @@
1
+ require 'json'
2
+
3
+ module FlydataCore
4
+ module Postgresql
5
+
6
+ class SourcePos
7
+ include Comparable
8
+
9
+ def initialize(snapshot_id, pk_values = nil)
10
+ @snapshot_id = snapshot_id
11
+ @pk_values = pk_values
12
+ end
13
+
14
+ attr_reader :snapshot_id
15
+
16
+ def to_s
17
+ pk_values = @pk_values ? @pk_values.to_json : ''
18
+ "#{@snapshot_id}\t#{pk_values}"
19
+ end
20
+
21
+ def <=>(other)
22
+ # TODO take pk_values into account
23
+ @snapshot_id <=> other.snapshot_id
24
+ end
25
+
26
+ def self.load(str)
27
+ snapshot_id, pk_valules = str.split("\t")
28
+ pk_values = JSON.parse(pk_values) if pk_values
29
+ self.new(snapshot_id, pk_values)
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -25,6 +25,16 @@ class Base
25
25
 
26
26
  tabledef
27
27
  end
28
+
29
+ def column_names
30
+ @columns.collect{|col| col[:column]}
31
+ end
32
+
33
+ def pk_columns
34
+ @columns.select{|col| col.has_key?(:primary_key) }.
35
+ sort{|a,b| a[:primary_key] <=> b[:primary_key]}.
36
+ collect{|col| col[:column]}
37
+ end
28
38
  end
29
39
 
30
40
  end
@@ -9,16 +9,32 @@ class PostgresqlTableDef < Base
9
9
 
10
10
  TYPE_MAP_P2F = {
11
11
  'bigint' => {type: 'int8'},
12
+ 'bigserial' => {type: 'int8'},
13
+ 'boolean' => {type: 'int1', def_width: '1'}, # TODO introduce bool type
14
+ 'bytea' => {type: 'varbinary'}, # TODO need value conversion
15
+ 'character' => {type: 'varchar', def_width: '1'},
12
16
  'character varying' => {type: 'varchar',
13
- width_attrs:["character_octet_length"]}, # TODO check def_width
17
+ width_attrs:["character_octet_length"],
18
+ def_width:[1]},
19
+ 'date' => {type: 'date'},
20
+ 'decimal' => {type: 'numeric',
21
+ width_attrs:["numeric_precision", "numeric_scale"],
22
+ def_width:[nil, 0] },
23
+ 'double precision' => {type: 'float8'},
14
24
  'integer' => {type: 'int4'},
15
- 'timestamp with time zone' => {type: 'datetime'}, # TODO may need override?
16
- 'timestamp without time zone' => {type: 'datetime'}, # TODO may need override?
17
- 'bytea' => {type: 'varbinary'}, # TODO need value conversion
25
+ 'money' => {type: 'money'},
18
26
  'numeric' => {type: 'numeric',
19
27
  width_attrs:["numeric_precision", "numeric_scale"],
20
28
  def_width:[nil, 0],
21
29
  },
30
+ 'real' => {type: 'float4'},
31
+ 'serial' => {type: 'int4'},
32
+ 'smallint' => {type: 'int2'},
33
+ 'text' => {type: 'text'},
34
+ 'time with time zone' => {type: 'time'},
35
+ 'time without time zone' => {type: 'time'},
36
+ 'timestamp with time zone' => {type: 'datetime'},
37
+ 'timestamp without time zone' => {type: 'datetime'},
22
38
  # TODO add more types
23
39
  }
24
40
 
@@ -0,0 +1,43 @@
1
+ require 'flydata-core/postgresql/source_pos'
2
+
3
+ module FlydataCore
4
+ module Postgresql
5
+
6
+ describe SourcePos do
7
+ let(:subject_object) { described_class.new(snapshot_id, pk_values) }
8
+
9
+ let(:snapshot_id) { "1234:1234:" }
10
+ let(:pk_values) { nil }
11
+
12
+ describe '#to_s' do
13
+ subject { subject_object.to_s }
14
+
15
+ context 'when pk_values is nil' do
16
+ let(:pk_values) { nil }
17
+ it { is_expected.to eq %Q|#{snapshot_id}\t| }
18
+ end
19
+ context 'when pk_values is not nil' do
20
+ let(:pk_values) { { "user_id" => 1, "address_id" => 3 } }
21
+ it { is_expected.to eq %Q|#{snapshot_id}\t{"user_id":1,"address_id":3}| }
22
+ end
23
+ end
24
+
25
+ describe '.load' do
26
+ subject { described_class.load(str) }
27
+
28
+ context 'without pk_values' do
29
+ let(:str) { %Q|#{snapshot_id}\t| }
30
+ it { is_expected.to eq described_class.new(snapshot_id) }
31
+ end
32
+ context 'with pk_values' do
33
+ let(:str) { %Q|#{snapshot_id}\t{"user_id":1,"address_id":3}| }
34
+ it do
35
+ is_expected.to eq described_class.new(snapshot_id,
36
+ "user_id" => 1, "address_id" => 3)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,51 @@
1
+ require 'flydata-core/table_def/base'
2
+
3
+ module FlydataCore
4
+ module TableDef
5
+
6
+ describe Base do
7
+ let(:subject_object) { described_class.new(table_def, table_name, columns,
8
+ column_def, default_charset,
9
+ default_source_charset, comment) }
10
+
11
+ let(:table_def) { double('table_def') }
12
+ let(:table_name) { double('table_name') }
13
+ let(:columns) { double('columns') }
14
+ let(:column_def) { double('column_def') }
15
+ let(:default_charset) { double('default_charset') }
16
+ let(:default_source_charset) { double('default_source_charset') }
17
+ let(:comment) { double('comment') }
18
+
19
+ describe '#pk_columns' do
20
+ subject { subject_object.pk_columns }
21
+
22
+ let(:columns) do
23
+ [ {column: "name"},
24
+ {column: "address_id", primary_key: pk1_value},
25
+ {column: "zip"},
26
+ {column: "user_id", primary_key: pk2_value},
27
+ ]
28
+ end
29
+
30
+
31
+ context 'with unordered primary keys' do
32
+ let(:pk1_value) { 't' }
33
+ let(:pk2_value) { 't' }
34
+
35
+ it "returns primary keys in the column order" do
36
+ is_expected.to eq %w(address_id user_id)
37
+ end
38
+ end
39
+ context 'with ordered primary keys' do
40
+ let(:pk1_value) { 2 }
41
+ let(:pk2_value) { 1 }
42
+
43
+ it "returns primary keys in the pk order" do
44
+ is_expected.to eq %w(user_id address_id)
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+ end
Binary file
@@ -110,8 +110,8 @@ EOF
110
110
  log_info_stdout('Restarting sender process.') unless options[:quiet]
111
111
  begin
112
112
  stop(options)
113
- rescue
114
- log_warn_stderr 'Something has gone wrong... force stopping the FlyData process...'
113
+ rescue => e
114
+ log_warn_stderr "Something has gone wrong. Force stopping the FlyData process. error:#{e.to_s}"
115
115
  kill_all(options)
116
116
  end
117
117
  else
@@ -132,7 +132,7 @@ EOF
132
132
  `[ -f #{pid_file} ] && pgrep -P \`cat #{pid_file}\``.to_i > 0
133
133
  end
134
134
  def kill_all(options = {})
135
- if Kernel.system("ps ax | grep 'flydata' | grep -v grep | grep fluentd | awk '{print \"kill \" $1}' | sh")
135
+ if Kernel.system("ps x | grep 'flydata' | grep -v grep | grep fluentd | awk '{print \"kill -9 \" $1}' | sh")
136
136
  log_info_stdout("Done.") unless options[:quiet]
137
137
  return true
138
138
  else
@@ -192,11 +192,14 @@ EOF
192
192
  raise "Somthing has gone wrong... Please try setup command again."
193
193
  end
194
194
  def wait_until_client_stop(options = {})
195
- retry_count = 10
195
+ retry_count = 120
196
+ show_message_at_retry = 4
196
197
  1.upto(retry_count) do |i|
197
198
  return true unless process_exist?
198
- log_info_stdout("Waiting for the client to stop... (#{i}/#{retry_count})") unless options[:quiet]
199
- Kernel.sleep 3
199
+ Kernel.sleep 5
200
+ if i % show_message_at_retry == 0
201
+ log_info_stdout("Waiting for the client to stop...") unless options[:quiet]
202
+ end
200
203
  end
201
204
  false
202
205
  end
@@ -76,18 +76,12 @@ What's next?
76
76
  Flydata::Command::Conf.new.copy_templates
77
77
  puts
78
78
  de_exists = !!retrieve_data_entries.first
79
- ret = if de_exists && source.setup.initial_run_need_restart?
80
- sender = Flydata::Command::Sender.new
81
- if sender.process_exist?
82
- sender.stop(quiet: true)
83
- true
84
- else
85
- false
86
- end
87
- else
88
- false
89
- end
90
- Flydata::Command::Sender.new.restart(quiet: true) if ret
79
+ if de_exists && source.setup.initial_run_need_restart?
80
+ sender = Flydata::Command::Sender.new
81
+ if sender.process_exist?
82
+ Flydata::Command::Sender.new.restart(quiet: true)
83
+ end
84
+ end
91
85
  last_message = de_exists ? source.setup.initial_run_complete_message
92
86
  : :no_de_cancel
93
87
  msgs = standard_messages
@@ -34,6 +34,7 @@ module Flydata
34
34
  SERVER_DATA_PROCESSING_TIMEOUT = 3600 # seconds
35
35
 
36
36
  # for dump.pos file
37
+ STATUS_START = 'START' # only :source_pos is available at the begining of parse
37
38
  STATUS_PARSING = 'PARSING'
38
39
  STATUS_PARSED = 'WAITING' # the value is different from the constant name on purpose for backward compatibility.
39
40
  STATUS_COMPLETE = 'COMPLETE'
@@ -783,24 +784,27 @@ EOM
783
784
  def parse_dump_and_send(dump_io, dp, de, sync_fm, source_pos)
784
785
 
785
786
  context = source.parse_dump_and_send
786
- # Prepare forwarder
787
- de_tag_name = de["tag_name#{env_suffix}"]
788
- server_port = dp['server_port']
789
- data_servers = source.sync.data_servers
790
- servers = data_servers ? data_servers.split(',') :
791
- dp["servers#{env_suffix}"].collect{|s| "#{s}:#{server_port}"}
792
- forwarder_type = source.sync.forwarder ||
793
- (dp['ssl_enabled'] ? 'sslforwarder' : 'tcpforwarder')
794
- forwarder = Flydata::Output::ForwarderFactory.create(forwarder_type, de_tag_name, servers)
795
787
 
796
788
  # Load dump.pos file for resume
797
789
  dump_pos_info = sync_fm.load_dump_pos
798
- dump_pos_info ||= {}
790
+ if dump_pos_info.empty?
791
+ # First time to parse. No dump pos file available.
792
+ # Re-initialize dump_pos_info hash with new dump pos file.
793
+ if source_pos.nil?
794
+ raise "Cannot parse dump because source position is not available. Reset unfinished initial sync by command: flydata sync:reset --init"
795
+ end
796
+ sync_fm.save_dump_pos(STATUS_START, nil, nil, source_pos)
797
+ dump_pos_info = sync_fm.load_dump_pos
798
+ end
799
+
800
+ source_pos = dump_pos_info[:source_pos]
801
+ if source_pos.nil?
802
+ # this should never happen but just in case...
803
+ raise "Source position is not available. Parse dump failed. Reset unfinished initial sync by command: flydata sync:reset --init"
804
+ end
805
+
799
806
  if dump_pos_info[:table_name] && dump_pos_info[:last_pos].to_i != -1
800
- source_pos = dump_pos_info[:source_pos]
801
807
  log_info_stdout("Resuming... Last processed table: #{dump_pos_info[:table_name]}")
802
- else
803
- dump_pos_info[:source_pos] = source_pos
804
808
  end
805
809
  if dump_pos_info[:source_table] && dump_pos_info[:source_table].value_converters.nil?
806
810
  # Old marshal dumped source_table object may not have value_converters
@@ -810,6 +814,17 @@ EOM
810
814
  # Old marshal dumped source_table object may not have column_names
811
815
  dump_pos_info[:source_table].set_column_names
812
816
  end
817
+
818
+ # Prepare forwarder
819
+ de_tag_name = de["tag_name#{env_suffix}"]
820
+ server_port = dp['server_port']
821
+ data_servers = source.sync.data_servers
822
+ servers = data_servers ? data_servers.split(',') :
823
+ dp["servers#{env_suffix}"].collect{|s| "#{s}:#{server_port}"}
824
+ forwarder_type = source.sync.forwarder ||
825
+ (dp['ssl_enabled'] ? 'sslforwarder' : 'tcpforwarder')
826
+ forwarder = Flydata::Output::ForwarderFactory.create(forwarder_type, de_tag_name, servers)
827
+
813
828
  log_info_stdout("Sending data to FlyData Server...")
814
829
 
815
830
  # initialize stats
@@ -884,6 +899,8 @@ EOM
884
899
  if tmp_num_inserted_record > 0 && forwarder.buffer_record_count > 0
885
900
  ret = forwarder.flush # send buffer data to the server before checkpoint
886
901
  sync_fm.save_record_count_stat(table_name, ret[:record_count]) if ret
902
+ # save check point
903
+ sync_fm.save_dump_pos(STATUS_PARSING, table_name, last_pos, source_pos, state, substate)
887
904
  end
888
905
 
889
906
  # show the current progress
@@ -893,9 +910,6 @@ EOM
893
910
  log_info_stdout(" -> #{(last_pos.to_f/dump_file_size * 100).round(1)}% (#{last_pos}/#{dump_file_size}) completed...")
894
911
  end
895
912
 
896
- # save check point
897
- sync_fm.save_dump_pos(STATUS_PARSING, table_name, last_pos, source_pos, state, substate)
898
-
899
913
  # send record count for the table
900
914
  if table_name.to_s != '' &&
901
915
  state == Flydata::Parser::State::CREATE_TABLE
@@ -925,10 +939,10 @@ EOM
925
939
  send_record_counts_threads.each{|t| t.join}
926
940
  output_thread.join
927
941
  forwarder.close
942
+ sync_fm.save_dump_pos(STATUS_PARSED, '', dump_file_size, source_pos)
928
943
  log_info_stdout(" -> Done")
929
944
  #log_info_stdout(" -> Records sent to the server")
930
945
  #log_info_stdout(" -> #{sync_fm.load_stats}")
931
- sync_fm.save_dump_pos(STATUS_PARSED, '', dump_file_size, source_pos)
932
946
 
933
947
  if ENV['FLYDATA_BENCHMARK']
934
948
  bench_end_time = Time.now
@@ -15,9 +15,8 @@ module Fluent
15
15
  config_param :tables_append_only, :string
16
16
 
17
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'
18
+ config_param :tag, :string
19
+ config_param :position_file, :string, default: 'position.log'
21
20
  end
22
21
  end
23
22
 
@@ -9,15 +9,15 @@ require 'kodama'
9
9
  require 'flydata/sync_file_manager'
10
10
  require 'flydata-core/mysql/command_generator'
11
11
  require 'flydata/fluent-plugins/flydata_plugin_ext/preference'
12
- require 'flydata/fluent-plugins/mysql/binlog_position_file'
13
- require 'flydata/fluent-plugins/mysql/binlog_record_dispatcher'
14
- require 'flydata/fluent-plugins/mysql/context'
15
12
  require 'flydata/fluent-plugins/flydata_plugin_ext/idle_event_detector'
16
- require 'flydata/fluent-plugins/mysql/table_meta'
13
+ require 'flydata/fluent-plugins/flydata_plugin_ext/flydata_sync'
14
+ require 'flydata/source_mysql/plugin_support/binlog_position_file'
15
+ require 'flydata/source_mysql/plugin_support/binlog_record_dispatcher'
16
+ require 'flydata/source_mysql/plugin_support/context'
17
+ require 'flydata/source_mysql/plugin_support/table_meta'
17
18
  require 'flydata/source_mysql/table_ddl'
18
19
  require 'flydata-core/fluent/config_helper'
19
20
  require 'flydata-core/mysql/ssl'
20
- require 'flydata/fluent-plugins/flydata_plugin_ext/flydata_sync'
21
21
 
22
22
 
23
23
  class MysqlBinlogFlydataInput < MysqlBinlogInput
@@ -26,11 +26,9 @@ class MysqlBinlogFlydataInput < MysqlBinlogInput
26
26
 
27
27
  Plugin.register_input('mysql_binlog_flydata', self)
28
28
 
29
- BINLOG_POSITION_FILE_CLASS = Mysql::BinLogPositionFile
29
+ BINLOG_POSITION_FILE_CLASS = Flydata::SourceMysql::PluginSupport::BinLogPositionFile
30
30
 
31
31
  config_param :database, :string
32
- config_param :tables, :string
33
- config_param :tables_append_only, :string
34
32
  config_param :initial_idle_interval, :integer, :default => 30 # 30 sec
35
33
  config_param :continuous_idle_interval, :integer, :default => 600 # 10 min
36
34
  config_param :idle_timeout, :time, :default => 1800 # 30 min
@@ -51,7 +49,7 @@ class MysqlBinlogFlydataInput < MysqlBinlogInput
51
49
  # Supported ssl cipher list for mysql(openssl)
52
50
  # https://dev.mysql.com/doc/refman/5.6/en/ssl-options.html
53
51
 
54
- config_param :secondary_ssl_cipher, :string, :default => FlydataCore::Mysql::Ssl::NON_DH_SSL_CIPHER
52
+ config_param :secondary_ssl_cipher, :string, default: FlydataCore::Mysql::Ssl::NON_DH_SSL_CIPHER
55
53
 
56
54
  def configure(conf)
57
55
  super
@@ -77,7 +75,7 @@ class MysqlBinlogFlydataInput < MysqlBinlogInput
77
75
  #exit 1 # causes retry loop
78
76
  end
79
77
 
80
- table_meta = Flydata::Mysql::TableMeta.new(@db_opts.merge(tables: @tables))
78
+ table_meta = Flydata::SourceMysql::PluginSupport::TableMeta.new(@db_opts.merge(tables: @tables))
81
79
 
82
80
  table_revs = tables.inject({}) do |h, table_name|
83
81
  h[table_name] = @sync_fm.table_rev(table_name)
@@ -85,12 +83,12 @@ class MysqlBinlogFlydataInput < MysqlBinlogInput
85
83
  end
86
84
 
87
85
  # Set context
88
- @context = Mysql::Context.new(
86
+ @context = Flydata::SourceMysql::PluginSupport::Context.new(
89
87
  database: @database, tables: @tables,
90
88
  tag: @tag, sync_fm: @sync_fm, omit_events: @omit_events,
91
89
  table_meta: table_meta, table_revs: table_revs,
92
90
  )
93
- @record_dispatcher = Mysql::FlydataBinlogRecordDispatcher.new(@context)
91
+ @record_dispatcher = Flydata::SourceMysql::PluginSupport::FlydataBinlogRecordDispatcher.new(@context)
94
92
  @idle_event_detector = IdleEventDetector.new(@initial_idle_interval, @continuous_idle_interval, @check_interval, @idle_timeout)
95
93
  end
96
94
 
@@ -184,6 +182,9 @@ EOS
184
182
  elsif /binlog file.*does not exist/.match(e.to_s)
185
183
  $log.error("#{e.to_s}. Sync must be reset. Terminating the agent.")
186
184
  Process.kill(:TERM, Process.ppid)
185
+ elsif e.kind_of?(Kodama::ConnectionEstablishError)
186
+ $log.error("#{e.to_s}. Connection to MySQL server could not be established. Terminating the agent.")
187
+ Process.kill(:TERM, Process.ppid)
187
188
  else
188
189
  raise e
189
190
  end
@@ -228,8 +229,8 @@ EOS
228
229
  begin
229
230
  @kodama_client.stop_request
230
231
  if wait_till_safe_to_stop
231
- $log.info "Killing Kodama client"
232
- Thread.kill(@thread)
232
+ @thread.join
233
+ $log.info "Kodama has stopped successfully"
233
234
  else
234
235
  $log.error "Unable to stop Kodama"
235
236
  end