@@ -57,6 +57,7 @@ config_usage() ->
5757 " [--display_skfs] default: false (SKFs not included)\n " ,
5858 " config route refresh_all - Refresh all routes\n " ,
5959 " [--minimum] default: 1 (need a minimum of 1 SKFs ro be updated)\n " ,
60+ " config route refresh_broken - Refresh broken routes\n " ,
6061 " config route refresh <route_id> - Refresh route's EUIs, SKFs, DevAddrRanges\n " ,
6162 " config route activate <route_id> - Activate route\n " ,
6263 " config route deactivate <route_id> - Deactivate route\n " ,
@@ -103,6 +104,12 @@ config_cmd() ->
103104 ],
104105 fun config_route_refresh_all /3
105106 ],
107+ [
108+ [" config" , " route" , " refresh_broken" ],
109+ [],
110+ [],
111+ fun config_route_refresh_broken /3
112+ ],
106113 [
107114 [" config" , " route" , " refresh" , '*' ],
108115 [],
@@ -299,44 +306,78 @@ config_route_refresh_all(["config", "route", "refresh_all"], [], Flags) ->
299306 RouteIDs = [ID || {ID , _ } <- Sorted ],
300307 Total = erlang :length (RouteIDs ),
301308 lager :info (" Found ~p routes to update" , [Total ]),
302- route_refresh_all (
303- Total , RouteIDs , backoff :init (timer :seconds (1 ), timer :minutes (1 ))
304- )
309+ routes_refresh (Total , RouteIDs )
305310 end ),
306- c_text (" command spawned @ ~p , look at logs and tail hpr_cli_config" , [Pid ]);
311+ c_text (
312+ " command spawned @ ~p , look at logs and `tail -F /opt/hpr/log/info.log | grep hpr_cli_config`" ,
313+ [Pid ]
314+ );
307315config_route_refresh_all (_ , _ , _ ) ->
308316 usage .
309317
310- route_refresh_all (_Total , [], _Backoff0 ) ->
318+ config_route_refresh_broken ([" config" , " route" , " refresh_broken" ], [], _Flags ) ->
319+ Pid = erlang :spawn (fun () ->
320+ RouteIDsWithDevAddr =
321+ hpr_devaddr_range_storage :foldl (
322+ fun ({_ , RouteID }, Acc ) ->
323+ sets :add_element (RouteID , Acc )
324+ end ,
325+ sets :new ()
326+ ),
327+ RouteIDs = hpr_route_storage :foldl (
328+ fun (RouteETS , RouteIDs ) ->
329+ SKFCount =
330+ case ets :info (hpr_route_ets :skf_ets (RouteETS ), size ) of
331+ undefined -> 0 ;
332+ N -> N
333+ end ,
334+ Route = hpr_route_ets :route (RouteETS ),
335+ RouteID = hpr_route :id (Route ),
336+ case SKFCount > 0 andalso not sets :is_element (RouteID , RouteIDsWithDevAddr ) of
337+ true ->
338+ lager :warning (
339+ [{route_id , RouteID }, {oui , hpr_route :oui (Route )}],
340+ " BROKEN_ROUTES route has no devaddr ranges but has (~p ) skfs" ,
341+ [SKFCount ]
342+ ),
343+ [RouteID | RouteIDs ];
344+ false ->
345+ RouteIDs
346+ end
347+ end ,
348+ []
349+ ),
350+ Total = erlang :length (RouteIDs ),
351+ lager :info (" Found ~p routes to fix" , [Total ]),
352+ routes_refresh (Total , RouteIDs )
353+ end ),
354+ c_text (
355+ " command spawned @ ~p , look at logs and `tail -F /opt/hpr/log/info.log | grep hpr_cli_config`" ,
356+ [Pid ]
357+ );
358+ config_route_refresh_broken (_ , _ , _ ) ->
359+ usage .
360+
361+ routes_refresh (_Total , []) ->
311362 lager :info (" All done!" );
312- route_refresh_all (Total , [RouteID | T ] = RouteIDs , Backoff0 ) ->
363+ routes_refresh (Total , [RouteID | RouteIDs ] ) ->
313364 CurrTotal = erlang :length (RouteIDs ),
314365 IDX = Total - CurrTotal + 1 ,
315366 lager :info (" ~p /~p ===== ~s =====" , [
316367 IDX , Total , RouteID
317368 ]),
318369 Start = erlang :system_time (millisecond ),
319- case try_refresh_route (RouteID ) of
320- ok ->
321- End = erlang :system_time (millisecond ),
322- lager :info (" took ~p ms" , [End - Start ]),
323- {_ , Backoff1 } = backoff :succeed (Backoff0 ),
324- route_refresh_all (Total , T , Backoff1 );
325- error ->
326- End = erlang :system_time (millisecond ),
327- lager :info (" took ~p ms" , [End - Start ]),
328- {Delay , Backoff1 } = backoff :fail (Backoff0 ),
329- lager :info (" sleeping ~p ms" , [Delay ]),
330- timer :sleep (Delay ),
331- route_refresh_all (Total , RouteIDs , Backoff1 )
332- end ,
333- ok .
334-
335- try_refresh_route (RouteID ) ->
336- try hpr_route_stream_worker :refresh_route (RouteID ) of
370+ try hpr_route_stream_worker :refresh_route (RouteID , 3 ) of
337371 {ok , Map } ->
338372 lager :info (" | Type | Before | After | Removed | Added |" ),
339373 lager :info (" |------|---------|---------|---------|---------|" ),
374+ lager :info (" | ~4w | ~7w | ~7w | ~7w | ~7w |" , [
375+ addr ,
376+ maps :get (devaddr_before , Map ),
377+ maps :get (devaddr_after , Map ),
378+ maps :get (devaddr_removed , Map ),
379+ maps :get (devaddr_added , Map )
380+ ]),
340381 lager :info (" | ~4w | ~7w | ~7w | ~7w | ~7w |" , [
341382 eui ,
342383 maps :get (eui_before , Map ),
@@ -350,23 +391,16 @@ try_refresh_route(RouteID) ->
350391 maps :get (skf_after , Map ),
351392 maps :get (skf_removed , Map ),
352393 maps :get (skf_added , Map )
353- ]),
354- lager :info (" | ~4w | ~7w | ~7w | ~7w | ~7w |" , [
355- addr ,
356- maps :get (devaddr_before , Map ),
357- maps :get (devaddr_after , Map ),
358- maps :get (devaddr_removed , Map ),
359- maps :get (devaddr_added , Map )
360- ]),
361- ok ;
394+ ]);
362395 {error , _R } ->
363- lager :info (" ERROR ~p " , [_R ]),
364- error
396+ lager :error (" error ~p " , [_R ])
365397 catch
366398 _E :_R ->
367- lager :info (" CRASHED ~p " , [_R ]),
368- error
369- end .
399+ lager :critical (" crashed ~p " , [_R ])
400+ end ,
401+ End = erlang :system_time (millisecond ),
402+ lager :info (" took ~p ms" , [End - Start ]),
403+ routes_refresh (Total , RouteIDs ).
370404
371405config_route_refresh ([" config" , " route" , " refresh" , RouteID ], [], _Flags ) ->
372406 case hpr_route_stream_worker :refresh_route (RouteID , 3 ) of
0 commit comments