ebisu_connection 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87ddae1248a9277a1f722106a6f363dd04abfbf9
4
- data.tar.gz: e4cc9ef470525730d97c7f73492c85f87002818f
3
+ metadata.gz: 98f897fee0659bddbed6e4539387a46f2c43a72a
4
+ data.tar.gz: 8dcd5b499e30cd9bd32681e08ffa00cd7d338bb5
5
5
  SHA512:
6
- metadata.gz: 7be8879cd77128d32518c61410b2077dee5ed9537c455bb85bb215797af97c3033ce54c87b22394a4f75ad6b70df4b568325d775ce4005708d17c83910f25298
7
- data.tar.gz: e751976d76f4b79eb1118b7e65c34c0eccd0a67ef6715c5bd67706b62a61156b86a95e810362786d735494c19d700564b5419c2ba77e1df9fb2a6ae68e4a93a6
6
+ metadata.gz: 502269d5808c9dc2bb0d13e494d01fc15b726b9923f6dc8a2c736b732a8d587b82e57ef389c4c0fd8d1c8dca8af114a87a114924e0a8c73518ad007d7a03c915
7
+ data.tar.gz: 543a8f54458d6f5bba4f523a689ef59958d649fe7942474f547a5858454272d4981b529a8f593199ad31213e29a25e8fdea37f59190461712801a1a90b37f99f
data/.travis.yml CHANGED
@@ -5,7 +5,6 @@ before_script:
5
5
  - mysql -e 'create database ebisu_connection_test_slave;'
6
6
  - "bundle exec ruby spec/prepare.rb"
7
7
  rvm:
8
- - 1.9.3
9
8
  - 2.0.0
10
9
  - 2.1
11
10
  - 2.2
data/README.md CHANGED
@@ -133,9 +133,13 @@ Read query will be access to slave server.
133
133
  Article.where(:id => 1)
134
134
  Article.count
135
135
 
136
- If you want to access to master saver, use readonly(false).
136
+ If you want to access to the master server, use read_master.
137
137
 
138
- Article.where(:id => 1).readonly(false)
138
+ ```ruby
139
+ Article.where(:id => 1).read_master
140
+ ```
141
+
142
+ It is possible to use readonly(false) instead of read_master, but it will be depricated at future version.
139
143
 
140
144
  In transaction, Always will be access to master server.
141
145
 
@@ -159,8 +163,8 @@ To run the test suite, you need mysql installed.
159
163
  How to setup your test environment.
160
164
 
161
165
  ```bash
162
- bundle install --path bundle
163
- GEM_HOME=bundle/ruby/(your ruby version) gem install bundler --pre
166
+ bundle install --path .bundle
167
+ GEM_HOME=.bundle/ruby/(your ruby version) gem install bundler --pre
164
168
  bundle exec appraisal install
165
169
  ```
166
170
 
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency 'fresh_connection', '~> 0.3.0'
21
+ spec.add_dependency 'fresh_connection', '~> 0.4.0'
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.7"
24
24
  spec.add_development_dependency "rake", '~> 10.0'
@@ -1,3 +1,5 @@
1
+ require 'yaml'
2
+
1
3
  module EbisuConnection
2
4
  class ConfFile
3
5
  class << self
@@ -11,7 +13,6 @@ module EbisuConnection
11
13
 
12
14
  def conf_clear!
13
15
  @slaves_conf = nil
14
- @spec = nil
15
16
  end
16
17
 
17
18
  def slaves_conf(slave_group)
@@ -23,11 +24,6 @@ module EbisuConnection
23
24
  end
24
25
  end
25
26
 
26
- def spec(slave_group)
27
- @spec ||= get_spec
28
- @spec.merge(@spec[slave_group] || {})
29
- end
30
-
31
27
  def slaves_file
32
28
  return @slaves_file if @slaves_file
33
29
  raise "nothing slaves_file. You have to set a file path using EbisuConnection.slaves_file= method" unless defined?(Rails)
@@ -57,11 +53,7 @@ module EbisuConnection
57
53
  def get_slaves_conf
58
54
  @file_mtime = File.mtime(slaves_file)
59
55
  conf = YAML.load_file(slaves_file)
60
- conf[FreshConnection.env.to_s] || {}
61
- end
62
-
63
- def get_spec
64
- ActiveRecord::Base.configurations[FreshConnection.env]
56
+ conf[EbisuConnection.env.to_s] || {}
65
57
  end
66
58
  end
67
59
  end
@@ -1,10 +1,9 @@
1
- require 'yaml'
2
1
  require 'fresh_connection/abstract_connection_manager'
2
+ require 'ebisu_connection/conf_file'
3
+ require 'ebisu_connection/slave_group'
3
4
 
4
5
  module EbisuConnection
5
6
  class ConnectionManager < FreshConnection::AbstractConnectionManager
6
- delegate :if_modify, :conf_clear!, :to => ConfFile
7
-
8
7
  def initialize(slave_group = "slave")
9
8
  super
10
9
  @slaves = {}
@@ -17,14 +16,14 @@ module EbisuConnection
17
16
  def put_aside!
18
17
  return if check_own_connection
19
18
 
20
- if_modify do
19
+ ConfFile.if_modify do
21
20
  reserve_release_all_connection
22
21
  check_own_connection
23
22
  end
24
23
  end
25
24
 
26
25
  def recovery(failure_connection, exception)
27
- if recoverable? && slave_down_message?(exception.message)
26
+ if slave_down_message?(exception.message)
28
27
  slaves.remove_connection(failure_connection)
29
28
  true
30
29
  else
@@ -32,10 +31,6 @@ module EbisuConnection
32
31
  end
33
32
  end
34
33
 
35
- def recoverable?
36
- true
37
- end
38
-
39
34
  def clear_all_connection!
40
35
  synchronize do
41
36
  @slaves.values.each do |s|
@@ -43,7 +38,7 @@ module EbisuConnection
43
38
  end
44
39
 
45
40
  @slaves = {}
46
- conf_clear!
41
+ ConfFile.conf_clear!
47
42
  end
48
43
  end
49
44
 
@@ -68,7 +63,7 @@ module EbisuConnection
68
63
  @slaves.values.each do |s|
69
64
  s.reserve_release_connection!
70
65
  end
71
- conf_clear!
66
+ ConfFile.conf_clear!
72
67
  end
73
68
  end
74
69
 
@@ -79,15 +74,11 @@ module EbisuConnection
79
74
  end
80
75
 
81
76
  def get_slaves
82
- SlaveGroup.new(slaves_conf, spec)
77
+ SlaveGroup.new(slaves_conf, slave_group)
83
78
  end
84
79
 
85
80
  def slaves_conf
86
- ConfFile.slaves_conf(@slave_group)
87
- end
88
-
89
- def spec
90
- ConfFile.spec(@slave_group)
81
+ ConfFile.slaves_conf(slave_group)
91
82
  end
92
83
  end
93
84
  end
@@ -1,33 +1,27 @@
1
- require 'active_support/core_ext/hash/keys'
2
- require 'active_support/core_ext/object/blank'
3
-
4
1
  module EbisuConnection
5
2
  class Slave
6
3
  attr_reader :hostname, :weight
7
4
 
8
- def initialize(conf, spec)
5
+ def initialize(conf, slave_group)
9
6
  case conf
10
7
  when String
11
8
  host, weight = conf.split(/\s*,\s*/)
12
9
  @hostname, port = host.split(/\s*:\s*/)
13
10
  when Hash
14
- conf.stringify_keys!
15
- @hostname = conf["host"]
16
- weight = conf["weight"]
17
- port = conf["port"]
11
+ @hostname = conf["host"] || conf[:host]
12
+ weight = conf["weight"] || conf[:weight]
13
+ port = conf["port"] || conf[:port]
18
14
  else
19
15
  raise ArgumentError, "slaves config is invalid"
20
16
  end
21
17
 
22
- modify_spec = {"host" => @hostname}
23
- modify_spec["port"] = port.to_i if port.present?
24
-
25
- @spec = spec.merge(modify_spec)
18
+ spec = modify_spec(port)
19
+ @connection_factory = FreshConnection::ConnectionFactory.new(slave_group, spec)
26
20
  @weight = (weight || 1).to_i
27
21
  end
28
22
 
29
23
  def connection
30
- @connection ||= ActiveRecord::Base.send("mysql2_connection", @spec)
24
+ @connection ||= @connection_factory.new_connection
31
25
  end
32
26
 
33
27
  def disconnect!
@@ -37,5 +31,12 @@ module EbisuConnection
37
31
  end
38
32
  rescue
39
33
  end
34
+
35
+ def modify_spec(port)
36
+ modify_spec = {"host" => @hostname}
37
+ return modify_spec unless port
38
+ modify_spec["port"] = port.to_i if port.is_a?(Integer) || !port.empty?
39
+ modify_spec
40
+ end
40
41
  end
41
42
  end
@@ -1,17 +1,20 @@
1
+ require 'ebisu_connection/greatest_common_divisor'
2
+ require 'ebisu_connection/slave'
3
+
1
4
  module EbisuConnection
2
5
  class SlaveGroup
3
6
  class AllSlavesHasGoneError < StandardError; end
4
7
 
5
- def initialize(slaves_conf, spec)
8
+ def initialize(slaves_conf, slave_group)
6
9
  @slaves = slaves_conf.map do |conf|
7
- Slave.new(conf, spec)
10
+ Slave.new(conf, slave_group)
8
11
  end
9
12
 
10
13
  recalc_roulette
11
14
  end
12
15
 
13
16
  def sample
14
- raise AllSlavesHasGoneError if @slaves.blank?
17
+ raise AllSlavesHasGoneError if @slaves.empty?
15
18
  @slaves[@roulette.sample]
16
19
  end
17
20
 
@@ -19,7 +22,7 @@ module EbisuConnection
19
22
  return unless s = @slaves.detect{|s| s.connection == connection}
20
23
  s.disconnect! rescue nil
21
24
  @slaves.delete(s)
22
- raise AllSlavesHasGoneError if @slaves.blank?
25
+ raise AllSlavesHasGoneError if @slaves.empty?
23
26
  recalc_roulette
24
27
  nil
25
28
  end
@@ -1,3 +1,3 @@
1
1
  module EbisuConnection
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,17 +1,22 @@
1
1
  require "fresh_connection"
2
- require "active_support/core_ext/module/delegation"
2
+ require 'ebisu_connection/conf_file'
3
+ require 'ebisu_connection/connection_manager'
3
4
 
4
5
  module EbisuConnection
5
- extend ActiveSupport::Autoload
6
+ class << self
7
+ attr_writer :env
6
8
 
7
- autoload :ConfFile
8
- autoload :ConnectionManager
9
- autoload :SlaveGroup
10
- autoload :Slave
11
- autoload :GreatestCommonDivisor
9
+ def slaves_file=(file)
10
+ ConfFile.slaves_file = file
11
+ end
12
12
 
13
- class << self
14
- delegate :slaves_file=, :check_interval=, :to => ConfFile
13
+ def check_interval=(interval)
14
+ ConfFile.check_interval = interval
15
+ end
16
+
17
+ def env
18
+ @env ||= defined?(Rails) && Rails.env || ENV["RAILS_ENV"] || ENV["RACK_ENV"]
19
+ end
15
20
  end
16
21
  end
17
22
 
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,6 @@ ENV["RAILS_ENV"]="test"
2
2
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
3
  require 'ebisu_connection'
4
4
 
5
- FreshConnection.env = "test"
5
+ EbisuConnection.env = "test"
6
6
  EbisuConnection.slaves_file = File.join(File.dirname(__FILE__), "slaves.yaml")
7
7
  require File.join(File.dirname(__FILE__), "prepare.rb")
@@ -8,6 +8,10 @@ describe EbisuConnection do
8
8
  end
9
9
 
10
10
  context "access to master" do
11
+ it "specify read_master" do
12
+ expect(User.read_master.first.name).to be_include("master")
13
+ end
14
+
11
15
  it "specify readonly(false)" do
12
16
  expect(User.readonly(false).first.name).to be_include("master")
13
17
  end
@@ -3,30 +3,25 @@ require 'spec_helper'
3
3
  describe EbisuConnection::SlaveGroup do
4
4
  before(:all) do
5
5
  @sg = EbisuConnection::SlaveGroup
6
- @spec = {
7
- "adapter" => "mysql2",
8
- "database" => "ebisu_connection_test",
9
- "username" => "root"
10
- }
11
6
  end
12
7
 
13
8
  context "#sample" do
14
9
  it "raise exception if slaves empty" do
15
- inst = @sg.new([], {})
10
+ inst = @sg.new([], "slave")
16
11
  expect{
17
12
  inst.sample
18
13
  }.to raise_error(EbisuConnection::SlaveGroup::AllSlavesHasGoneError)
19
14
  end
20
15
 
21
16
  it "return slve instance object" do
22
- inst = @sg.new(["h"], {})
17
+ inst = @sg.new(["h"], "slave")
23
18
  expect(inst.sample).to be_a(EbisuConnection::Slave)
24
19
  end
25
20
  end
26
21
 
27
22
  context "#remove_connection" do
28
23
  it "raise exception AllSlavesHasGoneError when slaves size is one" do
29
- inst = @sg.new(["localhost"], @spec)
24
+ inst = @sg.new(["localhost"], "slave")
30
25
  c = inst.sample.connection
31
26
  expect {
32
27
  inst.remove_connection(c)
@@ -1,29 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe EbisuConnection::Slave do
4
- before(:all) do
5
- @spec = {
6
- "adapter" => "mysql2",
7
- "database" => "ebisu_connection_test",
8
- "username" => "root"
9
- }
10
- end
11
-
12
4
  context "initialize(conf is String)" do
13
5
  it "hostname only" do
14
- s = EbisuConnection::Slave.new("host_1", {})
6
+ s = EbisuConnection::Slave.new("host_1", "slave")
15
7
  expect(s.hostname).to eq("host_1")
16
8
  expect(s.weight).to eq(1)
17
9
  end
18
10
 
19
11
  it "hostname and weight" do
20
- s = EbisuConnection::Slave.new("host_1, 10", {})
12
+ s = EbisuConnection::Slave.new("host_1, 10", "slave")
21
13
  expect(s.hostname).to eq("host_1")
22
14
  expect(s.weight).to eq(10)
23
15
  end
24
16
 
25
17
  it "hostname, weight and port" do
26
- s = EbisuConnection::Slave.new("host_1:1975, 10", {})
18
+ s = EbisuConnection::Slave.new("host_1:1975, 10", "slave")
27
19
  expect(s.hostname).to eq("host_1")
28
20
  expect(s.weight).to eq(10)
29
21
  end
@@ -31,19 +23,19 @@ describe EbisuConnection::Slave do
31
23
 
32
24
  context "initialize(conf is Hash)" do
33
25
  it "hostname only" do
34
- s = EbisuConnection::Slave.new({:host => "host_1"}, {})
26
+ s = EbisuConnection::Slave.new({:host => "host_1"}, "slave")
35
27
  expect(s.hostname).to eq("host_1")
36
28
  expect(s.weight).to eq(1)
37
29
  end
38
30
 
39
31
  it "hostname and weight" do
40
- s = EbisuConnection::Slave.new({:host => "host_1", :weight => 10}, {})
32
+ s = EbisuConnection::Slave.new({:host => "host_1", :weight => 10}, "slave")
41
33
  expect(s.hostname).to eq("host_1")
42
34
  expect(s.weight).to eq(10)
43
35
  end
44
36
 
45
37
  it "hostname, weight and port" do
46
- s = EbisuConnection::Slave.new({:host => "host_1", :weight => 10, :port => 1975}, {})
38
+ s = EbisuConnection::Slave.new({:host => "host_1", :weight => 10, :port => 1975}, "slave")
47
39
  expect(s.hostname).to eq("host_1")
48
40
  expect(s.weight).to eq(10)
49
41
  end
@@ -51,7 +43,7 @@ describe EbisuConnection::Slave do
51
43
 
52
44
  context "#connection" do
53
45
  it "return Mysql2Adapter object" do
54
- s = EbisuConnection::Slave.new("localhost", @spec)
46
+ s = EbisuConnection::Slave.new("localhost", "slave")
55
47
  expect(s.connection).to be_a(ActiveRecord::ConnectionAdapters::Mysql2Adapter)
56
48
  end
57
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ebisu_connection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tsukasaoishi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-03 00:00:00.000000000 Z
11
+ date: 2015-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fresh_connection
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.0
19
+ version: 0.4.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.3.0
26
+ version: 0.4.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement