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))
+    ].

Reply via email to