ar_mysql_flexmaster 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - 2.0
4
+ gemfile:
5
+ - gemfiles/rails2.gemfile
6
+ - gemfiles/rails3.gemfile
7
+ - gemfiles/rails3.2.gemfile
@@ -12,11 +12,12 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
13
  gem.name = "ar_mysql_flexmaster"
14
14
  gem.require_paths = ["lib"]
15
- gem.version = "0.3.0"
15
+ gem.version = "0.3.1"
16
16
 
17
17
  gem.add_runtime_dependency("mysql2")
18
18
  gem.add_runtime_dependency("activerecord")
19
19
  gem.add_runtime_dependency("activesupport")
20
20
  gem.add_development_dependency("appraisal")
21
21
  gem.add_development_dependency("yaggy")
22
+ gem.add_development_dependency("mysql_isolated_server")
22
23
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/ben/src/ar_mysql_flexmaster
3
3
  specs:
4
- ar_mysql_flexmaster (0.0.8)
4
+ ar_mysql_flexmaster (0.3.0)
5
5
  activerecord
6
6
  activesupport
7
7
  mysql2
@@ -31,6 +31,7 @@ GEM
31
31
  debugger-ruby_core_source (>= 1.1.1)
32
32
  debugger-ruby_core_source (1.1.6)
33
33
  mysql2 (0.2.18)
34
+ mysql_isolated_server (0.0.2)
34
35
  rack (1.1.5)
35
36
  rails (2.3.15)
36
37
  actionmailer (= 2.3.15)
@@ -50,5 +51,6 @@ DEPENDENCIES
50
51
  ar_mysql_flexmaster!
51
52
  debugger
52
53
  mysql2 (~> 0.2.0)
54
+ mysql_isolated_server
53
55
  rails (~> 2.3.15)
54
56
  yaggy
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/ben/src/ar_mysql_flexmaster
3
3
  specs:
4
- ar_mysql_flexmaster (0.0.8)
4
+ ar_mysql_flexmaster (0.3.0)
5
5
  activerecord
6
6
  activesupport
7
7
  mysql2
@@ -61,6 +61,7 @@ GEM
61
61
  mime-types (1.19)
62
62
  multi_json (1.5.0)
63
63
  mysql2 (0.3.11)
64
+ mysql_isolated_server (0.0.2)
64
65
  polyglot (0.3.3)
65
66
  rack (1.4.4)
66
67
  rack-cache (1.2)
@@ -108,5 +109,6 @@ DEPENDENCIES
108
109
  ar_mysql_flexmaster!
109
110
  debugger
110
111
  mysql2 (~> 0.3.0)
112
+ mysql_isolated_server
111
113
  rails (~> 3.2.0)
112
114
  yaggy
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/ben/src/ar_mysql_flexmaster
3
3
  specs:
4
- ar_mysql_flexmaster (0.0.8)
4
+ ar_mysql_flexmaster (0.3.0)
5
5
  activerecord
6
6
  activesupport
7
7
  mysql2
@@ -60,6 +60,7 @@ GEM
60
60
  treetop (~> 1.4.8)
61
61
  mime-types (1.19)
62
62
  mysql2 (0.2.18)
63
+ mysql_isolated_server (0.0.2)
63
64
  polyglot (0.3.3)
64
65
  rack (1.2.7)
65
66
  rack-mount (0.6.14)
@@ -98,5 +99,6 @@ DEPENDENCIES
98
99
  ar_mysql_flexmaster!
99
100
  debugger
100
101
  mysql2 (~> 0.2.0)
102
+ mysql_isolated_server
101
103
  rails (~> 3.0.0)
102
104
  yaggy
@@ -24,9 +24,9 @@ module ActiveRecord
24
24
 
25
25
  module ConnectionAdapters
26
26
  class MysqlFlexmasterAdapter < Mysql2Adapter
27
- class NoActiveMasterException < Exception; end
28
- class TooManyMastersException < Exception; end
29
- class NoServerAvailableException < Exception; end
27
+ class NoActiveMasterException < StandardError; end
28
+ class TooManyMastersException < StandardError; end
29
+ class NoServerAvailableException < StandardError; end
30
30
 
31
31
  CHECK_EVERY_N_SELECTS = 10
32
32
  DEFAULT_CONNECT_TIMEOUT = 5
@@ -1,12 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require_relative "mysql_isolated_server"
3
+ require "mysql_isolated_server"
4
4
 
5
5
  threads = []
6
6
  threads << Thread.new do
7
7
  $mysql_master = MysqlIsolatedServer.new(allow_output: false)
8
8
  $mysql_master.boot!
9
- $mysql_master.connection.query("set global server_id=1")
10
9
 
11
10
  puts "mysql master booted on port #{$mysql_master.port} -- access with mysql -uroot -h127.0.0.1 --port=#{$mysql_master.port} mysql"
12
11
  end
@@ -14,7 +13,6 @@ end
14
13
  threads << Thread.new do
15
14
  $mysql_slave = MysqlIsolatedServer.new
16
15
  $mysql_slave.boot!
17
- $mysql_slave.connection.query("set global server_id=2")
18
16
 
19
17
  puts "mysql slave booted on port #{$mysql_slave.port} -- access with mysql -uroot -h127.0.0.1 --port=#{$mysql_slave.port} mysql"
20
18
  end
@@ -22,7 +20,6 @@ end
22
20
  threads << Thread.new do
23
21
  $mysql_slave_2 = MysqlIsolatedServer.new
24
22
  $mysql_slave_2.boot!
25
- $mysql_slave_2.connection.query("set global server_id=3")
26
23
 
27
24
  puts "mysql chained slave booted on port #{$mysql_slave_2.port} -- access with mysql -uroot -h127.0.0.1 --port=#{$mysql_slave_2.port} mysql"
28
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_mysql_flexmaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-28 00:00:00.000000000 Z
12
+ date: 2013-04-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mysql2
@@ -91,6 +91,22 @@ dependencies:
91
91
  - - ! '>='
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: mysql_isolated_server
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
94
110
  description: ar_mysql_flexmaster allows configuring N mysql servers in database.yml
95
111
  and auto-selects which is a master at runtime
96
112
  email:
@@ -101,6 +117,7 @@ extensions: []
101
117
  extra_rdoc_files: []
102
118
  files:
103
119
  - .gitignore
120
+ - .travis.yml
104
121
  - Appraisals
105
122
  - Gemfile
106
123
  - LICENSE
@@ -124,10 +141,6 @@ files:
124
141
  - test/integration/there_and_back_again_test.rb
125
142
  - test/integration/with_queries_to_be_killed_test.rb
126
143
  - test/integration/wrong_setup_test.rb
127
- - test/mysql_isolated_server.rb
128
- - test/user.MYD
129
- - test/user.MYI
130
- - test/user.frm
131
144
  homepage: http://github.com/osheroff/ar_mysql_flexmaster
132
145
  licenses: []
133
146
  post_install_message:
@@ -161,7 +174,3 @@ test_files:
161
174
  - test/integration/there_and_back_again_test.rb
162
175
  - test/integration/with_queries_to_be_killed_test.rb
163
176
  - test/integration/wrong_setup_test.rb
164
- - test/mysql_isolated_server.rb
165
- - test/user.MYD
166
- - test/user.MYI
167
- - test/user.frm
@@ -1,123 +0,0 @@
1
- require 'tmpdir'
2
- require 'socket'
3
- require 'mysql2'
4
-
5
- class MysqlIsolatedServer
6
- attr_reader :pid, :base, :port
7
- MYSQL_BASE_DIR="/usr"
8
-
9
- def initialize(options = {})
10
- @base = Dir.mktmpdir("/tmp/mysql_isolated")
11
- @mysql_data_dir="#{@base}/mysqld"
12
- @mysql_socket="#{@mysql_data_dir}/mysqld.sock"
13
- @params = options[:params]
14
- @load_data_path = options[:data_path]
15
- @port = options[:port]
16
- @allow_output = options[:allow_output]
17
- end
18
-
19
- def make_slave_of(master)
20
- master_binlog_info = master.connection.query("show master status").first
21
- connection.query(<<-EOL
22
- change master to master_host='127.0.0.1',
23
- master_port=#{master.port},
24
- master_user='root', master_password='',
25
- master_log_file='#{master_binlog_info['File']}',
26
- master_log_pos=#{master_binlog_info['Position']}
27
- EOL
28
- )
29
- connection.query("SLAVE START")
30
- end
31
-
32
- def connection
33
- @cx ||= Mysql2::Client.new(:host => "127.0.0.1", :port => @port, :username => "root", :password => "", :database => "mysql")
34
- end
35
-
36
- def set_rw(rw)
37
- ro = rw ? 0 : 1
38
- connection.query("SET GLOBAL READ_ONLY=#{ro}")
39
- end
40
-
41
-
42
- def locate_executable(*candidates)
43
- output = `which #{candidates.join(' ')}`
44
- return nil if output == "\n"
45
- output.split("\n").first
46
- end
47
-
48
- def boot!
49
- @port ||= grab_free_port
50
- system("rm -Rf #{@mysql_data_dir}")
51
- system("mkdir #{@mysql_data_dir}")
52
- if @load_data_path
53
- system("cp -a #{@load_data_path}/* #{@mysql_data_dir}")
54
- system("rm -f #{@mysql_data_dir}/relay-log.info")
55
- else
56
- mysql_install_db = `which mysql_install_db`
57
- idb_path = File.dirname(mysql_install_db)
58
- system("(cd #{idb_path}/..; mysql_install_db --datadir=#{@mysql_data_dir} --user=`whoami`) >/dev/null 2>&1")
59
- system("cp #{File.expand_path(File.dirname(__FILE__))}/user.* #{@mysql_data_dir}/mysql")
60
- end
61
-
62
- exec_server <<-EOL
63
- mysqld --no-defaults --default-storage-engine=innodb \
64
- --datadir=#{@mysql_data_dir} --pid-file=#{@base}/mysqld.pid --port=#{@port} \
65
- #{@params} --socket=#{@mysql_data_dir}/mysql.sock --log-bin --log-slave-updates
66
- EOL
67
-
68
- while !system("mysql -h127.0.0.1 --port=#{@port} --database=mysql -u root -e 'select 1' >/dev/null 2>&1")
69
- sleep(0.1)
70
- end
71
-
72
- tzinfo_to_sql = locate_executable("mysql_tzinfo_to_sql5", "mysql_tzinfo_to_sql")
73
- raise "could not find mysql_tzinfo_to_sql" unless tzinfo_to_sql
74
- system("#{tzinfo_to_sql} /usr/share/zoneinfo 2>/dev/null | mysql -h127.0.0.1 --database=mysql --port=#{@port} -u root mysql ")
75
-
76
- system(%Q(mysql -h127.0.0.1 --port=#{@port} --database=mysql -u root -e "SET GLOBAL time_zone='UTC'"))
77
- system(%Q(mysql -h127.0.0.1 --port=#{@port} --database=mysql -u root -e "GRANT SELECT ON *.* to 'zdslave'@'localhost'"))
78
- end
79
-
80
- def grab_free_port
81
- while true
82
- candidate=9000 + rand(50_000)
83
-
84
- begin
85
- socket = Socket.new(:INET, :STREAM, 0)
86
- socket.bind(Addrinfo.tcp("127.0.0.1", candidate))
87
- socket.close
88
- return candidate
89
- rescue Exception => e
90
- puts e
91
- end
92
- end
93
- end
94
-
95
- attr_reader :pid
96
- def exec_server(cmd)
97
- cmd.strip!
98
- cmd.gsub!(/\\\n/, ' ')
99
- devnull = File.open("/dev/null", "w")
100
- system("mkdir -p #{base}/tmp")
101
- system("chmod 0777 #{base}/tmp")
102
- pid = fork do
103
- ENV["TMPDIR"] = "#{base}/tmp"
104
- if !@allow_output
105
- STDOUT.reopen(devnull)
106
- STDERR.reopen(devnull)
107
- end
108
-
109
- exec(cmd)
110
- end
111
- at_exit {
112
- Process.kill("TERM", pid)
113
- system("rm -Rf #{base}")
114
- }
115
- @pid = pid
116
- devnull.close
117
- end
118
-
119
- def kill!
120
- return unless @pid
121
- system("kill -KILL #{@pid}")
122
- end
123
- end
data/test/user.MYD DELETED
Binary file
data/test/user.MYI DELETED
Binary file
data/test/user.frm DELETED
Binary file