Packages
ra
1.1.4
3.1.9
3.1.8
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.2
3.0.1
3.0.0
3.0.0-beta.1
2.17.3
2.17.2
2.17.1
2.17.0
2.16.13
2.16.12
2.16.11
2.16.10
2.16.9
2.16.8
2.16.7
2.16.6
2.16.5
2.16.4
2.16.3
2.16.2
2.16.1
2.16.0
2.16.0-pre.12
2.16.0-pre.11
2.16.0-pre.10
2.16.0-pre.9
2.16.0-pre.8
2.16.0-pre.7
2.16.0-pre.6
2.16.0-pre.5
2.16.0-pre.4
2.16.0-pre.3
2.16.0-pre.2
2.16.0-pre.1
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.0
2.13.6
2.13.5
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.13.0-pre.1
2.12.0
2.11.0
2.11.0-pre.1
2.10.2-pre.2
2.10.2-pre.1
2.10.1
2.10.0
2.10.0-pre.3
2.10.0-pre.2
2.10.0-pre.1
2.9.10-pre.1
2.9.1
2.9.1-pre.2
2.9.1-pre.1
2.9.0
2.8.0
retired
2.7.3
2.7.2
2.7.1
2.7.0
2.7.0-pre.3
2.7.0-pre.2
2.7.0-pre.1
2.6.3
2.6.2
2.6.1
2.6.0-pre.1
2.5.1
2.5.1-pre.1
2.5.0
2.4.9
2.4.8
2.4.7
2.4.6
2.4.5
2.4.4
2.4.3
2.4.2
retired
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.9.6
0.9.5
0.9.4
0.9.2
0.3.3
retired
0.3.2
retired
0.3.1
retired
Raft library
Current section
Files
Jump to
Current section
Files
src/ra_log_ets.erl
%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
%%
%% Copyright (c) 2017-2020 VMware, Inc. or its affiliates. All rights reserved.
%%
%% @hidden
-module(ra_log_ets).
-behaviour(gen_server).
-export([start_link/1,
give_away/1,
delete_tables/1]).
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
terminate/2,
code_change/3]).
-include("ra.hrl").
-record(state, {}).
%%% ra_log_ets - owns mem_table ETS tables
%%%===================================================================
%%% API functions
%%%===================================================================
start_link(DataDir) ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [DataDir], []).
-spec give_away(ets:tid()) -> true.
give_away(Tid) ->
ets:give_away(Tid, whereis(?MODULE), undefined).
-spec delete_tables([ets:tid()]) -> ok.
delete_tables(Tids) ->
gen_server:cast(?MODULE, {delete_tables, Tids}).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
init([DataDir]) ->
process_flag(trap_exit, true),
TableFlags = [named_table,
{read_concurrency, true},
{write_concurrency, true},
public],
% create mem table lookup table to be used to map ra cluster name
% to table identifiers to query.
_ = ets:new(ra_log_open_mem_tables, [set | TableFlags]),
_ = ets:new(ra_log_closed_mem_tables, [bag | TableFlags]),
_ = ra_counters:init(),
_ = ra_leaderboard:init(),
%% Table for ra processes to record their current snapshot index so that
%% other processes such as the segment writer can use this value to skip
%% stale records and avoid flushing unnecessary data to disk.
%% This is written from the ra process so will need write_concurrency.
%% {RaUId, ra_index()}
_ = ets:new(ra_log_snapshot_state, [set | TableFlags]),
ok = ra_directory:init(DataDir),
{ok, #state{}}.
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast({delete_tables, Tids}, State) ->
%% delete ets tables,
%% we need to be defensive here.
%% it is better to leak a table than to crash them all
[begin
try ets:delete(Tid) of
true -> ok
catch
_:Err ->
?WARN("ra_log_ets: failed to delete ets table ~w with ~w "
"This table may need to be cleaned up manually~n",
[Tid, Err]),
ok
end
end || Tid <- Tids],
{noreply, State};
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok = ra_directory:deinit(),
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================