diameter 0.1.0.pre1 → 0.1.0.pre2
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 +4 -4
- data/lib/diameter/stack.rb +19 -5
- data/lib/diameter/stack_transport_helpers.rb +15 -10
- metadata +22 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 094780fda8c683887185f52d477741b15ad4fa33
|
4
|
+
data.tar.gz: e96a298d199fd0b2b1f5964829bd29ffbc4eb2cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 910ab518a7907dc8cff3277df5a86ac4572296ee5341a6afdee5bb0485ba94f449dcf0bf100422382a1906afdac9a3449a3db4bcf8602d33ebfed2f82c4e1799
|
7
|
+
data.tar.gz: b8d2ec9c8fe0426f3ef880987caa1d842853219b537a8e66a1b222af122baf77d5d87474ecf9a9dcaaeb59a754205bb7031dfcf1f401563187f994914d0418d2
|
data/lib/diameter/stack.rb
CHANGED
@@ -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
|
-
|
102
|
-
|
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
|
-
@
|
35
|
+
@wakeup_pipe_wr.puts "wakeup"
|
31
36
|
end
|
32
37
|
|
33
38
|
def main_loop
|
34
|
-
|
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.
|
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.
|
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.
|
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 =
|
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.
|
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-
|
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/
|
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.
|
133
|
+
rubygems_version: 2.1.11
|
134
134
|
signing_key:
|
135
135
|
specification_version: 4
|
136
136
|
summary: Pure-Ruby Diameter stack
|