anchor.diff:      Db3 = ?l2b(couch_config:get("couch_httpd_auth", "authentication_db",
           "_users")),
       couch_db_update_notifier:start_link(fun
  -    ({updated, Db}) when Db == Db1; Db == Db2; Db == Db3 ->
  +    ({updated, Db}) when Db == Db1 ->
           Nodes = mem3:nodes(),
           Live = nodes(),
  -        [?MODULE:push(Db, N) || N <- Nodes, lists:member(N, Live)];
  +        [?MODULE:push(Db1, N) || N <- Nodes, lists:member(N, Live)];
  +    ({updated, Db}) when Db == Db2; Db == Db3 ->
  +        ?MODULE:push(Db, find_next_node());
       ({updated, <<"shards/", _/binary>> = ShardName}) ->
           % TODO deal with split/merged partitions by comparing keyranges
           try mem3:shards(mem3:dbname(ShardName)) of
  
positive.code:         gen_server:cast(?MODULE, {remove_shard, ShardName});
      (_) -> ok end).
  
  %% @doc Finds the next {DbName,Node} pair in the list of waiting replications
  %% which does not correspond to an already running replication
  -spec next_replication([#job{}], [#job{}], [#job{}]) -> {#job{}, [#job{}]} | nil.
  
negative.code:     Db1 = couch_config:get("mem3", "node_db", "nodes"),
      Db2 = couch_config:get("mem3", "shard_db", "dbs"),
      Db3 = couch_config:get("couch_httpd_auth", "authentication_db", "_users"),
      Node = find_next_node(),
      [push(?l2b(Db), Node) || Db <- [Db1, Db2, Db3]].
  
  initial_sync() ->
      [net_kernel:connect_node(Node) || Node <- mem3:nodes()],
  