[erlang-bugs] disksup:get_disk_data() is returning the wrong data on my system (OS X 10.8 -- Darwin 12)

Lukas Larsson <>
Tue Apr 23 14:54:33 CEST 2013


Hello,

I believe that this is already a known and fixed issue. The fix[1] will 
be part of the R16B01 release or you can get the latest maint from github.

If this does not fix your issue please use git to send in your proposed 
fixes as described at github.com[2].

Lukas

    [1]: 
http://erlang.org/pipermail/erlang-patches/2013-February/003611.html
    [2]: https://github.com/erlang/otp/wiki/Submitting-patches

On 23/04/13 01:16, John Bard wrote:
>
> disksup:get_disk_data() is returning garbage in OS X 10.8 (on my system)
>
>
> [I have verified this in R15B02, R15B03 & 16B]
>
>
> 1> ok = application:start(sasl).
>
> <snip>
>
> 2> ok = application:start(os_mon).
>
> <snip>
>
> 3> disksup:get_disk_data().
>
> [{"18704735",244277768,31}]
>
> 4>
>
>
> The expectation is: [{"/",244277768,31}]
>
>
> The problem is that the format of the df command changed in OS X 10.8 
> for some reason (at least it is different on my machine... I checked 
> and I don't appear to have any bash functions or aliases getting in 
> the way).
>
>
> In OS X 10.7.? (a colleague's mac mini: hdd):
>
> $ df -k -t ufs,hfs
>
> Filesystem   1024-blocks      Used Available Capacity  Mounted on
>
> /dev/disk0s2   487546976 156364392 330926584    33%    /
>
> $
>
>
> The 6th column is "Mounted on".
>
>
> In OS X 10.8.3 (my mac book pro: ssd):
>
> $ df -k -t ufs,hfs
>
> Filesystem   1024-blocks     Used Available Capacity  iused    ifree 
> %iused  Mounted on
>
> /dev/disk0s2   244277768 74564136 169457632    31% 18705032 42364408   
> 31%   /
>
> $
>
>
> The 6th column is "iused" instead of "Mounted on".
>
>
>
> If this is a simply difference in 10.8 [darwin 12] and isn't a more 
> complex situation than that (macs pre-installed with ssds vs. hdds? 
> some configuration somewhere?), a fix could be:
>
> [I toyed around in R16B, but the code is pretty much the same in 
> R15B03 and I assume the same in R15B02]
>
>
> in os_mon's disksup.erl:
>
>
> add a guard for the specific darwin in init's case statement:
>
>
> Port = case OS of
>
>     {unix, Flavor} when Flavor==sunos4;
>
>             Flavor==solaris;
>
>             Flavor==freebsd;
>
>             Flavor==dragonfly;
>
>             Flavor==darwin;
>
>             Flavor==darwin_12;
>
>             Flavor==linux;
>
>             Flavor==openbsd;
>
>             Flavor==netbsd;
>
>             Flavor==irix64;
>
>             Flavor==irix ->
>
>         start_portprogram();
>
>     {win32, _OSname} ->
>
>         not_used;
>
>     _ ->
>
>         exit({unsupported_os, OS})
>
>     end,
>
>
> add a clause to the case statement in the get_os() function:
>
>
> get_os() ->
>
>     case os:type() of
>
>         {unix, sunos} ->
>
>             case os:version() of
>
>                 {5,_,_} -> {unix, solaris};
>
>                 {4,_,_} -> {unix, sunos4};
>
>                 V -> exit({unknown_os_version, V})
>
>             end;
>
>         {unix, irix64} ->
>
>             {unix, irix};
>
>         {unix, darwin} ->
>
>             case os:version() of
>
>                 {12,_,_} -> {unix, darwin_12};
>
>                 _ -> {unix, darwin}
>
>             end;
>
>         OS ->
>
>             OS
>
>     end.
>
>
>
> add a function that will pattern match on the new darwin_12 atom 
> specified in the other places and will call into a function to parse 
> the df command differently:
>
>
> check_disk_space({unix, darwin_12}, Port, Threshold) ->
>
>     Result = my_cmd("/bin/df -k -t ufs,hfs", Port),
>
>     check_disks_darwin_12(skip_to_eol(Result), Threshold);
>
>
>
> and add that new function to parse the df command:
>
>
> %% Special cases like this annoy me...
>
> check_disks_darwin_12("", _Threshold) ->
>
>     [];
>
> check_disks_darwin_12("\n", _Threshold) ->
>
>     [];
>
> check_disks_darwin_12(Str, Threshold) ->
>
>     case io_lib:fread("~s~d~d~d~d%~d~d~d%~s", Str) of
>
>         {ok, [_FS, KB, _Used, _Avail, Cap, _IUsed, _IFree, _ICap, 
> MntOn], RestStr} ->
>
>             if
>
>                 Cap >= Threshold ->
>
>                     set_alarm({disk_almost_full, MntOn}, []);
>
>                 true ->
>
>                     clear_alarm({disk_almost_full, MntOn})
>
>             end,
>
>             [{MntOn, KB, Cap} | check_disks_darwin_12(RestStr, 
> Threshold)];
>
>         _Other ->
>
> check_disks_darwin_12(skip_to_eol(Str),Threshold)
>
>     end.
>
>
>
> Sorry if I butchered the whitespace (gmail ate the tabs, so I had to 
> manually fix the whitespace with consistent spaces).
>
> -- 
> Ryan
>
>
> _______________________________________________
> erlang-bugs mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-bugs

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20130423/21abbf16/attachment-0001.html>


More information about the erlang-bugs mailing list