Hi devs, Dan Larkin brought up a problem on IRC today. Deleting a DB
during compaction orphans a .compact file, and subsequent requests for
that DB will try to recover the DB using the .compact.
There's a good reason for the recovery procedure (it prevents data
loss if the server crashes during a switch to the new .compact file),
but it seems to me that when we delete a database we ought to make
sure it's really deleted by explicitly removing the .compact file
too. Here's my proposed patch; Paul and figured it made sense to run
this by the list before committing. Best,
Adam
diff --git a/src/couchdb/couch_server.erl b/src/couchdb/couch_server.erl
index c190862..3bf5972 100644
--- a/src/couchdb/couch_server.erl
+++ b/src/couchdb/couch_server.erl
@@ -303,6 +303,11 @@ handle_call({delete, DbName, _Options}, _From,
Server) ->
true = ets:delete(couch_dbs_by_lru, LruTime),
Server#server{dbs_open=Server#server.dbs_open - 1}
end,
+
+ %% Delete any leftover .compact file. If we don't do this a
subsequent
+ %% request for this DB will try to open the .compact file and
use it.
+ file:delete(FullFilepath ++ ".compact"),
+
case file:delete(FullFilepath) of
ok ->
couch_db_update_notifier:notify({deleted, DbName}),