ebisu_connection 0.2.0 → 0.3.0

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: 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