File 0131-add-option-quiet-to-disk_log.patch of Package erlang

From ed4d30888beb58c27f61dcf86384696cc221be35 Mon Sep 17 00:00:00 2001
From: Fred Hebert <mononcqc@ferd.ca>
Date: Sat, 13 May 2017 08:41:32 -0400
Subject: [PATCH 1/2] add option 'quiet' to disk_log

This option allows to suppress output of info_msgs to error_logger when
recoverable errors are encountered in disk_log by setting the value to
'true'.

Defaults to 'false', the backwards compatible behaviour.
---
 lib/kernel/doc/src/disk_log.xml    |  6 ++++++
 lib/kernel/src/disk_log.erl        |  5 ++++-
 lib/kernel/src/disk_log.hrl        |  2 ++
 lib/kernel/src/disk_log_1.erl      | 28 ++++++++++++++++++++++------
 lib/kernel/test/disk_log_SUITE.erl | 17 +++++++++++++++--
 5 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/lib/kernel/doc/src/disk_log.xml b/lib/kernel/doc/src/disk_log.xml
index aebeacee2..570d3ef9b 100644
--- a/lib/kernel/doc/src/disk_log.xml
+++ b/lib/kernel/doc/src/disk_log.xml
@@ -968,6 +968,12 @@
               <c>read_write</c>.
               </p>
           </item>
+          <tag><c>{quiet, Boolean}</c></tag>
+          <item>
+              <p>Specifies if messages will be sent to
+                <c>error_logger</c> on recoverable errors with
+                the log files. Defaults to <c>true</c>.</p>
+          </item>
         </taglist>
         <p><c>open/1</c> returns <c>{ok, <anno>Log</anno>}</c> if the
           log file is successfully opened. If the file is
diff --git a/lib/kernel/src/disk_log.erl b/lib/kernel/src/disk_log.erl
index 50a20c918..70cbf1c87 100644
--- a/lib/kernel/src/disk_log.erl
+++ b/lib/kernel/src/disk_log.erl
@@ -638,6 +638,8 @@ check_arg([{mode, read_only}|Tail], Res) ->
     check_arg(Tail, Res#arg{mode = read_only});
 check_arg([{mode, read_write}|Tail], Res) ->
     check_arg(Tail, Res#arg{mode = read_write});
+check_arg([{quiet, Boolean}|Tail], Res) when is_boolean(Boolean) ->
+    check_arg(Tail, Res#arg{quiet = Boolean});
 check_arg(Arg, _) ->
     {error, {badarg, Arg}}.
 
@@ -1276,7 +1278,8 @@ compare_arg(_Attr, _Val, _A) ->
 do_open(A) ->
     #arg{type = Type, format = Format, name = Name, head = Head0,
          file = FName, repair = Repair, size = Size, mode = Mode,
-         version = V} = A,
+         quiet = Quiet, version = V} = A,
+    disk_log_1:set_quiet(Quiet),
     Head = mk_head(Head0, Format),
     case do_open2(Type, Format, Name, FName, Repair, Size, Mode, Head, V) of
         {ok, Ret, Extra, FormatType, NoItems} ->
diff --git a/lib/kernel/src/disk_log.hrl b/lib/kernel/src/disk_log.hrl
index 58f6155ad..a362881f4 100644
--- a/lib/kernel/src/disk_log.hrl
+++ b/lib/kernel/src/disk_log.hrl
@@ -76,6 +76,7 @@
                           | {notify, boolean()}
                           | {head, Head :: dlog_head_opt()}
                           | {head_func, MFA :: {atom(), atom(), list()}}
+                          | {quiet, boolean()}
                           | {mode, Mode :: dlog_mode()}.
 -type dlog_options()     :: [dlog_option()].
 -type dlog_repair()      :: 'truncate' | boolean().
@@ -102,6 +103,7 @@
 	      head = none,
 	      mode = read_write   :: dlog_mode(),
 	      notify = false      :: boolean(),
+	      quiet = false       :: boolean(),
 	      options = []        :: dlog_options()}).
 
 -record(cache,                %% Cache for logged terms (per file descriptor).
diff --git a/lib/kernel/src/disk_log_1.erl b/lib/kernel/src/disk_log_1.erl
index d83c30f35..10c22e1ad 100644
--- a/lib/kernel/src/disk_log_1.erl
+++ b/lib/kernel/src/disk_log_1.erl
@@ -37,6 +37,7 @@
 -export([get_wrap_size/1]).
 -export([is_head/1]).
 -export([position/3, truncate_at/3, fwrite/4, fclose/2]).
+-export([set_quiet/1, is_quiet/0]).
 
 -compile({inline,[{scan_f2,7}]}).
 
@@ -500,7 +501,10 @@ lh(H, _F) -> % cannot happen
 
 repair(In, File) ->
     FSz = file_size(File),
-    error_logger:info_msg("disk_log: repairing ~tp ...\n", [File]),
+    case is_quiet() of
+        true -> ok;
+        _ -> error_logger:info_msg("disk_log: repairing ~tp ...\n", [File])
+    end,
     Tmp = add_ext(File, "TMP"),
     {ok, {_Alloc, Out, {0, _}, _FileSize}} = new_int_file(Tmp, none),
     scan_f_read(<<>>, In, Out, File, FSz, Tmp, ?MAX_CHUNK_SIZE, 0, 0).
@@ -769,8 +773,11 @@ mf_int_chunk(Handle, {FileNo, Pos}, Bin, N) ->
     NFileNo = inc(FileNo, Handle#handle.maxF),
     case catch int_open(FName, true, read_only, any) of
 	{error, _Reason} ->
-	   error_logger:info_msg("disk_log: chunk error. File ~tp missing.\n\n",
-				 [FName]),
+	    case is_quiet() of
+		true -> ok;
+		_ -> error_logger:info_msg("disk_log: chunk error. File ~tp missing.\n\n",
+					   [FName])
+	    end,
 	    mf_int_chunk(Handle, {NFileNo, 0}, [], N);
 	{ok, {_Alloc, FdC, _HeadSize, _FileSize}} ->
 	    case chunk(FdC, FName, Pos, Bin, N) of
@@ -797,9 +804,12 @@ mf_int_chunk_read_only(Handle, {FileNo, Pos}, Bin, N) ->
     NFileNo = inc(FileNo, Handle#handle.maxF),
     case catch int_open(FName, true, read_only, any) of
 	{error, _Reason} ->
-	   error_logger:info_msg("disk_log: chunk error. File ~tp missing.\n\n",
-				 [FName]),
-	   mf_int_chunk_read_only(Handle, {NFileNo, 0}, [], N);
+	    case is_quiet() of
+		true -> ok;
+		_ -> error_logger:info_msg("disk_log: chunk error. File ~tp missing.\n\n",
+					   [FName])
+	    end,
+	    mf_int_chunk_read_only(Handle, {NFileNo, 0}, [], N);
 	{ok, {_Alloc, FdC, _HeadSize, _FileSize}} ->
 	    case do_chunk_read_only(FdC, FName, Pos, Bin, N) of
 		{NewFdC, eof} ->
@@ -1549,6 +1559,12 @@ fclose(#cache{fd = Fd, c = C}, FileName) ->
     _ = write_cache_close(Fd, FileName, C),
     file:close(Fd).
 
+set_quiet(Bool) ->
+    put(quiet, Bool).
+
+is_quiet() ->
+    get(quiet) =:= true.
+
 %% -> {Reply, #cache{}}; Reply = ok | Error
 write_cache(Fd, _FileName, []) ->
     {ok, #cache{fd = Fd}};
diff --git a/lib/kernel/test/disk_log_SUITE.erl b/lib/kernel/test/disk_log_SUITE.erl
index 069df5a11..2b11a0381 100644
--- a/lib/kernel/test/disk_log_SUITE.erl
+++ b/lib/kernel/test/disk_log_SUITE.erl
@@ -2493,6 +2493,7 @@ error_repair(Conf) when is_list(Conf) ->
     del(File, No),
     ok = file:del_dir(Dir),
 
+    error_logger:add_report_handler(?MODULE, self()),
     %% repair a file
     P1 = pps(),
     {ok, n} = disk_log:open([{name, n}, {file, File}, {type, wrap},
@@ -2509,6 +2510,8 @@ error_repair(Conf) when is_list(Conf) ->
     ok = disk_log:close(n),
     true = (P1 == pps()),
     del(File, No),
+    receive {info_msg, _, "disk_log: repairing" ++ _, _} -> ok
+    after 1000 -> ct:fail(failed) end,
 
     %% yet another repair
     P2 = pps(),
@@ -2525,6 +2528,8 @@ error_repair(Conf) when is_list(Conf) ->
     ok = disk_log:close(n),
     true = (P2 == pps()),
     del(File, No),
+    receive {info_msg, _, "disk_log: repairing" ++ _, _} -> ok
+    after 1000 -> ct:fail(failed) end,
 
     %% Repair, large term
     Big = term_to_binary(lists:duplicate(66000,$a)),
@@ -2540,6 +2545,8 @@ error_repair(Conf) when is_list(Conf) ->
     ok = disk_log:close(n),
     Got = Big,
     del(File, No),
+    receive {info_msg, _, "disk_log: repairing" ++ _, _} -> ok
+    after 1000 -> ct:fail(failed) end,
 
     %% A term a little smaller than a chunk, then big terms.
     BigSmall = mk_bytes(1024*64-8-12),
@@ -2560,6 +2567,8 @@ error_repair(Conf) when is_list(Conf) ->
                        {type, halt}, {format, internal}]),
     ok = disk_log:close(n),
     file:delete(File),
+    receive {info_msg, _, "disk_log: repairing" ++ _, _} -> ok
+    after 1000 -> ct:fail(failed) end,
 
     %% The header is recovered.
     {ok,n} =
@@ -2573,12 +2582,13 @@ error_repair(Conf) when is_list(Conf) ->
     crash(File, 30),
     {repaired,n,{recovered,3},{badbytes,16}} =
         disk_log:open([{name, n}, {file, File}, {type, halt},
-		       {format, internal},{repair,true},
+		       {format, internal},{repair,true}, {quiet, true},
 		       {head_func, {?MODULE, head_fun, [{ok,"head"}]}}]),
     ["head",'of',terms] = get_all_terms(n),
     ok = disk_log:close(n),
-
+    error_logger:delete_report_handler(?MODULE),
     file:delete(File),
+    {messages, []} = process_info(self(), messages),
 
     ok.
 
@@ -5007,6 +5017,9 @@ init(Tester) ->
 handle_event({error_report, _GL, {Pid, crash_report, Report}}, Tester) ->
     Tester ! {crash_report, Pid, Report},
     {ok, Tester};
+handle_event({info_msg, _GL, {Pid, F,A}}, Tester) ->
+    Tester ! {info_msg, Pid, F, A},
+    {ok, Tester};
 handle_event(_Event, State) ->
     {ok, State}.
 
-- 
2.13.0

openSUSE Build Service is sponsored by