4141-ifdef (use_specs ).
4242
4343-type (erlang_node () :: atom ()).
44- -type (load () :: {{non_neg_integer (), float () }, erlang_node ()}).
44+ -type (load () :: {{non_neg_integer (), integer () | 'unknown' }, erlang_node ()}).
4545-spec (local_load / 0 :: () -> load ()).
4646-spec (remote_loads / 0 :: () -> [load ()]).
4747-spec (pick / 0 :: () -> erlang_node ()).
5252
5353local_load () ->
5454 LoadAvg = case whereis (cpu_sup ) of
55- undefined -> 0.0 ;
56- _Other -> cpu_sup :avg1 ()
55+ undefined -> unknown ;
56+ _ -> case cpu_sup :avg1 () of
57+ L when is_integer (L ) -> L ;
58+ {error , timeout } -> unknown
59+ end
5760 end ,
5861 {{statistics (run_queue ), LoadAvg }, node ()}.
5962
@@ -65,8 +68,12 @@ remote_loads() ->
6568pick () ->
6669 RemoteLoads = remote_loads (),
6770 {{RunQ , LoadAvg }, Node } = local_load (),
68- % % add bias towards current node
69- AdjustedLoadAvg = LoadAvg * ? FUDGE_FACTOR ,
71+ % % add bias towards current node; we rely on Erlang's term order
72+ % % of SomeFloat < local_unknown < unknown.
73+ AdjustedLoadAvg = case LoadAvg of
74+ unknown -> local_unknown ;
75+ _ -> LoadAvg * ? FUDGE_FACTOR
76+ end ,
7077 Loads = [{{RunQ , AdjustedLoadAvg }, Node } | RemoteLoads ],
7178 {_ , SelectedNode } = lists :min (Loads ),
7279 SelectedNode .
0 commit comments