diameter 0.1.0.pre1 → 0.1.0.pre2

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: e140baae5544d85586d01a9dbd1000c63d95aab0
4
- data.tar.gz: c8407d154a3498d9d159acf99c1222043a288760
3
+ metadata.gz: 094780fda8c683887185f52d477741b15ad4fa33
4
+ data.tar.gz: e96a298d199fd0b2b1f5964829bd29ffbc4eb2cc
5
5
  SHA512:
6
- metadata.gz: 5e8e0a512e7b9ec8111a7e8d8e70252a6e0deaad7b966013a8a80be8bfb8f0d84dcfcfa65caa7264e7798ab4b39f08ed1fdcb616cc0307914b4ff9534e86722b
7
- data.tar.gz: 44f4430b63e1c4a02c6f477ac89e37a2f0b94897a39e51ccae13eee62e73c0eba8f48ac7a35f74106b8d4cfa01312fa59b9128d40c53dd7be70cc57160d05a29
6
+ metadata.gz: 910ab518a7907dc8cff3277df5a86ac4572296ee5341a6afdee5bb0485ba94f449dcf0bf100422382a1906afdac9a3449a3db4bcf8602d33ebfed2f82c4e1799
7
+ data.tar.gz: b8d2ec9c8fe0426f3ef880987caa1d842853219b537a8e66a1b222af122baf77d5d87474ecf9a9dcaaeb59a754205bb7031dfcf1f401563187f994914d0418d2
@@ -22,6 +22,15 @@ module Diameter
22
22
  @tcp_helper = TCPStackHelper.new(self)
23
23
  @peer_table = {}
24
24
  @handlers = {}
25
+
26
+ @threadpool = pool = Concurrent::ThreadPoolExecutor.new(
27
+ min_threads: 5,
28
+ max_threads: 5,
29
+ max_queue: 100,
30
+ overflow_policy: :caller_runs
31
+ )
32
+
33
+
25
34
  Diameter.logger.log(Logger::INFO, 'Stack initialized')
26
35
  end
27
36
 
@@ -51,6 +60,12 @@ module Diameter
51
60
 
52
61
  def shutdown
53
62
  @tcp_helper.shutdown
63
+ @pending_ete.each do |ete, q|
64
+ Diameter.logger.debug("Shutting down queue #{q} as no answer has been received with EtE #{ete}")
65
+ q.push :shutdown
66
+ end
67
+ @threadpool.kill
68
+ @threadpool.wait_for_termination(5)
54
69
  end
55
70
 
56
71
  def close(connection)
@@ -91,15 +106,15 @@ module Diameter
91
106
  fail "Must pass a request" unless req.request
92
107
  req.add_avp('Origin-Host', @local_host) unless req.has_avp? 'Origin-Host'
93
108
  req.add_avp('Origin-Realm', @local_realm) unless req.has_avp? 'Origin-Realm'
94
- q = Queue.new
95
- @pending_ete[req.ete] = q
96
109
  peer_name = req.avp_by_name('Destination-Host').octet_string
97
110
  state = peer_state(peer_name)
98
111
  if state == :UP
99
112
  peer = @peer_table[peer_name]
100
113
  @tcp_helper.send(req.to_wire, peer.cxn)
101
- p = Concurrent::Promise.execute {
102
- Diameter.logger.debug("Waiting for answer to message with EtE #{req.ete}")
114
+ q = Queue.new
115
+ @pending_ete[req.ete] = q
116
+ p = Concurrent::Promise.execute(executor: @threadpool) {
117
+ Diameter.logger.debug("Waiting for answer to message with EtE #{req.ete}, queue #{q}")
103
118
  val = q.pop
104
119
  Diameter.logger.debug("Promise fulfilled for message with EtE #{req.ete}")
105
120
  val
@@ -233,7 +248,6 @@ module Diameter
233
248
 
234
249
  def handle_cea(cea)
235
250
  peer = cea.avp_by_name('Origin-Host').octet_string
236
- # puts peer
237
251
  if @peer_table.has_key? peer
238
252
  @peer_table[peer].state = :UP
239
253
  @peer_table[peer].reset_timer
@@ -3,6 +3,10 @@ require 'socket'
3
3
  require 'diameter/message'
4
4
  require 'diameter/avp'
5
5
 
6
+ if RUBY_ENGINE != 'jruby'
7
+ ServerSocket = Socket
8
+ end
9
+
6
10
  module Diameter
7
11
  module Internals
8
12
  # @private
@@ -15,6 +19,7 @@ module Diameter
15
19
  @loop_thread = nil
16
20
  @accept_loop_thread = nil
17
21
  @connection_lock = Mutex.new
22
+ @wakeup_pipe_rd, @wakeup_pipe_wr = IO.pipe
18
23
  end
19
24
 
20
25
  def start_main_loop
@@ -27,25 +32,25 @@ module Diameter
27
32
  end
28
33
 
29
34
  def wakeup
30
- @loop_thread.raise
35
+ @wakeup_pipe_wr.puts "wakeup"
31
36
  end
32
37
 
33
38
  def main_loop
34
- begin
35
- rs, _ws, es = IO.select(@all_connections, [], @all_connections)
36
- rescue RuntimeError
37
- return
38
- end
39
+ rs, _ws, es = IO.select(@all_connections + [@wakeup_pipe_rd], [], @all_connections)
39
40
 
40
41
  es.each do |e|
41
42
  Diameter.logger.log(Logger::WARN, "Exception on connection #{e}")
42
43
  end
43
44
 
44
45
  rs.each do |r|
46
+ if r == @wakeup_pipe_rd
47
+ r.gets
48
+ next
49
+ end
45
50
 
46
51
  existing_data = @data[r]
47
52
  if existing_data.length < 4
48
- msg, _src = r.recvfrom_nonblock(4 - existing_data.length)
53
+ msg, _src = r.recv_nonblock(4 - existing_data.length)
49
54
  if msg == ''
50
55
  Diameter.logger.warn('Received 0 bytes on read, closing connection')
51
56
  close(r)
@@ -59,7 +64,7 @@ module Diameter
59
64
  expected_len = Message.length_from_header(existing_data[0..4])
60
65
  Diameter.logger.debug("Read 4 bytes #{existing_data[0..4].inspect}, " \
61
66
  "reading full message of length #{expected_len}")
62
- msg, _src = r.recvfrom_nonblock(expected_len - existing_data.length)
67
+ msg, _src = r.recv_nonblock(expected_len - existing_data.length)
63
68
  existing_data += msg
64
69
  if msg == ''
65
70
  # Connection closed
@@ -78,7 +83,7 @@ module Diameter
78
83
  end
79
84
 
80
85
  def send(bytes, connection)
81
- connection.sendmsg(bytes)
86
+ connection.send(bytes, 0)
82
87
  end
83
88
  end
84
89
 
@@ -113,7 +118,7 @@ module Diameter
113
118
  end
114
119
 
115
120
  def setup_new_listen_connection(host, port)
116
- sd = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
121
+ sd = ServerSocket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
117
122
  # reuse = [1,0].pack('ii')
118
123
  sd.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
119
124
  sd.bind(Socket.pack_sockaddr_in(port, host))
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diameter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre1
4
+ version: 0.1.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Day
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-13 00:00:00.000000000 Z
11
+ date: 2014-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '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
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubocop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: yard
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mocha
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: minitest-spec-context
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  description:
@@ -101,15 +101,15 @@ extensions: []
101
101
  extra_rdoc_files: []
102
102
  files:
103
103
  - lib/diameter/avp.rb
104
- - lib/diameter/avp_parser.rb
105
- - lib/diameter/constants.rb
106
- - lib/diameter/diameter_logger.rb
107
- - lib/diameter/fsm.rb
108
104
  - lib/diameter/message.rb
109
- - lib/diameter/peer.rb
105
+ - lib/diameter/diameter_logger.rb
110
106
  - lib/diameter/stack.rb
111
107
  - lib/diameter/stack_transport_helpers.rb
112
108
  - lib/diameter/u24.rb
109
+ - lib/diameter/fsm.rb
110
+ - lib/diameter/avp_parser.rb
111
+ - lib/diameter/peer.rb
112
+ - lib/diameter/constants.rb
113
113
  homepage: http://rkday.github.io/ruby-diameter/api-docs/master/
114
114
  licenses:
115
115
  - MIT
@@ -120,17 +120,17 @@ require_paths:
120
120
  - lib
121
121
  required_ruby_version: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ">="
123
+ - - '>='
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - ">"
128
+ - - '>'
129
129
  - !ruby/object:Gem::Version
130
130
  version: 1.3.1
131
131
  requirements: []
132
132
  rubyforge_project:
133
- rubygems_version: 2.4.3
133
+ rubygems_version: 2.1.11
134
134
  signing_key:
135
135
  specification_version: 4
136
136
  summary: Pure-Ruby Diameter stack