Implement clustered compaction functions

COUCHDB-3099
diff --git a/src/fabric.erl b/src/fabric.erl
index fe663be..f2a1ad0 100644
--- a/src/fabric.erl
+++ b/src/fabric.erl
@@ -20,7 +20,8 @@
 -export([all_dbs/0, all_dbs/1, create_db/1, create_db/2, delete_db/1,
     delete_db/2, get_db_info/1, get_doc_count/1, set_revs_limit/3,
     set_security/2, set_security/3, get_revs_limit/1, get_security/1,
-    get_security/2, get_all_security/1, get_all_security/2]).
+    get_security/2, get_all_security/1, get_all_security/2,
+    compact/1, compact/2]).
 
 % Documents
 -export([open_doc/3, open_revs/4, get_doc_info/3, get_full_doc_info/3,
@@ -161,6 +162,16 @@
 get_all_security(DbName, Options) ->
     fabric_db_meta:get_all_security(dbname(DbName), opts(Options)).
 
+compact(DbName) ->
+    [rexi:cast(Node, {fabric_rpc, compact, [Name]}) ||
+        #shard{node=Node, name=Name} <- mem3:shards(dbname(DbName))],
+    ok.
+
+compact(DbName, DesignName) ->
+    [rexi:cast(Node, {fabric_rpc, compact, [Name, DesignName]}) ||
+        #shard{node=Node, name=Name} <- mem3:shards(dbname(DbName))],
+    ok.
+
 % doc operations
 
 %% @doc retrieve the doc with a given id
diff --git a/src/fabric_rpc.erl b/src/fabric_rpc.erl
index cc242b9..b7f4fec 100644
--- a/src/fabric_rpc.erl
+++ b/src/fabric_rpc.erl
@@ -19,6 +19,7 @@
 -export([create_db/1, delete_db/1, reset_validation_funs/1, set_security/3,
     set_revs_limit/3, create_shard_db_doc/2, delete_shard_db_doc/2]).
 -export([get_all_security/2, open_shard/2]).
+-export([compact/1, compact/2]).
 
 -export([get_db_info/2, get_doc_count/2, get_update_seq/2,
          changes/4, map_view/5, reduce_view/5, group_info/3]).
@@ -246,6 +247,15 @@
     set_io_priority(Name, Opts),
     rexi:reply(couch_db:open(Name, Opts)).
 
+compact(DbName) ->
+    with_db(DbName, [], {couch_db, start_compact, []}).
+
+compact(ShardName, DesignName) ->
+    {ok, Pid} = couch_index_server:get_index(
+        couch_mrview_index, ShardName, <<"_design/", DesignName/binary>>),
+    Ref = erlang:make_ref(),
+    Pid ! {'$gen_call', {self(), Ref}, compact}.
+
 %%
 %% internal
 %%