sequel-fiber_pool 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3320789391db6b39552f423a5ebdafb492fada1d
4
+ data.tar.gz: 7019e0cf0045b8ec68214eaa5f7b6b42fa485ac2
5
+ SHA512:
6
+ metadata.gz: 28d8b901bd7dea91d380779bae6a8b39b2b8f05ba3818c4e0a4b273317bfa0c97adbf7411de9dc1bd40588ad3d0d74f0d25c8e11cef4eeccbdae563605fc0524
7
+ data.tar.gz: b4ec5e62a13c59ca6c99be6cabaee53138961623982133f3cfc716c16159dfec8e3c8c8f25b2e066d3445e88d705264ac16d40a00236decbf0814e2cd44fe666
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in em-mysql2-sequel.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 takafan
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,13 @@
1
+ # Sequel::FiberPool
2
+
3
+ fibered sequel adapter, fibered pool.
4
+
5
+ fiber awared mysql2 either fiber awared pg, em-pg-sequel should be universal.
6
+
7
+ ## Usage
8
+
9
+ ```ruby
10
+ require "sequel-fiber_pool"
11
+
12
+ db = Sequel.connect(url, pool_class: :em_synchrony)
13
+ ```
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,2 @@
1
+ require 'sequel'
2
+ require 'sequel/fiber_pool'
@@ -0,0 +1,95 @@
1
+ module Sequel
2
+ class FiberPool < ::Sequel::ConnectionPool
3
+
4
+ DEFAULT_SIZE = 4
5
+
6
+ attr_reader :available, :allocated, :max_size
7
+
8
+ def initialize(db, opts = {})
9
+ super
10
+ @available = []
11
+ @allocated = {}
12
+ @pending = []
13
+
14
+ @max_size = opts[:max_connections] || DEFAULT_SIZE
15
+ hold {}
16
+ end
17
+
18
+ def size
19
+ @available.length + @allocated.length
20
+ end
21
+
22
+ def hold(server = nil)
23
+ fiber = Fiber.current
24
+ fiber_id = fiber.object_id
25
+
26
+ if conn = @allocated[fiber_id]
27
+ skip_release = true
28
+ else
29
+ conn = acquire(fiber) until conn
30
+ end
31
+
32
+ begin
33
+ yield conn
34
+
35
+ rescue ::Sequel::DatabaseDisconnectError => e
36
+ db.disconnect_connection(conn)
37
+ drop_failed(fiber_id)
38
+ skip_release = true
39
+
40
+ raise
41
+ ensure
42
+ release(fiber_id) unless skip_release
43
+ end
44
+ end
45
+
46
+ def disconnect(server = nil)
47
+ @available.each{ |conn| db.disconnect_connection(conn) }
48
+ @available.clear
49
+ end
50
+
51
+ private
52
+
53
+ def acquire(fiber)
54
+ if conn = @available.pop
55
+ @allocated[fiber.object_id] = conn
56
+ else
57
+ if size < max_size
58
+ allocate_new_connection(fiber.object_id)
59
+ else
60
+ @pending << fiber
61
+ Fiber.yield
62
+ end
63
+ end
64
+ end
65
+
66
+ def allocate_new_connection(fiber_id)
67
+ @allocated[fiber_id] = true
68
+ @allocated[fiber_id] = make_new(DEFAULT_SERVER)
69
+ rescue Exception => e
70
+ drop_failed(fiber_id)
71
+ raise e
72
+ end
73
+
74
+ # drop failed connection (or a mark) from the pool and
75
+ # ensure that the pending requests won't starve
76
+ def drop_failed(fiber_id)
77
+ @allocated.delete(fiber_id)
78
+ if pending = @pending.shift
79
+ EM.next_tick { pending.resume }
80
+ end
81
+ end
82
+
83
+ def release(fiber_id)
84
+ conn = @allocated.delete(fiber_id)
85
+ if pending = @pending.shift
86
+ @allocated[pending.object_id] = conn
87
+ EM.next_tick { pending.resume conn}
88
+ else
89
+ @available << conn
90
+ end
91
+ end
92
+
93
+ CONNECTION_POOL_MAP[:em_synchrony] = self
94
+ end
95
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "sequel-fiber_pool"
7
+ spec.version = '0.1.0'
8
+ spec.authors = ["takafan"]
9
+ spec.email = ["takafan@163.com"]
10
+ spec.summary = %q{fibered sequel adapter, fibered pool.}
11
+ spec.description = %q{fiber awared mysql2 either fiber awared pg, em-pg-sequel should be universal.}
12
+ spec.homepage = ""
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "sequel"
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.5"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "em-synchrony"
25
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sequel-fiber_pool
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - takafan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sequel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: em-synchrony
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: fiber awared mysql2 either fiber awared pg, em-pg-sequel should be universal.
70
+ email:
71
+ - takafan@163.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - lib/sequel-fiber_pool.rb
82
+ - lib/sequel/fiber_pool.rb
83
+ - sequel-fiber_pool.gemspec
84
+ homepage: ''
85
+ licenses:
86
+ - MIT
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.2.2
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: fibered sequel adapter, fibered pool.
108
+ test_files: []