Skip to content

Commit

Permalink
Be smarter about extracting the drive letter from a directory on win32
Browse files Browse the repository at this point in the history
  • Loading branch information
lukebakken committed Dec 18, 2021
1 parent 8a104f4 commit be691a0
Showing 1 changed file with 29 additions and 17 deletions.
46 changes: 29 additions & 17 deletions deps/rabbit/src/rabbit_disk_monitor.erl
Expand Up @@ -232,12 +232,20 @@ get_disk_free(Dir, {unix, _}) ->
Df = os:find_executable("df"),
parse_free_unix(run_cmd(Df ++ " -kP " ++ Dir));
get_disk_free(Dir, {win32, _}) ->
case win32_get_disk_free_fsutil(Dir) of
{ok, Free0} -> Free0;
% Dir:
% "c:/Users/username/AppData/Roaming/RabbitMQ/db/rabbit2@username-z01-mnesia"
case win32_get_drive_letter(Dir) of
error ->
case win32_get_disk_free_pwsh(Dir) of
{ok, Free1} -> Free1;
_ -> exit(could_not_determine_disk_free)
rabbit_log:warning("Mnesia directory is not in the expected format (C:): '~p'", [Dir]),
exit(could_not_determine_disk_free);
DriveLetter ->
case win32_get_disk_free_fsutil(DriveLetter) of
{ok, Free0} -> Free0;
error ->
case win32_get_disk_free_pwsh(DriveLetter) of
{ok, Free1} -> Free1;
_ -> exit(could_not_determine_disk_free)
end
end
end.

Expand All @@ -250,13 +258,18 @@ parse_free_unix(Str) ->
_ -> exit({unparseable, Str})
end.

win32_get_disk_free_fsutil(Dir) ->
% Dir:
% "c:/Users/username/AppData/Roaming/RabbitMQ/db/rabbit2@username-z01-mnesia"
Drive = string:slice(Dir, 0, 2),
win32_get_drive_letter([DriveLetter, $:, $/ | _]) when
(DriveLetter >= $a andalso DriveLetter =< $z) orelse
(DriveLetter >= $A andalso DriveLetter =< $Z) ->
DriveLetter;
win32_get_drive_letter(_) ->
error.

% Drive: c:
FsutilCmd = "fsutil.exe volume diskfree " ++ Drive,
win32_get_disk_free_fsutil(DriveLetter) when
(DriveLetter >= $a andalso DriveLetter =< $z) orelse
(DriveLetter >= $A andalso DriveLetter =< $Z) ->
% DriveLetter $c
FsutilCmd = "fsutil.exe volume diskfree " ++ [DriveLetter] ++ ":",

% C:\windows\system32>fsutil volume diskfree c:
% Total free bytes : 812,733,878,272 (756.9 GB)
Expand All @@ -276,12 +289,11 @@ win32_get_disk_free_fsutil(Dir) ->
end
end.


win32_get_disk_free_pwsh(Dir) ->
% Dir:
% "c:/Users/username/AppData/Roaming/RabbitMQ/db/rabbit2@username-z01-mnesia"
Drive = string:slice(Dir, 0, 1),
PoshCmd = "powershell.exe -NoLogo -NoProfile -NonInteractive -Command (Get-PSDrive " ++ Drive ++ ").Free",
win32_get_disk_free_pwsh(DriveLetter) when
(DriveLetter >= $a andalso DriveLetter =< $z) orelse
(DriveLetter >= $A andalso DriveLetter =< $Z) ->
% DriveLetter $c
PoshCmd = "powershell.exe -NoLogo -NoProfile -NonInteractive -Command (Get-PSDrive " ++ [DriveLetter] ++ ").Free",
case run_cmd(PoshCmd) of
{error, timeout} ->
error;
Expand Down

0 comments on commit be691a0

Please sign in to comment.