summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2010-05-13 11:20:41 +0100
committerMatthias Radestock <matthias@lshift.net>2010-05-13 11:20:41 +0100
commit31dbffcc0d96cbe345efb8876e7348befad7a665 (patch)
treebb33cbf5da485a3a745f84e3b1cd478ada8ba6ce
parent148d26a89abceff4ab9553fbd0f12c16b1bc0857 (diff)
downloadrabbitmq-server-git-31dbffcc0d96cbe345efb8876e7348befad7a665.tar.gz
tweak msg_store_index initialisation API
-rw-r--r--include/rabbit_msg_store_index.hrl4
-rw-r--r--src/rabbit_msg_store.erl17
-rw-r--r--src/rabbit_msg_store_ets_index.erl14
-rw-r--r--src/rabbit_msg_store_index.erl17
4 files changed, 27 insertions, 25 deletions
diff --git a/include/rabbit_msg_store_index.hrl b/include/rabbit_msg_store_index.hrl
index eb0ad5cb68..88a474aebc 100644
--- a/include/rabbit_msg_store_index.hrl
+++ b/include/rabbit_msg_store_index.hrl
@@ -41,8 +41,8 @@
-type(fieldpos() :: non_neg_integer()).
-type(fieldvalue() :: any()).
--spec(init/2 :: (('fresh'|'recover'), dir()) ->
- {'fresh'|'recovered', index_state()}).
+-spec(new/1 :: (dir()) -> index_state()).
+-spec(recover/1 :: (dir()) -> {'ok', index_state()} | {'error', any()}).
-spec(lookup/2 :: (guid(), index_state()) -> ('not_found' | keyvalue())).
-spec(insert/2 :: (keyvalue(), index_state()) -> 'ok').
-spec(update/2 :: (keyvalue(), index_state()) -> 'ok').
diff --git a/src/rabbit_msg_store.erl b/src/rabbit_msg_store.erl
index 701ca29df6..508bc60d4b 100644
--- a/src/rabbit_msg_store.erl
+++ b/src/rabbit_msg_store.erl
@@ -496,11 +496,11 @@ init([Server, BaseDir, ClientRefs, {MsgRefDeltaGen, MsgRefDeltaGenInit}]) ->
rabbit_log:info("Using ~p to provide index for message store~n",
[IndexModule]),
+ Fresh = fun () -> {false, IndexModule:new(Dir), sets:new()} end,
{AllCleanShutdown, IndexState, ClientRefs1} =
case detect_clean_shutdown(Dir) of
{false, _Error} ->
- {fresh, IndexState1} = IndexModule:init(fresh, Dir),
- {false, IndexState1, sets:new()};
+ Fresh();
{true, Terms} ->
RecClientRefs = proplists:get_value(client_refs, Terms, []),
RecIndexModule = proplists:get_value(index_module, Terms),
@@ -508,15 +508,14 @@ init([Server, BaseDir, ClientRefs, {MsgRefDeltaGen, MsgRefDeltaGenInit}]) ->
lists:sort(ClientRefs) == lists:sort(RecClientRefs)
andalso IndexModule == RecIndexModule) of
true ->
- case IndexModule:init(recover, Dir) of
- {fresh, IndexState1} ->
- {false, IndexState1, sets:new()};
- {recovered, IndexState1} ->
- {true, IndexState1, sets:from_list(ClientRefs)}
+ case IndexModule:recover(Dir) of
+ {ok, IndexState1} ->
+ {true, IndexState1, sets:from_list(ClientRefs)};
+ _Error ->
+ Fresh()
end;
false ->
- {fresh, IndexState1} = IndexModule:init(fresh, Dir),
- {false, IndexState1, sets:new()}
+ Fresh()
end
end,
diff --git a/src/rabbit_msg_store_ets_index.erl b/src/rabbit_msg_store_ets_index.erl
index b4fb5ef174..1eb3c11fb5 100644
--- a/src/rabbit_msg_store_ets_index.erl
+++ b/src/rabbit_msg_store_ets_index.erl
@@ -33,7 +33,8 @@
-behaviour(rabbit_msg_store_index).
--export([init/2, lookup/2, insert/2, update/2, update_fields/3, delete/2,
+-export([new/1, recover/1,
+ lookup/2, insert/2, update/2, update_fields/3, delete/2,
delete_by_file/2, terminate/1]).
-define(MSG_LOC_NAME, rabbit_msg_store_ets_index).
@@ -43,16 +44,17 @@
-record(state, { table, dir }).
-init(fresh, Dir) ->
+new(Dir) ->
file:delete(filename:join(Dir, ?FILENAME)),
Tid = ets:new(?MSG_LOC_NAME, [set, public, {keypos, #msg_location.guid}]),
- {fresh, #state { table = Tid, dir = Dir }};
-init(recover, Dir) ->
+ #state { table = Tid, dir = Dir }.
+
+recover(Dir) ->
Path = filename:join(Dir, ?FILENAME),
case ets:file2tab(Path) of
{ok, Tid} -> file:delete(Path),
- {recovered, #state { table = Tid, dir = Dir }};
- {error, _} -> init(fresh, Dir)
+ {ok, #state { table = Tid, dir = Dir }};
+ Error -> Error
end.
lookup(Key, State) ->
diff --git a/src/rabbit_msg_store_index.erl b/src/rabbit_msg_store_index.erl
index 2c9de3fda8..0ed64a9d81 100644
--- a/src/rabbit_msg_store_index.erl
+++ b/src/rabbit_msg_store_index.erl
@@ -34,13 +34,14 @@
-export([behaviour_info/1]).
behaviour_info(callbacks) ->
- [{init, 2},
- {lookup, 2},
- {insert, 2},
- {update, 2},
- {update_fields, 3},
- {delete, 2},
- {delete_by_file, 2},
- {terminate, 1}];
+ [{new, 1},
+ {recover, 1},
+ {lookup, 2},
+ {insert, 2},
+ {update, 2},
+ {update_fields, 3},
+ {delete, 2},
+ {delete_by_file, 2},
+ {terminate, 1}];
behaviour_info(_Other) ->
undefined.