Here's some preliminary food for thought:

-*- mode: grep; default-directory: "~/src/altoros/moxi/repo180/ns_server/" -*-
Grep started at Thu Jul 12 10:01:13

(cd ~/src/altoros/moxi/repo180/ns_server/ ; git ls-files --exclude-standard -c -o -z | xargs -0 grep -i -nH -e ns_vbm_sup)
doc/ns-server-hierarchy.txt:132:                                                        (supervisor '(ns_vbm_sup "default") :name 'ns_vbm_sup-default
src/ns_janitor.erl:105:                    ns_vbm_sup:set_replicas(Bucket, NodesReplicas),
src/ns_janitor.erl:214:                      ns_vbm_sup:kill_children(N, Bucket, [VBucket]);
src/ns_janitor.erl:227:                      ns_vbm_sup:kill_children(M, Bucket, [VBucket])
src/ns_janitor_vis.erl:63:    Replicators = lists:sort(ns_vbm_sup:replicators(Nodes, Bucket)),
src/ns_rebalancer.erl:349:        lists:sort(ns_vbm_sup:replicators(Nodes, Bucket)),
src/ns_rebalancer.erl:419:                    try ns_vbm_sup:replicators([node()],
src/ns_single_vbucket_mover.erl:115:            {ok, Pid} = ns_vbm_sup:spawn_mover(Bucket, V, N1, N2),
src/ns_single_vbucket_mover.erl:134:            {ok, Pid} = ns_vbm_sup:spawn_mover(Bucket, V, N1, N2),
src/ns_single_vbucket_mover.erl:145:            {ok, Pid} = ns_vbm_sup:spawn_mover(Bucket, V, N1, N2),
src/ns_vbm_sup.erl:16:-module(ns_vbm_sup).
src/ns_vbm_sup.erl:364:    HaveChangeFilterKey = rpc:async_call(SrcNode, ns_vbm_sup, have_local_change_vbucket_filter, []),
src/ns_vbm_sup.erl:365:    ChangeFilterRV = rpc:call(SrcNode, ns_vbm_sup, local_change_vbucket_filter,
src/ns_vbucket_mover.erl:346:            ActualCount = ns_vbm_sup:apply_changes(BucketName, lists:reverse(Changes)),
src/single_bucket_sup.erl:41:     {{ns_vbm_sup, BucketName}, {ns_vbm_sup, start_link, [BucketName]},
src/single_bucket_sup.erl:42:      permanent, 1000, worker, [ns_vbm_sup]},

Grep finished (matches found) at Thu Jul 12 10:01:13

----------------------------------------------------------------

So you can see ns_vbm_sup calls are made by:

* janitor (master node),

* ns_rebalancer (master node),

* ns_single_vbucket_mover (just for building takeover migrator args and actually spawning it remotely)

* ns_vbucket_mover (master node)

And here's what stuff get's called remotely

* ns_vbm_sup on master node is interfacing with supervisor directly

* _and_ there's rpc call to ns_vbm_sup:local_change_vbucket_filter.
  _But_ 1.8.0 doesn't have it and we're already prepared to deal with
  that. Note however that 1.8.1's ebucketmigrators kill named tap
  unless they are not spawned through tricky vbucket filter change
  protocol, so we can't just not use local_change_vbucket_filter in
  1.8.1

On related note:

* ns_rebalancer:bucket_replication_statuses/0 is rpc:multicall-ed by 1.8.x nodes
