Skip to content

Commit 41f5c8a

Browse files
authored
Add stats for pair's requests (#70)
1 parent 994acb5 commit 41f5c8a

File tree

8 files changed

+360
-107
lines changed

8 files changed

+360
-107
lines changed

lib/ex_ice/candidate_pair.ex

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,27 @@ defmodule ExICE.CandidatePair do
1212
priority: non_neg_integer(),
1313
remote_cand_id: integer(),
1414
state: state(),
15-
valid?: boolean()
15+
valid?: boolean(),
16+
last_seen: integer(),
17+
# stats
18+
requests_received: non_neg_integer(),
19+
requests_sent: non_neg_integer(),
20+
responses_received: non_neg_integer(),
21+
non_symmetric_responses_received: non_neg_integer(),
22+
responses_sent: non_neg_integer()
1623
}
1724

1825
@enforce_keys [:id, :local_cand_id, :remote_cand_id, :priority]
1926
defstruct @enforce_keys ++
2027
[
2128
nominated?: false,
2229
state: :frozen,
23-
valid?: false
30+
valid?: false,
31+
last_seen: nil,
32+
requests_received: 0,
33+
requests_sent: 0,
34+
responses_received: 0,
35+
non_symmetric_responses_received: 0,
36+
responses_sent: 0
2437
]
2538
end

lib/ex_ice/priv/candidate_pair.ex

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ defmodule ExICE.Priv.CandidatePair do
2121
succeeded_pair_id: integer() | nil,
2222
discovered_pair_id: integer() | nil,
2323
keepalive_timer: reference() | nil,
24-
last_seen: integer()
24+
last_seen: integer(),
25+
requests_received: non_neg_integer(),
26+
requests_sent: non_neg_integer(),
27+
responses_received: non_neg_integer(),
28+
non_symmetric_responses_received: non_neg_integer(),
29+
responses_sent: non_neg_integer()
2530
}
2631

2732
@enforce_keys [:id, :local_cand_id, :remote_cand_id, :priority]
@@ -36,7 +41,12 @@ defmodule ExICE.Priv.CandidatePair do
3641
keepalive_timer: nil,
3742
# Time when this pair has received some data
3843
# or sent conn check.
39-
last_seen: nil
44+
last_seen: nil,
45+
requests_received: 0,
46+
requests_sent: 0,
47+
responses_received: 0,
48+
non_symmetric_responses_received: 0,
49+
responses_sent: 0
4050
]
4151

4252
@doc false
@@ -101,7 +111,13 @@ defmodule ExICE.Priv.CandidatePair do
101111
priority: pair.priority,
102112
remote_cand_id: pair.remote_cand_id,
103113
state: pair.state,
104-
valid?: pair.valid?
114+
valid?: pair.valid?,
115+
last_seen: pair.last_seen,
116+
requests_received: pair.requests_received,
117+
requests_sent: pair.requests_sent,
118+
responses_received: pair.responses_received,
119+
non_symmetric_responses_received: pair.non_symmetric_responses_received,
120+
responses_sent: pair.responses_sent
105121
}
106122
end
107123
end

lib/ex_ice/priv/conn_check_handler/controlled.ex

Lines changed: 72 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,32 +24,59 @@ defmodule ExICE.Priv.ConnCheckHandler.Controlled do
2424

2525
nil when ice_agent.state in [:new, :checking, :connected] ->
2626
Logger.debug("Adding new candidate pair: #{inspect(pair)}")
27+
pair = %CandidatePair{pair | requests_received: 1}
2728
checklist = Map.put(ice_agent.checklist, pair.id, pair)
2829
ice_agent = %ICEAgent{ice_agent | checklist: checklist}
2930
ICEAgent.send_binding_success_response(ice_agent, pair, msg)
3031

3132
%CandidatePair{} = checklist_pair ->
3233
cond do
33-
checklist_pair.state == :failed and ice_agent.state in [:failed, :completed] ->
34-
# update last seen so we can observe that something is received but don't reply
35-
# as we are in the failed state
36-
checklist_pair = %CandidatePair{checklist_pair | last_seen: pair.last_seen}
37-
put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
34+
ice_agent.state == :failed ->
35+
r_pair = resolve_pair(ice_agent, checklist_pair)
36+
37+
r_pair = %CandidatePair{
38+
r_pair
39+
| last_seen: pair.last_seen,
40+
requests_received: r_pair.requests_received + 1
41+
}
42+
43+
put_in(ice_agent.checklist[r_pair.id], r_pair)
44+
45+
checklist_pair.state == :failed and ice_agent.state == :completed ->
46+
r_pair = resolve_pair(ice_agent, checklist_pair)
47+
48+
r_pair = %CandidatePair{
49+
r_pair
50+
| last_seen: pair.last_seen,
51+
requests_received: r_pair.requests_received + 1
52+
}
53+
54+
put_in(ice_agent.checklist[r_pair.id], r_pair)
3855

3956
checklist_pair.state == :failed ->
40-
checklist_pair = %CandidatePair{
41-
checklist_pair
57+
r_pair = resolve_pair(ice_agent, checklist_pair)
58+
59+
r_pair = %CandidatePair{
60+
r_pair
4261
| state: :waiting,
43-
last_seen: pair.last_seen
62+
last_seen: pair.last_seen,
63+
requests_received: r_pair.requests_received + 1
4464
}
4565

46-
ice_agent = put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
47-
ICEAgent.send_binding_success_response(ice_agent, checklist_pair, msg)
66+
ice_agent = put_in(ice_agent.checklist[r_pair.id], r_pair)
67+
ICEAgent.send_binding_success_response(ice_agent, r_pair, msg)
4868

4969
true ->
50-
checklist_pair = %CandidatePair{checklist_pair | last_seen: pair.last_seen}
51-
ice_agent = put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
52-
ICEAgent.send_binding_success_response(ice_agent, checklist_pair, msg)
70+
r_pair = resolve_pair(ice_agent, checklist_pair)
71+
72+
r_pair = %CandidatePair{
73+
r_pair
74+
| last_seen: pair.last_seen,
75+
requests_received: r_pair.requests_received + 1
76+
}
77+
78+
ice_agent = put_in(ice_agent.checklist[r_pair.id], r_pair)
79+
ICEAgent.send_binding_success_response(ice_agent, r_pair, msg)
5380
end
5481
end
5582
end
@@ -71,15 +98,21 @@ defmodule ExICE.Priv.ConnCheckHandler.Controlled do
7198
successful conn check: #{inspect(pair.id)}\
7299
""")
73100

74-
pair = %CandidatePair{pair | nominate?: true}
101+
pair = %CandidatePair{pair | nominate?: true, requests_received: 1}
75102
checklist = Map.put(ice_agent.checklist, pair.id, pair)
76103

77104
ice_agent = %ICEAgent{ice_agent | checklist: checklist}
78105
ICEAgent.send_binding_success_response(ice_agent, pair, msg)
79106

80107
%CandidatePair{state: :succeeded} = checklist_pair when ice_agent.state != :failed ->
81108
discovered_pair = Map.fetch!(ice_agent.checklist, checklist_pair.discovered_pair_id)
82-
discovered_pair = %CandidatePair{discovered_pair | last_seen: pair.last_seen}
109+
110+
discovered_pair = %CandidatePair{
111+
discovered_pair
112+
| last_seen: pair.last_seen,
113+
requests_received: discovered_pair.requests_received + 1
114+
}
115+
83116
ice_agent = put_in(ice_agent.checklist[discovered_pair.id], discovered_pair)
84117

85118
if ice_agent.selected_pair_id != discovered_pair.id do
@@ -92,21 +125,24 @@ defmodule ExICE.Priv.ConnCheckHandler.Controlled do
92125

93126
%CandidatePair{state: :failed} = checklist_pair
94127
when ice_agent.state not in [:completed, :failed] ->
128+
r_pair = resolve_pair(ice_agent, checklist_pair)
129+
95130
Logger.debug("""
96131
Nomination request on failed pair. Re-scheduling pair for conn-check.
97132
We will nominate pair once conn check passes.
98-
Pair: #{inspect(checklist_pair.id)}
133+
Pair: #{inspect(pair.id)}
99134
""")
100135

101-
checklist_pair = %CandidatePair{
102-
checklist_pair
136+
r_pair = %CandidatePair{
137+
r_pair
103138
| nominate?: true,
104139
last_seen: pair.last_seen,
105-
state: :waiting
140+
state: :waiting,
141+
requests_received: r_pair.requests_received + 1
106142
}
107143

108-
ice_agent = put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
109-
ICEAgent.send_binding_success_response(ice_agent, checklist_pair, msg)
144+
ice_agent = put_in(ice_agent.checklist[r_pair.id], r_pair)
145+
ICEAgent.send_binding_success_response(ice_agent, r_pair, msg)
110146

111147
%CandidatePair{} = checklist_pair when ice_agent.state not in [:completed, :failed] ->
112148
Logger.debug("""
@@ -118,15 +154,23 @@ defmodule ExICE.Priv.ConnCheckHandler.Controlled do
118154
checklist_pair = %CandidatePair{
119155
checklist_pair
120156
| nominate?: true,
121-
last_seen: pair.last_seen
157+
last_seen: pair.last_seen,
158+
requests_received: checklist_pair.requests_received + 1
122159
}
123160

124161
ice_agent = put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
125162
ICEAgent.send_binding_success_response(ice_agent, checklist_pair, msg)
126163

127164
%CandidatePair{} = checklist_pair ->
128-
checklist_pair = %CandidatePair{checklist_pair | last_seen: pair.last_seen}
129-
put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
165+
r_pair = resolve_pair(ice_agent, checklist_pair)
166+
167+
r_pair = %CandidatePair{
168+
r_pair
169+
| last_seen: pair.last_seen,
170+
requests_received: r_pair.requests_received + 1
171+
}
172+
173+
put_in(ice_agent.checklist[r_pair.id], r_pair)
130174
end
131175
end
132176

@@ -167,4 +211,8 @@ defmodule ExICE.Priv.ConnCheckHandler.Controlled do
167211
ice_agent
168212
end
169213
end
214+
215+
defp resolve_pair(ice_agent, pair) do
216+
(pair.discovered_pair_id && Map.fetch!(ice_agent.checklist, pair.discovered_pair_id)) || pair
217+
end
170218
end

lib/ex_ice/priv/conn_check_handler/controlling.ex

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,59 @@ defmodule ExICE.Priv.ConnCheckHandler.Controlling do
3636

3737
nil when ice_agent.state in [:new, :checking, :connected] ->
3838
Logger.debug("Adding new candidate pair: #{inspect(pair)}")
39+
pair = %CandidatePair{pair | requests_received: 1}
3940
checklist = Map.put(ice_agent.checklist, pair.id, pair)
4041
ice_agent = %ICEAgent{ice_agent | checklist: checklist}
4142
ICEAgent.send_binding_success_response(ice_agent, pair, msg)
4243

4344
%CandidatePair{} = checklist_pair ->
4445
cond do
45-
checklist_pair.state == :failed and ice_agent.state in [:failed, :completed] ->
46-
# update last seen so we can observe that something is received but don't reply
47-
# as we are in the failed state
48-
checklist_pair = %CandidatePair{checklist_pair | last_seen: pair.last_seen}
49-
put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
46+
ice_agent.state == :failed ->
47+
r_pair = resolve_pair(ice_agent, checklist_pair)
48+
49+
r_pair = %CandidatePair{
50+
r_pair
51+
| last_seen: pair.last_seen,
52+
requests_received: r_pair.requests_received + 1
53+
}
54+
55+
put_in(ice_agent.checklist[r_pair.id], r_pair)
56+
57+
checklist_pair.state == :failed and ice_agent.state == :completed ->
58+
r_pair = resolve_pair(ice_agent, checklist_pair)
59+
60+
r_pair = %CandidatePair{
61+
r_pair
62+
| last_seen: pair.last_seen,
63+
requests_received: r_pair.requests_received + 1
64+
}
65+
66+
put_in(ice_agent.checklist[r_pair.id], r_pair)
5067

5168
checklist_pair.state == :failed ->
52-
checklist_pair = %CandidatePair{
53-
checklist_pair
69+
r_pair = resolve_pair(ice_agent, checklist_pair)
70+
71+
r_pair = %CandidatePair{
72+
r_pair
5473
| state: :waiting,
55-
last_seen: pair.last_seen
74+
last_seen: pair.last_seen,
75+
requests_received: r_pair.requests_received + 1
5676
}
5777

58-
ice_agent = put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
59-
ICEAgent.send_binding_success_response(ice_agent, checklist_pair, msg)
78+
ice_agent = put_in(ice_agent.checklist[r_pair.id], r_pair)
79+
ICEAgent.send_binding_success_response(ice_agent, r_pair, msg)
6080

6181
true ->
62-
checklist_pair = %CandidatePair{checklist_pair | last_seen: pair.last_seen}
63-
ice_agent = put_in(ice_agent.checklist[checklist_pair.id], checklist_pair)
64-
ICEAgent.send_binding_success_response(ice_agent, checklist_pair, msg)
82+
r_pair = resolve_pair(ice_agent, checklist_pair)
83+
84+
r_pair = %CandidatePair{
85+
r_pair
86+
| last_seen: pair.last_seen,
87+
requests_received: r_pair.requests_received + 1
88+
}
89+
90+
ice_agent = put_in(ice_agent.checklist[r_pair.id], r_pair)
91+
ICEAgent.send_binding_success_response(ice_agent, r_pair, msg)
6592
end
6693
end
6794
end
@@ -86,4 +113,8 @@ defmodule ExICE.Priv.ConnCheckHandler.Controlling do
86113
ice_agent = %ICEAgent{ice_agent | nominating?: {false, nil}, selected_pair_id: pair.id}
87114
ICEAgent.change_connection_state(ice_agent, :completed)
88115
end
116+
117+
defp resolve_pair(ice_agent, pair) do
118+
(pair.discovered_pair_id && Map.fetch!(ice_agent.checklist, pair.discovered_pair_id)) || pair
119+
end
89120
end

0 commit comments

Comments
 (0)