Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:20
elixir
0010-Use-persistent_term-for-Logger-config-8977...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0010-Use-persistent_term-for-Logger-config-8977.patch of Package elixir
From 1f5ad68302a716196bf0c4ee9c7dd26c7a65160d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= <jose.valim@gmail.com> Date: Wed, 24 Apr 2019 09:28:31 +0200 Subject: [PATCH] Use :persistent_term for Logger config (#8977) Closes #8592. --- lib/logger/lib/logger/config.ex | 78 +++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/lib/logger/lib/logger/config.ex b/lib/logger/lib/logger/config.ex index 1ae09fa4c..58785331e 100644 --- a/lib/logger/lib/logger/config.ex +++ b/lib/logger/lib/logger/config.ex @@ -4,6 +4,8 @@ defmodule Logger.Config do @behaviour :gen_event @name __MODULE__ @table __MODULE__ + @data_key __MODULE__ + @deleted_handlers_key __MODULE__.DeletedHandlers @counter_pos 1 @update_counter_message {__MODULE__, :update_counter} @@ -20,7 +22,7 @@ def remove_translator(translator) do end def level do - %{level: level} = read_data!(:translation_data) + %{level: level} = read_data!(@data_key) level end @@ -36,11 +38,11 @@ defp level_to_number(:warn), do: 2 defp level_to_number(:error), do: 3 def translation_data do - read_data!(:translation_data) + read_data!(@data_key) end def log_data(level) do - %{level: min_level} = config = read_data!(:log_data) + %{level: min_level} = config = read_data!(@data_key) if compare_levels(level, min_level) != :lt do %{thresholds: {counter, sync, discard}} = config @@ -58,7 +60,7 @@ def log_data(level) do def deleted_handlers do try do - :ets.lookup_element(@table, :deleted_handlers, 2) + read_data(@deleted_handlers_key, []) rescue ArgumentError -> [] end @@ -84,7 +86,7 @@ def init({@table, counter}) do {counter, :log, Application.fetch_env!(:logger, :discard_threshold), Application.fetch_env!(:logger, :discard_threshold_periodic_check)} - :ets.lookup_element(@table, :log_data, 2) || compute_data(state) + read_data(@data_key, nil) || compute_data(state) state = update_counter(state, false) {:ok, state} end @@ -122,7 +124,7 @@ def handle_call({:remove_translator, translator}, state) do def handle_call({:deleted_handlers, new}, state) do old = deleted_handlers() - true = :ets.update_element(@table, :deleted_handlers, {2, new}) + update_data(@deleted_handlers_key, new) {:ok, old, state} end @@ -225,25 +227,37 @@ defp bump_counter({:counters, counter}) do ## Data helpers + # TODO: Use persistent_term exclusively when we require Erlang/OTP 22+. defp new_data do - entries = [ - {:log_data, nil}, - {:translation_data, nil}, - {:deleted_handlers, []} - ] + _ = Code.ensure_loaded(:persistent_term) - table = :ets.new(@table, [:named_table, :public, {:read_concurrency, true}]) - true = :ets.insert_new(@table, entries) - table + if not function_exported?(:persistent_term, :get, 2) do + entries = [ + {@data_key, nil}, + {@deleted_handlers_key, []} + ] + + _ = :ets.new(@table, [:named_table, :public, {:read_concurrency, true}]) + true = :ets.insert_new(@table, entries) + end + + @table end - defp delete_data(@table), do: :ets.delete(@table) + defp delete_data(@table) do + if function_exported?(:persistent_term, :get, 2) do + :persistent_term.erase(@data_key) + :persistent_term.erase(@deleted_handlers_key) + else + :ets.delete(@table) + end + end defp update_translators(fun) do - translation_data = read_data!(:translation_data) - translators = fun.(translation_data.translators) + data = read_data!(@data_key) + translators = fun.(data.translators) Application.put_env(:logger, :translators, translators) - update_data(:translation_data, %{translation_data | translators: translators}) + update_data(@data_key, %{data | translators: translators}) end defp compute_data({counter, _mode, _discard_threshold, _discard_period}) do @@ -251,27 +265,21 @@ defp compute_data({counter, _mode, _discard_threshold, _discard_period}) do discard_threshold = Application.fetch_env!(:logger, :discard_threshold) discard_period = Application.fetch_env!(:logger, :discard_threshold_periodic_check) - log_data = %{ + data = %{ level: Application.fetch_env!(:logger, :level), utc_log: Application.fetch_env!(:logger, :utc_log), truncate: Application.fetch_env!(:logger, :truncate), - thresholds: {counter, sync_threshold, discard_threshold} - } - - translation_data = %{ - level: Application.fetch_env!(:logger, :level), translators: Application.fetch_env!(:logger, :translators), - truncate: Application.fetch_env!(:logger, :truncate) + thresholds: {counter, sync_threshold, discard_threshold} } - update_data(:log_data, log_data) - update_data(:translation_data, translation_data) + update_data(@data_key, data) {counter, :log, discard_threshold, discard_period} end defp read_data!(key) do try do - :ets.lookup_element(@table, key, 2) + read_data(key, nil) rescue ArgumentError -> raise "cannot use Logger, the :logger application is not running" @@ -284,7 +292,19 @@ defp read_data!(key) do end end + defp read_data(key, default) do + if function_exported?(:persistent_term, :get, 2) do + :persistent_term.get(key, default) + else + :ets.lookup_element(@table, key, 2) + end + end + defp update_data(key, value) do - :ets.update_element(@table, key, {2, value}) + if function_exported?(:persistent_term, :get, 2) do + :persistent_term.put(key, value) + else + :ets.insert(@table, {key, value}) + end end end -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor