Add `delete_after_rename` config parameter This config parameter allows to specify if the compaction files must to be deleted right after compaction finished or we want to pospond this until the database restart.
If latter, the files will be kept in ".delete" directory renamed to random uuids to avoid collision and cleaned up during a database start in `couch_file:init_delete_dir/1` call. Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch/commit/9e0cb357 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch/tree/9e0cb357 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch/diff/9e0cb357 Branch: refs/heads/master Commit: 9e0cb35709a4bab1efbcf507127dd36f47bb53d9 Parents: 5be6958 Author: Eric Avdey <[email protected]> Authored: Fri Apr 22 14:36:45 2016 -0300 Committer: Eric Avdey <[email protected]> Committed: Thu Apr 28 13:09:35 2016 -0300 ---------------------------------------------------------------------- src/couch_file.erl | 12 +++++++----- test/couch_file_tests.erl | 33 +++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/9e0cb357/src/couch_file.erl ---------------------------------------------------------------------- diff --git a/src/couch_file.erl b/src/couch_file.erl index 607fd6c..d2c28d4 100644 --- a/src/couch_file.erl +++ b/src/couch_file.erl @@ -228,21 +228,23 @@ delete(RootDir, FullFilePath, Async) -> true -> rename_file(FullFilePath); false -> - delete_file(RootDir, FullFilePath, Async) + DeleteAfterRename = config:get_boolean("couchdb", + "delete_after_rename", true), + delete_file(RootDir, FullFilePath, Async, DeleteAfterRename) end. -delete_file(RootDir, Filepath, Async) -> +delete_file(RootDir, Filepath, Async, DeleteAfterRename) -> DelFile = filename:join([RootDir,".delete", ?b2l(couch_uuids:random())]), case file:rename(Filepath, DelFile) of - ok -> + ok when DeleteAfterRename -> if (Async) -> spawn(file, delete, [DelFile]), ok; true -> file:delete(DelFile) end; - Error -> - Error + Else -> + Else end. rename_file(Original) -> http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/9e0cb357/test/couch_file_tests.erl ---------------------------------------------------------------------- diff --git a/test/couch_file_tests.erl b/test/couch_file_tests.erl index c7bdfca..8edbaac 100644 --- a/test/couch_file_tests.erl +++ b/test/couch_file_tests.erl @@ -296,20 +296,29 @@ delete_test_() -> [ fun(Cfg) -> {"enable_database_recovery = false", - make_delete_test_case(Cfg, false)} + make_enable_recovery_test_case(Cfg, false)} end, fun(Cfg) -> {"enable_database_recovery = true", - make_delete_test_case(Cfg, true)} + make_enable_recovery_test_case(Cfg, true)} + end, + fun(Cfg) -> + {"delete_after_rename = true", + make_delete_after_rename_test_case(Cfg, true)} + end, + fun(Cfg) -> + {"delete_after_rename = false", + make_delete_after_rename_test_case(Cfg, false)} end ] } }. -make_delete_test_case({RootDir, File}, EnableRecovery) -> +make_enable_recovery_test_case({RootDir, File}, EnableRecovery) -> meck:expect(config, get_boolean, fun - ("couchdb", "enable_database_recovery", _) -> EnableRecovery + ("couchdb", "enable_database_recovery", _) -> EnableRecovery; + ("couchdb", "delete_after_rename", _) -> true end), FileExistsBefore = filelib:is_regular(File), couch_file:delete(RootDir, File, false), @@ -321,3 +330,19 @@ make_delete_test_case({RootDir, File}, EnableRecovery) -> ?_assertNot(FileExistsAfter), ?_assertEqual(ExpectRenamedCount, length(RenamedFiles)) ]. + +make_delete_after_rename_test_case({RootDir, File}, DeleteAfterRename) -> + meck:expect(config, get_boolean, fun + ("couchdb", "enable_database_recovery", _) -> false; + ("couchdb", "delete_after_rename", _) -> DeleteAfterRename + end), + FileExistsBefore = filelib:is_regular(File), + couch_file:delete(RootDir, File, false), + FileExistsAfter = filelib:is_regular(File), + RenamedFiles = filelib:wildcard(filename:join([RootDir, ".delete", "*"])), + ExpectRenamedCount = if DeleteAfterRename -> 0; true -> 1 end, + [ + ?_assert(FileExistsBefore), + ?_assertNot(FileExistsAfter), + ?_assertEqual(ExpectRenamedCount, length(RenamedFiles)) + ].
