Skip to content

Commit c183452

Browse files
committed
Move view index files to .view_deleted when db is deleted
Bugzid 86318
1 parent c40b232 commit c183452

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

src/couch/src/couch_file.erl

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
-export([append_raw_chunk/2, assemble_file_chunk/1, assemble_file_chunk/2]).
4444
-export([append_term/2, append_term/3, append_term_md5/2, append_term_md5/3]).
4545
-export([write_header/2, read_header/1]).
46-
-export([delete/2, delete/3, nuke_dir/2, init_delete_dir/1]).
46+
-export([delete/2, delete/3, nuke_dir/2, nuke_dir/3, init_delete_dir/1]).
4747

4848
% gen_server callbacks
4949
-export([init/1, terminate/2, code_change/3]).
@@ -264,6 +264,16 @@ rename_file(Original) ->
264264
Else -> Else
265265
end.
266266

267+
rename_dir(RootDelDir, Original, DbName) ->
268+
DbDir = binary_to_list(DbName) ++ "_design",
269+
Deleted_Index_Dir = filename:join([RootDelDir, ".view_recovery", DbDir]),
270+
Now = calendar:local_time(),
271+
filelib:ensure_dir(Deleted_Index_Dir),
272+
case file:rename(Original, Deleted_Index_Dir) of
273+
ok -> file:change_time(Deleted_Index_Dir, Now);
274+
Else -> Else
275+
end.
276+
267277
deleted_filename(Original) ->
268278
{{Y, Mon, D}, {H, Min, S}} = calendar:universal_time(),
269279
Suffix = lists:flatten(
@@ -272,12 +282,20 @@ deleted_filename(Original) ->
272282
++ filename:extension(Original), [Y, Mon, D, H, Min, S])),
273283
filename:rootname(Original) ++ Suffix.
274284

275-
nuke_dir(RootDelDir, Dir) ->
285+
nuke_dir(RootDir, Dir) ->
286+
nuke_dir(RootDir, Dir, []).
287+
nuke_dir(RootDelDir, Dir, Options) ->
276288
EnableRecovery = config:get_boolean("couchdb",
277289
"enable_database_recovery", false),
278290
case EnableRecovery of
279291
true ->
280-
rename_file(Dir);
292+
Context = couch_util:get_value(context, Options, compaction),
293+
case Context =:= delete of
294+
true ->
295+
DbName = couch_util:get_value(db_name, Options),
296+
rename_dir(RootDelDir, Dir, DbName);
297+
false -> rename_file(Dir)
298+
end;
281299
false ->
282300
delete_dir(RootDelDir, Dir)
283301
end.

src/couch_index/src/couch_index_server.erl

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,13 @@ handle_call({async_error, {DbName, _DDocId, Sig}, Error}, _From, State) ->
154154
[gen_server:reply(From, Error) || From <- Waiters],
155155
ets:delete(?BY_SIG, {DbName, Sig}),
156156
{reply, ok, State};
157-
handle_call({reset_indexes, DbName}, _From, State) ->
158-
reset_indexes(DbName, State#st.root_dir),
157+
handle_call({reset_indexes, Options}, _From, State) ->
158+
reset_indexes(Options, State#st.root_dir),
159159
{reply, ok, State}.
160160

161161

162-
handle_cast({reset_indexes, DbName}, State) ->
163-
reset_indexes(DbName, State#st.root_dir),
162+
handle_cast({reset_indexes, Options}, State) ->
163+
reset_indexes(Options, State#st.root_dir),
164164
{noreply, State}.
165165

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

221221

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

235236

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

247248

248249
handle_db_event(DbName, created, St) ->
249-
gen_server:cast(?MODULE, {reset_indexes, DbName}),
250+
gen_server:cast(?MODULE, {reset_indexes, [{db_name, DbName}, {context, []}]}),
250251
{ok, St};
251252
handle_db_event(DbName, deleted, St) ->
252-
gen_server:cast(?MODULE, {reset_indexes, DbName}),
253+
gen_server:cast(?MODULE, {reset_indexes, [{db_name, DbName}, {context, delete}]}),
253254
{ok, St};
254255
handle_db_event(DbName, {ddoc_updated, DDocId}, St) ->
255256
lists:foreach(fun({_DbName, {_DDocId, Sig}}) ->

0 commit comments

Comments
 (0)