File 3382-kernel-Update-group_history-after-disk_log-change.patch of Package erlang

From 5cadb1f3a3ebd6931cefe8dcde88591e2ca67040 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Tue, 23 Feb 2021 12:12:33 +0100
Subject: [PATCH 2/2] kernel: Update group_history after disk_log change

To keep the old messages about resizing the disk log some changes were
needed. The 'size_mismatch' error is no longer returned, why the size
of the opened wrap log needs to be compared to the requested size.
---
 lib/kernel/src/group_history.erl | 72 +++++++++++++++++++++++---------
 1 file changed, 53 insertions(+), 19 deletions(-)

diff --git a/lib/kernel/src/group_history.erl b/lib/kernel/src/group_history.erl
index c196b0c1a9..f50060cefa 100644
--- a/lib/kernel/src/group_history.erl
+++ b/lib/kernel/src/group_history.erl
@@ -44,9 +44,14 @@ load() ->
     wait_for_kernel_safe_sup(),
     case history_status() of
         enabled ->
-            try open_log() of
+            %% If the size option were included the log file would be
+            %% silently resized. If the log file does not exist, a
+            %% {badarg, size} error is returned and a new log file
+            %% created. If the file exists, the log file is resized if
+            %% needed, with a size warning.
+            try open_log_no_size() of
                 {ok, ?LOG_NAME} ->
-                    read_full_log(?LOG_NAME);
+                    maybe_resize_log(?LOG_NAME);
                 {repaired, ?LOG_NAME, {recovered, Good}, {badbytes, Bad}} ->
                     report_repairs(?LOG_NAME, Good, Bad),
                     read_full_log(?LOG_NAME);
@@ -57,13 +62,11 @@ load() ->
                 {error, {name_already_open, _}} ->
                     show_rename_warning(),
                     read_full_log(?LOG_NAME);
-                {error, {size_mismatch, Current, New}} ->
-                    show_size_warning(Current, New),
-                    resize_log(?LOG_NAME, Current, New),
-                    load();
                 {error, {invalid_header, {vsn, Version}}} ->
                     upgrade_version(?LOG_NAME, Version),
                     load();
+                {error, {badarg, size}} ->
+                    open_new_log(?LOG_NAME);
                 {error, Reason} ->
                     handle_open_error(Reason),
                     disable_history(),
@@ -122,8 +125,7 @@ wait_for_kernel_safe_sup() ->
 
 %% Repair the log out of band
 repair_log(Name) ->
-    Opts = lists:keydelete(size, 1, log_options()),
-    case disk_log:open(Opts) of
+    case open_log_no_size() of
         {repaired, ?LOG_NAME, {recovered, Good}, {badbytes, Bad}} ->
             report_repairs(?LOG_NAME, Good, Bad);
         _ ->
@@ -132,6 +134,16 @@ repair_log(Name) ->
     _ = disk_log:close(Name),
     load().
 
+open_new_log(Name) ->
+    case open_log() of
+        {error, Reason} ->
+            handle_open_error(Reason),
+            disable_history();
+        _ ->
+            _ = disk_log:close(Name),
+            load()
+    end.
+
 %% Return whether the shell history is enabled or not
 -spec history_status() -> enabled | disabled | module().
 history_status() ->
@@ -168,6 +180,12 @@ open_log() ->
     _ = ensure_path(Opts),
     disk_log:open(Opts).
 
+%% Like open_log(), but with no 'size' option.
+open_log_no_size() ->
+    Opts = lists:keydelete(size, 1, log_options()),
+    _ = ensure_path(Opts),
+    disk_log:open(Opts).
+
 %% Return logger options
 log_options() ->
     Path = find_path(),
@@ -203,6 +221,17 @@ read_full_log(Name) ->
             lists:reverse(maybe_drop_header(Logs) ++ read_full_log(Name, Cont))
     end.
 
+%% Resize or read an open log
+maybe_resize_log(Name) ->
+    case {disk_log_info(size), find_wrap_values()} of
+        {Sz, Sz} ->
+            read_full_log(Name);
+        {Current, New} ->
+            show_size_warning(Current, New),
+            resize_log(Name, Current, New),
+            load()
+    end.
+
 read_full_log(Name, Cont) ->
     case disk_log:chunk(Name, Cont) of
         {error, no_such_log} ->
@@ -243,6 +272,10 @@ handle_open_error({file_error, FileName, Reason}) ->
 handle_open_error(Err) ->
     show_unexpected_warning({disk_log, open, 1}, Err).
 
+disk_log_info(Tag) ->
+    {Tag, Value} = lists:keyfind(size, 1, disk_log:info(?LOG_NAME)),
+    Value.
+
 find_wrap_values() ->
     ConfSize = case application:get_env(kernel, shell_history_file_bytes) of
         undefined -> ?DEFAULT_SIZE;
@@ -267,19 +300,18 @@ report_repairs(_, Good, Bad) ->
 resize_log(Name, _OldSize, NewSize) ->
     show('$#erlang-history-resize-attempt',
          "Attempting to resize the log history file to ~p...", [NewSize]),
-    Opts = lists:keydelete(size, 1, log_options()),
-    _ = case disk_log:open(Opts) of
-        {error, {need_repair, _}} ->
-            _ = repair_log(Name),
-            disk_log:open(Opts);
-        _ ->
-            ok
-    end,
+    _ = case open_log_no_size() of
+            {error, {need_repair, _}} ->
+                _ = repair_log(Name),
+                _ = open_log_no_size();
+            _ ->
+                ok
+        end,
     case disk_log:change_size(Name, NewSize) of
         ok ->
             show('$#erlang-history-resize-result',
                  "ok~n", []);
-        {error, {new_size_too_small, _, _}} ->
+        {error, {new_size_too_small, _, _}} -> % cannot happen
             show('$#erlang-history-resize-result',
                  "failed (new size is too small)~n", []),
             disable_history();
@@ -287,7 +319,9 @@ resize_log(Name, _OldSize, NewSize) ->
             show('$#erlang-history-resize-result',
                  "failed (~p)~n", [Reason]),
             disable_history()
-    end.
+    end,
+    _ = disk_log:close(?LOG_NAME),
+    ok.
 
 upgrade_version(_Name, Unsupported) ->
     %% We only know of one version and can't support a newer one
@@ -299,7 +333,7 @@ upgrade_version(_Name, Unsupported) ->
 
 disable_history() ->
     show('$#erlang-history-disable', "Disabling shell history logging.~n", []),
-    application:set_env(kernel, shell_history, force_disabled).
+    application:set_env(kernel, shell_history, disabled).
 
 find_path() ->
     case application:get_env(kernel, shell_history_path) of
-- 
2.26.2

openSUSE Build Service is sponsored by