flydata 0.8.8 → 0.8.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f5fc3a906ed3837e16d5cedecaf192d488c140eb
4
- data.tar.gz: b5ddcf8ea4abd89688e6ed096837bf53cfff14ee
3
+ metadata.gz: 18f14f5aa7cb056405bcddd04145128861746e81
4
+ data.tar.gz: 7137aa3faffbc50cdadf71a54e22f50c59f7beb4
5
5
  SHA512:
6
- metadata.gz: 14bd2021e7c507a6ab59e29e6e210776fd6a2a7bf2eaeb52d36b1da39839d1e575203066c2b14e6bb06628f8464b1b9b9510c13c64b7ada5d727b81d46ce230e
7
- data.tar.gz: 83740aa8b34dd758656071446c34a8fd2ed0486a464eca577b9ea9ff0731ece4e190ba36292210cd66953adf761e2ff5abaeb6e484582b491d93d24928eab396
6
+ metadata.gz: 515cc0f4a0520fc9c6f2573eb457d903dd83c43c6ff8ef114659b8e6050d67c3984e2ecc4acbfeba8307b12e4db383b1039df4647ede956c0d52799a465b6a6c
7
+ data.tar.gz: e2ea17f5471e190d8bcc718db2da8136bff4677337f60fb5e1f7da4011fb41de5081c9efad491bd8ebe1043296e26a969a55845a6b3446764e573d022cfad3f8
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.8
1
+ 0.8.9
@@ -1,13 +1,18 @@
1
1
  require 'open3'
2
2
  require 'shellwords'
3
3
  require 'flydata-core/table_def/mysql_table_def'
4
+ require 'flydata-core/mysql/compatibility_checker'
4
5
 
5
6
  module FlydataCore
6
7
  module Mysql
7
8
  class CommandGenerator
8
9
  DEFAULT_OPTION = "--default-character-set=utf8 --protocol=tcp"
9
10
  DEFAULT_MYSQL_OPTION = "#{DEFAULT_OPTION} --skip-auto-rehash"
11
+ DEFAULT_MYSQLDUMP57_OPTION = "#{DEFAULT_OPTION} --set-gtid-purged=OFF" # If you face GTID issue when start initial sync, try this option for mysqldump
10
12
 
13
+ # Get default command options
14
+ # Arguments:
15
+ # command - String ('mysql' or 'mysqldump')
11
16
  def self.default_cmd_option(command)
12
17
  case command
13
18
  when 'mysql'
@@ -48,6 +53,15 @@ module FlydataCore
48
53
  default_option = option[:no_default_option] ? "" : default_cmd_option(command)
49
54
  default_option += " --ssl-ca #{ssl_ca}" if ssl_ca
50
55
  default_option += " --ssl-cipher=#{ssl_cipher}" unless ssl_cipher.to_s.empty?
56
+
57
+ if command == 'mysqldump'
58
+ version = MysqlCompatibilityChecker.new(option).mysql_server_version
59
+
60
+ if !(version =~ /Maria/) && MysqlCompatibilityChecker.server_version_eq_or_higher?(version, "5.6.9")
61
+ default_option += " --set-gtid-purged=OFF"
62
+ end
63
+ end
64
+
51
65
  default_option = nil if default_option == ''
52
66
 
53
67
  custom_option = option[:custom_option]
@@ -29,6 +29,33 @@ module FlydataCore
29
29
  "database"
30
30
  end
31
31
 
32
+ # Utility methods
33
+
34
+ VERSION_QUERY = "SHOW VARIABLES LIKE 'version'"
35
+ def mysql_server_version
36
+ result = exec_query(VERSION_QUERY)
37
+ result.first['Value']
38
+ end
39
+
40
+ # Check if the version of MySQL server is equal or higher than the given version
41
+ # Argument:
42
+ # version: (String)
43
+ # Example:
44
+ # - MySQL server version: "5.6.10-log"
45
+ # server_version_eq_or_higher?("5.6.10-log", "5.6.9") #=> true
46
+ # - MySQL server version: "5.6.24-2+deb.sury.org~precise+2-log"
47
+ # server_version_eq_or_higher?("5.6.24-2+deb.sury.org~precise+2-log", "5.6.24") #=> true
48
+ def self.server_version_eq_or_higher?(server_version, version_to_compare)
49
+ (version_to_array(server_version) <=> version_to_array(version_to_compare)) >= 0
50
+ end
51
+
52
+ # Converting version string to Array of Integers
53
+ # Example: version_to_array("5.6.9-log") #=> [5, 6, 9]
54
+ # version_to_array("5.6.24-2+deb.sury.org~precise+2-log") #=> [5, 6, 24, 0, 0]
55
+ def self.version_to_array(version)
56
+ version.split('.').map(&:to_i)
57
+ end
58
+
32
59
  # This command works only on RDS MySQL
33
60
  RDS_CHECK_QUERY = "call mysql.rds_show_configuration;"
34
61
  def rds?(hostname = @option[:host])
@@ -324,7 +351,7 @@ EOT
324
351
  class NonRdsRetentionChecker < MysqlCompatibilityChecker
325
352
  include MysqlVariablesHandling
326
353
 
327
- BINLOG_RETENTION_HOURS = 24
354
+ BINLOG_RETENTION_HOURS = 96
328
355
  EXPIRE_LOGS_DAYS_LIMIT = BINLOG_RETENTION_HOURS / 24
329
356
 
330
357
  def check_result(result, option = @option)
@@ -15,6 +15,12 @@ module FlydataCore
15
15
  } }
16
16
  let(:option) { default_option }
17
17
  let(:cmd_pswd_check) { 'mysqldump -h test-host -P 3306 -utestuser -p%s --default-character-set=utf8 --protocol=tcp testdb' }
18
+ let(:mysql_compatibility_checker) { instance_double(MysqlCompatibilityChecker) }
19
+
20
+ before do
21
+ allow(MysqlCompatibilityChecker).to receive(:new).and_return(mysql_compatibility_checker)
22
+ allow(mysql_compatibility_checker).to receive(:mysql_server_version).and_return('5.6.8')
23
+ end
18
24
 
19
25
  describe '.generate_mysql_cmd' do
20
26
  subject { described_class.generate_mysql_cmd(option) }
@@ -35,7 +41,7 @@ module FlydataCore
35
41
  ) }
36
42
  end
37
43
 
38
- context 'when option conatins string key' do
44
+ context 'when option contains string key' do
39
45
  before {
40
46
  option[:database] = nil
41
47
  option['database'] = 'another_db'
@@ -121,6 +127,34 @@ module FlydataCore
121
127
  'mysqldump -h test-host -P 3306 -utestuser -ptestpassword --default-character-set=utf8 --protocol=tcp testdb test_table'
122
128
  ) }
123
129
  end
130
+
131
+ context 'when mysql version is 5.6.9' do
132
+ before do
133
+ allow(mysql_compatibility_checker).to receive(:mysql_server_version).and_return('5.6.9')
134
+ end
135
+
136
+ context 'when command is not \'mysqldump\'' do
137
+ before { option[:command] = nil }
138
+
139
+ it { is_expected.to eq(
140
+ 'mysql -h test-host -P 3306 -utestuser -ptestpassword --default-character-set=utf8 --protocol=tcp --skip-auto-rehash testdb'
141
+ ) }
142
+ end
143
+
144
+ context 'when server is MariaDB' do
145
+ before do
146
+ allow(mysql_compatibility_checker).to receive(:mysql_server_version).and_return('5.6.9-MariaDB')
147
+ end
148
+
149
+ it { is_expected.to eq(
150
+ 'mysqldump -h test-host -P 3306 -utestuser -ptestpassword --default-character-set=utf8 --protocol=tcp testdb'
151
+ ) }
152
+ end
153
+
154
+ it { is_expected.to eq(
155
+ 'mysqldump -h test-host -P 3306 -utestuser -ptestpassword --default-character-set=utf8 --protocol=tcp --set-gtid-purged=OFF testdb'
156
+ ) }
157
+ end
124
158
  end
125
159
 
126
160
  describe '.generate_mysql_ddl_dump_cmd' do
@@ -19,6 +19,36 @@ module FlydataCore
19
19
  describe MysqlCompatibilityChecker do
20
20
  let(:subject_object) { described_class.new(option) }
21
21
 
22
+ describe '#mysql_server_version' do
23
+ before do
24
+ version = [{"Variable_name"=>"version", "Value"=>"5.5.57-log"}]
25
+ allow(subject_object).to receive(:exec_query).with("SHOW VARIABLES LIKE 'version'").and_return(version)
26
+ end
27
+
28
+ it 'returns the mysql version' do
29
+ expect(subject_object.mysql_server_version).to eq('5.5.57-log')
30
+ end
31
+ end
32
+
33
+ describe '.server_version_eq_or_higher' do
34
+ it 'returns true if versions are equal' do
35
+ expect(described_class.server_version_eq_or_higher?("5.6.9-log", "5.6.9")).to be_truthy
36
+ end
37
+ it 'returns true if version is higher' do
38
+ expect(described_class.server_version_eq_or_higher?("5.6.10-log", "5.6.9")).to be_truthy
39
+ end
40
+ it 'returns false if version is lower' do
41
+ expect(described_class.server_version_eq_or_higher?("5.6.8-log", "5.6.9")).to be_falsey
42
+ end
43
+ end
44
+
45
+ describe '.version_to_array' do
46
+ it 'converts string to array' do
47
+ expect(described_class.version_to_array('5.6.9-log')).to eq([5, 6, 9])
48
+ expect(described_class.version_to_array('5.6.24-2+deb.sury.org~precise+2-log')).to eq([5, 6, 24, 0, 0])
49
+ end
50
+ end
51
+
22
52
  describe '#rds?' do
23
53
  subject { subject_object.rds? }
24
54
 
Binary file
@@ -170,15 +170,23 @@ module SourceMysql
170
170
  end
171
171
  context "where retention period is too low" do
172
172
  before do
173
- allow(client).to receive(:query).with("call mysql.rds_show_configuration;").and_return([{"name"=>"binlog retention hours", "value"=>4}])
173
+ allow(client).to receive(:query).with("call mysql.rds_show_configuration;").and_return([{"name"=>"binlog retention hours", "value"=>95}])
174
174
  end
175
175
  it do
176
176
  expect{subject}.to raise_error(FlydataCore::MysqlCompatibilityError, /rds_set_config/)
177
177
  end
178
178
  end
179
+ context "where retention period is equal to the recommended limit" do
180
+ before do
181
+ allow(client).to receive(:query).with("call mysql.rds_show_configuration;").and_return([{"name"=>"binlog retention hours", "value"=>96}])
182
+ end
183
+ it do
184
+ expect{subject}.to_not raise_error
185
+ end
186
+ end
179
187
  context "where retention period is over recommended limit" do
180
188
  before do
181
- allow(client).to receive(:query).with("call mysql.rds_show_configuration;").and_return([{"name"=>"binlog retention hours", "value"=>120}])
189
+ allow(client).to receive(:query).with("call mysql.rds_show_configuration;").and_return([{"name"=>"binlog retention hours", "value"=>97}])
182
190
  end
183
191
  it do
184
192
  expect{subject}.to_not raise_error
@@ -191,6 +199,11 @@ module SourceMysql
191
199
  it do
192
200
  expect{subject}.to_not raise_error
193
201
  end
202
+ it "logs the correct message" do
203
+ message = "[WARNING]Cannot verify RDS retention period on current MySQL user account.\nTo see retention period, please run this on your RDS:\n $> call mysql.rds_show_configuration;\nPlease verify that the hours is not nil and is at least 96 hours\nTo set binlog retention hours, you can run this on your RDS:\n $> call mysql.rds_set_configuration('binlog retention hours', 96);\n"
204
+ expect(subject_object).to receive(:log_warn_stderr).with(message)
205
+ subject
206
+ end
194
207
  end
195
208
  end
196
209
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flydata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.8
4
+ version: 0.8.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koichi Fujikawa
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2017-03-25 00:00:00.000000000 Z
16
+ date: 2018-02-13 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: rest-client
@@ -950,7 +950,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
950
950
  version: '0'
951
951
  requirements: []
952
952
  rubyforge_project:
953
- rubygems_version: 2.4.3
953
+ rubygems_version: 2.4.8
954
954
  signing_key:
955
955
  specification_version: 4
956
956
  summary: FlyData Agent