Skip to content

Commit

Permalink
Move view index files to .view_deleted when db is deleted
Browse files Browse the repository at this point in the history
Bugzid 86318
  • Loading branch information
jiangphcn committed Jun 19, 2017
1 parent c40b232 commit c183452
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 11 deletions.
24 changes: 21 additions & 3 deletions src/couch/src/couch_file.erl
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
-export([append_raw_chunk/2, assemble_file_chunk/1, assemble_file_chunk/2]).
-export([append_term/2, append_term/3, append_term_md5/2, append_term_md5/3]).
-export([write_header/2, read_header/1]).
-export([delete/2, delete/3, nuke_dir/2, init_delete_dir/1]).
-export([delete/2, delete/3, nuke_dir/2, nuke_dir/3, init_delete_dir/1]).

% gen_server callbacks
-export([init/1, terminate/2, code_change/3]).
Expand Down Expand Up @@ -264,6 +264,16 @@ rename_file(Original) ->
Else -> Else
end.

rename_dir(RootDelDir, Original, DbName) ->
DbDir = binary_to_list(DbName) ++ "_design",
Deleted_Index_Dir = filename:join([RootDelDir, ".view_recovery", DbDir]),
Now = calendar:local_time(),
filelib:ensure_dir(Deleted_Index_Dir),
case file:rename(Original, Deleted_Index_Dir) of
ok -> file:change_time(Deleted_Index_Dir, Now);
Else -> Else
end.

deleted_filename(Original) ->
{{Y, Mon, D}, {H, Min, S}} = calendar:universal_time(),
Suffix = lists:flatten(
Expand All @@ -272,12 +282,20 @@ deleted_filename(Original) ->
++ filename:extension(Original), [Y, Mon, D, H, Min, S])),
filename:rootname(Original) ++ Suffix.

nuke_dir(RootDelDir, Dir) ->
nuke_dir(RootDir, Dir) ->
nuke_dir(RootDir, Dir, []).
nuke_dir(RootDelDir, Dir, Options) ->
EnableRecovery = config:get_boolean("couchdb",
"enable_database_recovery", false),
case EnableRecovery of
true ->
rename_file(Dir);
Context = couch_util:get_value(context, Options, compaction),
case Context =:= delete of
true ->
DbName = couch_util:get_value(db_name, Options),
rename_dir(RootDelDir, Dir, DbName);
false -> rename_file(Dir)
end;
false ->
delete_dir(RootDelDir, Dir)
end.
Expand Down
17 changes: 9 additions & 8 deletions src/couch_index/src/couch_index_server.erl
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,13 @@ handle_call({async_error, {DbName, _DDocId, Sig}, Error}, _From, State) ->
[gen_server:reply(From, Error) || From <- Waiters],
ets:delete(?BY_SIG, {DbName, Sig}),
{reply, ok, State};
handle_call({reset_indexes, DbName}, _From, State) ->
reset_indexes(DbName, State#st.root_dir),
handle_call({reset_indexes, Options}, _From, State) ->
reset_indexes(Options, State#st.root_dir),
{reply, ok, State}.


handle_cast({reset_indexes, DbName}, State) ->
reset_indexes(DbName, State#st.root_dir),
handle_cast({reset_indexes, Options}, State) ->
reset_indexes(Options, State#st.root_dir),
{noreply, State}.

handle_info({'EXIT', Pid, Reason}, Server) ->
Expand Down Expand Up @@ -219,7 +219,8 @@ new_index({Mod, IdxState, DbName, Sig}) ->
end.


reset_indexes(DbName, Root) ->
reset_indexes(Options, Root) ->
DbName = couch_util:get_value(db_name, Options),
% shutdown all the updaters and clear the files, the db got changed
Fun = fun({_, {DDocId, Sig}}) ->
[{_, Pid}] = ets:lookup(?BY_SIG, {DbName, Sig}),
Expand All @@ -230,7 +231,7 @@ reset_indexes(DbName, Root) ->
end,
lists:foreach(Fun, ets:lookup(?BY_DB, DbName)),
Path = couch_index_util:index_dir("", DbName),
couch_file:nuke_dir(Root, Path).
couch_file:nuke_dir(Root, Path, Options).


add_to_ets(DbName, Sig, DDocId, Pid) ->
Expand All @@ -246,10 +247,10 @@ rem_from_ets(DbName, Sig, DDocId, Pid) ->


handle_db_event(DbName, created, St) ->
gen_server:cast(?MODULE, {reset_indexes, DbName}),
gen_server:cast(?MODULE, {reset_indexes, [{db_name, DbName}, {context, []}]}),
{ok, St};
handle_db_event(DbName, deleted, St) ->
gen_server:cast(?MODULE, {reset_indexes, DbName}),
gen_server:cast(?MODULE, {reset_indexes, [{db_name, DbName}, {context, delete}]}),
{ok, St};
handle_db_event(DbName, {ddoc_updated, DDocId}, St) ->
lists:foreach(fun({_DbName, {_DDocId, Sig}}) ->
Expand Down

0 comments on commit c183452

Please sign in to comment.