flydata 0.5.4 → 0.5.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/VERSION +1 -1
- data/flydata-core/lib/flydata-core/table_def/redshift_table_def.rb +1 -1
- data/flydata-core/spec/table_def/redshift_table_def_spec.rb +6 -0
- data/flydata.gemspec +5 -3
- data/lib/flydata/command/base.rb +4 -0
- data/lib/flydata/command/exclusive_runnable.rb +74 -0
- data/lib/flydata/command/helper.rb +2 -1
- data/lib/flydata/command/restart.rb +1 -0
- data/lib/flydata/command/start.rb +1 -0
- data/lib/flydata/command/stop.rb +1 -0
- data/lib/flydata/command/sync.rb +21 -14
- data/spec/flydata/command/exclusive_runnable_spec.rb +129 -0
- data/spec/flydata/command/sync_spec.rb +13 -10
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0882affb434c077a4d37f2127b7ca91aab356603
|
4
|
+
data.tar.gz: 83d402b1b492178d70a4bb6f71a2ada8c515e43e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: add50b1e166a42d338de4c386272e207bc4089b4ba746cdf52f961f8a344ecd0a676b6411bd0552239b6960d208d51bb9ac13f01448f85704a55a8805ec87104
|
7
|
+
data.tar.gz: 3028bb9b76675e98bf31eac4c6226ceb1abd001f019fa5702403632d29310b79b7e1a7b3f21a5e5bf71146ef3a778dfa62efe9db47c6f792f2552d505245bf44
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.5
|
@@ -334,6 +334,12 @@ EOT
|
|
334
334
|
it_behaves_like *examples
|
335
335
|
end
|
336
336
|
|
337
|
+
context 'when default_value is CURRENT_TIMESTAMP(6)' do
|
338
|
+
let(:default_value) { 'CURRENT_TIMESTAMP(6)' }
|
339
|
+
let(:default_value_sql) { "SYSDATE" }
|
340
|
+
it_behaves_like *examples
|
341
|
+
end
|
342
|
+
|
337
343
|
context 'when default_value is 0000-00-00 00:00:00' do
|
338
344
|
let(:default_value) { "'0000-00-00 00:00:00'" }
|
339
345
|
let(:default_value_sql) { "'0001-01-01 00:00:00.000000'" }
|
data/flydata.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: flydata 0.5.
|
5
|
+
# stub: flydata 0.5.5 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "flydata"
|
9
|
-
s.version = "0.5.
|
9
|
+
s.version = "0.5.5"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Koichi Fujikawa", "Masashi Miyazaki", "Matthew Luu", "Mak Inada", "Sriram NS"]
|
14
|
-
s.date = "2015-09-
|
14
|
+
s.date = "2015-09-11"
|
15
15
|
s.description = "FlyData Agent"
|
16
16
|
s.email = "sysadmin@flydata.com"
|
17
17
|
s.executables = ["fdmysqldump", "flydata", "serverinfo"]
|
@@ -101,6 +101,7 @@ Gem::Specification.new do |s|
|
|
101
101
|
"lib/flydata/command/conf.rb",
|
102
102
|
"lib/flydata/command/crontab.rb",
|
103
103
|
"lib/flydata/command/encrypt.rb",
|
104
|
+
"lib/flydata/command/exclusive_runnable.rb",
|
104
105
|
"lib/flydata/command/helper.rb",
|
105
106
|
"lib/flydata/command/kill_all.rb",
|
106
107
|
"lib/flydata/command/login.rb",
|
@@ -174,6 +175,7 @@ Gem::Specification.new do |s|
|
|
174
175
|
"spec/flydata/command/conf_spec.rb",
|
175
176
|
"spec/flydata/command/crontab_spec.rb",
|
176
177
|
"spec/flydata/command/encrypt_spec.rb",
|
178
|
+
"spec/flydata/command/exclusive_runnable_spec.rb",
|
177
179
|
"spec/flydata/command/helper_spec.rb",
|
178
180
|
"spec/flydata/command/kill_all_spec.rb",
|
179
181
|
"spec/flydata/command/login_spec.rb",
|
data/lib/flydata/command/base.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'slop'
|
2
2
|
require 'flydata/api_client'
|
3
3
|
require 'flydata/command_loggable'
|
4
|
+
require 'flydata/command/exclusive_runnable'
|
4
5
|
require 'flydata/preference/data_entry_preference'
|
5
6
|
|
6
7
|
|
@@ -8,6 +9,9 @@ module Flydata
|
|
8
9
|
module Command
|
9
10
|
class Base
|
10
11
|
include CommandLoggable
|
12
|
+
include ExclusiveRunnable
|
13
|
+
|
14
|
+
self.exclusive_run_home = FLYDATA_HOME
|
11
15
|
|
12
16
|
def initialize(options = Slop.new)
|
13
17
|
@api_client = ApiClient.instance
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Flydata
|
4
|
+
module Command
|
5
|
+
|
6
|
+
module ExclusiveRunnable
|
7
|
+
def self.included base
|
8
|
+
base.extend ClassMethods
|
9
|
+
|
10
|
+
base.class_variable_set(:@@exclusive_run_home, ENV['HOME'])
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
def run_exclusive(method, options = {})
|
15
|
+
saved_method = :"__#{method}"
|
16
|
+
alias_method saved_method, method
|
17
|
+
|
18
|
+
define_method(method) do |*args|
|
19
|
+
result = nil
|
20
|
+
exclusive_run_info = nil
|
21
|
+
begin
|
22
|
+
info = self.class.load_exclusive_run_info
|
23
|
+
if info
|
24
|
+
raise "Command `#{info['command']}` is already running. Wait until the command completes or stop the command. (pid:#{info['pid']})"
|
25
|
+
end
|
26
|
+
exclusive_run_info = { command: self.class.command(method, options), pid: Process.pid }
|
27
|
+
self.class.save_exclusive_run_info(exclusive_run_info)
|
28
|
+
result = send(saved_method, *args)
|
29
|
+
ensure
|
30
|
+
self.class.delete_exclusive_run_info if exclusive_run_info
|
31
|
+
end
|
32
|
+
result
|
33
|
+
end
|
34
|
+
end
|
35
|
+
def exclusive_run_home
|
36
|
+
@@exclusive_run_home
|
37
|
+
end
|
38
|
+
def exclusive_run_home=(value)
|
39
|
+
@@exclusive_run_home = value
|
40
|
+
end
|
41
|
+
def exclusive_run_info_path
|
42
|
+
File.join(exclusive_run_home, "exclusive_run.info")
|
43
|
+
end
|
44
|
+
|
45
|
+
def load_exclusive_run_info
|
46
|
+
path = exclusive_run_info_path
|
47
|
+
return nil unless File.exists?(path)
|
48
|
+
|
49
|
+
JSON.parse(File.open(path){|f| f.read})
|
50
|
+
end
|
51
|
+
|
52
|
+
def save_exclusive_run_info(info)
|
53
|
+
path = exclusive_run_info_path
|
54
|
+
File.open(path, "w"){|f| f.write(info.to_json)}
|
55
|
+
end
|
56
|
+
|
57
|
+
def delete_exclusive_run_info
|
58
|
+
path = exclusive_run_info_path
|
59
|
+
File.delete(path) if File.exists?(path)
|
60
|
+
end
|
61
|
+
|
62
|
+
def command(subcommand, options = {})
|
63
|
+
return options[:command] if options[:command]
|
64
|
+
|
65
|
+
modules = self.name.split('::')
|
66
|
+
|
67
|
+
cmd = modules.last.downcase
|
68
|
+
subcommand == :run ? cmd : "#{cmd}:#{subcommand}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
data/lib/flydata/command/stop.rb
CHANGED
data/lib/flydata/command/sync.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'fiber'
|
2
1
|
require 'msgpack'
|
3
2
|
require 'mysql2'
|
4
3
|
require 'rest_client'
|
@@ -23,6 +22,7 @@ module Flydata
|
|
23
22
|
|
24
23
|
class Sync < Base
|
25
24
|
include Helpers
|
25
|
+
|
26
26
|
INSERT_PROGRESS_INTERVAL = 1000
|
27
27
|
SERVER_DATA_PROCESSING_TIMEOUT = 3600 # seconds
|
28
28
|
|
@@ -101,6 +101,7 @@ module Flydata
|
|
101
101
|
last_message = ALL_DONE_MESSAGE_TEMPLATE % [redshift_console_url, dashboard_url]
|
102
102
|
log_info_stdout(last_message)
|
103
103
|
end
|
104
|
+
run_exclusive :run
|
104
105
|
|
105
106
|
# Public method
|
106
107
|
# - Called from Sender#start/restart
|
@@ -136,6 +137,7 @@ EOS
|
|
136
137
|
end
|
137
138
|
log_info_stdout("Buffers have been flushed and the sender process has been stopped.")
|
138
139
|
end
|
140
|
+
run_exclusive :flush
|
139
141
|
|
140
142
|
# Command: flydata sync:reset
|
141
143
|
# - Arguments
|
@@ -204,7 +206,7 @@ EOS
|
|
204
206
|
sync_fm.table_rev_file_paths(*@input_tables),
|
205
207
|
sync_fm.table_ddl_file_paths(*@input_tables)
|
206
208
|
]
|
207
|
-
new_tables_after_reset = @
|
209
|
+
new_tables_after_reset = @unsynced_tables + @input_tables
|
208
210
|
if @input_tables.empty? or @full_tables.empty? or @full_tables.all?{|ft| new_tables_after_reset.include?(ft)}
|
209
211
|
delete_files << sync_fm.binlog_path
|
210
212
|
delete_files << sync_fm.sent_binlog_path
|
@@ -215,6 +217,7 @@ EOS
|
|
215
217
|
sync_fm.close
|
216
218
|
log_info_stdout("Reset completed successfully.")
|
217
219
|
end
|
220
|
+
run_exclusive :reset
|
218
221
|
|
219
222
|
# Depricated Command: flydata sync:skip
|
220
223
|
# skip initial sync
|
@@ -228,6 +231,7 @@ EOS
|
|
228
231
|
log_info_stdout("-> #{binlog_path}")
|
229
232
|
log_info_stdout("Run 'flydata start' to start continuous sync.")
|
230
233
|
end
|
234
|
+
run_exclusive :skip
|
231
235
|
|
232
236
|
# Command: flydata sync:generate_table_ddl
|
233
237
|
# - Arguments
|
@@ -249,10 +253,11 @@ EOS
|
|
249
253
|
Flydata::MysqlCompatibilityCheck.new(dp, de['mysql_data_entry_preference']).check
|
250
254
|
|
251
255
|
# Set instance variables
|
252
|
-
set_current_tables(tables,
|
256
|
+
set_current_tables(tables, include_all_tables: true)
|
253
257
|
|
254
258
|
do_generate_table_ddl(de)
|
255
259
|
end
|
260
|
+
run_exclusive :generate_table_ddl
|
256
261
|
|
257
262
|
# Command: flydata sync:fix_binlogpos
|
258
263
|
# - Arguments
|
@@ -301,6 +306,7 @@ EOS
|
|
301
306
|
sync_fm.save_binlog(new_binlog_info)
|
302
307
|
log_info_stdout("Done!")
|
303
308
|
end
|
309
|
+
run_exclusive :fix_binlogpos
|
304
310
|
|
305
311
|
private
|
306
312
|
|
@@ -317,9 +323,9 @@ EOS
|
|
317
323
|
# #initial_sync knows where to resume from.
|
318
324
|
log_info_stdout("Resuming the initial sync...")
|
319
325
|
initial_sync(de, options.merge(sync_resumed: true))
|
320
|
-
elsif !@
|
326
|
+
elsif !@unsynced_tables.empty?
|
321
327
|
show_purpose_name
|
322
|
-
unsynced_table_message = "We've noticed that these tables have not been synced yet: #{@
|
328
|
+
unsynced_table_message = "We've noticed that these tables have not been synced yet: #{@unsynced_tables.join(", ")}\n"
|
323
329
|
unless @ddl_tables.empty?
|
324
330
|
unsynced_table_message <<
|
325
331
|
" WARNING: We've noticed that at least one of these tables have not had their DDL generated yet.\n" +
|
@@ -847,7 +853,7 @@ EOM
|
|
847
853
|
schema_name = (de['schema_name'] || nil)
|
848
854
|
mp = de['mysql_data_entry_preference']
|
849
855
|
|
850
|
-
tables = opts.all_tables? ? @full_tables : (@input_tables.empty? ? @
|
856
|
+
tables = opts.all_tables? ? @full_tables : (@input_tables.empty? ? @unsynced_tables : @input_tables)
|
851
857
|
|
852
858
|
raise "There are no valid unsynced tables, if you want to just get ddl for all tables, please run \`flydata sync:generate_table_ddl --all-tables\`" if tables.empty?
|
853
859
|
|
@@ -897,8 +903,7 @@ EOS
|
|
897
903
|
end
|
898
904
|
end
|
899
905
|
|
900
|
-
|
901
|
-
fixed_tables.each {|table| table_validity_hash[table] = nil }
|
906
|
+
tables_without_error.each {|table| table_validity_hash[table] = nil }
|
902
907
|
flydata.data_entry.update_table_validity(de['id'], {updated_tables: table_validity_hash}) unless table_validity_hash.empty?
|
903
908
|
|
904
909
|
sync_fm = create_sync_file_manager(de)
|
@@ -944,16 +949,17 @@ Thank you for using FlyData!
|
|
944
949
|
sync_info = sync_fm.load_sync_info
|
945
950
|
sync_resumed = options[:resume] && !!sync_info
|
946
951
|
|
947
|
-
|
948
|
-
@full_tables = options[:
|
952
|
+
#full_tables will either include all tables including invalid tables or all valid tables that aren't new tables
|
953
|
+
@full_tables = options[:include_all_tables] ? de['mysql_data_entry_preference']['tables'] + de['mysql_data_entry_preference']['invalid_tables'] :
|
954
|
+
de['mysql_data_entry_preference']['tables'] - de['mysql_data_entry_preference']['new_tables']
|
949
955
|
|
950
|
-
@
|
956
|
+
@unsynced_tables = sync_fm.get_new_table_list(@full_tables, "pos") # Get list of tables that do not have a .pos file
|
951
957
|
@ddl_tables = sync_fm.get_new_table_list(@full_tables, "generated_ddl")
|
952
958
|
|
953
959
|
@input_tables = sync_resumed ? sync_info[:tables] : input_tables
|
954
960
|
@input_tables ||= []
|
955
961
|
@full_initial_sync = sync_resumed ? sync_info[:initial_sync] :
|
956
|
-
(@
|
962
|
+
(@unsynced_tables == @full_tables)
|
957
963
|
|
958
964
|
sync_fm.close
|
959
965
|
|
@@ -980,7 +986,7 @@ Thank you for using FlyData!
|
|
980
986
|
elsif !@input_tables.empty?
|
981
987
|
@input_tables
|
982
988
|
else
|
983
|
-
@
|
989
|
+
@unsynced_tables
|
984
990
|
end
|
985
991
|
end
|
986
992
|
|
@@ -991,7 +997,7 @@ Thank you for using FlyData!
|
|
991
997
|
elsif !@input_tables.empty?
|
992
998
|
@input_tables
|
993
999
|
else
|
994
|
-
@
|
1000
|
+
@unsynced_tables
|
995
1001
|
end
|
996
1002
|
end
|
997
1003
|
|
@@ -1012,6 +1018,7 @@ Thank you for using FlyData!
|
|
1012
1018
|
mp['tables'] = mp['tables'].split(",").uniq
|
1013
1019
|
end
|
1014
1020
|
mp['invalid_tables'] = mp['invalid_tables'].kind_of?(String) ? mp['invalid_tables'].split(",").uniq : []
|
1021
|
+
mp['new_tables'] = mp['new_tables'].kind_of?(String) ? mp['new_tables'].split(",").uniq : []
|
1015
1022
|
|
1016
1023
|
unless mp['ssl_ca_content'].to_s.strip.empty?
|
1017
1024
|
sync_fm = create_sync_file_manager(de)
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flydata/command/exclusive_runnable'
|
3
|
+
|
4
|
+
module Flydata
|
5
|
+
module Command
|
6
|
+
|
7
|
+
class Exclusiverunnabletest
|
8
|
+
include ExclusiveRunnable
|
9
|
+
|
10
|
+
def long_running_command
|
11
|
+
sleep 0.2
|
12
|
+
"result1"
|
13
|
+
end
|
14
|
+
run_exclusive :long_running_command
|
15
|
+
|
16
|
+
def normal_method_call
|
17
|
+
"result2"
|
18
|
+
end
|
19
|
+
run_exclusive :normal_method_call
|
20
|
+
end
|
21
|
+
|
22
|
+
describe Exclusiverunnabletest do
|
23
|
+
let(:subject_object) { described_class.new }
|
24
|
+
|
25
|
+
let(:file_path) { "/tmp" }
|
26
|
+
let(:lock_file) { File.join(file_path, 'exclusive_run.info') }
|
27
|
+
let(:lock_file_content) { { command: 'exclusiverunnabletest:long_running_command', pid: 234 } }
|
28
|
+
|
29
|
+
before do
|
30
|
+
described_class.exclusive_run_home = file_path
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#normal_method_call' do
|
34
|
+
subject { subject_object.normal_method_call }
|
35
|
+
it "runs the method body normally" do
|
36
|
+
is_expected.to eq "result2"
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when a lock file already exists" do
|
40
|
+
before do
|
41
|
+
File.open(lock_file, "w") {|f| f.write(lock_file_content)}
|
42
|
+
end
|
43
|
+
|
44
|
+
it "does not delete the lock file" do
|
45
|
+
expect{ subject }.to raise_error
|
46
|
+
|
47
|
+
expect(File.exists?(lock_file)).to eq true
|
48
|
+
end
|
49
|
+
|
50
|
+
after do
|
51
|
+
File.delete(lock_file) if File.exists?(lock_file)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#long_running_command' do
|
57
|
+
subject { subject_object.long_running_command }
|
58
|
+
context 'run alone' do
|
59
|
+
context "check while the command is running" do
|
60
|
+
it "creates a lock file" do
|
61
|
+
th = Thread.new{ subject }
|
62
|
+
|
63
|
+
sleep 0.1
|
64
|
+
|
65
|
+
expect(File.exists?(lock_file)).to eq true
|
66
|
+
|
67
|
+
th.join
|
68
|
+
end
|
69
|
+
end
|
70
|
+
context "check after the command is finished" do
|
71
|
+
it "creates a lock file but it's gone" do
|
72
|
+
th = Thread.new{ subject }
|
73
|
+
|
74
|
+
th.join
|
75
|
+
|
76
|
+
expect(File.exists?(lock_file)).to eq false
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'run two commands concurrently' do
|
82
|
+
it "raises an error for the second command" do
|
83
|
+
th = Thread.new{ subject }
|
84
|
+
sleep 0.1
|
85
|
+
expect{ subject_object.normal_method_call }.to raise_exception(
|
86
|
+
/`exclusiverunnabletest:long_running_command` is already running\..*\(pid: *[0-9]+\)/)
|
87
|
+
|
88
|
+
th.join
|
89
|
+
end
|
90
|
+
end
|
91
|
+
context 'run two commands sequentially' do
|
92
|
+
it "runs both commands successfully" do
|
93
|
+
th = Thread.new{ subject }
|
94
|
+
|
95
|
+
th.join
|
96
|
+
|
97
|
+
expect( subject_object.normal_method_call ).to eq "result2"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '.command' do
|
103
|
+
subject { described_class.command(method_symbol, options) }
|
104
|
+
|
105
|
+
let(:options) { {} }
|
106
|
+
context 'with :run' do
|
107
|
+
let(:method_symbol) { :run }
|
108
|
+
it 'uses the class name as the command' do
|
109
|
+
is_expected.to eq "exclusiverunnabletest"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
context 'with a method' do
|
113
|
+
let(:method_symbol) { :a_method }
|
114
|
+
it 'uses the class name and the method as the command ' do
|
115
|
+
is_expected.to eq "exclusiverunnabletest:a_method"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
context 'with a :command option' do
|
119
|
+
let(:options) { { command: 'another_command' } }
|
120
|
+
let(:method_symbol) { :a_method }
|
121
|
+
it 'uses the command given as an option' do
|
122
|
+
is_expected.to eq "another_command"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
@@ -33,8 +33,9 @@ module Flydata
|
|
33
33
|
"data_port_key"=>"a458c641",
|
34
34
|
"mysql_data_entry_preference" =>
|
35
35
|
{ "host"=>"localhost", "port"=>3306, "username"=>"masashi",
|
36
|
-
"password"=>"welcome", "database"=>"sync_test", "tables"=>["table1", "table2"],
|
36
|
+
"password"=>"welcome", "database"=>"sync_test", "tables"=>["table1", "table2", "table4"],
|
37
37
|
"invalid_tables"=>["table3"],
|
38
|
+
"new_tables"=>["table4"],
|
38
39
|
"mysqldump_dir"=>default_mysqldump_dir, "forwarder" => "tcpforwarder",
|
39
40
|
"data_servers"=>"localhost:9905" }
|
40
41
|
}
|
@@ -91,8 +92,9 @@ module Flydata
|
|
91
92
|
let (:db_byte) { 1 }
|
92
93
|
let (:disk_byte) { 100 }
|
93
94
|
before do
|
94
|
-
expect(subject).to receive(:flydata).and_return(flydata)
|
95
|
+
expect(subject).to receive(:flydata).and_return(flydata).at_least(:once)
|
95
96
|
expect(flydata).to receive(:data_port).and_return(dp)
|
97
|
+
allow(flydata).to receive(:data_entry).and_return(default_data_entry)
|
96
98
|
expect(dp).to receive(:get).and_return(default_data_port)
|
97
99
|
allow(File).to receive(:exists?).and_return(false)
|
98
100
|
expect(default_sync_fm).to receive(:load_dump_pos).and_return(default_dump_pos)
|
@@ -110,7 +112,7 @@ module Flydata
|
|
110
112
|
before do
|
111
113
|
expect(default_sync_fm).to receive(:save_sync_info).once
|
112
114
|
expect(subject).to receive(:free_disk_space).and_return(disk_byte)
|
113
|
-
|
115
|
+
expect(File).to receive(:dirname)
|
114
116
|
end
|
115
117
|
it 'will export to dump file' do
|
116
118
|
expect(subject).to receive(:call_block_or_return_io)
|
@@ -140,7 +142,7 @@ module Flydata
|
|
140
142
|
before do
|
141
143
|
allow(subject).to receive(:data_entry).and_return(default_data_entry)
|
142
144
|
allow_any_instance_of(Flydata::Api::DataEntry).to receive(:update_table_validity).and_return(true)
|
143
|
-
subject.send(:set_current_tables, nil,
|
145
|
+
subject.send(:set_current_tables, nil, include_all_tables: true)
|
144
146
|
end
|
145
147
|
shared_examples 'throws an error' do
|
146
148
|
it "throws an error" do
|
@@ -152,7 +154,7 @@ module Flydata
|
|
152
154
|
context 'with full options' do
|
153
155
|
it 'issues mysqldump command with expected parameters' do
|
154
156
|
expect(Open3).to receive(:popen3).with(
|
155
|
-
'mysqldump -h localhost -P 3306 -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
|
157
|
+
'mysqldump -h localhost -P 3306 -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
|
156
158
|
subject.send(:do_generate_table_ddl, default_data_entry)
|
157
159
|
end
|
158
160
|
end
|
@@ -174,7 +176,7 @@ module Flydata
|
|
174
176
|
end
|
175
177
|
it "uses the default port" do
|
176
178
|
expect(Open3).to receive(:popen3).with(
|
177
|
-
'mysqldump -h localhost -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
|
179
|
+
'mysqldump -h localhost -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
|
178
180
|
subject.send(:do_generate_table_ddl, default_data_entry)
|
179
181
|
end
|
180
182
|
end
|
@@ -184,7 +186,7 @@ module Flydata
|
|
184
186
|
end
|
185
187
|
it "uses the specified port" do
|
186
188
|
expect(Open3).to receive(:popen3).with(
|
187
|
-
'mysqldump -h localhost -P 1234 -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
|
189
|
+
'mysqldump -h localhost -P 1234 -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
|
188
190
|
subject.send(:do_generate_table_ddl, default_data_entry)
|
189
191
|
end
|
190
192
|
end
|
@@ -206,7 +208,7 @@ module Flydata
|
|
206
208
|
end
|
207
209
|
it "call mysqldump without MYSQL_PW set" do
|
208
210
|
expect(Open3).to receive(:popen3).with(
|
209
|
-
'mysqldump -h localhost -P 3306 -umasashi --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
|
211
|
+
'mysqldump -h localhost -P 3306 -umasashi --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
|
210
212
|
subject.send(:do_generate_table_ddl, default_data_entry)
|
211
213
|
end
|
212
214
|
end
|
@@ -217,7 +219,7 @@ module Flydata
|
|
217
219
|
end
|
218
220
|
it "call mysqldump with MYSQL_PW set with correct symbols" do
|
219
221
|
expect(Open3).to receive(:popen3).with(
|
220
|
-
'mysqldump -h localhost -P 3306 -umasashi -p"welcome&!@^@#^" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
|
222
|
+
'mysqldump -h localhost -P 3306 -umasashi -p"welcome&!@^@#^" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
|
221
223
|
subject.send(:do_generate_table_ddl, default_data_entry)
|
222
224
|
end
|
223
225
|
end
|
@@ -238,8 +240,9 @@ module Flydata
|
|
238
240
|
before do
|
239
241
|
default_data_entry['mysql_data_entry_preference']['tables'] = []
|
240
242
|
default_data_entry['mysql_data_entry_preference']['invalid_tables'] = []
|
243
|
+
default_data_entry['mysql_data_entry_preference']['new_tables'] = []
|
241
244
|
allow(sync_cmd).to receive(:data_entry).and_return(default_data_entry)
|
242
|
-
sync_cmd.send(:set_current_tables, nil,
|
245
|
+
sync_cmd.send(:set_current_tables, nil, include_all_tables: true)
|
243
246
|
end
|
244
247
|
it 'should raise error' do
|
245
248
|
expect{sync_cmd.send(:do_generate_table_ddl, default_data_entry)}.to raise_error
|
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.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koichi Fujikawa
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2015-09-
|
15
|
+
date: 2015-09-11 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rest-client
|
@@ -538,6 +538,7 @@ files:
|
|
538
538
|
- lib/flydata/command/conf.rb
|
539
539
|
- lib/flydata/command/crontab.rb
|
540
540
|
- lib/flydata/command/encrypt.rb
|
541
|
+
- lib/flydata/command/exclusive_runnable.rb
|
541
542
|
- lib/flydata/command/helper.rb
|
542
543
|
- lib/flydata/command/kill_all.rb
|
543
544
|
- lib/flydata/command/login.rb
|
@@ -611,6 +612,7 @@ files:
|
|
611
612
|
- spec/flydata/command/conf_spec.rb
|
612
613
|
- spec/flydata/command/crontab_spec.rb
|
613
614
|
- spec/flydata/command/encrypt_spec.rb
|
615
|
+
- spec/flydata/command/exclusive_runnable_spec.rb
|
614
616
|
- spec/flydata/command/helper_spec.rb
|
615
617
|
- spec/flydata/command/kill_all_spec.rb
|
616
618
|
- spec/flydata/command/login_spec.rb
|