evt-event_store-cluster-leader_status 0.0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/event_store/cluster/leader_status.rb +14 -0
- data/lib/event_store/cluster/leader_status/controls.rb +16 -0
- data/lib/event_store/cluster/leader_status/controls/cluster_size.rb +13 -0
- data/lib/event_store/cluster/leader_status/controls/connect_http.rb +16 -0
- data/lib/event_store/cluster/leader_status/controls/current_members.rb +43 -0
- data/lib/event_store/cluster/leader_status/controls/gossip_endpoint/response.rb +111 -0
- data/lib/event_store/cluster/leader_status/controls/gossip_endpoint/response/member.rb +112 -0
- data/lib/event_store/cluster/leader_status/controls/hostname.rb +17 -0
- data/lib/event_store/cluster/leader_status/controls/ip_address.rb +27 -0
- data/lib/event_store/cluster/leader_status/controls/port.rb +33 -0
- data/lib/event_store/cluster/leader_status/controls/resolve_host.rb +9 -0
- data/lib/event_store/cluster/leader_status/controls/time.rb +9 -0
- data/lib/event_store/cluster/leader_status/controls/uuid.rb +9 -0
- data/lib/event_store/cluster/leader_status/data.rb +15 -0
- data/lib/event_store/cluster/leader_status/get.rb +54 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/get.rb +95 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/response.rb +24 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/response/member.rb +42 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/response/state.rb +19 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/response/transformer.rb +61 -0
- data/lib/event_store/cluster/leader_status/log.rb +13 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 718dd84c0ac14c746c5056ded4fd7d1d2bf900f6
|
4
|
+
data.tar.gz: b1dabd36f48acecb20223183e8caf4003a4f0a81
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2d74d2ae9ea5d893607d4c138415a21d546470164142f28a323cef8a160c50cbe7d5dfc0064ec6156b3a8db74d534710a19912dffad6155f9bd3d7eff59a2252
|
7
|
+
data.tar.gz: 651ae4ae3bd74fd6cb6fd453bf6bf61eba291942261409190d03628796bb828d1330bd69470bdf96efd7e2592b64eb7525382623c3995a6a9dd9ccf4cf141885
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'event_store/http/connect'
|
2
|
+
require 'schema'
|
3
|
+
require 'transform'
|
4
|
+
|
5
|
+
require 'event_store/cluster/leader_status/log'
|
6
|
+
|
7
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/get'
|
8
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/response/member'
|
9
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/response/transformer'
|
10
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/response/state'
|
11
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/response'
|
12
|
+
|
13
|
+
require 'event_store/cluster/leader_status/data'
|
14
|
+
require 'event_store/cluster/leader_status/get'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'clock/controls'
|
2
|
+
require 'identifier/uuid/controls'
|
3
|
+
require 'event_store/http/connect/controls'
|
4
|
+
|
5
|
+
require 'event_store/cluster/leader_status/controls/connect_http'
|
6
|
+
require 'event_store/cluster/leader_status/controls/cluster_size'
|
7
|
+
require 'event_store/cluster/leader_status/controls/current_members'
|
8
|
+
require 'event_store/cluster/leader_status/controls/hostname'
|
9
|
+
require 'event_store/cluster/leader_status/controls/ip_address'
|
10
|
+
require 'event_store/cluster/leader_status/controls/resolve_host'
|
11
|
+
require 'event_store/cluster/leader_status/controls/port'
|
12
|
+
require 'event_store/cluster/leader_status/controls/uuid'
|
13
|
+
require 'event_store/cluster/leader_status/controls/time'
|
14
|
+
|
15
|
+
require 'event_store/cluster/leader_status/controls/gossip_endpoint/response'
|
16
|
+
require 'event_store/cluster/leader_status/controls/gossip_endpoint/response/member'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module ConnectHTTP
|
6
|
+
def self.example(host: nil, ip_addresses: nil)
|
7
|
+
connect = EventStore::HTTP::Connect.build
|
8
|
+
connect.host = host if host
|
9
|
+
ResolveHost.configure connect, host: host, ip_addresses: ip_addresses
|
10
|
+
connect
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module CurrentMembers
|
6
|
+
def self.get
|
7
|
+
ip_address = IPAddress.example
|
8
|
+
port = Port::HTTP.example
|
9
|
+
|
10
|
+
leader_ip_address = nil
|
11
|
+
follower_ip_addresses = []
|
12
|
+
|
13
|
+
Net::HTTP.start ip_address, port do |connection|
|
14
|
+
connection.read_timeout = 0.1
|
15
|
+
|
16
|
+
response = connection.request_get '/gossip', { 'Accept' => 'application/json' }
|
17
|
+
|
18
|
+
fail unless response.code == '200'
|
19
|
+
|
20
|
+
json_text = response.body
|
21
|
+
|
22
|
+
gossip_status = JSON.parse json_text
|
23
|
+
|
24
|
+
members = gossip_status['members']
|
25
|
+
|
26
|
+
members.each do |member|
|
27
|
+
ip_address = member['externalHttpIp']
|
28
|
+
|
29
|
+
if member['state'] == 'Master'
|
30
|
+
leader_ip_address = ip_address
|
31
|
+
else
|
32
|
+
follower_ip_addresses << ip_address
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
return leader_ip_address, *follower_ip_addresses
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module GossipEndpoint
|
6
|
+
module Response
|
7
|
+
def self.server_ip
|
8
|
+
IPAddress.example
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.server_port
|
12
|
+
Port::HTTP::Internal.example
|
13
|
+
end
|
14
|
+
|
15
|
+
module State
|
16
|
+
def self.leader
|
17
|
+
'Master'
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.follower
|
21
|
+
'Slave'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module JSON
|
26
|
+
def self.text
|
27
|
+
<<-JSON
|
28
|
+
{
|
29
|
+
"members": [
|
30
|
+
{
|
31
|
+
"instanceId": "00000101-0000-4000-8000-000000000000",
|
32
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
33
|
+
"state": "Master",
|
34
|
+
"isAlive": true,
|
35
|
+
"internalTcpIp": "127.0.111.1",
|
36
|
+
"internalTcpPort": 1112,
|
37
|
+
"internalSecureTcpPort": 0,
|
38
|
+
"externalTcpIp": "127.0.111.1",
|
39
|
+
"externalTcpPort": 1113,
|
40
|
+
"externalSecureTcpPort": 0,
|
41
|
+
"internalHttpIp": "127.0.111.1",
|
42
|
+
"internalHttpPort": 2112,
|
43
|
+
"externalHttpIp": "127.0.111.1",
|
44
|
+
"externalHttpPort": 2113,
|
45
|
+
"lastCommitPosition": 1111,
|
46
|
+
"writerCheckpoint": 111,
|
47
|
+
"chaserCheckpoint": 11,
|
48
|
+
"epochPosition": 222,
|
49
|
+
"epochNumber": 22,
|
50
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
51
|
+
"nodePriority": 0
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"instanceId": "00000102-0000-4000-8000-000000000000",
|
55
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
56
|
+
"state": "Slave",
|
57
|
+
"isAlive": true,
|
58
|
+
"internalTcpIp": "127.0.111.2",
|
59
|
+
"internalTcpPort": 1112,
|
60
|
+
"internalSecureTcpPort": 0,
|
61
|
+
"externalTcpIp": "127.0.111.2",
|
62
|
+
"externalTcpPort": 1113,
|
63
|
+
"externalSecureTcpPort": 0,
|
64
|
+
"internalHttpIp": "127.0.111.2",
|
65
|
+
"internalHttpPort": 2112,
|
66
|
+
"externalHttpIp": "127.0.111.2",
|
67
|
+
"externalHttpPort": 2113,
|
68
|
+
"lastCommitPosition": 1111,
|
69
|
+
"writerCheckpoint": 111,
|
70
|
+
"chaserCheckpoint": 11,
|
71
|
+
"epochPosition": 222,
|
72
|
+
"epochNumber": 22,
|
73
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
74
|
+
"nodePriority": 0
|
75
|
+
},
|
76
|
+
{
|
77
|
+
"instanceId": "00000103-0000-4000-8000-000000000000",
|
78
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
79
|
+
"state": "Slave",
|
80
|
+
"isAlive": false,
|
81
|
+
"internalTcpIp": "127.0.111.3",
|
82
|
+
"internalTcpPort": 1112,
|
83
|
+
"internalSecureTcpPort": 0,
|
84
|
+
"externalTcpIp": "127.0.111.3",
|
85
|
+
"externalTcpPort": 1113,
|
86
|
+
"externalSecureTcpPort": 0,
|
87
|
+
"internalHttpIp": "127.0.111.3",
|
88
|
+
"internalHttpPort": 2112,
|
89
|
+
"externalHttpIp": "127.0.111.3",
|
90
|
+
"externalHttpPort": 2113,
|
91
|
+
"lastCommitPosition": 1111,
|
92
|
+
"writerCheckpoint": 111,
|
93
|
+
"chaserCheckpoint": 11,
|
94
|
+
"epochPosition": 222,
|
95
|
+
"epochNumber": 22,
|
96
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
97
|
+
"nodePriority": 0
|
98
|
+
}
|
99
|
+
],
|
100
|
+
"serverIp": "127.0.111.1",
|
101
|
+
"serverPort": 2112
|
102
|
+
}
|
103
|
+
JSON
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module GossipEndpoint
|
6
|
+
module Response
|
7
|
+
module Member
|
8
|
+
def self.instance_id(member_index=nil)
|
9
|
+
member_index ||= 1
|
10
|
+
|
11
|
+
UUID.example member_index + 100
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.time_stamp
|
15
|
+
Controls::Time::Raw.example.iso8601 6
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.state(member_index=nil)
|
19
|
+
member_index ||= 1
|
20
|
+
|
21
|
+
if member_index == 1
|
22
|
+
State.leader
|
23
|
+
else
|
24
|
+
State.follower
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.is_alive(member_index=nil)
|
29
|
+
if member_index == 3
|
30
|
+
false
|
31
|
+
else
|
32
|
+
true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.internal_tcp_ip(member_index=nil)
|
37
|
+
IPAddress.example member_index
|
38
|
+
end
|
39
|
+
singleton_class.send :alias_method, :external_tcp_ip, :internal_tcp_ip
|
40
|
+
singleton_class.send :alias_method, :internal_http_ip, :internal_tcp_ip
|
41
|
+
singleton_class.send :alias_method, :external_http_ip, :internal_tcp_ip
|
42
|
+
|
43
|
+
def self.internal_tcp_port
|
44
|
+
Port::TCP::Internal.example
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.internal_secure_tcp_port
|
48
|
+
0
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.external_tcp_port
|
52
|
+
Port::TCP::External.example
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.external_secure_tcp_port
|
56
|
+
0
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.internal_http_port
|
60
|
+
Port::HTTP::Internal.example
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.external_http_port
|
64
|
+
Port::HTTP.example
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.last_commit_position
|
68
|
+
1111
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.writer_checkpoint
|
72
|
+
111
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.chaser_checkpoint
|
76
|
+
11
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.epoch_position
|
80
|
+
222
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.epoch_number
|
84
|
+
22
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.epoch_id
|
88
|
+
UUID.example
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.node_priority
|
92
|
+
0
|
93
|
+
end
|
94
|
+
|
95
|
+
module Index
|
96
|
+
def self.leader
|
97
|
+
1
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.follower(follower_index=nil)
|
101
|
+
follower_index ||= 1
|
102
|
+
|
103
|
+
self.leader + follower_index
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
Hostname = EventStore::HTTP::Connect::Controls::Cluster::Hostname
|
6
|
+
|
7
|
+
module Hostname
|
8
|
+
module NonCluster
|
9
|
+
def self.example
|
10
|
+
EventStore::HTTP::Connect::Controls::Hostname.example
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
IPAddress = EventStore::HTTP::Connect::Controls::Cluster::IPAddress
|
6
|
+
|
7
|
+
module IPAddress
|
8
|
+
module Leader
|
9
|
+
def self.example
|
10
|
+
IPAddress.example member_index
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.member_index
|
14
|
+
2
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module NonCluster
|
19
|
+
def self.example
|
20
|
+
EventStore::HTTP::Connect::Controls::IPAddress.example
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module Port
|
6
|
+
module TCP
|
7
|
+
def self.example
|
8
|
+
1113
|
9
|
+
end
|
10
|
+
|
11
|
+
module Internal
|
12
|
+
def self.example
|
13
|
+
TCP.example - 1
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module HTTP
|
19
|
+
def self.example
|
20
|
+
EventStore::HTTP::Connect::Controls::Port.example
|
21
|
+
end
|
22
|
+
|
23
|
+
module Internal
|
24
|
+
def self.example
|
25
|
+
HTTP.example - 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
class Data
|
5
|
+
include Schema::DataStructure
|
6
|
+
|
7
|
+
attribute :tcp_ip_address, String
|
8
|
+
attribute :tcp_port, Integer
|
9
|
+
|
10
|
+
attribute :http_ip_address, String
|
11
|
+
attribute :http_port, Integer
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
class Get
|
5
|
+
include Log::Dependency
|
6
|
+
|
7
|
+
configure :get_leader_status
|
8
|
+
|
9
|
+
dependency :get_gossip_endpoint, GossipEndpoint::Get
|
10
|
+
|
11
|
+
def self.build(connect_http=nil)
|
12
|
+
instance = new
|
13
|
+
|
14
|
+
GossipEndpoint::Get.configure instance, connect_http
|
15
|
+
|
16
|
+
instance
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.call(*arguments)
|
20
|
+
instance = build *arguments
|
21
|
+
instance.()
|
22
|
+
end
|
23
|
+
|
24
|
+
def call
|
25
|
+
logger.trace { "Getting leader" }
|
26
|
+
|
27
|
+
gossip_response = get_gossip_endpoint.()
|
28
|
+
|
29
|
+
if gossip_response.nil?
|
30
|
+
logger.info { "Get leader done; EventStore is non-clustered" }
|
31
|
+
return nil
|
32
|
+
end
|
33
|
+
|
34
|
+
data = Data.new
|
35
|
+
|
36
|
+
SetAttributes.(
|
37
|
+
data,
|
38
|
+
gossip_response.leader,
|
39
|
+
copy: [
|
40
|
+
{ :external_tcp_ip => :tcp_ip_address },
|
41
|
+
{ :external_tcp_port => :tcp_port },
|
42
|
+
{ :external_http_ip => :http_ip_address },
|
43
|
+
{ :external_http_port => :http_port }
|
44
|
+
]
|
45
|
+
)
|
46
|
+
|
47
|
+
logger.info { "Get leader done (TCP: #{data.tcp_ip_address}:#{data.tcp_port}, HTTP: #{data.http_ip_address}:#{data.http_port})" }
|
48
|
+
|
49
|
+
data
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module GossipEndpoint
|
5
|
+
class Get
|
6
|
+
include Log::Dependency
|
7
|
+
|
8
|
+
configure :get_gossip_endpoint
|
9
|
+
|
10
|
+
dependency :connect_http, EventStore::HTTP::Connect
|
11
|
+
|
12
|
+
def self.build(connect_http=nil)
|
13
|
+
instance = new
|
14
|
+
|
15
|
+
connect_http = EventStore::HTTP::Connect.configure(
|
16
|
+
instance,
|
17
|
+
connect: connect_http,
|
18
|
+
attr_name: :connect_http
|
19
|
+
)
|
20
|
+
|
21
|
+
instance
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.call(host=nil, connect_http=nil)
|
25
|
+
instance = build connect_http
|
26
|
+
instance.(host)
|
27
|
+
end
|
28
|
+
|
29
|
+
def call(host=nil)
|
30
|
+
log_attributes = LogAttributes.get self, host: host
|
31
|
+
|
32
|
+
logger.trace { "GET gossip endpoint (#{log_attributes})" }
|
33
|
+
|
34
|
+
connection_telemetry = EventStore::HTTP::Connect.register_telemetry_sink connect_http
|
35
|
+
|
36
|
+
connect_http.(host) do |connection|
|
37
|
+
begin
|
38
|
+
response = connection.request_get uri_path, http_headers
|
39
|
+
rescue Net::ReadTimeout
|
40
|
+
response = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
if response
|
44
|
+
log_attributes << ", StatusCode: #{response.code}, ReasonPhrase: #{response.message}"
|
45
|
+
|
46
|
+
logger.debug { "GET gossip endpoint done (#{log_attributes})" }
|
47
|
+
logger.trace { "Data: \n\n#{response.body}" }
|
48
|
+
end
|
49
|
+
|
50
|
+
if response.nil? or non_cluster? response
|
51
|
+
error_message = "GET gossip endpoint made against non-clustered EventStore (#{log_attributes})"
|
52
|
+
logger.error error_message
|
53
|
+
raise NonClusterError, error_message
|
54
|
+
end
|
55
|
+
|
56
|
+
response = Transform::Read.(response.body, :json, Response)
|
57
|
+
|
58
|
+
return response
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def uri_path
|
63
|
+
'/gossip'
|
64
|
+
end
|
65
|
+
|
66
|
+
def http_headers
|
67
|
+
{ 'Accept' => 'application/json' }
|
68
|
+
end
|
69
|
+
|
70
|
+
def non_cluster?(response)
|
71
|
+
response.code == '408' and response.message == "Server was unable to handle request in time"
|
72
|
+
end
|
73
|
+
|
74
|
+
NonClusterError = Class.new StandardError
|
75
|
+
|
76
|
+
module LogAttributes
|
77
|
+
def self.get(get_instance, host: nil)
|
78
|
+
host_setting = get_instance.connect_http.host
|
79
|
+
|
80
|
+
if host.nil?
|
81
|
+
host_text = host_setting
|
82
|
+
else
|
83
|
+
host_text = "#{host} [Overriding setting: [#{host_setting}]]"
|
84
|
+
end
|
85
|
+
|
86
|
+
get_instance.instance_exec do
|
87
|
+
"Host: #{host_text}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module GossipEndpoint
|
5
|
+
class Response
|
6
|
+
include Schema::DataStructure
|
7
|
+
|
8
|
+
attribute :server_ip, String
|
9
|
+
attribute :server_port, Integer
|
10
|
+
attribute :leader, Member
|
11
|
+
attribute :followers, Array, default: ->{ Array.new }
|
12
|
+
|
13
|
+
def add_member(member)
|
14
|
+
if member.state == State.leader
|
15
|
+
self.leader = member
|
16
|
+
else
|
17
|
+
followers << member
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module GossipEndpoint
|
5
|
+
class Response
|
6
|
+
class Member
|
7
|
+
include Schema::DataStructure
|
8
|
+
|
9
|
+
attribute :instance_id, String
|
10
|
+
attribute :time_stamp, String
|
11
|
+
attribute :state, String
|
12
|
+
attribute :is_alive
|
13
|
+
|
14
|
+
attribute :internal_tcp_ip, String
|
15
|
+
attribute :internal_tcp_port, Integer
|
16
|
+
attribute :internal_secure_tcp_port, Integer
|
17
|
+
|
18
|
+
attribute :external_tcp_ip, String
|
19
|
+
attribute :external_tcp_port, Integer
|
20
|
+
attribute :external_secure_tcp_port, Integer
|
21
|
+
|
22
|
+
attribute :internal_http_ip, String
|
23
|
+
attribute :internal_http_port, Integer
|
24
|
+
|
25
|
+
attribute :external_http_ip, String
|
26
|
+
attribute :external_http_port, Integer
|
27
|
+
|
28
|
+
attribute :last_commit_position, Integer
|
29
|
+
attribute :writer_checkpoint, Integer
|
30
|
+
attribute :chaser_checkpoint, Integer
|
31
|
+
|
32
|
+
attribute :epoch_position, Integer
|
33
|
+
attribute :epoch_number, Integer
|
34
|
+
attribute :epoch_id, String
|
35
|
+
|
36
|
+
attribute :node_priority, Integer
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module GossipEndpoint
|
5
|
+
class Response
|
6
|
+
module Transformer
|
7
|
+
def self.json
|
8
|
+
JSON
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.instance(raw_data)
|
12
|
+
response = Response.new
|
13
|
+
|
14
|
+
SetAttributes.(response, raw_data)
|
15
|
+
|
16
|
+
raw_data[:members].each do |member_data|
|
17
|
+
member = member_instance member_data
|
18
|
+
|
19
|
+
response.add_member member
|
20
|
+
end
|
21
|
+
|
22
|
+
response
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.member_instance(member_data)
|
26
|
+
member = Response::Member.new
|
27
|
+
|
28
|
+
SetAttributes.(
|
29
|
+
member,
|
30
|
+
member_data,
|
31
|
+
strict: true
|
32
|
+
)
|
33
|
+
|
34
|
+
member
|
35
|
+
end
|
36
|
+
|
37
|
+
module Status
|
38
|
+
def self.leader
|
39
|
+
'Master'
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.follower
|
43
|
+
'Slave'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module JSON
|
48
|
+
def self.read(text)
|
49
|
+
formatted_data = ::JSON.parse text, symbolize_names: true
|
50
|
+
|
51
|
+
raw_data = Casing::Underscore.(formatted_data)
|
52
|
+
|
53
|
+
raw_data
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: evt-event_store-cluster-leader_status
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Eventide Project
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-01-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: evt-event_store-http-connect
|
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: evt-identifier-uuid
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: evt-schema
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
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: evt-transform
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: test_bench
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: " "
|
84
|
+
email: opensource@eventide-project.org
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- lib/event_store/cluster/leader_status.rb
|
90
|
+
- lib/event_store/cluster/leader_status/controls.rb
|
91
|
+
- lib/event_store/cluster/leader_status/controls/cluster_size.rb
|
92
|
+
- lib/event_store/cluster/leader_status/controls/connect_http.rb
|
93
|
+
- lib/event_store/cluster/leader_status/controls/current_members.rb
|
94
|
+
- lib/event_store/cluster/leader_status/controls/gossip_endpoint/response.rb
|
95
|
+
- lib/event_store/cluster/leader_status/controls/gossip_endpoint/response/member.rb
|
96
|
+
- lib/event_store/cluster/leader_status/controls/hostname.rb
|
97
|
+
- lib/event_store/cluster/leader_status/controls/ip_address.rb
|
98
|
+
- lib/event_store/cluster/leader_status/controls/port.rb
|
99
|
+
- lib/event_store/cluster/leader_status/controls/resolve_host.rb
|
100
|
+
- lib/event_store/cluster/leader_status/controls/time.rb
|
101
|
+
- lib/event_store/cluster/leader_status/controls/uuid.rb
|
102
|
+
- lib/event_store/cluster/leader_status/data.rb
|
103
|
+
- lib/event_store/cluster/leader_status/get.rb
|
104
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/get.rb
|
105
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/response.rb
|
106
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/response/member.rb
|
107
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/response/state.rb
|
108
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/response/transformer.rb
|
109
|
+
- lib/event_store/cluster/leader_status/log.rb
|
110
|
+
homepage: https://github.com/eventide-project/event-store-clustering
|
111
|
+
licenses:
|
112
|
+
- MIT
|
113
|
+
metadata: {}
|
114
|
+
post_install_message:
|
115
|
+
rdoc_options: []
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 2.3.3
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
requirements: []
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 2.6.8
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: Cluster leader status support for EventStore
|
134
|
+
test_files: []
|