|
62 | 62 | -export([ |
63 | 63 | start_link/1, |
64 | 64 | refresh_route/1, |
| 65 | + refresh_route/2, |
65 | 66 | checkpoint/0, |
66 | 67 | schedule_checkpoint/0 |
67 | 68 | ]). |
@@ -148,6 +149,19 @@ start_link(Args) -> |
148 | 149 | refresh_route(RouteID) -> |
149 | 150 | gen_server:call(?MODULE, {refresh_route, RouteID}, timer:seconds(300)). |
150 | 151 |
|
| 152 | +-spec refresh_route(hpr_route:id(), Retry :: non_neg_integer()) -> |
| 153 | + {ok, refresh_map()} | {error, any()}. |
| 154 | +refresh_route(RouteID, Retry) when Retry == 0 -> |
| 155 | + {error, {retry_exhausted, RouteID}}; |
| 156 | +refresh_route(RouteID, Retry) -> |
| 157 | + case ?MODULE:refresh_route(RouteID) of |
| 158 | + {ok, _} = Result -> |
| 159 | + Result; |
| 160 | + {error, Reason} -> |
| 161 | + lager:error("refresh_route failed ~p retrying ~p for ~p", [Reason, Retry, RouteID]), |
| 162 | + ?MODULE:refresh_route(RouteID, Retry - 1) |
| 163 | + end. |
| 164 | + |
151 | 165 | -spec checkpoint() -> ok. |
152 | 166 | checkpoint() -> |
153 | 167 | gen_server:call(?MODULE, checkpoint). |
@@ -246,25 +260,36 @@ handle_call({refresh_route, RouteID}, _From, State) -> |
246 | 260 | Reply = |
247 | 261 | case {DevaddrResponse, EUIResponse, SKFResponse} of |
248 | 262 | {{ok, {DBefore, DAfter}}, {ok, {EBefore, EAfter}}, {ok, {SBefore, SAfter}}} -> |
249 | | - {ok, #{ |
250 | | - eui_before => length(EBefore), |
251 | | - eui_after => length(EAfter), |
252 | | - eui_removed => length(EBefore -- EAfter), |
253 | | - eui_added => length(EAfter -- EBefore), |
254 | | - %% |
255 | | - skf_before => length(SBefore), |
256 | | - skf_after => length(SAfter), |
257 | | - skf_removed => length(SBefore -- SAfter), |
258 | | - skf_added => length(SAfter -- SBefore), |
259 | | - %% |
260 | | - devaddr_before => length(DBefore), |
261 | | - devaddr_after => length(DAfter), |
262 | | - devaddr_removed => length(DBefore -- DAfter), |
263 | | - devaddr_added => length(DAfter -- DBefore) |
264 | | - }}; |
265 | | - {Err, _, _} when element(1, Err) == error -> Err; |
266 | | - {_, Err, _} when element(1, Err) == error -> Err; |
267 | | - {_, _, Err} when element(1, Err) == error -> Err; |
| 263 | + LenSAfter = length(SAfter), |
| 264 | + LenDAfter = length(DAfter), |
| 265 | + % When we have some SKF (SAfter > 0) but no Devaddrs we consider it an error |
| 266 | + case LenSAfter > 0 andalso LenDAfter == 0 of |
| 267 | + true -> |
| 268 | + {error, devaddr_empty}; |
| 269 | + false -> |
| 270 | + {ok, #{ |
| 271 | + eui_before => length(EBefore), |
| 272 | + eui_after => length(EAfter), |
| 273 | + eui_removed => length(EBefore -- EAfter), |
| 274 | + eui_added => length(EAfter -- EBefore), |
| 275 | + %% |
| 276 | + skf_before => length(SBefore), |
| 277 | + skf_after => LenSAfter, |
| 278 | + skf_removed => length(SBefore -- SAfter), |
| 279 | + skf_added => length(SAfter -- SBefore), |
| 280 | + %% |
| 281 | + devaddr_before => length(DBefore), |
| 282 | + devaddr_after => LenDAfter, |
| 283 | + devaddr_removed => length(DBefore -- DAfter), |
| 284 | + devaddr_added => length(DAfter -- DBefore) |
| 285 | + }} |
| 286 | + end; |
| 287 | + {{error, _} = Err, _, _} -> |
| 288 | + Err; |
| 289 | + {_, {error, _} = Err, _} -> |
| 290 | + Err; |
| 291 | + {_, _, {error, _} = Err} -> |
| 292 | + Err; |
268 | 293 | Other -> |
269 | 294 | {error, {unexpected_response, Other}} |
270 | 295 | end, |
@@ -509,6 +534,7 @@ refresh_devaddrs(RouteID) -> |
509 | 534 | ], |
510 | 535 | {ok, {PreviousDevaddrs, Devaddrs1}}; |
511 | 536 | Err -> |
| 537 | + lager:error([{route_id, RouteID}], "failed to refresh route devaddrs ~p", [Err]), |
512 | 538 | Err |
513 | 539 | end; |
514 | 540 | {error, _E} = Err -> |
|
0 commit comments