Add a background lock and task manager module to riak core.
* The goal is to allow riak sub-systems to coordinate use of shared resources,
* e.g. protect from concurrent vnode folds on the same partition.
* Locks and tokens have a settable maximum concurrency limit.
* "Taken" locks and tokens are tracked in an ETS table.
* max_concurrency is returned when the set limits are reached.
* Processes that take locks are monitored.
* Locks are released when the taking processes terminate.
* Tokens are refreshed at a specified periodic rate.
* Token processes are not monitored because tokens never "release".
* A table manager is introduced to add persistence across process crashes,
* and to allow proper table transfer to occur without losing the table.
* An EQC test exercises the majority of the API. see test/bg_manager_eqc.erl
* See the original PR for background manager here: https://github.com/basho/riak_core/pull/364
Concurrency API should return 'undefined' for limits when the ETS table is unavailable * Allows callers to try again later
Clean up query API
* Remove history API, use unregistered to signal unavailability of bg-mgr, fix set_token_rate bug.
* Prune the query API down to a consistent set of commands and adjust tests.
* Change query API to use named ETS table directly; is not threaded through the gen_server.
Re-implement handoff integration.
* rebase on latest background manager.
* Add an optional callback entry point to the kv vnode: handoff_started/2
* core_vnode will check for the optional function and call if present
* returning max_concurrency will cause the handoff to be aborted and retried.
Address remaining issues in PR
* Remove lock defs file; it was moved to riak_kv_vnode.hrl since all these locks are KV-specific
* The optional call to handoff_started/2 allows vnodes one last chance to abort the handoff process. the function is passed the source vnode's partition number and node name (this node) because the callback does not have access to the full vnode state at this time. In addition the worker pid is passed so the vnode may use that information in its decision to cancel the handoff or not (e.g. get a lock on behalf of the process)
* Move code that calls handooff_started/2 into separate function and put the call inside the try/catch.
Move commonly used configuration switch reader function into core.
Address final PR comments.