From da612b5858003be9650f1907755ea42df663a9d8 Mon Sep 17 00:00:00 2001 From: Albert Schimpf <38429047+albsch@users.noreply.github.com> Date: Tue, 13 Jul 2021 19:23:27 +0000 Subject: [PATCH] V0.10.1 (#96) * riak_core_vnode_worker_pool to gen_statem (#19) * Added E22 to pipeline * Fixed Readme and descriptions to fit riak_core_lite * Included outside dependencies again * Fixed deprecation warnings in those dependencies * Added xref to pipeline * Added badge that tracks hex.pm version * Added coverage support * Removed unused test dependencies (goldrush, mustache). Added missing meck dependency to tests * Made edoc work again. Replaced macros with direct calls. Added edoc to pipeline * Replaced mochiglobal with persistent_term (#43) * Added lint command and lint to pipeline (#35) * #35 (#45) * fix riak_core_status:ringready/0 (#52) Added test case. * Formatter (#53) * Added default rebar3_format * Changed to otp_formatter, fixed one issue in code by refactoring * Adjusted pipeline * Unused modules (#58) * Bloom filter removed * Removed stats util modules * Removed one eqc files. * property based testing (#61) * update travis * adjust number of test executions * update coverage + bug fixing in riak_core_claim * 20 replaced riak_core_gen_server with gen_server (#63) * Erlang 23 Pipeline (#64) * Format with E23, increased line length by 20 * Added E23 to pipeline * PR #959 upstream (#65) * Added unit test case which enforces the deadlock prior the fix * V0.10.1 release * #70 * Moved proper to project_plugins (#72) * Finish removing bucket properties and buckets (#75) Co-authored-by: Andreas Schultz Co-authored-by: woelki Co-authored-by: Peter Zeller --- .gitignore | 1 + Makefile | 41 +- README.md | 57 +- elvis.config | 51 + eqc/bucket_eqc_utils.erl | 47 - eqc/mock_vnode.erl | 196 -- include/riak_core_bucket_type.hrl | 3 - include/riak_core_vnode.hrl | 8 +- rebar.config | 55 +- rebar.config.script | 6 + rebar.lock | 10 +- rebar3 | Bin 985460 -> 839684 bytes src/chash.erl | 308 +++ src/chashbin.erl | 255 ++ src/gen_fsm_compat.erl | 795 ++++++ src/gen_nb_server.erl | 277 +- src/riak_core.app.src | 48 +- src/riak_core.erl | 436 ++-- src/riak_core_apl.erl | 605 +++-- src/riak_core_app.erl | 46 +- src/riak_core_base64url.erl | 95 - src/riak_core_bucket.erl | 202 -- src/riak_core_bucket_props.erl | 277 -- src/riak_core_claim.erl | 1024 +++----- src/riak_core_claim_util.erl | 589 ++--- src/riak_core_claimant.erl | 1210 ++++----- src/riak_core_eventhandler_guard.erl | 41 +- src/riak_core_eventhandler_sup.erl | 59 +- src/riak_core_gen_server.erl | 1052 -------- src/riak_core_gossip.erl | 246 +- src/riak_core_handoff_listener.erl | 58 +- src/riak_core_handoff_listener_sup.erl | 21 +- src/riak_core_handoff_manager.erl | 1039 ++++---- src/riak_core_handoff_receiver.erl | 214 +- src/riak_core_handoff_receiver_sup.erl | 20 +- src/riak_core_handoff_sender.erl | 778 +++--- src/riak_core_handoff_sender_sup.erl | 27 +- src/riak_core_handoff_sup.erl | 27 +- src/riak_core_mochiglobal.erl | 107 - src/riak_core_node_watcher.erl | 791 +++--- src/riak_core_node_watcher_events.erl | 46 +- src/riak_core_priority_queue.erl | 304 +-- src/riak_core_rand.erl | 65 - src/riak_core_ring.erl | 2277 +++++++++-------- src/riak_core_ring_events.erl | 49 +- src/riak_core_ring_handler.erl | 225 +- src/riak_core_ring_manager.erl | 794 +++--- src/riak_core_ring_util.erl | 249 +- src/riak_core_send_msg.erl | 28 +- src/riak_core_status.erl | 194 +- src/riak_core_sup.erl | 37 +- src/riak_core_test_util.erl | 90 +- src/riak_core_util.erl | 1154 ++++----- src/riak_core_vnode.erl | 2178 ++++++++++------ src/riak_core_vnode_manager.erl | 1104 ++++---- src/riak_core_vnode_master.erl | 258 +- src/riak_core_vnode_proxy.erl | 566 ++-- src/riak_core_vnode_proxy_sup.erl | 14 +- src/riak_core_vnode_sup.erl | 18 +- src/riak_core_vnode_worker.erl | 66 +- src/riak_core_vnode_worker_pool.erl | 474 ++-- src/vclock.erl | 363 +-- test/eqc/13node_12node_ring.eqc | Bin 6804 -> 0 bytes test/eqc/169_group_join.eqc | Bin 40 -> 0 bytes test/eqc/648_unbalanced_singly.eqc | Bin 38 -> 0 bytes test/eqc/bprops_eqc.erl | 289 --- test/eqc/bucket_eqc_utils.erl | 49 - ...claim-statem-leaving-nodes-still-claim.eqc | Bin 6370 -> 0 bytes test/eqc/claim_32_5_unbalanced.eqc | Bin 38 -> 0 bytes test/eqc/riak_core_claim_statem.erl | 265 -- {eqc => test/pqc}/chash_eqc.erl | 20 +- {eqc => test/pqc}/core_vnode_eqc.erl | 123 +- .../pqc}/new_cluster_membership_model_eqc.erl | 40 +- test/{eqc => pqc}/node_watcher_qc.erl | 20 +- test/pqc/riak_core_claim_qc.erl | 323 +++ test/pqc/riak_core_claim_statem.erl | 270 ++ test/pqc/riak_core_claim_util_qc.erl | 50 + {eqc => test/pqc}/riak_core_ring_eqc.erl | 8 +- test/pqc/riak_core_ring_util_qc.erl | 141 + test/{eqc => pqc}/vclock_qc.erl | 26 +- test/{eqc => pqc}/worker_pool_pulse.erl | 0 test/riak_core_base64url_tests.erl | 42 - test/sync_command_test.erl | 3 +- test/worker_pool_test.erl | 151 +- tools.mk | 16 - 85 files changed, 11718 insertions(+), 11793 deletions(-) create mode 100644 elvis.config delete mode 100644 eqc/bucket_eqc_utils.erl delete mode 100644 eqc/mock_vnode.erl delete mode 100644 include/riak_core_bucket_type.hrl create mode 100644 rebar.config.script create mode 100644 src/chash.erl create mode 100644 src/chashbin.erl create mode 100644 src/gen_fsm_compat.erl delete mode 100644 src/riak_core_base64url.erl delete mode 100644 src/riak_core_bucket.erl delete mode 100644 src/riak_core_bucket_props.erl delete mode 100644 src/riak_core_gen_server.erl delete mode 100644 src/riak_core_mochiglobal.erl delete mode 100644 src/riak_core_rand.erl delete mode 100644 test/eqc/13node_12node_ring.eqc delete mode 100644 test/eqc/169_group_join.eqc delete mode 100644 test/eqc/648_unbalanced_singly.eqc delete mode 100644 test/eqc/bprops_eqc.erl delete mode 100644 test/eqc/bucket_eqc_utils.erl delete mode 100644 test/eqc/claim-statem-leaving-nodes-still-claim.eqc delete mode 100644 test/eqc/claim_32_5_unbalanced.eqc delete mode 100644 test/eqc/riak_core_claim_statem.erl rename {eqc => test/pqc}/chash_eqc.erl (90%) rename {eqc => test/pqc}/core_vnode_eqc.erl (83%) rename {eqc => test/pqc}/new_cluster_membership_model_eqc.erl (98%) rename test/{eqc => pqc}/node_watcher_qc.erl (98%) create mode 100644 test/pqc/riak_core_claim_qc.erl create mode 100644 test/pqc/riak_core_claim_statem.erl create mode 100644 test/pqc/riak_core_claim_util_qc.erl rename {eqc => test/pqc}/riak_core_ring_eqc.erl (95%) create mode 100644 test/pqc/riak_core_ring_util_qc.erl rename test/{eqc => pqc}/vclock_qc.erl (90%) rename test/{eqc => pqc}/worker_pool_pulse.erl (100%) delete mode 100644 test/riak_core_base64url_tests.erl delete mode 100644 tools.mk diff --git a/.gitignore b/.gitignore index 8d0dc9b95..d1039b5c4 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ rebar3.crashdump core_vnode_eqc.log .idea *.iml +**/*.coverdata diff --git a/Makefile b/Makefile index 90f2fb34c..3d9f05491 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,16 @@ PULSE_TESTS = worker_pool_pulse +COVERPATH = ./_build/test/cover +REBAR ?= ./rebar3 -.PHONY: deps test +.PHONY: deps test docs xref dialyzer format all: compile compile: deps - ./rebar3 compile + ${REBAR} compile clean: clean-test - ./rebar3 clean - + ${REBAR} clean distclean: clean @@ -28,7 +29,33 @@ clean-test: # You should 'clean' before your first run of this target # so that deps get built with PULSE where needed. pulse: - ./rebar3 compile -D PULSE - ./rebar3 eunit -D PULSE skip_deps=true suite=$(PULSE_TESTS) + ${REBAR} compile -D PULSE + ${REBAR} eunit -D PULSE skip_deps=true suite=$(PULSE_TESTS) + +proper: + ${REBAR} as proper do eunit + +epc: + ${REBAR} as epc eunit + +format: + ${REBAR} format + +test: compile + ${REBAR} eunit + +coverage: compile + cp _build/proper+test/cover/eunit.coverdata ${COVERPATH}/proper.coverdata ;\ + ${REBAR} cover --verbose + +docs: + ${REBAR} edoc + +xref: compile + ${REBAR} xref + +dialyzer: + ${REBAR} dialyzer -include tools.mk +lint: + ${REBAR} lint diff --git a/README.md b/README.md index 2b8ed89b8..dabdab390 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,32 @@ -# What is riak_core_antidote? +# What is riak_core_lite? -The 'antidote' version of riak core is a minimal and up-to-date version of riak core. +Riak Core Lite is a framework that simplifies the development of dynamo-style architectures, such as highly-available key-value stores and messaging systems. -# Riak Core +Build upon the essence of Riak KV's core with an up-to-date, modular and extensible foundation for elastic distributed services. + +# riak_core_lite ![Language](https://img.shields.io/badge/language-erlang-blue.svg) -![Release](https://img.shields.io/badge/release-R21-9cf.svg) -![Build](https://img.shields.io/badge/build-rebar3%203.9.0-brightgreen.svg) +![Release](https://img.shields.io/badge/release-R21+-9cf.svg) +![Release](https://img.shields.io/badge/formatter-erlang_otp-33d.svg) +![Build](https://img.shields.io/badge/build-rebar3%203.13.0-brightgreen.svg) -[![Build Status](https://travis-ci.com/albsch/riak_core.svg?branch=master)](https://travis-ci.com/albsch/riak_core.svg?branch=master) +[![Hex pm](https://img.shields.io/hexpm/v/riak_core_lite.svg)](https://hex.pm/packages/riak_core_lite) +[![Build Status](https://api.travis-ci.org/riak-core-lite/riak_core_lite.svg?branch=master)](https://api.travis-ci.org/riak-core-lite/riak_core_lite.svg?branch=master) +[![Coverage Status](https://coveralls.io/repos/github/riak-core-lite/riak_core_lite/badge.svg?branch=master)](https://coveralls.io/github/riak-core-lite/riak_core_lite?branch=master) -Riak Core is the distributed systems framework that forms the basis of -how [Riak](http://github.com/basho/riak) distributes data and scales. -More generally, it can be thought of as a toolkit for building -distributed, scalable, fault-tolerant applications. +To get started with riak_core_lite you can follow Mariano Guerra's tutorials. +They are based on the full riak_core, but are still applicable to riak_core_lite. -For some introductory reading on Riak Core (that’s not pure code), -there’s an old but still valuable -[blog post on the Basho Blog](http://basho.com/where-to-start-with-riak-core/) -that’s well worth your time. +1. [Setup](http://marianoguerra.org/posts/riak-core-tutorial-part-1-setup.html) +2. [Starting](http://marianoguerra.org/posts/riak-core-tutorial-part-2-starting.html) +3. [Ping Command](http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command.html) +4. [First Commands](http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands.html) +5. [Quorum Requests](http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests.html) +6. [Handoff](http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff.html) +7. [HTTP API](http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api.html) +9. [Persistent KV with leveled backend](http://marianoguerra.org/posts/riak-core-tutorial-part-9-persistent-kv-with-leveled-backend.html) ## Contributing @@ -35,7 +42,7 @@ other code. To get started: message, spanning multiple lines if detailed explanation is needed. 5. Push to your fork of the repository and then send a pull request. -6. A Riak committer will review your patch and merge it into the main +6. A committer will review your patch and merge it into the main repository or send you feedback. ## Issues, Questions, and Bugs @@ -43,14 +50,14 @@ other code. To get started: There are numerous ways to file issues or start conversations around something Core related -* The - [Riak Users List](http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com) - is the main place for all discussion around Riak. -* There is a - [Riak Core-specific mailing list](http://lists.basho.com/mailman/listinfo/riak-core_lists.basho.com) - for issues and questions that pertain to Core but not Riak. -* #riak on Freenode is a very active channel and can get you some - real-time help if a lot of instances. -* If you've found a bug in Riak Core, - [file](https://github.com/basho/riak_core/issues) a clear, concise, +* If you've found a bug in riak_core_lite, + [file](https://github.com/riak-core-lite/riak_core_lite/issues) a clear, concise, explanatory issue against this repo. + +## Reference Implementation + +For some reference on how `riak_core_lite` can be used, you can read about projects which are using `riak_core_lite` as a library: + +- [rcl_memkv](https://github.com/albsch/rcl_memkv): A minimalistic in-memory key-value store to understand how to implement the handoff behavior properly +- [rclref](https://github.com/wattlebirdaz/rclref): A reference implementation of a distributed key-value store using riak_core_lite featuring quorum reads and writes. +- [AntidoteDB](https://github.com/AntidoteDB/antidote): A a highly available geo-replicated key-value database which uses riak_core_lite for sharding of data centers. diff --git a/elvis.config b/elvis.config new file mode 100644 index 000000000..7aae67e46 --- /dev/null +++ b/elvis.config @@ -0,0 +1,51 @@ +%linting and style rules +[{elvis, + [{config, + [#{dirs => ["apps/*/src", "src"], + filter => "*.erl", + rules => [{elvis_style, line_length, + #{ignore => [], + limit => 120, + skip_comments => false}}, + %{elvis_style, no_tabs}, + {elvis_style, no_trailing_whitespace}, + {elvis_style, macro_names, #{ignore => []}}, + {elvis_style, macro_module_names}, + {elvis_style, operator_spaces, #{rules => [{right, ","}, + {right, "++"}, + {left, "++"}, + {right, "--"}, + {left, "--"}]}}, + %{elvis_style, god_modules, + %#{limit => 40, + % ignore => []}}, + {elvis_style, used_ignored_variable}, + {elvis_style, no_behavior_info}, + { + elvis_style, + module_naming_convention, + #{regex => "^[a-z]([a-z0-9]*_?)*(_SUITE)?$", + ignore => []} + }, + { + elvis_style, + function_naming_convention, + #{regex => "^[a-z]([a-z0-9]*_?)*$"} %base: ^([a-z][a-z0-9]*_?)*$ + }, + {elvis_style, state_record_and_type}, + {elvis_style, no_spec_with_records} + ] + }, + #{dirs => ["."], + filter => "Makefile", + rules => [{elvis_project, no_deps_master_erlang_mk, #{ignore => []}}, + {elvis_project, protocol_for_deps_erlang_mk, #{ignore => []}}] + }, + #{dirs => ["."], + filter => "rebar.config", + rules => [{elvis_project, no_deps_master_rebar, #{ignore => []}}, + {elvis_project, protocol_for_deps_rebar, #{ignore => []}}] + } + ] + }] +}]. diff --git a/eqc/bucket_eqc_utils.erl b/eqc/bucket_eqc_utils.erl deleted file mode 100644 index d5959fe60..000000000 --- a/eqc/bucket_eqc_utils.erl +++ /dev/null @@ -1,47 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2007-2016 Basho Technologies, Inc. -%% -%% This file is provided to you under the Apache License, -%% Version 2.0 (the "License"); you may not use this file -%% except in compliance with the License. You may obtain -%% a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, -%% software distributed under the License is distributed on an -%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -%% KIND, either express or implied. See the License for the -%% specific language governing permissions and limitations -%% under the License. -%% -%% ------------------------------------------------------------------- - --module(bucket_eqc_utils). - -%% API --export([per_test_setup/2]). - - -per_test_setup(DefaultBucketProps, TestFun) -> - try - riak_core_test_util:stop_pid(whereis(riak_core_ring_events)), - riak_core_test_util:stop_pid(whereis(riak_core_ring_manager)), - application:set_env(riak_core, claimant_tick, 4294967295), - application:set_env(riak_core, cluster_name, "eqc_test"), - application:set_env(riak_core, default_bucket_props, DefaultBucketProps), - {ok, RingEvents} = riak_core_ring_events:start_link(), - {ok, RingMgr} = riak_core_ring_manager:start_link(test), - {ok, Claimant} = riak_core_claimant:start_link(), - - Results = TestFun(), - - riak_core_test_util:stop_pid(Claimant), - unlink(RingMgr), - riak_core_ring_manager:stop(), - riak_core_test_util:stop_pid(RingEvents), - Results - after - meck:unload() - end. diff --git a/eqc/mock_vnode.erl b/eqc/mock_vnode.erl deleted file mode 100644 index 44dbe6a87..000000000 --- a/eqc/mock_vnode.erl +++ /dev/null @@ -1,196 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% mock_vnode: mock vnode for unit testing -%% -%% Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved. -%% -%% This file is provided to you under the Apache License, -%% Version 2.0 (the "License"); you may not use this file -%% except in compliance with the License. You may obtain -%% a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, -%% software distributed under the License is distributed on an -%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -%% KIND, either express or implied. See the License for the -%% specific language governing permissions and limitations -%% under the License. -%% -%% ------------------------------------------------------------------- - -%% @doc mock vnode for unit testing - --module(mock_vnode). -%TODO: Work out why this gives a warning -%-behavior(riak_core_vnode). --export([start_vnode/1, - get_index/1, - get_counter/1, - neverreply/1, - returnreply/1, - latereply/1, - asyncnoreply/2, - asyncreply/2, - asynccrash/2, - crash/1, - spawn_error/2, - sync_error/2, - get_crash_reason/1, - stop/1]). --export([init/1, - handle_command/3, - terminate/2, - handle_exit/3]). --export([init_worker/3, - handle_work/3]). --behavior(riak_core_vnode_worker). - --record(state, {index, counter, crash_reason}). --record(wstate, {index, args, props, counter, crash_reason}). - --define(MASTER, mock_vnode_master). - -%% API -start_vnode(I) -> - riak_core_vnode_master:start_vnode(I, ?MODULE). - -get_index(Preflist) -> - riak_core_vnode_master:sync_command(Preflist, get_index, ?MASTER). - -get_counter(Preflist) -> - riak_core_vnode_master:sync_command(Preflist, get_counter, ?MASTER). - -neverreply(Preflist) -> - riak_core_vnode_master:command(Preflist, neverreply, ?MASTER). - -returnreply(Preflist) -> - Ref = {neverreply, make_ref()}, - riak_core_vnode_master:command(Preflist, returnreply, {raw, Ref, self()}, ?MASTER), - {ok, Ref}. - -latereply(Preflist) -> - Ref = {latereply, make_ref()}, - riak_core_vnode_master:command(Preflist, latereply, {raw, Ref, self()}, ?MASTER), - {ok, Ref}. - -asyncnoreply(Preflist, AsyncDonePid) -> - Ref = {asyncnoreply, make_ref()}, - riak_core_vnode_master:command(Preflist, {asyncnoreply, AsyncDonePid}, - {raw, Ref, AsyncDonePid}, ?MASTER), - {ok, Ref}. - -asyncreply(Preflist, AsyncDonePid) -> - Ref = {asyncreply, make_ref()}, - riak_core_vnode_master:command(Preflist, {asyncreply, AsyncDonePid}, - {raw, Ref, AsyncDonePid}, ?MASTER), - {ok, Ref}. - -asynccrash(Preflist, AsyncDonePid) -> - Ref = {asynccrash, make_ref()}, - riak_core_vnode_master:command(Preflist, {asynccrash, AsyncDonePid}, - {raw, Ref, AsyncDonePid}, ?MASTER), - {ok, Ref}. - -crash(Preflist) -> - riak_core_vnode_master:sync_command(Preflist, crash, ?MASTER). - -spawn_error(Preflist, Cmd) -> - riak_core_vnode_master:sync_spawn_command(Preflist, {sync_error, Cmd}, ?MASTER). - -sync_error(Preflist, Cmd) -> - riak_core_vnode_master:sync_command(Preflist, {sync_error, Cmd}, ?MASTER). - -get_crash_reason(Preflist) -> - riak_core_vnode_master:sync_command(Preflist, get_crash_reason, ?MASTER). - -stop(Preflist) -> - riak_core_vnode_master:sync_command(Preflist, stop, ?MASTER). - - -%% Callbacks - -init([Index]) -> - S = #state{index=Index,counter=0}, - {ok, PoolSize} = application:get_env(riak_core, core_vnode_eqc_pool_size), - case PoolSize of - PoolSize when PoolSize > 0 -> - {ok, S, [{pool, ?MODULE, PoolSize, myargs}]}; - _ -> - {ok, S} - end. - -handle_command(get_index, _Sender, State) -> - {reply, {ok, State#state.index}, State}; -handle_command(get_counter, _Sender, State) -> - {reply, {ok, State#state.counter}, State}; -handle_command(get_crash_reason, _Sender, State) -> - {reply, {ok, State#state.crash_reason}, State}; -handle_command({sync_error, error}, _Sender, State) -> - erlang:error(core_breach), - {reply, ok, State}; -handle_command({sync_error, exit}, _Sender, State) -> - erlang:exit(core_breach), - {reply, ok, State}; -handle_command({sync_error, badthrow}, _Sender, State) -> - erlang:throw({reply, {error, terrible}, State}); %% emulate gen_server -handle_command({sync_error, goodthrow}, _Sender, State) -> - erlang:throw({reply, ok, State}); %% emulate gen_server - -handle_command(crash, _Sender, State) -> - spawn_link(fun() -> exit(State#state.index) end), - {reply, ok, State}; -handle_command(stop, Sender, State = #state{counter=Counter}) -> - %% Send reply here as vnode_master:sync_command does a call - %% which is cast on to the vnode process. Returning {stop,...} - %% does not provide for returning a response. - riak_core_vnode:reply(Sender, stopped), - {stop, normal, State#state{counter = Counter + 1}}; -handle_command(neverreply, _Sender, State = #state{counter=Counter}) -> - {noreply, State#state{counter = Counter + 1}}; -handle_command(returnreply, _Sender, State = #state{counter=Counter}) -> - {reply, returnreply, State#state{counter = Counter + 1}}; -handle_command(latereply, Sender, State = #state{counter=Counter}) -> - spawn(fun() -> - timer:sleep(100), - riak_core_vnode:reply(Sender, latereply) - end), - {noreply, State#state{counter = Counter + 1}}; -handle_command({asyncnoreply, DonePid}, Sender, State = #state{counter=Counter}) -> - {async, {noreply, DonePid}, Sender, State#state{counter = Counter + 1}}; -handle_command({asyncreply, DonePid}, Sender, State = #state{counter=Counter}) -> - {async, {reply, DonePid}, Sender, State#state{counter = Counter + 1}}; -handle_command({asynccrash, DonePid}, Sender, State = #state{counter=Counter}) -> - {async, {crash, DonePid}, Sender, State#state{counter = Counter + 1}}. - -handle_exit(_Pid, Reason, State) -> - {noreply, State#state{crash_reason=Reason}}. - -terminate(_Reason, _State) -> - ok. - - - -%% -%% Vnode worker callbacks -%% -init_worker(Index, Args, Props) -> - {ok, #wstate{index=Index, args=Args, props=Props}}. - -handle_work({noreply, DonePid}, {raw, Ref, _EqcPid} = _Sender, State = #wstate{index=I}) -> - timer:sleep(100), % slow things down enough to cause issue on stops - DonePid ! {I, {ok, Ref}}, - {noreply, State}; -handle_work({reply, DonePid}, {raw, Ref, _EqcPid} = _Sender, State = #wstate{index=I}) -> - timer:sleep(100), % slow things down enough to cause issue on stops - DonePid ! {I, {ok, Ref}}, - {reply, asyncreply, State}; -handle_work({crash, DonePid}, - {raw, Ref, _EqcPid} = _Sender, _State = #wstate{index=I}) -> - timer:sleep(100), % slow things down enough to cause issue on stops - %% This msg needs to get sent, since it's counted in core_vnode_eqc work tracking - %% in next_state_data/5 - DonePid ! {I, {ok, Ref}}, - throw(deliberate_async_crash). - diff --git a/include/riak_core_bucket_type.hrl b/include/riak_core_bucket_type.hrl deleted file mode 100644 index 298966604..000000000 --- a/include/riak_core_bucket_type.hrl +++ /dev/null @@ -1,3 +0,0 @@ --define(BUCKET_TYPE_PREFIX, {core, bucket_types}). --define(DEFAULT_TYPE, <<"default">>). - diff --git a/include/riak_core_vnode.hrl b/include/riak_core_vnode.hrl index 9ff955a66..9caf35944 100644 --- a/include/riak_core_vnode.hrl +++ b/include/riak_core_vnode.hrl @@ -1,9 +1,10 @@ -type sender_type() :: fsm | server | raw. -type sender() :: {sender_type(), reference() | tuple(), pid()} | %% TODO: Double-check that these special cases are kosher - {server, undefined, undefined} | % special case in - % riak_core_vnode_master.erl + {fsm, undefined, pid()} | % what are these special cases and what is the reference used for?? + {server, undefined, undefined} | % special case in riak_core_vnode_master.erl ignore. + -type partition() :: chash:index_as_int(). -type vnode_req() :: term(). -type keyspaces() :: [{partition(), [partition()]}]. @@ -28,9 +29,6 @@ forwardable :: boolean(), opts = [] :: list()}). --define(VNODE_REQ, #riak_vnode_req_v1). --define(COVERAGE_REQ, #riak_coverage_req_v1). --define(FOLD_REQ, #riak_core_fold_req_v2). -define(KV_VNODE_LOCK(Idx), {vnode_lock, Idx}). -type handoff_dest() :: {riak_core_handoff_manager:ho_type(), {partition(), node()}}. diff --git a/rebar.config b/rebar.config index c57e19120..796022367 100644 --- a/rebar.config +++ b/rebar.config @@ -1,22 +1,15 @@ -%{cover_enabled, true}. -{erl_opts, [warnings_as_errors, - debug_info]}. -{edoc_opts, [{preprocess, true}]}. -{xref_checks, []}. -{xref_queries, [{"(XC - UC) || (XU - X - B - \"(cluster_info|dtrace)\" : Mod)", []}]}. - +%% Add debug information in compiled code for other tools like debuggers, code coverage tools, or analysis tools +{erl_opts, [debug_info]}. {deps, [ % worker pool library - {poolboy, "~>1.5.2"}, - % metric collection - {basho_stats, "~>1.0.3"}, - % bloom filter - {blume, "~>0.1.0"}, - % consistent hashing function - {chash, "~>0.1.2"}, - % legacy gen_fsm behaviour - gen_fsm_compat + {poolboy, "~>1.5.2"} ]}. +%% Defensive xref configuration +{xref_checks, [ undefined_function_calls, locals_not_used, deprecated_function_calls ]}. + +%% Code formatter +{project_plugins, [rebar3_format, rebar3_lint, rebar3_proper]}. +{format, [ {formatter, otp_formatter} ]}. %%------------------------------------------------------------------- %% Profiles @@ -25,18 +18,18 @@ {profiles, [ {test, [ {erl_opts, [nowarn_export_all]}, - {deps, - [ - {mustache, ".*", {git, "https://github.com/mojombo/mustache.erl.git", {tag, "v0.1.1"}}}, - % event framework for test cases - {goldrush, "~>0.1.8"} - ]}]}, - {docs, [{deps, [{edown, "0.7.0"}]}]}, - {eqc, [{erl_opts, [nowarn_export_all, {d, 'EQC'}, {d, 'TEST'}]}, {deps, [meck]}, {plugins, [{rebar_eqc, "~>0.1.0"}]}]}, - {prod, [{relx, [{dev_mode, false}]}]}, - {lint, [ - {plugins, [ - {rebar3_lint, {git, "https://github.com/project-fifo/rebar3_lint.git", {tag, "0.1.4"}}} - ]} - ]} - ]}. + {plugins, [{coveralls, {git, "https://github.com/markusn/coveralls-erl", {branch, "master"}}}]}, + {deps, [meck]} + ]}, + {proper, [ + {erl_opts, [nowarn_export_all, {d, 'PROPER'}, {d, 'TEST'}]}, + {plugins, [{coveralls, {git, "https://github.com/markusn/coveralls-erl", {branch, "master"}}}]}, + {deps, [meck, {proper, "1.3.0"}, recon]} + ]}, + {docs, [{deps, [{edown, "0.7.0"}]}]} +]}. + +{cover_enabled, true}. +{cover_export_enabled, true}. +{coveralls_coverdata, "_build/test/cover/*.coverdata"}. +{coveralls_service_name, "travis-ci"}. diff --git a/rebar.config.script b/rebar.config.script new file mode 100644 index 000000000..6c1419104 --- /dev/null +++ b/rebar.config.script @@ -0,0 +1,6 @@ +case os:getenv("TRAVIS") of + "true" -> + lists:keystore(coveralls_service_job_id, 1, CONFIG, {coveralls_service_job_id, os:getenv("TRAVIS_JOB_ID")}); + _ -> + CONFIG +end. \ No newline at end of file diff --git a/rebar.lock b/rebar.lock index 1222fd60f..6dabcf610 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,14 +1,6 @@ {"1.1.0", -[{<<"basho_stats">>,{pkg,<<"basho_stats">>,<<"1.0.3">>},0}, - {<<"blume">>,{pkg,<<"blume">>,<<"0.1.1">>},0}, - {<<"chash">>,{pkg,<<"chash">>,<<"0.1.2">>},0}, - {<<"gen_fsm_compat">>,{pkg,<<"gen_fsm_compat">>,<<"0.3.0">>},0}, - {<<"poolboy">>,{pkg,<<"poolboy">>,<<"1.5.2">>},0}]}. +[{<<"poolboy">>,{pkg,<<"poolboy">>,<<"1.5.2">>},0}]}. [ {pkg_hash,[ - {<<"basho_stats">>, <<"7E1174151509C64FCC1934120ED32295E14F84DAAE7F84926BA2C8D3700D146C">>}, - {<<"blume">>, <<"CFB4F43688690BA81C6A79F54E4678CFD5FDEDAB692F277AE740AE4A3897360D">>}, - {<<"chash">>, <<"AF02484F2640C653C4B9A8557A14CA0704989DBEDB27E7CCBC442F1903A3BCA7">>}, - {<<"gen_fsm_compat">>, <<"5903549F67D595F58A7101154CBE0FDD46955FBFBE40813F1E53C23A970FF5F4">>}, {<<"poolboy">>, <<"392B007A1693A64540CEAD79830443ABF5762F5D30CF50BC95CB2C1AAAFA006B">>}]} ]. diff --git a/rebar3 b/rebar3 index b40d756a37ca29ec22617ff6bb6ccdd11f64975f..e550663abb94eb8419a900088c3f58b40a147eaa 100755 GIT binary patch delta 806569 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 F`r^GtHu(RzSzvAK*YL4U9Es`06YyC<{@e*Fh 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

!5i`c1QMiOHOuk=& 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%0A9`Ex; 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
4>;7S44!A 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

  • Zl{v2X^#06Md5M${?ui?^Pumli*w%0(S= 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�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

    ql$y&Spe?zO8a3<@_sY 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%0DFWaHH7iI?XKLtW`f%i0;T_*( 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�oKGK>>liVxBlV!xr2+G|UZ5@MLj! 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�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

    MpG zOT~3+9kY`;d`|YKk>cs#i^rH6^4UZ9Nc&r!{}~qiC9ojF|AJ;jAG`_qsT9KWFrs^z zzE!BT{262s#ebF9dk{>WC_PIJeKyx6wiJl{7l{3<5c|IXmq8W;7k|MXrEw@7?1^E5 zU@@IAf{MdSJn#%o6h#m)@eXT{purQ@xYC{|c)P3b>ANrYsr%j@x+<=^x@x>{#cS8w z{eRUxA<5?bWKvyK-}lvbe_xd%Yds;%dc`s-#ro2Az}w@t^`MHg3AQl!ud&U{I)nd4 zWrT`507~SnU*!z`+kd?ExEKpiga0nzCoEtFeuF#4LOH(j9Az%?#+I#@4gNIkHCWq5+k2*pUli%q zDx9>oweEmzjX<|GT2BhXq;=thi_Zr9Wa3U4{11)Rb7Hpjynn%;Yp|Xbjn=acexAXf zSDwG)#1{fyA&j!Y|JZ1~2#l8u{$hjm0x({1r1b*Cc)>ULOCk850^R}elL7v6!5Uyq z_?3$+)>>rgO4b@^H7Dk*fy%6kHBhI_Bdu4=vh}LLUum=kaQuK@TP`cstbC?eTzM(w zWR%D+?Xfr8^M5uvC9_guC8K2SRWg@E|BRBM;;;_uvsJ)PiRY}>RmxFuk8H+#m1l{v zq`R5uLb;6a9)AoUY}`w#O5;3FIew+P1c8A zy68ay&#vUG4_jxoS|8RuVxD5XVV-KeX)d+iGEcMKHh)jI-Z7V1?;8A#@#$3s>tm-0 zzl}vF#M=fH?PX&DGxLl4{XOUyQo;LWK8ut_6ep1E#WEk#}5cjlE zaNp9n+kv~iio1On?&=Wt^igo%*0`Sn_tPrwr^9g9hPcZ{!F@;Leg@pns<@vG!@VZN zJ!2HycYihR=fM5Eiu?I6+!-P6@= znWY;G))(<6{5BTjF_E>t5FoE9_1S4Pg#~=YD6~HqpDq`yFTvNBRldI5!I$YcYHrBb znWG?o2=^U}PlJDyw_XD;^lW=HJ6+E{jb_XA?6YWghMs*M z&6exg7tw5mo_!h3&eXF%2Ye;mc?J0SOTqd|G~t&<_Hd9rysY(=W7gHil=4KtSH;uT zH+C)zinlr4@O8jfgVLFx^vz6ZATS)SAY)Dwerf2&FFJN>PR9IMzKqpv zMt@*@i@^8}f$=>8;|B!Bj|TsCyxm@qV?+~v17L$?*aXEt$zU& zoT1(sfHQbSC+%lty=Sh>NsC;Kz>I*0gd$&7IzNP|G&1pNGX zZp9P|By%rEWmqzv%mn;`c<%5yq(>z5W+<&W;1|Yo^3a0Z6>ROggRQLGRhV@JS=Zcz z-}Yj2j1`;9A}i~dIR$tskLt)kCV!bqLb7fgwr@dB1d)j>S0#c9>5Z4=K7Sg<(yZi% zv$8&9Wl+l*;^~r6&boB)Eckkk5<|Y^REwqI?p%;bh%hM>Atxu1Q%urMVZ$jV7_N

    s3yd5*>=QwRBY(^}%SLX0#AnyH%)Omh27q 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

    sFHd#P4TZc>9o0 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 z zwd{JST_sJe^yLz{mFkqtlnv(i7vcY(GenMI-edpy2hMQQf3ZLi0%EoOY;jM$`VW;4 zK2-RQ#ir8w<)iZCy~vX4l!66Uj!iiDR-21i4$;jM#C&4e!xYEg%fH?fSed73F>-1J}Q9 zKYZuip86SFwAk$i0%C(29xwJ52J!-e(SJtCXwxeb=F!QU6?#EhjyxZF-9v@p0OU2IA=JS)eOKx6cE3rFVn+H zPp+WsR%DOb0<1(XZm$vNOv|6(nvBq@k*F+alS96$whh;^6@$2ovw2+66)sA`NZ1vE z)fq5o@+N(&i%U&2ST~IKTk<>}J!!=AEAv<6Wj$(FMsjw*y+|Ld>`7rblrzzIOEa(N zW;F{1!-e=3sTyZ;l6TGh+KkOvTgSty%ra5~GWp$t0pdt`%amx1>A4^ryy#RItdz~8 zRrc&fTHe&V?!$-Ky--Z1^11=2absiFR@+o3(r!Ba`5WSz#TN8XQ%qT+o#sO^Q@4>dv znemj+Z*zIjn%FDRkpz56G*{F0qMXV7l zEs22nw|ZV18S>SXrYilo98_RP&)ix;1M2ywIC^dC@p5HLhZj4gbULMb_!#}ugbx@# zY7`@Ftmw%MTuE1#hKWD^d2&178W;H~OxizvYnY@5l`9X{y<&3%}sZ zC2aEa?nfm%uh1o*`9JujLPx8gS9|x3?z{YUP(P)RBT5uX7B*{Aj(_l=d7hzGLNh$I$ZBhXsF2{Y#SAVpaRw?y&GfcW-tS z%2NjfXS0J70W559h~(5LG5BT862Sc_8GY&7SFaq6B^b-3_&p^ZmA6yt_0jP zLJ__1j=OD8Rmv#N_Cqq#V(Q?lMmBBRgys{SICu;!yznVY)IU?Mcaf+m)vL8HEDZ%O zBSS`05A~K#d5oSIC`A%FKO$sIwoYIFi?%dYN|=}|2|eKtLN={k6P~x`0KokEH38i~ z*q|Nl*7sb zDFNSclOoY;_EuOG@?iXrb#~1&Sbks;J3Hpu3}`(_$1?`zS`t@t_Zr1z0RVl%P3N5l zuDS*`(mMHRuU+)Td;DMaA3*OWu~UvHoTFAAT(YLg6pTC|A96hCZi=tgrAv9{19dNDdJGI)eJ)YH5 zZ?{62>hR)_(EiGMTq0%fv6S&hy?(#78xU~!`%qO%Hhw#p?P;aFGQ3ne8qtftun@|n z9Fur(34_Y1hSF~7)U*S$sQ0O;w>|35e$?{-&a^Wl*@gw-wwdG}LiQtR92e1-0>`Zw z2j|uigJ+eO$i$NV1mHNAV-X8RyNj0EVRSE!EXf%Lp0TvZS*A!|+G`+p&DlD{-EEp$ zNoS(CRGO)TyhP#*Ir1c3RSa4i_b4URJlPB=6DsTk7!)aFXfOe?A4RUq&EMq?B2}ai zY3Flo&Hhb+nkXc96P~1cf&Z*+FhO3$kso-yef4BrW8}9W0AQ3@sGHZ`xcBp$bg2

    iupn*8%*WUUwYXL?GQ|&gb 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

    &AtmD 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

    UHs>uIT25(lItf7zm(w%!RRZm-W=H)fgM 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

    szu5Wz3iFAtNTh}< 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 E15QL&y#N3J diff --git a/src/chash.erl b/src/chash.erl new file mode 100644 index 000000000..ec42297f2 --- /dev/null +++ b/src/chash.erl @@ -0,0 +1,308 @@ +%% ------------------------------------------------------------------- +%% +%% taken from: https://github.com/basho/riak_core/blob/develop/src/chash.erl +%% +%% chash: basic consistent hashing +%% +%% Copyright (c) 2007-2011 Basho Technologies, Inc. All Rights Reserved. +%% +%% This file is provided to you under the Apache License, +%% Version 2.0 (the "License"); you may not use this file +%% except in compliance with the License. You may obtain +%% a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, +%% software distributed under the License is distributed on an +%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +%% KIND, either express or implied. See the License for the +%% specific language governing permissions and limitations +%% under the License. +%% +%% ------------------------------------------------------------------- + +%% @doc A consistent hashing implementation. The space described by the ring +%% coincides with SHA-1 hashes, and so any two keys producing the same +%% SHA-1 hash are considered identical within the ring. +%% +%% Warning: It is not recommended that code outside this module make use +%% of the structure of a chash. +%% +%% @reference Karger, D.; Lehman, E.; Leighton, T.; Panigrahy, R.; Levine, M.; +%% Lewin, D. (1997). "Consistent hashing and random trees". Proceedings of the +%% twenty-ninth annual ACM symposium on Theory of computing: 654~663. ACM Press +%% New York, NY, USA + +-module(chash). + +-export([contains_name/2, fresh/2, lookup/2, key_of/1, + members/1, merge_rings/2, next_index/2, nodes/1, + predecessors/2, predecessors/3, ring_increment/1, + size/1, successors/2, successors/3, update/3]). + +-export_type([chash/0, index/0, index_as_int/0]). + +-define(RINGTOP, + trunc(math:pow(2, 160) - 1)). % SHA-1 space + +-ifdef(TEST). + +-include_lib("eunit/include/eunit.hrl"). + +-endif. + +-type chash() :: {num_partitions(), [node_entry()]}. + +%% A Node is the unique identifier for the owner of a given partition. +%% An Erlang Pid works well here, but the chash module allows it to +%% be any term. +-type chash_node() :: term(). + +%% Indices into the ring, used as keys for object location, are binary +%% representations of 160-bit integers. +-type index() :: <<_:160>>. + +-type index_as_int() :: integer(). + +-type node_entry() :: {index_as_int(), chash_node()}. + +-type num_partitions() :: pos_integer(). + +%% =================================================================== +%% Public API +%% =================================================================== + +%% @doc Return true if named Node owns any partitions in the ring, else false. +-spec contains_name(Name :: chash_node(), + CHash :: chash()) -> boolean(). + +contains_name(Name, CHash) -> + {_NumPartitions, Nodes} = CHash, + [X || {_, X} <- Nodes, X == Name] =/= []. + +%% @doc Create a brand new ring. The size and seednode are specified; +%% initially all partitions are owned by the seednode. If NumPartitions +%% is not much larger than the intended eventual number of +%% participating nodes, then performance will suffer. +-spec fresh(NumPartitions :: num_partitions(), + SeedNode :: chash_node()) -> chash(). + +fresh(NumPartitions, SeedNode) -> + Inc = ring_increment(NumPartitions), + {NumPartitions, + [{IndexAsInt, SeedNode} + || IndexAsInt <- lists:seq(0, (?RINGTOP) - 1, Inc)]}. + +%% @doc Find the Node that owns the partition identified by IndexAsInt. +-spec lookup(IndexAsInt :: index_as_int(), + CHash :: chash()) -> chash_node(). + +lookup(IndexAsInt, CHash) -> + {_NumPartitions, Nodes} = CHash, + {IndexAsInt, X} = proplists:lookup(IndexAsInt, Nodes), + X. + +sha(Bin) -> crypto:hash(sha, Bin). + +%% @doc Given any term used to name an object, produce that object's key +%% into the ring. Two names with the same SHA-1 hash value are +%% considered the same name. +-spec key_of(ObjectName :: term()) -> index(). + +key_of(ObjectName) -> sha(term_to_binary(ObjectName)). + +%% @doc Return all Nodes that own any partitions in the ring. +-spec members(CHash :: chash()) -> [chash_node()]. + +members(CHash) -> + {_NumPartitions, Nodes} = CHash, + lists:usort([X || {_Idx, X} <- Nodes]). + +%% @doc Return a randomized merge of two rings. +%% If multiple nodes are actively claiming nodes in the same +%% time period, churn will occur. Be prepared to live with it. +-spec merge_rings(CHashA :: chash(), + CHashB :: chash()) -> chash(). + +merge_rings(CHashA, CHashB) -> + {NumPartitions, NodesA} = CHashA, + {NumPartitions, NodesB} = CHashB, + {NumPartitions, + [{I, random_node(A, B)} + || {{I, A}, {I, B}} <- lists:zip(NodesA, NodesB)]}. + +%% @doc Given the integer representation of a chash key, +%% return the next ring index integer value. +-spec next_index(IntegerKey :: integer(), + CHash :: chash()) -> index_as_int(). + +next_index(IntegerKey, {NumPartitions, _}) -> + Inc = ring_increment(NumPartitions), + (IntegerKey div Inc + 1) rem NumPartitions * Inc. + +%% @doc Return the entire set of NodeEntries in the ring. +-spec nodes(CHash :: chash()) -> [node_entry()]. + +nodes(CHash) -> {_NumPartitions, Nodes} = CHash, Nodes. + +%% @doc Given an object key, return all NodeEntries in order starting at Index. +-spec ordered_from(Index :: index(), + CHash :: chash()) -> [node_entry()]. + +ordered_from(Index, {NumPartitions, Nodes}) -> + <> = Index, + Inc = ring_increment(NumPartitions), + {A, B} = lists:split(IndexAsInt div Inc + 1, Nodes), + B ++ A. + +%% @doc Given an object key, return all NodeEntries in reverse order +%% starting at Index. +-spec predecessors(Index :: index() | index_as_int(), + CHash :: chash()) -> [node_entry()]. + +predecessors(Index, CHash) -> + {NumPartitions, _Nodes} = CHash, + predecessors(Index, CHash, NumPartitions). + +%% @doc Given an object key, return the next N NodeEntries in reverse order +%% starting at Index. +-spec predecessors(Index :: index() | index_as_int(), + CHash :: chash(), N :: integer()) -> [node_entry()]. + +predecessors(Index, CHash, N) when is_integer(Index) -> + predecessors(<>, CHash, N); +predecessors(Index, CHash, N) -> + Num = max_n(N, CHash), + {Res, _} = lists:split(Num, + lists:reverse(ordered_from(Index, CHash))), + Res. + +%% @doc Return increment between ring indexes given +%% the number of ring partitions. +-spec ring_increment(NumPartitions :: + pos_integer()) -> pos_integer(). + +ring_increment(NumPartitions) -> + (?RINGTOP) div NumPartitions. + +%% @doc Return the number of partitions in the ring. +-spec size(CHash :: chash()) -> integer(). + +size(CHash) -> + {_NumPartitions, Nodes} = CHash, length(Nodes). + +%% @doc Given an object key, return all NodeEntries in order starting at Index. +-spec successors(Index :: index(), + CHash :: chash()) -> [node_entry()]. + +successors(Index, CHash) -> + {NumPartitions, _Nodes} = CHash, + successors(Index, CHash, NumPartitions). + +%% @doc Given an object key, return the next N NodeEntries in order +%% starting at Index. +-spec successors(Index :: index(), CHash :: chash(), + N :: integer()) -> [node_entry()]. + +successors(Index, CHash, N) -> + Num = max_n(N, CHash), + Ordered = ordered_from(Index, CHash), + {NumPartitions, _Nodes} = CHash, + if Num =:= NumPartitions -> Ordered; + true -> {Res, _} = lists:split(Num, Ordered), Res + end. + +%% @doc Make the partition beginning at IndexAsInt owned by Name'd node. +-spec update(IndexAsInt :: index_as_int(), + Name :: chash_node(), CHash :: chash()) -> chash(). + +update(IndexAsInt, Name, CHash) -> + {NumPartitions, Nodes} = CHash, + NewNodes = lists:keyreplace(IndexAsInt, 1, Nodes, + {IndexAsInt, Name}), + {NumPartitions, NewNodes}. + +%% ==================================================================== +%% Internal functions +%% ==================================================================== + +%% @private +%% @doc Return either N or the number of partitions in the ring, whichever +%% is lesser. +-spec max_n(N :: integer(), + CHash :: chash()) -> integer(). + +max_n(N, {NumPartitions, _Nodes}) -> + erlang:min(N, NumPartitions). + +%% @private +-spec random_node(NodeA :: chash_node(), + NodeB :: chash_node()) -> chash_node(). + +random_node(NodeA, NodeA) -> NodeA; +random_node(NodeA, NodeB) -> + lists:nth(rand:uniform(2), [NodeA, NodeB]). + +%% =================================================================== +%% EUnit tests +%% =================================================================== +-ifdef(TEST). + +update_test() -> + Node = old@host, + NewNode = new@host, + % Create a fresh ring... + CHash = chash:fresh(5, Node), + GetNthIndex = fun (N, {_, Nodes}) -> + {Index, _} = lists:nth(N, Nodes), Index + end, + % Test update... + FirstIndex = GetNthIndex(1, CHash), + ThirdIndex = GetNthIndex(3, CHash), + {5, + [{_, NewNode}, {_, Node}, {_, Node}, {_, Node}, + {_, Node}, {_, Node}]} = + update(FirstIndex, NewNode, CHash), + {5, + [{_, Node}, {_, Node}, {_, NewNode}, {_, Node}, + {_, Node}, {_, Node}]} = + update(ThirdIndex, NewNode, CHash). + +contains_test() -> + CHash = chash:fresh(8, the_node), + ?assertEqual(true, (contains_name(the_node, CHash))), + ?assertEqual(false, + (contains_name(some_other_node, CHash))). + +max_n_test() -> + CHash = chash:fresh(8, the_node), + ?assertEqual(1, (max_n(1, CHash))), + ?assertEqual(8, (max_n(11, CHash))). + +simple_size_test() -> + ?assertEqual(8, + (length(chash:nodes(chash:fresh(8, the_node))))). + +successors_length_test() -> + ?assertEqual(8, + (length(chash:successors(chash:key_of(0), + chash:fresh(8, the_node))))). + +inverse_pred_test() -> + CHash = chash:fresh(8, the_node), + S = [I + || {I, _} <- chash:successors(chash:key_of(4), CHash)], + P = [I + || {I, _} + <- chash:predecessors(chash:key_of(4), CHash)], + ?assertEqual(S, (lists:reverse(P))). + +merge_test() -> + CHashA = chash:fresh(8, node_one), + CHashB = chash:update(0, node_one, + chash:fresh(8, node_two)), + CHash = chash:merge_rings(CHashA, CHashB), + ?assertEqual(node_one, (chash:lookup(0, CHash))). + +-endif. diff --git a/src/chashbin.erl b/src/chashbin.erl new file mode 100644 index 000000000..6404ae0fd --- /dev/null +++ b/src/chashbin.erl @@ -0,0 +1,255 @@ +%% ------------------------------------------------------------------- +%% +%% taken from: https://github.com/basho/riak_core/blob/develop/src/chashbin.erl +%% +%% riak_core: Core Riak Application +%% +%% Copyright (c) 2013 Basho Technologies, Inc. All Rights Reserved. +%% +%% This file is provided to you under the Apache License, +%% Version 2.0 (the "License"); you may not use this file +%% except in compliance with the License. You may obtain +%% a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, +%% software distributed under the License is distributed on an +%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +%% KIND, either express or implied. See the License for the +%% specific language governing permissions and limitations +%% under the License. +%% +%% ------------------------------------------------------------------- +-module(chashbin). + +-export([create/1, to_chash/1, to_list/1, + to_list_filter/2, responsible_index/2, + responsible_position/2, index_owner/2, + num_partitions/1]). + +-export([iterator/2, exact_iterator/2, itr_value/1, + itr_pop/2, itr_next/1, itr_next_while/2]). + +-export_type([chashbin/0]). + +%% 160 bits for hash, 16 bits for node id +%% these macros break edoc +%% also these macros are not used consistently, commenting out for now +%%-define(UNIT, 176). +%%-define(ENTRY, binary-unit:?UNIT). + +-type owners_bin() :: <<_:_*176>>. + +-type index() :: chash:index_as_int(). + +-type pred_fun() :: fun(({index(), + node()}) -> boolean()). + +-type chash_key() :: index() | chash:index(). + +-ifndef(namespaced_types). + +-record(chashbin, + {size :: pos_integer(), owners :: owners_bin(), + nodes :: erlang:tuple(node())}). + +-else. + +-record(chashbin, + {size :: pos_integer(), owners :: owners_bin(), + nodes :: erlang:tuple(node())}). + +-endif. + +-type chashbin() :: #chashbin{}. + +-record(iterator, + {pos :: non_neg_integer(), start :: non_neg_integer(), + chbin :: chashbin()}). + +-type iterator() :: #iterator{}. + +%% =================================================================== +%% Public API +%% =================================================================== + +%% @doc Create a `chashbin' from the provided `chash' +-spec create(chash:chash()) -> chashbin(). + +create({Size, Owners}) -> + Nodes1 = [Node || {_, Node} <- Owners], + Nodes2 = lists:usort(Nodes1), + Nodes3 = lists:zip(Nodes2, + lists:seq(1, length(Nodes2))), + Bin = create_bin(Owners, Nodes3, <<>>), + #chashbin{size = Size, owners = Bin, + nodes = list_to_tuple(Nodes2)}. + +%% @doc Convert a `chashbin' back to a `chash' +-spec to_chash(chashbin()) -> chash:chash(). + +to_chash(CHBin = #chashbin{size = Size}) -> + L = to_list(CHBin), {Size, L}. + +%% @doc Convert a `chashbin' to a list of `{Index, Owner}' pairs +-spec to_list(chashbin()) -> [{index(), node()}]. + +to_list(#chashbin{owners = Bin, nodes = Nodes}) -> + [{Idx, element(Id, Nodes)} + || <> <= Bin]. + +%% @doc +%% Convert a `chashbin' to a list of `{Index, Owner}' pairs for +%% which `Pred({Index, Owner})' returns `true' +-spec to_list_filter(pred_fun(), + chashbin()) -> [{index(), node()}]. + +to_list_filter(Pred, + #chashbin{owners = Bin, nodes = Nodes}) -> + [{Idx, element(Id, Nodes)} + || <> <= Bin, + Pred({Idx, element(Id, Nodes)})]. + +%% @doc Determine the ring index responsible for a given chash key +-spec responsible_index(chash_key(), + chashbin()) -> index(). + +responsible_index(<>, CHBin) -> + responsible_index(HashKey, CHBin); +responsible_index(HashKey, #chashbin{size = Size}) -> + Inc = chash:ring_increment(Size), + (HashKey div Inc + 1) rem Size * Inc. + +%% @doc Determine the ring position responsible for a given chash key +-spec responsible_position(chash_key(), + chashbin()) -> non_neg_integer(). + +responsible_position(<>, CHBin) -> + responsible_position(HashKey, CHBin); +responsible_position(HashKey, #chashbin{size = Size}) -> + Inc = chash:ring_increment(Size), + (HashKey div Inc + 1) rem Size. + +%% @doc Return the node that owns the given index +-spec index_owner(index(), chashbin()) -> node(). + +index_owner(Idx, CHBin) -> + case itr_value(exact_iterator(Idx, CHBin)) of + {Idx, Owner} -> Owner; + _ -> + %% Match the behavior for riak_core_ring:index_owner/2 + exit({badmatch, false}) + end. + +%% @doc Return the number of partitions in a given `chashbin' +-spec num_partitions(chashbin()) -> pos_integer(). + +num_partitions(#chashbin{size = Size}) -> Size. + +%% =================================================================== +%% Public Iterator API +%% =================================================================== + +%% @doc +%% Return an iterator pointing to the index responsible for the given chash key +-spec iterator(first | chash_key(), + chashbin()) -> iterator(). + +iterator(first, CHBin) -> + #iterator{pos = 0, start = 0, chbin = CHBin}; +iterator(<>, CHBin) -> + iterator(HashKey, CHBin); +iterator(HashKey, CHBin) -> + Pos = responsible_position(HashKey, CHBin), + #iterator{pos = Pos, start = Pos, chbin = CHBin}. + +%% @doc Return the `{Index, Owner}' pair pointed to by the iterator +-spec itr_value(iterator()) -> {index(), node()}. + +itr_value(#iterator{pos = Pos, + chbin = #chashbin{owners = Bin, nodes = Nodes}}) -> + <<_:Pos/binary-unit:176, Idx:160/integer, Id:16/integer, + _/binary>> = + Bin, + Owner = element(Id, Nodes), + {Idx, Owner}. + +%% @doc Advance the iterator by one ring position +-spec itr_next(iterator()) -> iterator() | done. + +itr_next(Itr = #iterator{pos = Pos, start = Start, + chbin = CHBin}) -> + Pos2 = (Pos + 1) rem CHBin#chashbin.size, + case Pos2 of + Start -> done; + _ -> Itr#iterator{pos = Pos2} + end. + +%% @doc +%% Advance the iterator `N' times, returning a list of the traversed +%% `{Index, Owner}' pairs as well as the new iterator state +-spec itr_pop(pos_integer(), iterator()) -> {[{index(), + node()}], + iterator()}. + +itr_pop(N, Itr = #iterator{pos = Pos, chbin = CHBin}) -> + #chashbin{size = Size, owners = Bin, nodes = Nodes} = + CHBin, + L = case Bin of + <<_:Pos/binary-unit:176, Bin2:N/binary-unit:176, + _/binary>> -> + [{Idx, element(Id, Nodes)} + || <> <= Bin2]; + _ -> + Left = N + Pos - Size, + Skip = Pos - Left, + <> = + Bin, + L1 = [{Idx, element(Id, Nodes)} + || <> <= Bin2], + L2 = [{Idx, element(Id, Nodes)} + || <> <= Bin3], + L1 ++ L2 + end, + Pos2 = (Pos + N) rem Size, + Itr2 = Itr#iterator{pos = Pos2}, + {L, Itr2}. + +%% @doc Advance the iterator while `Pred({Index, Owner})' returns `true' +-spec itr_next_while(pred_fun(), + iterator()) -> iterator(). + +itr_next_while(Pred, Itr) -> + case Pred(itr_value(Itr)) of + false -> Itr; + true -> itr_next_while(Pred, itr_next(Itr)) + end. + +%% =================================================================== +%% Internal functions +%% =================================================================== + +%% Convert list of {Index, Owner} pairs into `chashbin' binary representation +-spec create_bin([{index(), node()}], + [{node(), pos_integer()}], binary()) -> owners_bin(). + +create_bin([], _, Bin) -> Bin; +create_bin([{Idx, Owner} | Owners], Nodes, Bin) -> + {Owner, Id} = lists:keyfind(Owner, 1, Nodes), + Bin2 = <>, + create_bin(Owners, Nodes, Bin2). + +%% Convert ring index into ring position +index_position(<>, CHBin) -> + index_position(Idx, CHBin); +index_position(Idx, #chashbin{size = Size}) -> + Inc = chash:ring_increment(Size), Idx div Inc rem Size. + +%% Return iterator pointing to the given index +exact_iterator(<>, CHBin) -> + exact_iterator(Idx, CHBin); +exact_iterator(Idx, CHBin) -> + Pos = index_position(Idx, CHBin), + #iterator{pos = Pos, start = Pos, chbin = CHBin}. diff --git a/src/gen_fsm_compat.erl b/src/gen_fsm_compat.erl new file mode 100644 index 000000000..f137bdb16 --- /dev/null +++ b/src/gen_fsm_compat.erl @@ -0,0 +1,795 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2018. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_fsm_compat). + +%%%----------------------------------------------------------------- +%%% +%%% This state machine is somewhat more pure than state_lib. It is +%%% still based on State dispatching (one function per state), but +%%% allows a function handle_event to take care of events in all states. +%%% It's not that pure anymore :( We also allow synchronized event sending. +%%% +%%% If the Parent process terminates the Module:terminate/2 +%%% function is called. +%%% +%%% The user module should export: +%%% +%%% init(Args) +%%% ==> {ok, StateName, StateData} +%%% {ok, StateName, StateData, Timeout} +%%% ignore +%%% {stop, Reason} +%%% +%%% StateName(Msg, StateData) +%%% +%%% ==> {next_state, NewStateName, NewStateData} +%%% {next_state, NewStateName, NewStateData, Timeout} +%%% {stop, Reason, NewStateData} +%%% Reason = normal | shutdown | Term terminate(State) is called +%%% +%%% StateName(Msg, From, StateData) +%%% +%%% ==> {next_state, NewStateName, NewStateData} +%%% {next_state, NewStateName, NewStateData, Timeout} +%%% {reply, Reply, NewStateName, NewStateData} +%%% {reply, Reply, NewStateName, NewStateData, Timeout} +%%% {stop, Reason, NewStateData} +%%% Reason = normal | shutdown | Term terminate(State) is called +%%% +%%% handle_event(Msg, StateName, StateData) +%%% +%%% ==> {next_state, NewStateName, NewStateData} +%%% {next_state, NewStateName, NewStateData, Timeout} +%%% {stop, Reason, Reply, NewStateData} +%%% {stop, Reason, NewStateData} +%%% Reason = normal | shutdown | Term terminate(State) is called +%%% +%%% handle_sync_event(Msg, From, StateName, StateData) +%%% +%%% ==> {next_state, NewStateName, NewStateData} +%%% {next_state, NewStateName, NewStateData, Timeout} +%%% {reply, Reply, NewStateName, NewStateData} +%%% {reply, Reply, NewStateName, NewStateData, Timeout} +%%% {stop, Reason, Reply, NewStateData} +%%% {stop, Reason, NewStateData} +%%% Reason = normal | shutdown | Term terminate(State) is called +%%% +%%% handle_info(Info, StateName) (e.g. {'EXIT', P, R}, {nodedown, N}, ... +%%% +%%% ==> {next_state, NewStateName, NewStateData} +%%% {next_state, NewStateName, NewStateData, Timeout} +%%% {stop, Reason, NewStateData} +%%% Reason = normal | shutdown | Term terminate(State) is called +%%% +%%% terminate(Reason, StateName, StateData) Let the user module clean up +%%% always called when server terminates +%%% +%%% ==> the return value is ignored +%%% +%%% +%%% The work flow (of the fsm) can be described as follows: +%%% +%%% User module fsm +%%% ----------- ------- +%%% start -----> start +%%% init <----- . +%%% +%%% loop +%%% StateName <----- . +%%% +%%% handle_event <----- . +%%% +%%% handle__sunc_event <----- . +%%% +%%% handle_info <----- . +%%% +%%% terminate <----- . +%%% +%%% +%%% --------------------------------------------------- + +-export([start/3, start/4, start_link/3, start_link/4, + stop/1, stop/3, send_event/2, sync_send_event/2, + sync_send_event/3, send_all_state_event/2, + sync_send_all_state_event/2, + sync_send_all_state_event/3, reply/2, start_timer/2, + send_event_after/2, cancel_timer/1, enter_loop/4, + enter_loop/5, enter_loop/6, wake_hib/7]). + +%% Internal exports +-export([init_it/6, system_continue/3, + system_terminate/4, system_code_change/4, + system_get_state/1, system_replace_state/2, + format_status/2]). + +-import(error_logger, [format/2]). + +%%% --------------------------------------------------- +%%% Interface functions. +%%% --------------------------------------------------- + +-callback init(Args :: term()) -> {ok, + StateName :: atom(), StateData :: term()} | + {ok, StateName :: atom(), StateData :: term(), + timeout() | hibernate} | + {stop, Reason :: term()} | ignore. + +-callback handle_event(Event :: term(), + StateName :: atom(), + StateData :: term()) -> {next_state, + NextStateName :: atom(), + NewStateData :: term()} | + {next_state, + NextStateName :: atom(), + NewStateData :: term(), + timeout() | hibernate} | + {stop, Reason :: term(), + NewStateData :: term()}. + +-callback handle_sync_event(Event :: term(), + From :: {pid(), Tag :: term()}, StateName :: atom(), + StateData :: term()) -> {reply, Reply :: term(), + NextStateName :: atom(), + NewStateData :: term()} | + {reply, Reply :: term(), + NextStateName :: atom(), + NewStateData :: term(), + timeout() | hibernate} | + {next_state, + NextStateName :: atom(), + NewStateData :: term()} | + {next_state, + NextStateName :: atom(), + NewStateData :: term(), + timeout() | hibernate} | + {stop, Reason :: term(), + Reply :: term(), + NewStateData :: term()} | + {stop, Reason :: term(), + NewStateData :: term()}. + +-callback handle_info(Info :: term(), + StateName :: atom(), + StateData :: term()) -> {next_state, + NextStateName :: atom(), + NewStateData :: term()} | + {next_state, + NextStateName :: atom(), + NewStateData :: term(), + timeout() | hibernate} | + {stop, Reason :: normal | term(), + NewStateData :: term()}. + +-callback terminate(Reason :: normal | shutdown | + {shutdown, term()} | term(), + StateName :: atom(), StateData :: term()) -> term(). + +-callback code_change(OldVsn :: term() | {down, term()}, + StateName :: atom(), StateData :: term(), + Extra :: term()) -> {ok, NextStateName :: atom(), + NewStateData :: term()}. + +-callback format_status(Opt, + StatusData) -> Status when Opt :: normal | terminate, + StatusData :: [PDict | + State], + PDict :: [{Key :: term(), + Value :: term()}], + State :: term(), + Status :: term(). + +-optional_callbacks([handle_info/3, terminate/3, + code_change/4, format_status/2]). + +%%% --------------------------------------------------- +%%% Starts a generic state machine. +%%% start(Mod, Args, Options) +%%% start(Name, Mod, Args, Options) +%%% start_link(Mod, Args, Options) +%%% start_link(Name, Mod, Args, Options) where: +%%% Name ::= {local, atom()} | {global, term()} | {via, atom(), term()} +%%% Mod ::= atom(), callback module implementing the 'real' fsm +%%% Args ::= term(), init arguments (to Module:init/1) +%%% Options ::= [{debug, [Flag]}] +%%% Flag ::= trace | log | {logfile, File} | statistics | debug +%%% (debug == log && statistics) +%%% Returns: {ok, Pid} | +%%% {error, {already_started, Pid}} | +%%% {error, Reason} +%%% --------------------------------------------------- +start(Mod, Args, Options) -> + gen:start(?MODULE, nolink, Mod, Args, Options). + +start(Name, Mod, Args, Options) -> + gen:start(?MODULE, nolink, Name, Mod, Args, Options). + +start_link(Mod, Args, Options) -> + gen:start(?MODULE, link, Mod, Args, Options). + +start_link(Name, Mod, Args, Options) -> + gen:start(?MODULE, link, Name, Mod, Args, Options). + +stop(Name) -> gen:stop(Name). + +stop(Name, Reason, Timeout) -> + gen:stop(Name, Reason, Timeout). + +send_event({global, Name}, Event) -> + catch global:send(Name, {'$gen_event', Event}), ok; +send_event({via, Module, Name}, Event) -> + catch Module:send(Name, {'$gen_event', Event}), ok; +send_event(Name, Event) -> + Name ! {'$gen_event', Event}, ok. + +sync_send_event(Name, Event) -> + case catch gen:call(Name, '$gen_sync_event', Event) of + {ok, Res} -> Res; + {'EXIT', Reason} -> + exit({Reason, + {?MODULE, sync_send_event, [Name, Event]}}) + end. + +sync_send_event(Name, Event, Timeout) -> + case catch gen:call(Name, '$gen_sync_event', Event, + Timeout) + of + {ok, Res} -> Res; + {'EXIT', Reason} -> + exit({Reason, + {?MODULE, sync_send_event, [Name, Event, Timeout]}}) + end. + +send_all_state_event({global, Name}, Event) -> + catch global:send(Name, + {'$gen_all_state_event', Event}), + ok; +send_all_state_event({via, Module, Name}, Event) -> + catch Module:send(Name, + {'$gen_all_state_event', Event}), + ok; +send_all_state_event(Name, Event) -> + Name ! {'$gen_all_state_event', Event}, ok. + +sync_send_all_state_event(Name, Event) -> + case catch gen:call(Name, '$gen_sync_all_state_event', + Event) + of + {ok, Res} -> Res; + {'EXIT', Reason} -> + exit({Reason, + {?MODULE, sync_send_all_state_event, [Name, Event]}}) + end. + +sync_send_all_state_event(Name, Event, Timeout) -> + case catch gen:call(Name, '$gen_sync_all_state_event', + Event, Timeout) + of + {ok, Res} -> Res; + {'EXIT', Reason} -> + exit({Reason, + {?MODULE, sync_send_all_state_event, + [Name, Event, Timeout]}}) + end. + +%% Designed to be only callable within one of the callbacks +%% hence using the self() of this instance of the process. +%% This is to ensure that timers don't go astray in global +%% e.g. when straddling a failover, or turn up in a restarted +%% instance of the process. + +%% Returns Ref, sends event {timeout,Ref,Msg} after Time +%% to the (then) current state. +start_timer(Time, Msg) -> + erlang:start_timer(Time, self(), {'$gen_timer', Msg}). + +%% Returns Ref, sends Event after Time to the (then) current state. +send_event_after(Time, Event) -> + erlang:start_timer(Time, self(), {'$gen_event', Event}). + +%% Returns the remaining time for the timer if Ref referred to +%% an active timer/send_event_after, false otherwise. +cancel_timer(Ref) -> + case erlang:cancel_timer(Ref) of + false -> + receive {timeout, Ref, _} -> 0 after 0 -> false end; + RemainingTime -> RemainingTime + end. + +%% enter_loop/4,5,6 +%% Makes an existing process into a gen_fsm. +%% The calling process will enter the gen_fsm receive loop and become a +%% gen_fsm process. +%% The process *must* have been started using one of the start functions +%% in proc_lib, see proc_lib(3). +%% The user is responsible for any initialization of the process, +%% including registering a name for it. +enter_loop(Mod, Options, StateName, StateData) -> + enter_loop(Mod, Options, StateName, StateData, self(), + infinity). + +enter_loop(Mod, Options, StateName, StateData, + {Scope, _} = ServerName) + when Scope == local; Scope == global -> + enter_loop(Mod, Options, StateName, StateData, + ServerName, infinity); +enter_loop(Mod, Options, StateName, StateData, + {via, _, _} = ServerName) -> + enter_loop(Mod, Options, StateName, StateData, + ServerName, infinity); +enter_loop(Mod, Options, StateName, StateData, + Timeout) -> + enter_loop(Mod, Options, StateName, StateData, self(), + Timeout). + +enter_loop(Mod, Options, StateName, StateData, + ServerName, Timeout) -> + Name = gen:get_proc_name(ServerName), + Parent = gen:get_parent(), + Debug = gen:debug_options(Name, Options), + HibernateAfterTimeout = gen:hibernate_after(Options), + loop(Parent, Name, StateName, StateData, Mod, Timeout, + HibernateAfterTimeout, Debug). + +%%% --------------------------------------------------- +%%% Initiate the new process. +%%% Register the name using the Rfunc function +%%% Calls the Moduleinit/Args function. +%%% Finally an acknowledge is sent to Parent and the main +%%% loop is entered. +%%% --------------------------------------------------- +init_it(Starter, self, Name, Mod, Args, Options) -> + init_it(Starter, self(), Name, Mod, Args, Options); +init_it(Starter, Parent, Name0, Module, Args, + Options) -> + Name = gen:name(Name0), + Debug = gen:debug_options(Name, Options), + HibernateAfterTimeout = gen:hibernate_after(Options), + case catch Module:init(Args) of + {ok, StateName, StateData} -> + proc_lib:init_ack(Starter, {ok, self()}), + loop(Parent, Name, StateName, StateData, Module, + infinity, HibernateAfterTimeout, Debug); + {ok, StateName, StateData, Timeout} -> + proc_lib:init_ack(Starter, {ok, self()}), + loop(Parent, Name, StateName, StateData, Module, + Timeout, HibernateAfterTimeout, Debug); + {stop, Reason} -> + gen:unregister_name(Name0), + proc_lib:init_ack(Starter, {error, Reason}), + exit(Reason); + ignore -> + gen:unregister_name(Name0), + proc_lib:init_ack(Starter, ignore), + exit(normal); + {'EXIT', Reason} -> + gen:unregister_name(Name0), + proc_lib:init_ack(Starter, {error, Reason}), + exit(Reason); + Else -> + Error = {bad_return_value, Else}, + proc_lib:init_ack(Starter, {error, Error}), + exit(Error) + end. + +%%----------------------------------------------------------------- +%% The MAIN loop +%%----------------------------------------------------------------- +loop(Parent, Name, StateName, StateData, Mod, hibernate, + HibernateAfterTimeout, Debug) -> + proc_lib:hibernate(?MODULE, wake_hib, + [Parent, Name, StateName, StateData, Mod, + HibernateAfterTimeout, Debug]); +loop(Parent, Name, StateName, StateData, Mod, infinity, + HibernateAfterTimeout, Debug) -> + receive + Msg -> + decode_msg(Msg, Parent, Name, StateName, StateData, Mod, + infinity, HibernateAfterTimeout, Debug, false) + after HibernateAfterTimeout -> + loop(Parent, Name, StateName, StateData, Mod, hibernate, + HibernateAfterTimeout, Debug) + end; +loop(Parent, Name, StateName, StateData, Mod, Time, + HibernateAfterTimeout, Debug) -> + Msg = receive + Input -> Input after Time -> {'$gen_event', timeout} + end, + decode_msg(Msg, Parent, Name, StateName, StateData, Mod, + Time, HibernateAfterTimeout, Debug, false). + +wake_hib(Parent, Name, StateName, StateData, Mod, + HibernateAfterTimeout, Debug) -> + Msg = receive Input -> Input end, + decode_msg(Msg, Parent, Name, StateName, StateData, Mod, + hibernate, HibernateAfterTimeout, Debug, true). + +decode_msg(Msg, Parent, Name, StateName, StateData, Mod, + Time, HibernateAfterTimeout, Debug, Hib) -> + case Msg of + {system, From, Req} -> + sys:handle_system_msg(Req, From, Parent, ?MODULE, Debug, + [Name, StateName, StateData, Mod, Time, + HibernateAfterTimeout], + Hib); + {'EXIT', Parent, Reason} -> + terminate(Reason, Name, Msg, Mod, StateName, StateData, + Debug); + _Msg when Debug =:= [] -> + handle_msg(Msg, Parent, Name, StateName, StateData, Mod, + Time, HibernateAfterTimeout); + _Msg -> + Debug1 = sys:handle_debug(Debug, fun print_event/3, + {Name, StateName}, {in, Msg}), + handle_msg(Msg, Parent, Name, StateName, StateData, Mod, + Time, HibernateAfterTimeout, Debug1) + end. + +%%----------------------------------------------------------------- +%% Callback functions for system messages handling. +%%----------------------------------------------------------------- +system_continue(Parent, Debug, + [Name, StateName, StateData, Mod, Time, + HibernateAfterTimeout]) -> + loop(Parent, Name, StateName, StateData, Mod, Time, + HibernateAfterTimeout, Debug). + +-spec system_terminate(term(), _, _, + [term(), ...]) -> no_return(). + +system_terminate(Reason, _Parent, Debug, + [Name, StateName, StateData, Mod, _Time, + _HibernateAfterTimeout]) -> + terminate(Reason, Name, [], Mod, StateName, StateData, + Debug). + +system_code_change([Name, StateName, StateData, Module, + Time, HibernateAfterTimeout], + _Module, OldVsn, Extra) -> + case catch Module:code_change(OldVsn, StateName, + StateData, Extra) + of + {ok, NewStateName, NewStateData} -> + {ok, + [Name, NewStateName, NewStateData, Module, Time, + HibernateAfterTimeout]}; + Else -> Else + end. + +system_get_state([_Name, StateName, StateData, _Mod, + _Time, _HibernateAfterTimeout]) -> + {ok, {StateName, StateData}}. + +system_replace_state(StateFun, + [Name, StateName, StateData, Mod, Time, + HibernateAfterTimeout]) -> + Result = {NStateName, NStateData} = StateFun({StateName, + StateData}), + {ok, Result, + [Name, NStateName, NStateData, Mod, Time, + HibernateAfterTimeout]}. + +%%----------------------------------------------------------------- +%% Format debug messages. Print them as the call-back module sees +%% them, not as the real erlang messages. Use trace for that. +%%----------------------------------------------------------------- +print_event(Dev, {in, Msg}, {Name, StateName}) -> + case Msg of + {'$gen_event', Event} -> + io:format(Dev, "*DBG* ~tp got event ~tp in state ~tw~n", + [Name, Event, StateName]); + {'$gen_all_state_event', Event} -> + io:format(Dev, + "*DBG* ~tp got all_state_event ~tp in " + "state ~tw~n", + [Name, Event, StateName]); + {timeout, Ref, {'$gen_timer', Message}} -> + io:format(Dev, "*DBG* ~tp got timer ~tp in state ~tw~n", + [Name, {timeout, Ref, Message}, StateName]); + {timeout, _Ref, {'$gen_event', Event}} -> + io:format(Dev, "*DBG* ~tp got timer ~tp in state ~tw~n", + [Name, Event, StateName]); + _ -> + io:format(Dev, "*DBG* ~tp got ~tp in state ~tw~n", + [Name, Msg, StateName]) + end; +print_event(Dev, {out, Msg, To, StateName}, Name) -> + io:format(Dev, + "*DBG* ~tp sent ~tp to ~tw~n and " + "switched to state ~tw~n", + [Name, Msg, To, StateName]); +print_event(Dev, return, {Name, StateName}) -> + io:format(Dev, "*DBG* ~tp switched to state ~tw~n", + [Name, StateName]). + +handle_msg(Msg, Parent, Name, StateName, StateData, Mod, + _Time, HibernateAfterTimeout) -> + %No debug here + From = from(Msg), + case catch dispatch(Msg, Mod, StateName, StateData) of + {next_state, NStateName, NStateData} -> + loop(Parent, Name, NStateName, NStateData, Mod, + infinity, HibernateAfterTimeout, []); + {next_state, NStateName, NStateData, Time1} -> + loop(Parent, Name, NStateName, NStateData, Mod, Time1, + HibernateAfterTimeout, []); + {reply, Reply, NStateName, NStateData} + when From =/= undefined -> + reply(From, Reply), + loop(Parent, Name, NStateName, NStateData, Mod, + infinity, HibernateAfterTimeout, []); + {reply, Reply, NStateName, NStateData, Time1} + when From =/= undefined -> + reply(From, Reply), + loop(Parent, Name, NStateName, NStateData, Mod, Time1, + HibernateAfterTimeout, []); + {stop, Reason, NStateData} -> + terminate(Reason, Name, Msg, Mod, StateName, NStateData, + []); + {stop, Reason, Reply, NStateData} + when From =/= undefined -> + {'EXIT', R} = (catch terminate(Reason, Name, Msg, Mod, + StateName, NStateData, [])), + reply(From, Reply), + exit(R); + {'EXIT', + {undef, [{Mod, handle_info, [_, _, _], _} | _]}} -> + error_logger:warning_msg("** Undefined handle_info in ~p~n** Unhandled " + "message: ~tp~n", + [Mod, Msg]), + loop(Parent, Name, StateName, StateData, Mod, infinity, + HibernateAfterTimeout, []); + {'EXIT', What} -> + terminate(What, Name, Msg, Mod, StateName, StateData, + []); + Reply -> + terminate({bad_return_value, Reply}, Name, Msg, Mod, + StateName, StateData, []) + end. + +handle_msg(Msg, Parent, Name, StateName, StateData, Mod, + _Time, HibernateAfterTimeout, Debug) -> + From = from(Msg), + case catch dispatch(Msg, Mod, StateName, StateData) of + {next_state, NStateName, NStateData} -> + Debug1 = sys:handle_debug(Debug, fun print_event/3, + {Name, NStateName}, return), + loop(Parent, Name, NStateName, NStateData, Mod, + infinity, HibernateAfterTimeout, Debug1); + {next_state, NStateName, NStateData, Time1} -> + Debug1 = sys:handle_debug(Debug, fun print_event/3, + {Name, NStateName}, return), + loop(Parent, Name, NStateName, NStateData, Mod, Time1, + HibernateAfterTimeout, Debug1); + {reply, Reply, NStateName, NStateData} + when From =/= undefined -> + Debug1 = reply(Name, From, Reply, Debug, NStateName), + loop(Parent, Name, NStateName, NStateData, Mod, + infinity, HibernateAfterTimeout, Debug1); + {reply, Reply, NStateName, NStateData, Time1} + when From =/= undefined -> + Debug1 = reply(Name, From, Reply, Debug, NStateName), + loop(Parent, Name, NStateName, NStateData, Mod, Time1, + HibernateAfterTimeout, Debug1); + {stop, Reason, NStateData} -> + terminate(Reason, Name, Msg, Mod, StateName, NStateData, + Debug); + {stop, Reason, Reply, NStateData} + when From =/= undefined -> + {'EXIT', R} = (catch terminate(Reason, Name, Msg, Mod, + StateName, NStateData, Debug)), + _ = reply(Name, From, Reply, Debug, StateName), + exit(R); + {'EXIT', What} -> + terminate(What, Name, Msg, Mod, StateName, StateData, + Debug); + Reply -> + terminate({bad_return_value, Reply}, Name, Msg, Mod, + StateName, StateData, Debug) + end. + +dispatch({'$gen_event', Event}, Module, StateName, + StateData) -> + Module:StateName(Event, StateData); +dispatch({'$gen_all_state_event', Event}, Module, + StateName, StateData) -> + Module:handle_event(Event, StateName, StateData); +dispatch({'$gen_sync_event', From, Event}, Module, + StateName, StateData) -> + Module:StateName(Event, From, StateData); +dispatch({'$gen_sync_all_state_event', From, Event}, + Module, StateName, StateData) -> + Module:handle_sync_event(Event, From, StateName, + StateData); +dispatch({timeout, Ref, {'$gen_timer', Msg}}, Module, + StateName, StateData) -> + Module:StateName({timeout, Ref, Msg}, StateData); +dispatch({timeout, _Ref, {'$gen_event', Event}}, Module, + StateName, StateData) -> + Module:StateName(Event, StateData); +dispatch(Info, Module, StateName, StateData) -> + Module:handle_info(Info, StateName, StateData). + +from({'$gen_sync_event', From, _Event}) -> From; +from({'$gen_sync_all_state_event', From, _Event}) -> + From; +from(_) -> undefined. + +%% Send a reply to the client. +reply({To, Tag}, Reply) -> catch To ! {Tag, Reply}. + +reply(Name, {To, Tag}, Reply, Debug, StateName) -> + reply({To, Tag}, Reply), + sys:handle_debug(Debug, fun print_event/3, Name, + {out, Reply, To, StateName}). + +%%% --------------------------------------------------- +%%% Terminate the server. +%%% --------------------------------------------------- + +-spec terminate(term(), _, _, atom(), _, _, + _) -> no_return(). + +terminate(Reason, Name, Msg, Module, StateName, + StateData, Debug) -> + case erlang:function_exported(Module, terminate, 3) of + true -> + case catch Module:terminate(Reason, StateName, + StateData) + of + {'EXIT', R} -> + FmtStateData = format_status(terminate, Module, get(), + StateData), + error_info(R, Name, Msg, StateName, FmtStateData, + Debug), + exit(R); + _ -> ok + end; + false -> ok + end, + case Reason of + normal -> exit(normal); + shutdown -> exit(shutdown); + {shutdown, _} = Shutdown -> exit(Shutdown); + _ -> + FmtStateData1 = format_status(terminate, Module, get(), + StateData), + error_info(Reason, Name, Msg, StateName, FmtStateData1, + Debug), + exit(Reason) + end. + +error_info(Reason, Name, Msg, StateName, StateData, + Debug) -> + Reason1 = case Reason of + {undef, [{M, F, A, L} | MFAs]} -> + case code:is_loaded(M) of + false -> + {'module could not be loaded', [{M, F, A, L} | MFAs]}; + _ -> + case erlang:function_exported(M, F, length(A)) of + true -> Reason; + false -> + {'function not exported', [{M, F, A, L} | MFAs]} + end + end; + _ -> Reason + end, + Str = "** State machine ~tp terminating \n" ++ + get_msg_str(Msg) ++ + "** When State == ~tp~n** Data " + "== ~tp~n** Reason for termination = " + "~n** ~tp~n", + format(Str, + [Name, get_msg(Msg), StateName, StateData, Reason1]), + sys:print_log(Debug), + ok. + +get_msg_str({'$gen_event', _Event}) -> + "** Last event in was ~tp~n"; +get_msg_str({'$gen_sync_event', _Event}) -> + "** Last sync event in was ~tp~n"; +get_msg_str({'$gen_all_state_event', _Event}) -> + "** Last event in was ~tp (for all states)~n"; +get_msg_str({'$gen_sync_all_state_event', _Event}) -> + "** Last sync event in was ~tp (for all " + "states)~n"; +get_msg_str({timeout, _Ref, {'$gen_timer', _Msg}}) -> + "** Last timer event in was ~tp~n"; +get_msg_str({timeout, _Ref, {'$gen_event', _Msg}}) -> + "** Last timer event in was ~tp~n"; +get_msg_str(_Msg) -> "** Last message in was ~tp~n". + +get_msg({'$gen_event', Event}) -> Event; +get_msg({'$gen_sync_event', Event}) -> Event; +get_msg({'$gen_all_state_event', Event}) -> Event; +get_msg({'$gen_sync_all_state_event', Event}) -> Event; +get_msg({timeout, Ref, {'$gen_timer', Msg}}) -> + {timeout, Ref, Msg}; +get_msg({timeout, _Ref, {'$gen_event', Event}}) -> + Event; +get_msg(Msg) -> Msg. + +%%----------------------------------------------------------------- +%% Status information +%%----------------------------------------------------------------- + +-if((?OTP_RELEASE) >= 22). + +format_status(Opt, StatusData) -> + [PDict, SysState, Parent, Debug, + [Name, StateName, StateData, Mod, _Time, + _HibernateAfterTimeout]] = + StatusData, + Header = + gen:format_status_header("Status for state machine", + Name), + Log = sys:get_log(Debug), + Specfic = format_status(Opt, Mod, PDict, StateData), + Specfic = case format_status(Opt, Mod, PDict, StateData) + of + S when is_list(S) -> S; + S -> [S] + end, + [{header, Header}, + {data, + [{"Status", SysState}, {"Parent", Parent}, + {"Logged events", Log}, {"StateName", StateName}]} + | Specfic]. + +-elif((?OTP_RELEASE) >= 21). + +format_status(Opt, StatusData) -> + [PDict, SysState, Parent, Debug, + [Name, StateName, StateData, Mod, _Time, + _HibernateAfterTimeout]] = + StatusData, + Header = + gen:format_status_header("Status for state machine", + Name), + %% Log = sys:get_log(Debug), + Log = sys:get_debug(log, Debug, []), + Specfic = format_status(Opt, Mod, PDict, StateData), + Specfic = case format_status(Opt, Mod, PDict, StateData) + of + S when is_list(S) -> S; + S -> [S] + end, + [{header, Header}, + {data, + [{"Status", SysState}, {"Parent", Parent}, + {"Logged events", Log}, {"StateName", StateName}]} + | Specfic]. + +-endif. + +format_status(Opt, Module, PDict, State) -> + DefStatus = case Opt of + terminate -> State; + _ -> [{data, [{"StateData", State}]}] + end, + case erlang:function_exported(Module, format_status, 2) + of + true -> + case catch Module:format_status(Opt, [PDict, State]) of + {'EXIT', _} -> DefStatus; + Else -> Else + end; + _ -> DefStatus + end. diff --git a/src/gen_nb_server.erl b/src/gen_nb_server.erl index caf855f6e..1e1395fd7 100644 --- a/src/gen_nb_server.erl +++ b/src/gen_nb_server.erl @@ -28,153 +28,200 @@ -export([start_link/4]). %% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). -define(SERVER, ?MODULE). --record(state, {cb, - sock, - server_state}). - --callback init(InitArgs::list()) -> - {ok, State::term()} | - {error, Reason::term()}. - --callback handle_call(Msg::term(), From::{pid(), term()}, State::term()) -> - {reply, Reply::term(), State::term()} | - {reply, Reply::term(), State::term(), number() | hibernate} | - {noreply, State::term()} | - {noreply, State::term(), number() | hibernate} | - {stop, Reason::term(), State::term()}. - --callback handle_cast(Msg::term(), State::term()) -> - {noreply, State::term()} | - {noreply, State::term(), number() | hibernate} | - {stop, Reason::term(), State::term()}. - --callback handle_info(Msg::term(), State::term()) -> - {noreply, State::term()} | - {noreply, State::term(), number() | hibernate} | - {stop, Reason::term(), State::term()}. - --callback terminate(Reason::term(), State::term()) -> - ok. +-record(state, {cb, sock, server_state}). + +-callback init(InitArgs :: list()) -> {ok, + State :: term()} | + {error, Reason :: term()}. + +-callback handle_call(Msg :: term(), + From :: {pid(), term()}, State :: term()) -> {reply, + Reply :: + term(), + State :: + term()} | + {reply, + Reply :: + term(), + State :: + term(), + number() | + hibernate} | + {noreply, + State :: + term()} | + {noreply, + State :: + term(), + number() | + hibernate} | + {stop, + Reason :: + term(), + State :: + term()}. + +-callback handle_cast(Msg :: term(), + State :: term()) -> {noreply, State :: term()} | + {noreply, State :: term(), + number() | hibernate} | + {stop, Reason :: term(), + State :: term()}. + +-callback handle_info(Msg :: term(), + State :: term()) -> {noreply, State :: term()} | + {noreply, State :: term(), + number() | hibernate} | + {stop, Reason :: term(), + State :: term()}. + +-callback terminate(Reason :: term(), + State :: term()) -> ok. -callback sock_opts() -> [gen_tcp:listen_option()]. --callback new_connection(inet:socket(), State::term()) -> - {ok, NewState::term()} | - {stop, Reason::term(), NewState::term()}. +-callback new_connection(inet:socket(), + State :: term()) -> {ok, NewState :: term()} | + {stop, Reason :: term(), + NewState :: term()}. -%% @spec start_link(CallbackModule, IpAddr, Port, InitParams) -> Result -%% CallbackModule = atom() +%% @spec start_link(Module, IpAddr, Port, InitParams) -> Result +%% Module = atom() %% IpAddr = string() %% Port = integer() %% InitParams = [any()] %% Result = {ok, pid()} | {error, any()} %% @doc Start server listening on IpAddr:Port -start_link(CallbackModule, IpAddr, Port, InitParams) -> - gen_server:start_link(?MODULE, [CallbackModule, IpAddr, Port, InitParams], []). +start_link(Module, IpAddr, Port, InitParams) -> + gen_server:start_link(?MODULE, + [Module, IpAddr, Port, InitParams], []). %% @hidden -init([CallbackModule, IpAddr, Port, InitParams]) -> - case CallbackModule:init(InitParams) of - {ok, ServerState} -> - case listen_on(CallbackModule, IpAddr, Port) of - {ok, Sock} -> - {ok, #state{cb=CallbackModule, sock=Sock, server_state=ServerState}}; - Error -> - CallbackModule:terminate(Error, ServerState), - Error - end; - Err -> - Err - end. +init([Module, IpAddr, Port, InitParams]) -> + case Module:init(InitParams) of + {ok, ServerState} -> + case listen_on(Module, IpAddr, Port) of + {ok, Sock} -> + {ok, + #state{cb = Module, sock = Sock, + server_state = ServerState}}; + Error -> Module:terminate(Error, ServerState), Error + end; + Err -> Err + end. %% @hidden -handle_call(Request, From, #state{cb=Callback, server_state=ServerState}=State) -> - case Callback:handle_call(Request, From, ServerState) of - {reply, Reply, NewServerState} -> - {reply, Reply, State#state{server_state=NewServerState}}; - {reply, Reply, NewServerState, Arg} when Arg =:= hibernate orelse is_number(Arg) -> - {reply, Reply, State#state{server_state=NewServerState}, Arg}; - {noreply, NewServerState} -> - {noreply, State#state{server_state=NewServerState}}; - {noreply, NewServerState, Arg} when Arg =:= hibernate orelse is_number(Arg) -> - {noreply, State#state{server_state=NewServerState}, Arg}; - {stop, Reason, NewServerState} -> - {stop, Reason, State#state{server_state=NewServerState}}; - {stop, Reason, Reply, NewServerState} -> - {stop, Reason, Reply, State#state{server_state=NewServerState}} - end. +handle_call(Request, From, + #state{cb = Module, server_state = ServerState} = + State) -> + case Module:handle_call(Request, From, ServerState) of + {reply, Reply, NewServerState} -> + {reply, Reply, + State#state{server_state = NewServerState}}; + {reply, Reply, NewServerState, Arg} + when Arg =:= hibernate orelse is_number(Arg) -> + {reply, Reply, + State#state{server_state = NewServerState}, Arg}; + {noreply, NewServerState} -> + {noreply, State#state{server_state = NewServerState}}; + {noreply, NewServerState, Arg} + when Arg =:= hibernate orelse is_number(Arg) -> + {noreply, State#state{server_state = NewServerState}, + Arg}; + {stop, Reason, NewServerState} -> + {stop, Reason, + State#state{server_state = NewServerState}}; + {stop, Reason, Reply, NewServerState} -> + {stop, Reason, Reply, + State#state{server_state = NewServerState}} + end. %% @hidden -handle_cast(Msg, #state{cb=Callback, server_state=ServerState}=State) -> - case Callback:handle_cast(Msg, ServerState) of - {noreply, NewServerState} -> - {noreply, State#state{server_state=NewServerState}}; - {noreply, NewServerState, Arg} when Arg =:= hibernate orelse is_number(Arg) -> - {noreply, State#state{server_state=NewServerState}, Arg}; - {stop, Reason, NewServerState} -> - {stop, Reason, State#state{server_state=NewServerState}} - end. +handle_cast(Msg, + #state{cb = Module, server_state = ServerState} = + State) -> + case Module:handle_cast(Msg, ServerState) of + {noreply, NewServerState} -> + {noreply, State#state{server_state = NewServerState}}; + {noreply, NewServerState, Arg} + when Arg =:= hibernate orelse is_number(Arg) -> + {noreply, State#state{server_state = NewServerState}, + Arg}; + {stop, Reason, NewServerState} -> + {stop, Reason, + State#state{server_state = NewServerState}} + end. %% @hidden -handle_info({inet_async, ListSock, _Ref, {ok, CliSocket}}, #state{cb=Callback, server_state=ServerState}=State) -> - inet_db:register_socket(CliSocket, inet_tcp), - case Callback:new_connection(CliSocket, ServerState) of - {ok, NewServerState} -> - {ok, _} = prim_inet:async_accept(ListSock, -1), - {noreply, State#state{server_state=NewServerState}}; - {stop, Reason, NewServerState} -> - {stop, Reason, State#state{server_state=NewServerState}} - end; - -handle_info(Info, #state{cb=Callback, server_state=ServerState}=State) -> - case Callback:handle_info(Info, ServerState) of - {noreply, NewServerState} -> - {noreply, State#state{server_state=NewServerState}}; - {noreply, NewServerState, Arg} when Arg =:= hibernate orelse is_number(Arg) -> - {noreply, State#state{server_state=NewServerState}, Arg}; - {stop, Reason, NewServerState} -> - {stop, Reason, State#state{server_state=NewServerState}} - end. +handle_info({inet_async, ListSock, _Ref, + {ok, CliSocket}}, + #state{cb = Module, server_state = ServerState} = + State) -> + inet_db:register_socket(CliSocket, inet_tcp), + case Module:new_connection(CliSocket, ServerState) of + {ok, NewServerState} -> + {ok, _} = prim_inet:async_accept(ListSock, -1), + {noreply, State#state{server_state = NewServerState}}; + {stop, Reason, NewServerState} -> + {stop, Reason, + State#state{server_state = NewServerState}} + end; +handle_info(Info, + #state{cb = Module, server_state = ServerState} = + State) -> + case Module:handle_info(Info, ServerState) of + {noreply, NewServerState} -> + {noreply, State#state{server_state = NewServerState}}; + {noreply, NewServerState, Arg} + when Arg =:= hibernate orelse is_number(Arg) -> + {noreply, State#state{server_state = NewServerState}, + Arg}; + {stop, Reason, NewServerState} -> + {stop, Reason, + State#state{server_state = NewServerState}} + end. %% @hidden -terminate(Reason, #state{cb=Callback, sock=Sock, server_state=ServerState}) -> - gen_tcp:close(Sock), - Callback:terminate(Reason, ServerState), - ok. +terminate(Reason, + #state{cb = Module, sock = Sock, + server_state = ServerState}) -> + gen_tcp:close(Sock), + Module:terminate(Reason, ServerState), + ok. %% @hidden -code_change(_OldVsn, State, _Extra) -> - {ok, State}. +code_change(_OldVsn, State, _Extra) -> {ok, State}. %% Internal functions %% @hidden -%% @spec listen_on(CallbackModule, IpAddr, Port) -> Result -%% CallbackModule = atom() +%% @spec listen_on(Module, IpAddr, Port) -> Result +%% Module = atom() %% IpAddr = string() | tuple() %% Port = integer() %% Result = {ok, port()} | {error, any()} -listen_on(CallbackModule, IpAddr, Port) when is_tuple(IpAddr) andalso - (8 =:= size(IpAddr) orelse - 4 =:= size(IpAddr)) -> - SockOpts = [{ip, IpAddr}|CallbackModule:sock_opts()], +listen_on(Module, IpAddr, Port) + when is_tuple(IpAddr) andalso + (8 =:= size(IpAddr) orelse 4 =:= size(IpAddr)) -> + SockOpts = [{ip, IpAddr} | Module:sock_opts()], case gen_tcp:listen(Port, SockOpts) of - {ok, LSock} -> - {ok, _Ref} = prim_inet:async_accept(LSock, -1), - {ok, LSock}; - Err -> - Err + {ok, LSock} -> + {ok, _Ref} = prim_inet:async_accept(LSock, -1), + {ok, LSock}; + Err -> Err end; -listen_on(CallbackModule, IpAddrStr, Port) -> +listen_on(Module, IpAddrStr, Port) -> case inet_parse:address(IpAddrStr) of - {ok, IpAddr} -> - listen_on(CallbackModule, IpAddr, Port); - Err -> - logger:critical("Cannot start listener for ~p on invalid address ~p:~p", [CallbackModule, IpAddrStr, Port]), - Err + {ok, IpAddr} -> listen_on(Module, IpAddr, Port); + Err -> + logger:critical("Cannot start listener for ~p\n " + " on invalid address " + "~p:~p", + [Module, IpAddrStr, Port]), + Err end. diff --git a/src/riak_core.app.src b/src/riak_core.app.src index 7df7a4e4f..f5f327bd9 100644 --- a/src/riak_core.app.src +++ b/src/riak_core.app.src @@ -1,40 +1,32 @@ -{application,riak_core, - [{description,"Riak Core"}, - {vsn,"4.0.0"}, - {modules,[]}, - {registered,[]}, - {included_applications,[chash, syntax_tools, compiler]}, +{application, riak_core, + [{description, "Riak Core Lite"}, + {vsn,"0.10.1"}, {applications, - [ - kernel,stdlib,crypto,os_mon, - gen_fsm_compat, - basho_stats,poolboy - ]}, - {mod,{riak_core_app,[]}}, + [kernel, stdlib, crypto, os_mon, poolboy] + }, + {mod, {riak_core_app, []}}, {env, - [{cluster_name,"default"}, - {platform_data_dir,"data"}, - {ring_state_dir,"data/ring"}, - {ring_creation_size,64}, + [{cluster_name, "default"}, + {platform_data_dir, "data"}, + {ring_state_dir, "data/ring"}, + {ring_creation_size, 64}, {gossip_interval, 60000}, - {target_n_val,4}, + {target_n_val, 4}, {vnode_inactivity_timeout, 60000}, {vnode_check_interval, 5000}, {vnode_overload_threshold, 10000}, {vnode_modules, []}, {vnode_routing, proxy}, - {handoff_concurrency,2}, + {handoff_concurrency, 2}, {handoff_receive_timeout, 300000}, % 5 minutes TCP timeout {handoff_receive_vnode_timeout, 60000}, % timeout for vnode to process the hand-off data msg - {default_bucket_props, []}, - {handoff_port,8099}, - {handoff_ip,"0.0.0.0"}, - {bucket_fixups, []}, - {bucket_validators, []}, + {handoff_port, 8099}, + {handoff_ip, "0.0.0.0"}, {stat_mods, []}, {health_checks, []} -]}, -{pkg_name,"riak_core"}, - {maintainers,["AntidoteDB","Albert Schimpf"]}, - {licenses,["Apache"]}, - {links,[{"Github","https://github.com/AntidoteDB/riak_core"}]}]}. + ]}, + {pkg_name, "riak_core_lite"}, + {maintainers, ["riak_core_lite", "Albert Schimpf"]}, + {licenses, ["Apache"]}, + {links, [{"Github", "https://github.com/riak-core-lite/riak_core_lite"}]} + ]}. diff --git a/src/riak_core.erl b/src/riak_core.erl index c24e235c3..1ee62dbfb 100644 --- a/src/riak_core.erl +++ b/src/riak_core.erl @@ -20,18 +20,27 @@ %% %% ------------------------------------------------------------------- -module(riak_core). --export([stop/0, stop/1, join/1, join/4, staged_join/1, remove/1, down/1, - leave/0, remove_from_cluster/1]). + +-export([stop/0, stop/1, join/1, join/4, staged_join/1, + remove/1, down/1, leave/0, remove_from_cluster/1]). + -export([vnode_modules/0, health_check/1]). --export([register/1, register/2, bucket_fixups/0, bucket_validators/0]). + +-export([register/1, register/2]). + -export([stat_mods/0, stat_prefix/0]). --export([add_guarded_event_handler/3, add_guarded_event_handler/4]). +-export([add_guarded_event_handler/3, + add_guarded_event_handler/4]). + -export([delete_guarded_event_handler/3]). + -export([wait_for_application/1, wait_for_service/1]). --compile({no_auto_import,[register/2]}). --define(WAIT_PRINT_INTERVAL, (60 * 1000)). +-compile({no_auto_import, [{register, 2}]}). + +-define(WAIT_PRINT_INTERVAL, 60 * 1000). + -define(WAIT_POLL_INTERVAL, 100). %% @spec stop() -> ok @@ -39,63 +48,59 @@ stop() -> stop("riak stop requested"). -ifdef(TEST). + stop(Reason) -> logger:notice("~p", [Reason]), % if we're in test mode, we don't want to halt the node, so instead % we just stop the application. application:stop(riak_core). + -else. + stop(Reason) -> % we never do an application:stop because that makes it very hard % to really halt the runtime, which is what we need here. logger:notice("~p", [Reason]), init:stop(). + -endif. %% %% @doc Join the ring found on the specified remote node %% -join(Node) -> - join(Node, false). +join(Node) -> join(Node, false). %% @doc Join the remote cluster without automatically claiming ring %% ownership. Used to stage a join in the newer plan/commit %% approach to cluster administration. See {@link riak_core_claimant} -staged_join(Node) -> - join(Node, false). +staged_join(Node) -> join(Node, false). join(NodeStr, Auto) when is_list(NodeStr) -> join(riak_core_util:str_to_node(NodeStr), Auto); join(Node, Auto) when is_atom(Node) -> join(node(), Node, Auto). -join(Node, Node, _) -> - {error, self_join}; -join(_, Node, Auto) -> - join(node(), Node, false, Auto). +join(Node, Node, _) -> {error, self_join}; +join(_, Node, Auto) -> join(node(), Node, false, Auto). join(_, Node, Rejoin, Auto) -> case net_adm:ping(Node) of - pang -> - {error, not_reachable}; - pong -> - standard_join(Node, Rejoin, Auto) + pang -> {error, not_reachable}; + pong -> standard_join(Node, Rejoin, Auto) end. get_other_ring(Node) -> - riak_core_util:safe_rpc(Node, riak_core_ring_manager, get_raw_ring, []). + riak_core_util:safe_rpc(Node, riak_core_ring_manager, + get_raw_ring, []). standard_join(Node, Rejoin, Auto) when is_atom(Node) -> case net_adm:ping(Node) of - pong -> - case get_other_ring(Node) of - {ok, Ring} -> - standard_join(Node, Ring, Rejoin, Auto); - _ -> - {error, unable_to_get_join_ring} - end; - pang -> - {error, not_reachable} + pong -> + case get_other_ring(Node) of + {ok, Ring} -> standard_join(Node, Ring, Rejoin, Auto); + _ -> {error, unable_to_get_join_ring} + end; + pang -> {error, not_reachable} end. %% `init:get_status/0' will return a 2-tuple reflecting the init @@ -103,254 +108,202 @@ standard_join(Node, Rejoin, Auto) when is_atom(Node) -> %% `started', or `stopping'. We only want to allow join actions if all %% applications have finished starting to avoid ring status race %% conditions. -init_complete({started, _}) -> - true; -init_complete(_) -> - false. +init_complete({started, _}) -> true; +init_complete(_) -> false. standard_join(Node, Ring, Rejoin, Auto) -> {ok, MyRing} = riak_core_ring_manager:get_raw_ring(), - InitComplete = init_complete(init:get_status()), - - SameSize = (riak_core_ring:num_partitions(MyRing) =:= - riak_core_ring:num_partitions(Ring)), - Singleton = ([node()] =:= riak_core_ring:all_members(MyRing)), + SameSize = riak_core_ring:num_partitions(MyRing) =:= + riak_core_ring:num_partitions(Ring), + Singleton = [node()] =:= + riak_core_ring:all_members(MyRing), case {InitComplete, Rejoin or Singleton, SameSize} of - {false, _, _} -> - {error, node_still_starting}; - {_, false, _} -> - {error, not_single_node}; - {_, _, false} -> - {error, different_ring_sizes}; - _ -> - Ring2 = riak_core_ring:add_member(node(), Ring, - node()), - Ring3 = riak_core_ring:set_owner(Ring2, node()), - Ring4 = - riak_core_ring:update_member_meta(node(), - Ring3, - node(), - gossip_vsn, - 2), - Ring5 = Ring4, - Ring6 = maybe_auto_join(Auto, node(), Ring5), - riak_core_ring_manager:set_my_ring(Ring6), - riak_core_gossip:send_ring(Node, node()) + {false, _, _} -> {error, node_still_starting}; + {_, false, _} -> {error, not_single_node}; + {_, _, false} -> {error, different_ring_sizes}; + _ -> + Ring2 = riak_core_ring:add_member(node(), Ring, node()), + Ring3 = riak_core_ring:set_owner(Ring2, node()), + Ring4 = riak_core_ring:update_member_meta(node(), Ring3, + node(), gossip_vsn, 2), + Ring5 = Ring4, + Ring6 = maybe_auto_join(Auto, node(), Ring5), + riak_core_ring_manager:set_my_ring(Ring6), + riak_core_gossip:send_ring(Node, node()) end. -maybe_auto_join(false, _Node, Ring) -> - Ring; +maybe_auto_join(false, _Node, Ring) -> Ring; maybe_auto_join(true, Node, Ring) -> - riak_core_ring:update_member_meta(Node, Ring, Node, '$autojoin', true). + riak_core_ring:update_member_meta(Node, Ring, Node, + '$autojoin', true). remove(Node) -> {ok, Ring} = riak_core_ring_manager:get_raw_ring(), case {riak_core_ring:all_members(Ring), - riak_core_ring:member_status(Ring, Node)} of - {_, invalid} -> - {error, not_member}; - {[Node], _} -> - {error, only_member}; - _ -> - standard_remove(Node) + riak_core_ring:member_status(Ring, Node)} + of + {_, invalid} -> {error, not_member}; + {[Node], _} -> {error, only_member}; + _ -> standard_remove(Node) end. standard_remove(Node) -> - riak_core_ring_manager:ring_trans( - fun(Ring2, _) -> - Ring3 = riak_core_ring:remove_member(node(), Ring2, Node), - Ring4 = riak_core_ring:ring_changed(node(), Ring3), - {new_ring, Ring4} - end, []), + riak_core_ring_manager:ring_trans(fun (Ring2, _) -> + Ring3 = + riak_core_ring:remove_member(node(), + Ring2, + Node), + Ring4 = + riak_core_ring:ring_changed(node(), + Ring3), + {new_ring, Ring4} + end, + []), ok. down(Node) -> {ok, Ring} = riak_core_ring_manager:get_raw_ring(), case net_adm:ping(Node) of - pong -> - {error, is_up}; - pang -> - case {riak_core_ring:all_members(Ring), - riak_core_ring:member_status(Ring, Node)} of - {_, invalid} -> - {error, not_member}; - {[Node], _} -> - {error, only_member}; - _ -> - riak_core_ring_manager:ring_trans( - fun(Ring2, _) -> - Ring3 = riak_core_ring:down_member(node(), Ring2, Node), - Ring4 = riak_core_ring:ring_changed(node(), Ring3), - {new_ring, Ring4} - end, []), - ok - end + pong -> {error, is_up}; + pang -> + case {riak_core_ring:all_members(Ring), + riak_core_ring:member_status(Ring, Node)} + of + {_, invalid} -> {error, not_member}; + {[Node], _} -> {error, only_member}; + _ -> + riak_core_ring_manager:ring_trans(fun (Ring2, _) -> + Ring3 = + riak_core_ring:down_member(node(), + Ring2, + Node), + Ring4 = + riak_core_ring:ring_changed(node(), + Ring3), + {new_ring, Ring4} + end, + []), + ok + end end. leave() -> Node = node(), {ok, Ring} = riak_core_ring_manager:get_raw_ring(), case {riak_core_ring:all_members(Ring), - riak_core_ring:member_status(Ring, Node)} of - {_, invalid} -> - {error, not_member}; - {[Node], _} -> - {error, only_member}; - {_, valid} -> - standard_leave(Node); - {_, _} -> - {error, already_leaving} + riak_core_ring:member_status(Ring, Node)} + of + {_, invalid} -> {error, not_member}; + {[Node], _} -> {error, only_member}; + {_, valid} -> standard_leave(Node); + {_, _} -> {error, already_leaving} end. standard_leave(Node) -> - riak_core_ring_manager:ring_trans( - fun(Ring2, _) -> - Ring3 = riak_core_ring:leave_member(Node, Ring2, Node), - {new_ring, Ring3} - end, []), + riak_core_ring_manager:ring_trans(fun (Ring2, _) -> + Ring3 = + riak_core_ring:leave_member(Node, + Ring2, + Node), + {new_ring, Ring3} + end, + []), ok. %% @spec remove_from_cluster(ExitingNode :: atom()) -> term() %% @doc Cause all partitions owned by ExitingNode to be taken over %% by other nodes. -remove_from_cluster(ExitingNode) when is_atom(ExitingNode) -> +remove_from_cluster(ExitingNode) + when is_atom(ExitingNode) -> remove(ExitingNode). vnode_modules() -> case application:get_env(riak_core, vnode_modules) of - undefined -> []; - {ok, Mods} -> Mods - end. - -bucket_fixups() -> - case application:get_env(riak_core, bucket_fixups) of - undefined -> []; - {ok, Mods} -> Mods - end. - -bucket_validators() -> - case application:get_env(riak_core, bucket_validators) of - undefined -> []; - {ok, Mods} -> Mods + undefined -> []; + {ok, Mods} -> Mods end. stat_mods() -> case application:get_env(riak_core, stat_mods) of - undefined -> []; - {ok, Mods} -> Mods + undefined -> []; + {ok, Mods} -> Mods end. health_check(App) -> case application:get_env(riak_core, health_checks) of - undefined -> - undefined; - {ok, Mods} -> - case lists:keyfind(App, 1, Mods) of - false -> - undefined; - {App, MFA} -> - MFA - end + undefined -> undefined; + {ok, Mods} -> + case lists:keyfind(App, 1, Mods) of + false -> undefined; + {App, MFA} -> MFA + end end. %% Get the application name if not supplied, first by get_application %% then by searching by module name get_app(undefined, Module) -> {ok, App} = case application:get_application(self()) of - {ok, AppName} -> {ok, AppName}; - undefined -> app_for_module(Module) + {ok, AppName} -> {ok, AppName}; + undefined -> app_for_module(Module) end, App; -get_app(App, _Module) -> - App. +get_app(App, _Module) -> App. %% @doc Register a riak_core application. -register(Props) -> - register(undefined, Props). +register(Props) -> register(undefined, Props). %% @doc Register a named riak_core application. register(_App, []) -> %% Once the app is registered, do a no-op ring trans %% to ensure the new fixups are run against %% the ring. - {ok, _R} = riak_core_ring_manager:ring_trans(fun(R,_A) -> {new_ring, R} end, + {ok, _R} = riak_core_ring_manager:ring_trans(fun (R, + _A) -> + {new_ring, R} + end, undefined), riak_core_ring_events:force_sync_update(), ok; -register(App, [{bucket_fixup, FixupMod}|T]) -> - register_mod(get_app(App, FixupMod), FixupMod, bucket_fixups), - register(App, T); -register(App, [{repl_helper, FixupMod}|T]) -> - register_mod(get_app(App, FixupMod), FixupMod, repl_helper), - register(App, T); -register(App, [{vnode_module, VNodeMod}|T]) -> - register_mod(get_app(App, VNodeMod), VNodeMod, vnode_modules), - register(App, T); -register(App, [{health_check, HealthMFA}|T]) -> - register_metadata(get_app(App, HealthMFA), HealthMFA, health_checks), - register(App, T); -register(App, [{bucket_validator, ValidationMod}|T]) -> - register_mod(get_app(App, ValidationMod), ValidationMod, bucket_validators), - register(App, T); -register(App, [{stat_mod, StatMod}|T]) -> - register_mod(App, StatMod, stat_mods), - register(App, T); -register(App, [{permissions, Permissions}|T]) -> - register_mod(App, Permissions, permissions), +register(App, [{vnode_module, VNodeMod} | T]) -> + register_mod(get_app(App, VNodeMod), VNodeMod, + vnode_modules), register(App, T); -register(App, [{auth_mod, {AuthType, AuthMod}}|T]) -> - register_proplist({AuthType, AuthMod}, auth_mods), +register(App, [{health_check, HealthMFA} | T]) -> + register_metadata(get_app(App, HealthMFA), HealthMFA, + health_checks), register(App, T). register_mod(App, Module, Type) when is_atom(Type) -> case Type of - vnode_modules -> - riak_core_vnode_proxy_sup:start_proxies(Module); - stat_mods -> - %% STATS -%% riak_core_stats_sup:start_server(Module); - logger:warning("Metric collection disabled"), - ok; - _ -> - ok + vnode_modules -> + riak_core_vnode_proxy_sup:start_proxies(Module) end, case application:get_env(riak_core, Type) of - undefined -> - application:set_env(riak_core, Type, [{App,Module}]); - {ok, Mods} -> - application:set_env(riak_core, Type, - lists:usort([{App,Module}|Mods])) + undefined -> + application:set_env(riak_core, Type, [{App, Module}]); + {ok, Mods} -> + application:set_env(riak_core, Type, + lists:usort([{App, Module} | Mods])) end. register_metadata(App, Value, Type) -> case application:get_env(riak_core, Type) of - undefined -> - application:set_env(riak_core, Type, [{App,Value}]); - {ok, Values} -> - application:set_env(riak_core, Type, - lists:usort([{App,Value}|Values])) + undefined -> + application:set_env(riak_core, Type, [{App, Value}]); + {ok, Values} -> + application:set_env(riak_core, Type, + lists:usort([{App, Value} | Values])) end. -register_proplist({Key, Value}, Type) -> - case application:get_env(riak_core, Type) of - undefined -> - application:set_env(riak_core, Type, [{Key, Value}]); - {ok, Values} -> - application:set_env(riak_core, Type, lists:keystore(Key, 1, - Values, - {Key, Value})) - end. - - - %% @spec add_guarded_event_handler(HandlerMod, Handler, Args) -> AddResult %% HandlerMod = module() %% Handler = module() | {module(), term()} %% Args = list() %% AddResult = ok | {error, Reason::term()} add_guarded_event_handler(HandlerMod, Handler, Args) -> - add_guarded_event_handler(HandlerMod, Handler, Args, undefined). + add_guarded_event_handler(HandlerMod, Handler, Args, + undefined). %% @spec add_guarded_event_handler(HandlerMod, Handler, Args, ExitFun) -> AddResult %% HandlerMod = module() @@ -364,8 +317,10 @@ add_guarded_event_handler(HandlerMod, Handler, Args) -> %% (riak_core_eventhandler_guard) that adds a supervised handler in its %% init() callback and exits when the handler crashes so it can be %% restarted by the supervisor. -add_guarded_event_handler(HandlerMod, Handler, Args, ExitFun) -> - riak_core_eventhandler_sup:start_guarded_handler(HandlerMod, Handler, Args, ExitFun). +add_guarded_event_handler(HandlerMod, Handler, Args, + ExitFun) -> + riak_core_eventhandler_sup:start_guarded_handler(HandlerMod, + Handler, Args, ExitFun). %% @spec delete_guarded_event_handler(HandlerMod, Handler, Args) -> Result %% HandlerMod = module() @@ -383,60 +338,77 @@ add_guarded_event_handler(HandlerMod, Handler, Args, ExitFun) -> %% specified event handler is not installed, the function returns %% {error,module_not_found}. If the callback function fails with Reason, %% the function returns {'EXIT',Reason}. -delete_guarded_event_handler(HandlerMod, Handler, Args) -> - riak_core_eventhandler_sup:stop_guarded_handler(HandlerMod, Handler, Args). +delete_guarded_event_handler(HandlerMod, Handler, + Args) -> + riak_core_eventhandler_sup:stop_guarded_handler(HandlerMod, + Handler, Args). app_for_module(Mod) -> app_for_module(application:which_applications(), Mod). -app_for_module([], _Mod) -> - {ok, undefined}; -app_for_module([{App,_,_}|T], Mod) -> +app_for_module([], _Mod) -> {ok, undefined}; +app_for_module([{App, _, _} | T], Mod) -> {ok, Mods} = application:get_key(App, modules), case lists:member(Mod, Mods) of - true -> {ok, App}; - false -> app_for_module(T, Mod) + true -> {ok, App}; + false -> app_for_module(T, Mod) end. - wait_for_application(App) -> wait_for_application(App, 0). + wait_for_application(App, Elapsed) -> - case lists:keymember(App, 1, application:which_applications()) of - true when Elapsed == 0 -> - ok; - true when Elapsed > 0 -> - logger:info("Wait complete for application ~p (~p seconds)", [App, Elapsed div 1000]), - ok; - false -> - %% Possibly print a notice. - ShouldPrint = Elapsed rem ?WAIT_PRINT_INTERVAL == 0, - case ShouldPrint of - true -> logger:info("Waiting for application ~p to start (~p seconds).", [App, Elapsed div 1000]); - false -> skip - end, - timer:sleep(?WAIT_POLL_INTERVAL), - wait_for_application(App, Elapsed + ?WAIT_POLL_INTERVAL) + case lists:keymember(App, 1, + application:which_applications()) + of + true when Elapsed == 0 -> ok; + true when Elapsed > 0 -> + logger:info("Wait complete for application ~p (~p " + "seconds)", + [App, Elapsed div 1000]), + ok; + false -> + %% Possibly print a notice. + ShouldPrint = Elapsed rem (?WAIT_PRINT_INTERVAL) == 0, + case ShouldPrint of + true -> + logger:info("Waiting for application ~p to start\n " + " " + "(~p seconds).", + [App, Elapsed div 1000]); + false -> skip + end, + timer:sleep(?WAIT_POLL_INTERVAL), + wait_for_application(App, + Elapsed + (?WAIT_POLL_INTERVAL)) end. wait_for_service(Service) -> wait_for_service(Service, 0). + wait_for_service(Service, Elapsed) -> - case lists:member(Service, riak_core_node_watcher:services(node())) of - true when Elapsed == 0 -> - ok; - true when Elapsed > 0 -> - logger:info("Wait complete for service ~p (~p seconds)", [Service, Elapsed div 1000]), - ok; - false -> - %% Possibly print a notice. - ShouldPrint = Elapsed rem ?WAIT_PRINT_INTERVAL == 0, - case ShouldPrint of - true -> logger:info("Waiting for service ~p to start (~p seconds)", [Service, Elapsed div 1000]); - false -> skip - end, - timer:sleep(?WAIT_POLL_INTERVAL), - wait_for_service(Service, Elapsed + ?WAIT_POLL_INTERVAL) + case lists:member(Service, + riak_core_node_watcher:services(node())) + of + true when Elapsed == 0 -> ok; + true when Elapsed > 0 -> + logger:info("Wait complete for service ~p (~p seconds)", + [Service, Elapsed div 1000]), + ok; + false -> + %% Possibly print a notice. + ShouldPrint = Elapsed rem (?WAIT_PRINT_INTERVAL) == 0, + case ShouldPrint of + true -> + logger:info("Waiting for service ~p to start\n " + " (~p " + "seconds)", + [Service, Elapsed div 1000]); + false -> skip + end, + timer:sleep(?WAIT_POLL_INTERVAL), + wait_for_service(Service, + Elapsed + (?WAIT_POLL_INTERVAL)) end. stat_prefix() -> diff --git a/src/riak_core_apl.erl b/src/riak_core_apl.erl index b76e40796..df4778746 100644 --- a/src/riak_core_apl.erl +++ b/src/riak_core_apl.erl @@ -23,44 +23,61 @@ %% substituted. %% ------------------------------------------------------------------- -module(riak_core_apl). --export([active_owners/1, active_owners/2, - get_apl/3, get_apl/4, - get_apl_ann/2, get_apl_ann/3, get_apl_ann/4, - get_apl_ann_with_pnum/1, - get_primary_apl/3, get_primary_apl/4, - get_primary_apl_chbin/4, - first_up/2, offline_owners/1, offline_owners/2 - ]). --export_type([preflist/0, preflist_ann/0, preflist_with_pnum_ann/0]). +-export([active_owners/1, active_owners/2, get_apl/3, + get_apl/4, get_apl_ann/2, get_apl_ann/3, get_apl_ann/4, + get_apl_ann_with_pnum/1, get_primary_apl/3, + get_primary_apl/4, get_primary_apl_chbin/4, first_up/2, + offline_owners/1, offline_owners/2]). + +-export_type([preflist/0, preflist_ann/0, + preflist_with_pnum_ann/0]). -ifdef(TEST). + -include_lib("eunit/include/eunit.hrl"). + -endif. +-type bucket() :: binary() | {binary(), binary()}. + -type index() :: chash:index_as_int(). + -type n_val() :: non_neg_integer(). + -type ring() :: riak_core_ring:riak_core_ring(). + -type preflist() :: [{index(), node()}]. --type preflist_ann() :: [{{index(), node()}, primary|fallback}]. + +-type preflist_ann() :: [{{index(), node()}, + primary | fallback}]. + %% @type preflist_with_pnum_ann(). %% Annotated preflist where the partition value is an id/number %% (0 to ring_size-1) instead of a hash. --type preflist_with_pnum_ann() :: [{{riak_core_ring:partition_id(), node()}, - primary|fallback}]. +-type + preflist_with_pnum_ann() :: [{{riak_core_ring:partition_id(), + node()}, + primary | fallback}]. + -type iterator() :: term(). + -type chashbin() :: term(). + -type docidx() :: chash:index(). %% @doc Return preflist of all active primary nodes (with no %% substituion of fallbacks). Used to simulate a %% preflist with N=ring_size. -spec active_owners(atom()) -> preflist_ann(). + active_owners(Service) -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), - active_owners(Ring, riak_core_node_watcher:nodes(Service)). + active_owners(Ring, + riak_core_node_watcher:nodes(Service)). -spec active_owners(ring(), [node()]) -> preflist_ann(). + active_owners(Ring, UpNodes) -> UpNodes1 = UpNodes, Primaries = riak_core_ring:all_owners(Ring), @@ -69,23 +86,31 @@ active_owners(Ring, UpNodes) -> %% @doc Get the active preflist taking account of which nodes are up. -spec get_apl(docidx(), n_val(), atom()) -> preflist(). + get_apl(DocIdx, N, Service) -> {ok, CHBin} = riak_core_ring_manager:get_chash_bin(), - get_apl_chbin(DocIdx, N, CHBin, riak_core_node_watcher:nodes(Service)). + get_apl_chbin(DocIdx, N, CHBin, + riak_core_node_watcher:nodes(Service)). %% @doc Get the active preflist taking account of which nodes are up %% for a given chash/upnodes list. --spec get_apl_chbin(docidx(), n_val(), chashbin:chashbin(), [node()]) -> preflist(). +-spec get_apl_chbin(docidx(), n_val(), + chashbin:chashbin(), [node()]) -> preflist(). + get_apl_chbin(DocIdx, N, CHBin, UpNodes) -> - [{Partition, Node} || {{Partition, Node}, _Type} <- - get_apl_ann_chbin(DocIdx, N, CHBin, UpNodes)]. + [{Partition, Node} + || {{Partition, Node}, _Type} + <- get_apl_ann_chbin(DocIdx, N, CHBin, UpNodes)]. %% @doc Get the active preflist taking account of which nodes are up %% for a given ring/upnodes list. --spec get_apl(docidx(), n_val(), ring(), [node()]) -> preflist(). +-spec get_apl(docidx(), n_val(), ring(), + [node()]) -> preflist(). + get_apl(DocIdx, N, Ring, UpNodes) -> - [{Partition, Node} || {{Partition, Node}, _Type} <- - get_apl_ann(DocIdx, N, Ring, UpNodes)]. + [{Partition, Node} + || {{Partition, Node}, _Type} + <- get_apl_ann(DocIdx, N, Ring, UpNodes)]. %% @doc Get the active preflist taking account of which nodes are up for a given %% chash/upnodes list and annotate each node with type of primary/fallback. @@ -96,7 +121,9 @@ get_apl_ann(DocIdx, N, UpNodes) -> %% @doc Get the active preflist taking account of which nodes are up %% for a given ring/upnodes list and annotate each node with type of %% primary/fallback. --spec get_apl_ann(binary(), n_val(), ring(), [node()]) -> preflist_ann(). +-spec get_apl_ann(binary(), n_val(), ring(), + [node()]) -> preflist_ann(). + get_apl_ann(DocIdx, N, Ring, UpNodes) -> UpNodes1 = UpNodes, Preflist = riak_core_ring:preflist(DocIdx, Ring), @@ -106,17 +133,20 @@ get_apl_ann(DocIdx, N, Ring, UpNodes) -> %% @doc Get the active preflist for a given {bucket, key} and list of nodes %% and annotate each node with type of primary/fallback. --spec get_apl_ann(riak_core_bucket:bucket(), [node()]) -> preflist_ann(). +-spec get_apl_ann(bucket(), [node()]) -> preflist_ann(). + get_apl_ann({Bucket, Key}, UpNodes) -> - BucketProps = riak_core_bucket:get_bucket(Bucket), - NVal = proplists:get_value(n_val, BucketProps), + {ok, NVal} = application:get_env(riak_core, + target_n_val), DocIdx = riak_core_util:chash_key({Bucket, Key}), get_apl_ann(DocIdx, NVal, UpNodes). %% @doc Get the active preflist taking account of which nodes are up %% for a given {bucket, key} and annotate each node with type of %% primary/fallback --spec get_apl_ann_with_pnum(riak_core_bucket:bucket()) -> preflist_with_pnum_ann(). +-spec + get_apl_ann_with_pnum(bucket()) -> preflist_with_pnum_ann(). + get_apl_ann_with_pnum(BKey) -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), UpNodes = riak_core_ring:all_members(Ring), @@ -127,7 +157,9 @@ get_apl_ann_with_pnum(BKey) -> %% @doc Get the active preflist taking account of which nodes are up %% for a given chash/upnodes list and annotate each node with type of %% primary/fallback. --spec get_apl_ann_chbin(binary(), n_val(), chashbin(), [node()]) -> preflist_ann(). +-spec get_apl_ann_chbin(binary(), n_val(), chashbin(), + [node()]) -> preflist_ann(). + get_apl_ann_chbin(DocIdx, N, CHBin, UpNodes) -> UpNodes1 = UpNodes, Itr = chashbin:iterator(DocIdx, CHBin), @@ -136,13 +168,18 @@ get_apl_ann_chbin(DocIdx, N, CHBin, UpNodes) -> Up ++ find_fallbacks_chbin(Pangs, Itr2, UpNodes1, []). %% @doc Same as get_apl, but returns only the primaries. --spec get_primary_apl(binary(), n_val(), atom()) -> preflist_ann(). +-spec get_primary_apl(binary(), n_val(), + atom()) -> preflist_ann(). + get_primary_apl(DocIdx, N, Service) -> {ok, CHBin} = riak_core_ring_manager:get_chash_bin(), - get_primary_apl_chbin(DocIdx, N, CHBin, riak_core_node_watcher:nodes(Service)). + get_primary_apl_chbin(DocIdx, N, CHBin, + riak_core_node_watcher:nodes(Service)). %% @doc Same as get_apl, but returns only the primaries. --spec get_primary_apl_chbin(binary(), n_val(), chashbin(), [node()]) -> preflist_ann(). +-spec get_primary_apl_chbin(binary(), n_val(), + chashbin(), [node()]) -> preflist_ann(). + get_primary_apl_chbin(DocIdx, N, CHBin, UpNodes) -> UpNodes1 = UpNodes, Itr = chashbin:iterator(DocIdx, CHBin), @@ -151,7 +188,9 @@ get_primary_apl_chbin(DocIdx, N, CHBin, UpNodes) -> Up. %% @doc Same as get_apl, but returns only the primaries. --spec get_primary_apl(binary(), n_val(), ring(), [node()]) -> preflist_ann(). +-spec get_primary_apl(binary(), n_val(), ring(), + [node()]) -> preflist_ann(). + get_primary_apl(DocIdx, N, Ring, UpNodes) -> UpNodes1 = UpNodes, Preflist = riak_core_ring:preflist(DocIdx, Ring), @@ -164,10 +203,12 @@ get_primary_apl(DocIdx, N, Ring, UpNodes) -> first_up(DocIdx, Service) -> {ok, CHBin} = riak_core_ring_manager:get_chash_bin(), Itr = chashbin:iterator(DocIdx, CHBin), - UpSet = ordsets:from_list(riak_core_node_watcher:nodes(Service)), - Itr2 = chashbin:itr_next_while(fun({_P, Node}) -> + UpSet = + ordsets:from_list(riak_core_node_watcher:nodes(Service)), + Itr2 = chashbin:itr_next_while(fun ({_P, Node}) -> not ordsets:is_element(Node, UpSet) - end, Itr), + end, + Itr), chashbin:itr_value(Itr2). offline_owners(Service) -> @@ -175,108 +216,138 @@ offline_owners(Service) -> offline_owners(Service, CHBin). offline_owners(Service, CHBin) when is_atom(Service) -> - UpSet = ordsets:from_list(riak_core_node_watcher:nodes(Service)), + UpSet = + ordsets:from_list(riak_core_node_watcher:nodes(Service)), offline_owners(UpSet, CHBin); offline_owners(UpSet, CHBin) when is_list(UpSet) -> %% UpSet is an ordset of available nodes - DownVNodes = chashbin:to_list_filter(fun({_Index, Node}) -> + DownVNodes = chashbin:to_list_filter(fun ({_Index, + Node}) -> not is_up(Node, UpSet) - end, CHBin), + end, + CHBin), DownVNodes. %% @doc Split a preference list into up and down lists. --spec check_up(preflist(), [node()], preflist_ann(), preflist()) -> {preflist_ann(), preflist()}. +-spec check_up(preflist(), [node()], preflist_ann(), + preflist()) -> {preflist_ann(), preflist()}. + check_up([], _UpNodes, Up, Pangs) -> {lists:reverse(Up), lists:reverse(Pangs)}; -check_up([{Partition,Node}|Rest], UpNodes, Up, Pangs) -> +check_up([{Partition, Node} | Rest], UpNodes, Up, + Pangs) -> case is_up(Node, UpNodes) of - true -> - check_up(Rest, UpNodes, [{{Partition, Node}, primary} | Up], Pangs); - false -> - check_up(Rest, UpNodes, Up, [{Partition, Node} | Pangs]) + true -> + check_up(Rest, UpNodes, + [{{Partition, Node}, primary} | Up], Pangs); + false -> + check_up(Rest, UpNodes, Up, [{Partition, Node} | Pangs]) end. %% @doc Find fallbacks for downed nodes in the preference list. --spec find_fallbacks(preflist(), preflist(), [node()], preflist_ann()) -> preflist_ann(). +-spec find_fallbacks(preflist(), preflist(), [node()], + preflist_ann()) -> preflist_ann(). + find_fallbacks(_Pangs, [], _UpNodes, Secondaries) -> lists:reverse(Secondaries); find_fallbacks([], _Fallbacks, _UpNodes, Secondaries) -> lists:reverse(Secondaries); -find_fallbacks([{Partition, _Node}|Rest]=Pangs, [{_,FN}|Fallbacks], UpNodes, Secondaries) -> +find_fallbacks([{Partition, _Node} | Rest] = Pangs, + [{_, FN} | Fallbacks], UpNodes, Secondaries) -> case is_up(FN, UpNodes) of - true -> - find_fallbacks(Rest, Fallbacks, UpNodes, - [{{Partition, FN}, fallback} | Secondaries]); - false -> - find_fallbacks(Pangs, Fallbacks, UpNodes, Secondaries) + true -> + find_fallbacks(Rest, Fallbacks, UpNodes, + [{{Partition, FN}, fallback} | Secondaries]); + false -> + find_fallbacks(Pangs, Fallbacks, UpNodes, Secondaries) end. %% @doc Find fallbacks for downed nodes in the preference list. --spec find_fallbacks_chbin(preflist(), iterator(),[node()], preflist_ann()) -> preflist_ann(). -find_fallbacks_chbin([], _Fallbacks, _UpNodes, Secondaries) -> +-spec find_fallbacks_chbin(preflist(), iterator(), + [node()], preflist_ann()) -> preflist_ann(). + +find_fallbacks_chbin([], _Fallbacks, _UpNodes, + Secondaries) -> lists:reverse(Secondaries); find_fallbacks_chbin(_, done, _UpNodes, Secondaries) -> lists:reverse(Secondaries); -find_fallbacks_chbin([{Partition, _Node}|Rest]=Pangs, Itr, UpNodes, Secondaries) -> +find_fallbacks_chbin([{Partition, _Node} | Rest] = + Pangs, + Itr, UpNodes, Secondaries) -> {_, FN} = chashbin:itr_value(Itr), Itr2 = chashbin:itr_next(Itr), case is_up(FN, UpNodes) of - true -> - find_fallbacks_chbin(Rest, Itr2, UpNodes, - [{{Partition, FN}, fallback} | Secondaries]); - false -> - find_fallbacks_chbin(Pangs, Itr2, UpNodes, Secondaries) + true -> + find_fallbacks_chbin(Rest, Itr2, UpNodes, + [{{Partition, FN}, fallback} | Secondaries]); + false -> + find_fallbacks_chbin(Pangs, Itr2, UpNodes, Secondaries) end. %% @doc Return true if a node is up. -is_up(Node, UpNodes) -> - lists:member(Node, UpNodes). +is_up(Node, UpNodes) -> lists:member(Node, UpNodes). %% @doc Return annotated preflist with partition ids/nums instead of hashes. --spec apl_with_partition_nums(preflist_ann(), riak_core_ring:ring_size()) -> - preflist_with_pnum_ann(). +-spec apl_with_partition_nums(preflist_ann(), + riak_core_ring:ring_size()) -> preflist_with_pnum_ann(). + apl_with_partition_nums(Apl, Size) -> - [{{riak_core_ring_util:hash_to_partition_id(Hash, Size), Node}, Ann} || - {{Hash, Node}, Ann} <- Apl]. + [{{riak_core_ring_util:hash_to_partition_id(Hash, Size), + Node}, + Ann} + || {{Hash, Node}, Ann} <- Apl]. -ifdef(TEST). smallest_test() -> - Ring = riak_core_ring:fresh(1,node()), - ?assertEqual([{0,node()}], get_apl(last_in_ring(), 1, Ring, [node()])). + Ring = riak_core_ring:fresh(1, node()), + ?assertEqual([{0, node()}], + (get_apl(last_in_ring(), 1, Ring, [node()]))). four_node_test() -> Nodes = [nodea, nodeb, nodec, noded], Ring = perfect_ring(8, Nodes), - ?assertEqual([{0,nodea}, - {182687704666362864775460604089535377456991567872,nodeb}, - {365375409332725729550921208179070754913983135744,nodec}], - get_apl(last_in_ring(), 3, Ring, Nodes)), + ?assertEqual([{0, nodea}, + {182687704666362864775460604089535377456991567872, + nodeb}, + {365375409332725729550921208179070754913983135744, + nodec}], + (get_apl(last_in_ring(), 3, Ring, Nodes))), %% With a node down - ?assertEqual([{182687704666362864775460604089535377456991567872,nodeb}, - {365375409332725729550921208179070754913983135744,nodec}, - {0,noded}], - get_apl(last_in_ring(), 3, Ring, [nodeb, nodec, noded])), + ?assertEqual([{182687704666362864775460604089535377456991567872, + nodeb}, + {365375409332725729550921208179070754913983135744, + nodec}, + {0, noded}], + (get_apl(last_in_ring(), 3, Ring, + [nodeb, nodec, noded]))), %% With two nodes down - ?assertEqual([{365375409332725729550921208179070754913983135744,nodec}, - {0,noded}, - {182687704666362864775460604089535377456991567872,nodec}], - get_apl(last_in_ring(), 3, Ring, [nodec, noded])), + ?assertEqual([{365375409332725729550921208179070754913983135744, + nodec}, + {0, noded}, + {182687704666362864775460604089535377456991567872, + nodec}], + (get_apl(last_in_ring(), 3, Ring, [nodec, noded]))), %% With the other two nodes down - ?assertEqual([{0,nodea}, - {182687704666362864775460604089535377456991567872,nodeb}, - {365375409332725729550921208179070754913983135744,nodea}], - get_apl(last_in_ring(), 3, Ring, [nodea, nodeb])). + ?assertEqual([{0, nodea}, + {182687704666362864775460604089535377456991567872, + nodeb}, + {365375409332725729550921208179070754913983135744, + nodea}], + (get_apl(last_in_ring(), 3, Ring, [nodea, nodeb]))). %% Create a perfect ring - RingSize must be a multiple of nodes -perfect_ring(RingSize, Nodes) when RingSize rem length(Nodes) =:= 0 -> - Ring = riak_core_ring:fresh(RingSize,node()), +perfect_ring(RingSize, Nodes) + when RingSize rem length(Nodes) =:= 0 -> + Ring = riak_core_ring:fresh(RingSize, node()), Owners = riak_core_ring:all_owners(Ring), - TransferNode = - fun({Idx,_CurOwner}, {Ring0, [NewOwner|Rest]}) -> - {riak_core_ring:transfer_node(Idx, NewOwner, Ring0), Rest ++ [NewOwner]} - end, - {PerfectRing, _} = lists:foldl(TransferNode, {Ring, Nodes}, Owners), + TransferNode = fun ({Idx, _CurOwner}, + {Ring0, [NewOwner | Rest]}) -> + {riak_core_ring:transfer_node(Idx, NewOwner, Ring0), + Rest ++ [NewOwner]} + end, + {PerfectRing, _} = lists:foldl(TransferNode, + {Ring, Nodes}, Owners), PerfectRing. last_in_ring() -> @@ -287,186 +358,186 @@ six_node_test() -> %% earlier {ok, [Ring]} = file:consult("test/my_ring"), %DocIdx = riak_core_util:chash_key({<<"foo">>, <<"bar">>}), - DocIdx = <<73,212,27,234,104,13,150,207,0,82,86,183,125,225,172, - 154,135,46,6,112>>, - - Nodes = ['dev1@127.0.0.1', 'dev2@127.0.0.1', 'dev3@127.0.0.1', - 'dev4@127.0.0.1', 'dev5@127.0.0.1', 'dev6@127.0.0.1'], - + DocIdx = <<73, 212, 27, 234, 104, 13, 150, 207, 0, 82, + 86, 183, 125, 225, 172, 154, 135, 46, 6, 112>>, + Nodes = ['dev1@127.0.0.1', 'dev2@127.0.0.1', + 'dev3@127.0.0.1', 'dev4@127.0.0.1', 'dev5@127.0.0.1', + 'dev6@127.0.0.1'], %% Fallbacks should be selected by finding the next-highest partition after %% the DocIdx of the key, in this case the 433883 partition. The N %% partitions at that point are the primary partitions. If any of the primaries %% are down, the next up node found by walking the preflist is used as the %% fallback for that partition. - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev2@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev3@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev4@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes)), - - ?assertEqual([{456719261665907161938651510223838443642478919680, 'dev3@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev4@127.0.0.1'}, - {433883298582611803841718934712646521460354973696, 'dev5@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev2@127.0.0.1'])), - - ?assertEqual([{479555224749202520035584085735030365824602865664, 'dev4@127.0.0.1'}, - {433883298582611803841718934712646521460354973696, 'dev5@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev6@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev2@127.0.0.1', 'dev3@127.0.0.1'])), - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev5@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev6@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev1@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev2@127.0.0.1', 'dev3@127.0.0.1', - 'dev4@127.0.0.1'])), - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev5@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev6@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev5@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev2@127.0.0.1', 'dev3@127.0.0.1', - 'dev4@127.0.0.1', 'dev1@127.0.0.1'])), - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev2@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev3@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev5@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev4@127.0.0.1'])), - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev2@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev5@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev6@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev4@127.0.0.1', 'dev3@127.0.0.1'])), - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev2@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev5@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev1@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev4@127.0.0.1', 'dev3@127.0.0.1', - 'dev6@127.0.0.1'])), - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev2@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev5@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev2@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev4@127.0.0.1', 'dev3@127.0.0.1', - 'dev6@127.0.0.1', 'dev1@127.0.0.1'])), - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev2@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev2@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev2@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev4@127.0.0.1', 'dev3@127.0.0.1', - 'dev6@127.0.0.1', 'dev1@127.0.0.1', 'dev5@127.0.0.1'])), - - ?assertEqual([{433883298582611803841718934712646521460354973696, 'dev2@127.0.0.1'}, - {479555224749202520035584085735030365824602865664, 'dev4@127.0.0.1'}, - {456719261665907161938651510223838443642478919680, 'dev5@127.0.0.1'}], - get_apl(DocIdx, 3, Ring, Nodes -- ['dev3@127.0.0.1'])), - + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev2@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev3@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev4@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, Nodes))), + ?assertEqual([{456719261665907161938651510223838443642478919680, + 'dev3@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev4@127.0.0.1'}, + {433883298582611803841718934712646521460354973696, + 'dev5@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- ['dev2@127.0.0.1']))), + ?assertEqual([{479555224749202520035584085735030365824602865664, + 'dev4@127.0.0.1'}, + {433883298582611803841718934712646521460354973696, + 'dev5@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev6@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- ['dev2@127.0.0.1', 'dev3@127.0.0.1']))), + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev5@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev6@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev1@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- + ['dev2@127.0.0.1', 'dev3@127.0.0.1', + 'dev4@127.0.0.1']))), + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev5@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev6@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev5@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- + ['dev2@127.0.0.1', 'dev3@127.0.0.1', + 'dev4@127.0.0.1', 'dev1@127.0.0.1']))), + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev2@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev3@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev5@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- ['dev4@127.0.0.1']))), + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev2@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev5@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev6@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- ['dev4@127.0.0.1', 'dev3@127.0.0.1']))), + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev2@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev5@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev1@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- + ['dev4@127.0.0.1', 'dev3@127.0.0.1', + 'dev6@127.0.0.1']))), + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev2@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev5@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev2@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- + ['dev4@127.0.0.1', 'dev3@127.0.0.1', + 'dev6@127.0.0.1', 'dev1@127.0.0.1']))), + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev2@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev2@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev2@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- + ['dev4@127.0.0.1', 'dev3@127.0.0.1', + 'dev6@127.0.0.1', 'dev1@127.0.0.1', + 'dev5@127.0.0.1']))), + ?assertEqual([{433883298582611803841718934712646521460354973696, + 'dev2@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev4@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev5@127.0.0.1'}], + (get_apl(DocIdx, 3, Ring, + Nodes -- ['dev3@127.0.0.1']))), ok. six_node_bucket_key_ann_test() -> {ok, [Ring]} = file:consult("test/my_ring"), - Nodes = ['dev1@127.0.0.1', 'dev2@127.0.0.1', 'dev3@127.0.0.1', - 'dev4@127.0.0.1', 'dev5@127.0.0.1', 'dev6@127.0.0.1'], + Nodes = ['dev1@127.0.0.1', 'dev2@127.0.0.1', + 'dev3@127.0.0.1', 'dev4@127.0.0.1', 'dev5@127.0.0.1', + 'dev6@127.0.0.1'], Bucket = <<"favorite">>, Key = <<"jethrotull">>, - application:set_env(riak_core, default_bucket_props, - [{n_val, 3}, - {chash_keyfun,{riak_core_util,chash_std_keyfun}}]), + application:set_env(riak_core, target_n_val, 3), riak_core_ring_manager:setup_ets(test), riak_core_ring_manager:set_ring_global(Ring), Size = riak_core_ring:num_partitions(Ring), - ?assertEqual([{{34, - 'dev5@127.0.0.1'}, - primary}, - {{35, - 'dev6@127.0.0.1'}, - primary}, - {{36, - 'dev1@127.0.0.1'}, - primary}], - apl_with_partition_nums( - get_apl_ann({Bucket, Key}, Nodes), Size)), - ?assertEqual([{{35, - 'dev6@127.0.0.1'}, - primary}, - {{36, - 'dev1@127.0.0.1'}, - primary}, - {{34, - 'dev2@127.0.0.1'}, - fallback}], - apl_with_partition_nums( - get_apl_ann({Bucket, Key}, Nodes -- - ['dev5@127.0.0.1']), Size)), - ?assertEqual([{{36, - 'dev1@127.0.0.1'}, - primary}, - {{34, - 'dev2@127.0.0.1'}, - fallback}, - {{35, - 'dev3@127.0.0.1'}, - fallback}], - apl_with_partition_nums( - get_apl_ann({Bucket, Key}, Nodes -- - ['dev5@127.0.0.1', - 'dev6@127.0.0.1']), Size)), - ?assertEqual([{{34, - 'dev2@127.0.0.1'}, - fallback}, - {{35, - 'dev3@127.0.0.1'}, - fallback}, - {{36, - 'dev4@127.0.0.1'}, - fallback}], - apl_with_partition_nums( - get_apl_ann({Bucket, Key}, Nodes -- - ['dev5@127.0.0.1', - 'dev6@127.0.0.1', - 'dev1@127.0.0.1']), Size)), - ?assertEqual([{{34, - 'dev3@127.0.0.1'}, - fallback}, - {{35, - 'dev4@127.0.0.1'}, - fallback}, - {{36, - 'dev3@127.0.0.1'}, - fallback}], - apl_with_partition_nums( - get_apl_ann({Bucket, Key}, Nodes -- - ['dev5@127.0.0.1', - 'dev6@127.0.0.1', - 'dev1@127.0.0.1', - 'dev2@127.0.0.1']), Size)), - ?assertEqual([{{34, - 'dev4@127.0.0.1'}, - fallback}, - {{35, - 'dev4@127.0.0.1'}, - fallback}, - {{36, - 'dev4@127.0.0.1'}, - fallback}], - apl_with_partition_nums( - get_apl_ann({Bucket, Key}, Nodes -- - ['dev5@127.0.0.1', - 'dev6@127.0.0.1', - 'dev1@127.0.0.1', - 'dev2@127.0.0.1', - 'dev3@127.0.0.1']), Size)), - ?assertEqual([{{34, - 'dev5@127.0.0.1'}, - primary}, - {{35, - 'dev6@127.0.0.1'}, - primary}, - {{36, - 'dev3@127.0.0.1'}, - fallback}], - apl_with_partition_nums( - get_apl_ann({Bucket, Key}, Nodes -- - ['dev1@127.0.0.1', - 'dev2@127.0.0.1']), Size)), + ?assertEqual([{{34, 'dev5@127.0.0.1'}, primary}, + {{35, 'dev6@127.0.0.1'}, primary}, + {{36, 'dev1@127.0.0.1'}, primary}], + (apl_with_partition_nums(get_apl_ann({Bucket, Key}, + Nodes), + Size))), + ?assertEqual([{{35, 'dev6@127.0.0.1'}, primary}, + {{36, 'dev1@127.0.0.1'}, primary}, + {{34, 'dev2@127.0.0.1'}, fallback}], + (apl_with_partition_nums(get_apl_ann({Bucket, Key}, + Nodes -- + ['dev5@127.0.0.1']), + Size))), + ?assertEqual([{{36, 'dev1@127.0.0.1'}, primary}, + {{34, 'dev2@127.0.0.1'}, fallback}, + {{35, 'dev3@127.0.0.1'}, fallback}], + (apl_with_partition_nums(get_apl_ann({Bucket, Key}, + Nodes -- + ['dev5@127.0.0.1', + 'dev6@127.0.0.1']), + Size))), + ?assertEqual([{{34, 'dev2@127.0.0.1'}, fallback}, + {{35, 'dev3@127.0.0.1'}, fallback}, + {{36, 'dev4@127.0.0.1'}, fallback}], + (apl_with_partition_nums(get_apl_ann({Bucket, Key}, + Nodes -- + ['dev5@127.0.0.1', + 'dev6@127.0.0.1', + 'dev1@127.0.0.1']), + Size))), + ?assertEqual([{{34, 'dev3@127.0.0.1'}, fallback}, + {{35, 'dev4@127.0.0.1'}, fallback}, + {{36, 'dev3@127.0.0.1'}, fallback}], + (apl_with_partition_nums(get_apl_ann({Bucket, Key}, + Nodes -- + ['dev5@127.0.0.1', + 'dev6@127.0.0.1', + 'dev1@127.0.0.1', + 'dev2@127.0.0.1']), + Size))), + ?assertEqual([{{34, 'dev4@127.0.0.1'}, fallback}, + {{35, 'dev4@127.0.0.1'}, fallback}, + {{36, 'dev4@127.0.0.1'}, fallback}], + (apl_with_partition_nums(get_apl_ann({Bucket, Key}, + Nodes -- + ['dev5@127.0.0.1', + 'dev6@127.0.0.1', + 'dev1@127.0.0.1', + 'dev2@127.0.0.1', + 'dev3@127.0.0.1']), + Size))), + ?assertEqual([{{34, 'dev5@127.0.0.1'}, primary}, + {{35, 'dev6@127.0.0.1'}, primary}, + {{36, 'dev3@127.0.0.1'}, fallback}], + (apl_with_partition_nums(get_apl_ann({Bucket, Key}, + Nodes -- + ['dev1@127.0.0.1', + 'dev2@127.0.0.1']), + Size))), riak_core_ring_manager:cleanup_ets(test), ok. @@ -475,7 +546,7 @@ chbin_test_() -> chbin_test_scenario() -> [chbin_test_scenario(Size, NumNodes) - || Size <- [32, 64, 128], + || Size <- [32, 64, 128], NumNodes <- [1, 2, 3, 4, 5, 8, Size div 4]], ok. @@ -486,20 +557,22 @@ chbin_test_scenario(Size, NumNodes) -> CHash = riak_core_ring:chash(Ring), CHBin = chashbin:create(CHash), Inc = chash:ring_increment(Size), - HashKeys = [<> || X <- lists:seq(0, RingTop, Inc div 2)], + HashKeys = [<> + || X <- lists:seq(0, RingTop, Inc div 2)], Shuffled = riak_core_util:shuffle(Nodes), _ = CHBin, [begin - Up = max(0, NumNodes - Down), - UpNodes = lists:sublist(Shuffled, Up), - ?assertEqual(get_apl(HashKey, N, Ring, UpNodes), - get_apl_chbin(HashKey, N, CHBin, UpNodes)), - ?assertEqual(get_primary_apl(HashKey, N, Ring, UpNodes), - get_primary_apl_chbin(HashKey, N, CHBin, UpNodes)), - ok - end || HashKey <- HashKeys, - N <- [1, 2, 3, 4], - Down <- [0, 1, 2, Size div 2, Size-1, Size]], + Up = max(0, NumNodes - Down), + UpNodes = lists:sublist(Shuffled, Up), + ?assertEqual((get_apl(HashKey, N, Ring, UpNodes)), + (get_apl_chbin(HashKey, N, CHBin, UpNodes))), + ?assertEqual((get_primary_apl(HashKey, N, Ring, + UpNodes)), + (get_primary_apl_chbin(HashKey, N, CHBin, UpNodes))), + ok + end + || HashKey <- HashKeys, N <- [1, 2, 3, 4], + Down <- [0, 1, 2, Size div 2, Size - 1, Size]], ok. -endif. diff --git a/src/riak_core_app.erl b/src/riak_core_app.erl index 9d2ce17ab..646887bbb 100644 --- a/src/riak_core_app.erl +++ b/src/riak_core_app.erl @@ -33,42 +33,40 @@ start(_StartType, _StartArgs) -> ok = validate_ring_state_directory_exists(), - start_riak_core_sup(). stop(_State) -> - logger:info("Stopped application riak_core", []), - ok. + logger:info("Stopped application riak_core", []), ok. validate_ring_state_directory_exists() -> riak_core_util:start_app_deps(riak_core), - {ok, RingStateDir} = application:get_env(riak_core, ring_state_dir), - case filelib:ensure_dir(filename:join(RingStateDir, "dummy")) of - ok -> - ok; - {error, RingReason} -> - logger:critical( - "Ring state directory ~p does not exist, " "and could not be created: ~p", - [RingStateDir, riak_core_util:posix_error(RingReason)]), - throw({error, invalid_ring_state_dir}) + {ok, RingStateDir} = application:get_env(riak_core, + ring_state_dir), + case filelib:ensure_dir(filename:join(RingStateDir, + "dummy")) + of + ok -> ok; + {error, RingReason} -> + logger:critical("Ring state directory ~p does not exist, " + "and could not be created: ~p", + [RingStateDir, + riak_core_util:posix_error(RingReason)]), + throw({error, invalid_ring_state_dir}) end. - start_riak_core_sup() -> %% Spin up the supervisor; prune ring files as necessary case riak_core_sup:start_link() of - {ok, Pid} -> - ok = register_applications(), - ok = add_ring_event_handler(), - - {ok, Pid}; - {error, Reason} -> - {error, Reason} + {ok, Pid} -> + ok = register_applications(), + ok = add_ring_event_handler(), + {ok, Pid}; + {error, Reason} -> {error, Reason} end. -register_applications() -> - ok. +register_applications() -> ok. add_ring_event_handler() -> - ok = riak_core_ring_events:add_guarded_handler(riak_core_ring_handler, []). - + ok = + riak_core_ring_events:add_guarded_handler(riak_core_ring_handler, + []). diff --git a/src/riak_core_base64url.erl b/src/riak_core_base64url.erl deleted file mode 100644 index a3e5a4390..000000000 --- a/src/riak_core_base64url.erl +++ /dev/null @@ -1,95 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2009-2010 Basho Technologies, Inc. All Rights Reserved. -%% -%% This file is provided to you under the Apache License, -%% Version 2.0 (the "License"); you may not use this file -%% except in compliance with the License. You may obtain -%% a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, -%% software distributed under the License is distributed on an -%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -%% KIND, either express or implied. See the License for the -%% specific language governing permissions and limitations -%% under the License. -%% -%% ------------------------------------------------------------------- - -%% @doc base64url is a wrapper around the base64 module to produce -%% base64-compatible encodings that are URL safe. -%% The / character in normal base64 encoding is replaced with -%% the _ character, and + is replaced with -. -%% This replacement scheme is named "base64url" by -%% http://en.wikipedia.org/wiki/Base64 - --module(riak_core_base64url). - --export([decode/1, - decode_to_string/1, - encode/1, - encode_to_string/1, - mime_decode/1, - mime_decode_to_string/1]). - --spec decode(iodata()) -> binary(). -decode(Base64url) -> - base64:decode(urldecode(Base64url)). - --spec decode_to_string(iodata()) -> string(). -decode_to_string(Base64url) -> - base64:decode_to_string(urldecode(Base64url)). - --spec mime_decode(iodata()) -> binary(). -mime_decode(Base64url) -> - base64:mime_decode(urldecode(Base64url)). - --spec mime_decode_to_string(iodata()) -> string(). -mime_decode_to_string(Base64url) -> - base64:mime_decode_to_string(urldecode(Base64url)). - --spec encode(iodata()) -> binary(). -encode(Data) -> - urlencode(base64:encode(Data)). - --spec encode_to_string(iodata()) -> string(). -encode_to_string(Data) -> - urlencode(base64:encode_to_string(Data)). - -urlencode(Base64) when is_list(Base64) -> - Padded = [urlencode_digit(D) || D <- Base64], - string:strip(Padded, both, $=); -urlencode(Base64) when is_binary(Base64) -> - Padded = << << (urlencode_digit(D)) >> || <> <= Base64 >>, - binary:replace(Padded, <<"=">>, <<"">>, [global]). - -urldecode(Base64url) when is_list(Base64url) -> - Prepad = [urldecode_digit(D) || D <- Base64url ], - Padding = padding(Prepad), - Prepad ++ Padding; -urldecode(Base64url) when is_binary(Base64url) -> - Prepad = << << (urldecode_digit(D)) >> || <> <= Base64url >>, - Padding = padding(Prepad), - <>. - -padding(Base64) when is_binary(Base64) -> - case byte_size(Base64) rem 4 of - 2 -> - <<"==">>; - 3 -> - <<"=">>; - _ -> - <<"">> - end; -padding(Base64) when is_list(Base64) -> - binary_to_list(padding(list_to_binary(Base64))). - -urlencode_digit($/) -> $_; -urlencode_digit($+) -> $-; -urlencode_digit(D) -> D. - -urldecode_digit($_) -> $/; -urldecode_digit($-) -> $+; -urldecode_digit(D) -> D. diff --git a/src/riak_core_bucket.erl b/src/riak_core_bucket.erl deleted file mode 100644 index e37627375..000000000 --- a/src/riak_core_bucket.erl +++ /dev/null @@ -1,202 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core: Core Riak Application -%% -%% Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved. -%% -%% This file is provided to you under the Apache License, -%% Version 2.0 (the "License"); you may not use this file -%% except in compliance with the License. You may obtain -%% a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, -%% software distributed under the License is distributed on an -%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -%% KIND, either express or implied. See the License for the -%% specific language governing permissions and limitations -%% under the License. -%% -%% ------------------------------------------------------------------- - -%% @doc Functions for manipulating bucket properties. --module(riak_core_bucket). - --export([append_bucket_defaults/1, - set_bucket/2, - get_bucket/1, - get_bucket/2, - reset_bucket/1, - get_buckets/1, - bucket_nval_map/1, - default_object_nval/0, - merge_props/2, - name/1, - n_val/1, - get_value/2]). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - --type property() :: {PropName::atom(), PropValue::any()}. --type properties() :: [property()]. - --type riak_core_ring() :: riak_core_ring:riak_core_ring(). --type bucket_type() :: binary(). --type nval_set() :: ordsets:ordset(pos_integer()). --type bucket() :: binary() | {bucket_type(), binary()}. - --export_type([property/0, properties/0, bucket/0, nval_set/0]). - -%% @doc Add a list of defaults to global list of defaults for new -%% buckets. If any item is in Items is already set in the -%% current defaults list, the new setting is omitted, and the old -%% setting is kept. Omitting the new setting is intended -%% behavior, to allow settings from app.config to override any -%% hard-coded values. -append_bucket_defaults(Items) when is_list(Items) -> - riak_core_bucket_props:append_defaults(Items). - -%% @doc Set the given BucketProps in Bucket or {BucketType, Bucket}. If BucketType does not -%% exist, or is not active, {error, no_type} is returned. --spec set_bucket(bucket(), [{atom(), any()}]) -> - ok | {error, no_type | [{atom(), atom()}]}. -set_bucket({<<"default">>, Name}, BucketProps) -> - set_bucket(Name, BucketProps); -set_bucket(Name, BucketProps0) -> - set_bucket(fun set_bucket_in_ring/2, Name, BucketProps0). - -set_bucket(StoreFun, Bucket, BucketProps0) -> - OldBucket = get_bucket(Bucket), - case riak_core_bucket_props:validate(update, Bucket, OldBucket, BucketProps0) of - {ok, BucketProps} -> - NewBucket = merge_props(BucketProps, OldBucket), - StoreFun(Bucket, NewBucket); - {error, Details} -> - logger:error("Bucket properties validation failed ~p~n", [Details]), - {error, Details} - end. - -set_bucket_in_ring(Bucket, BucketMeta) -> - F = fun(Ring, _Args) -> - {new_ring, riak_core_ring:update_meta(bucket_key(Bucket), - BucketMeta, - Ring)} - end, - {ok, _NewRing} = riak_core_ring_manager:ring_trans(F, undefined), - ok. - - -%% @spec merge_props(list(), list()) -> list() -%% @doc Merge two sets of bucket props. If duplicates exist, the -%% entries in Overriding are chosen before those in Other. -merge_props(Overriding, Other) -> - riak_core_bucket_props:merge(Overriding, Other). - -%% @spec get_bucket(riak_object:bucket()) -> -%% {ok, BucketProps :: riak_core_bucketprops()} | {error, no_type} -%% @doc Return the complete current list of properties for Bucket. -%% Properties include but are not limited to: -%%

    -%% n_val: how many replicas of objects in this bucket (default: 3)
    -%% allow_mult: can objects in this bucket have siblings? (default: false)
    -%% linkfun: a function returning a m/r FunTerm for link extraction
    -%% 
    -%% -get_bucket({<<"default">>, Name}) -> - get_bucket(Name); -get_bucket(Name) -> - Meta = riak_core_ring_manager:get_bucket_meta(Name), - get_bucket_props(Name, Meta). - -%% @spec get_bucket(Name, Ring::riak_core_ring()) -> -%% BucketProps :: riak_core_bucketprops() -%% @private -get_bucket({<<"default">>, Name}, Ring) -> - get_bucket(Name, Ring); -get_bucket({_Type, _Name}=Bucket, _Ring) -> - %% non-default type buckets are not stored in the ring, so just ignore it - get_bucket(Bucket). - -get_bucket_props(Name, undefined) -> - [{name, Name} | riak_core_bucket_props:defaults()]; -get_bucket_props(_Name, {ok, Bucket}) -> - Bucket. - -%% @spec reset_bucket(binary()) -> ok -%% @doc Reset the bucket properties for Bucket to the settings -%% inherited from its Bucket Type -reset_bucket({<<"default">>, Name}) -> - reset_bucket(Name); -reset_bucket(Bucket) -> - F = fun(Ring, _Args) -> - {new_ring, riak_core_ring:remove_meta(bucket_key(Bucket), Ring)} - end, - {ok, _NewRing} = riak_core_ring_manager:ring_trans(F, undefined), - ok. - -%% @doc Get bucket properties `Props' for all the buckets in the given -%% `Ring' and stored in metadata --spec get_buckets(riak_core_ring()) -> - Props::list(). -get_buckets(Ring) -> - RingNames = riak_core_ring:get_buckets(Ring), - RingBuckets = [get_bucket(Name, Ring) || Name <- RingNames], - RingBuckets. - -%% @doc returns a proplist containing all buckets and their respective N values --spec bucket_nval_map(riak_core_ring()) -> [{binary(),integer()}]. -bucket_nval_map(Ring) -> - [{riak_core_bucket:name(B), riak_core_bucket:n_val(B)} || - B <- riak_core_bucket:get_buckets(Ring)]. - -%% @doc returns the default n value for buckets that have not explicitly set the property --spec default_object_nval() -> integer(). -default_object_nval() -> - riak_core_bucket:n_val(riak_core_bucket_props:defaults()). - - -name(BProps) -> - get_value(name, BProps). - -n_val(BProps) -> - get_value(n_val, BProps). - -% a slighly faster version of proplists:get_value --spec get_value(atom(), properties()) -> any(). -get_value(Key, Proplist) -> - case lists:keyfind(Key, 1, Proplist) of - {Key, Value} -> Value; - _ -> undefined - end. - -bucket_key({<<"default">>, Name}) -> - bucket_key(Name); -bucket_key({_Type, _Name}=Bucket) -> - Bucket; -bucket_key(Name) -> - {bucket, Name}. - -%% =================================================================== -%% EUnit tests -%% =================================================================== --ifdef(TEST). - -simple_set_test() -> - application:load(riak_core), - application:set_env(riak_core, ring_state_dir, "_build/test/tmp"), - %% appending an empty list of defaults makes up for the fact that - %% riak_core_app:start/2 is not called during eunit runs - %% (that's where the usual defaults are set at startup), - %% while also not adding any trash that might affect other tests - append_bucket_defaults([]), - riak_core_ring_events:start_link(), - riak_core_ring_manager:start_link(test), - ok = set_bucket(a_bucket,[{key,value}]), - Bucket = get_bucket(a_bucket), - riak_core_ring_manager:stop(), - ?assertEqual(value, proplists:get_value(key, Bucket)). - --endif. diff --git a/src/riak_core_bucket_props.erl b/src/riak_core_bucket_props.erl deleted file mode 100644 index 352c5c264..000000000 --- a/src/riak_core_bucket_props.erl +++ /dev/null @@ -1,277 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2013 Basho Technologies, Inc. All Rights Reserved. -%% -%% This file is provided to you under the Apache License, -%% Version 2.0 (the "License"); you may not use this file -%% except in compliance with the License. You may obtain -%% a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, -%% software distributed under the License is distributed on an -%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -%% KIND, either express or implied. See the License for the -%% specific language governing permissions and limitations -%% under the License. -%% -%% ------------------------------------------------------------------- --module(riak_core_bucket_props). - --export([merge/2, - validate/4, - resolve/2, - defaults/0, - append_defaults/1]). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - --spec merge([{atom(), any()}], [{atom(), any()}]) -> [{atom(), any()}]. -merge(Overriding, Other) -> - lists:ukeymerge(1, lists:ukeysort(1, Overriding), - lists:ukeysort(1, Other)). - - --spec validate(create | update, - {riak_core_bucket:bucket_type(), undefined | binary()} | binary(), - undefined | [{atom(), any()}], - [{atom(), any()}]) -> {ok, [{atom(), any()}]} | {error, [{atom(), atom()}]}. -validate(CreateOrUpdate, Bucket, ExistingProps, BucketProps) -> - ReservedErrors = validate_reserved_names(Bucket), - CoreErrors = validate_core_props(CreateOrUpdate, Bucket, ExistingProps, BucketProps), - validate(CreateOrUpdate, Bucket, ExistingProps, BucketProps, riak_core:bucket_validators(), [ReservedErrors, CoreErrors]). - -validate(_CreateOrUpdate, _Bucket, _ExistingProps, Props, [], ErrorLists) -> - case lists:flatten(ErrorLists) of - [] -> {ok, Props}; - Errors -> {error, Errors} - end; -validate(CreateOrUpdate, Bucket, ExistingProps, BucketProps0, [{_App, Validator}|T], Errors0) -> - {BucketProps, Errors} = Validator:validate(CreateOrUpdate, Bucket, ExistingProps, BucketProps0), - validate(CreateOrUpdate, Bucket, ExistingProps, BucketProps, T, [Errors|Errors0]). - -validate_core_props(CreateOrUpdate, Bucket, ExistingProps, BucketProps) -> - lists:foldl(fun(Prop, Errors) -> - case validate_core_prop(CreateOrUpdate, Bucket, ExistingProps, Prop) of - true -> Errors; - Error -> [Error | Errors] - end - end, [], BucketProps). - -validate_core_prop(create, {_Bucket, undefined}, undefined, {claimant, Claimant}) when Claimant =:= node()-> - %% claimant valid on first call to create if claimant is this node - true; -validate_core_prop(create, {_Bucket, undefined}, undefined, {claimant, _BadClaimant}) -> - %% claimant not valid on first call to create if claimant is not this node - {claimant, "Invalid claimant"}; -validate_core_prop(create, {_Bucket, undefined}, Existing, {claimant, Claimant}) -> - %% subsequent creation calls cannot modify claimant and it should exist - case lists:keyfind(claimant, 1, Existing) of - false -> {claimant, "No claimant details found in existing properties"}; - {claimant, Claimant} -> true; - {claimant, _Other} -> {claimant, "Cannot modify claimant property"} - end; -validate_core_prop(update, {_Bucket, _BucketName}, _Existing, {claimant, _Claimant}) -> - %% cannot update claimant - {claimant, "Cannot update claimant property"}; -validate_core_prop(update, {_Bucket, _BucketName}, _Existing, {ddl, _DDL}) -> - %% cannot update time series DDL - {ddl, "Cannot update time series data definition"}; -validate_core_prop(update, {_Bucket, _BucketName}, _Existing, {table_def, _DDL}) -> - %% cannot update time series DDL (or, if it slips past riak_kv_console, - %% the table_def SQL(ish) code that is parsed to make a DDL) - %% - %% Defining the table_def atom here also sidesteps occasional - %% errors from existing_atom functions - {ddl, "Cannot update time series data definition"}; -validate_core_prop(create, {_Bucket, undefined}, undefined, {active, false}) -> - %% first creation call that sets active to false is always valid - true; -validate_core_prop(create, {_Bucket, undefined}, _Existing, {active, false}) -> - %% subsequent creation calls that leaves active false is valid - true; -validate_core_prop(update, {_Bucket, _}, _Existing, {active, true}) -> - %% calls to update that do not modify active are valid - true; -validate_core_prop(_, {_Bucket, _}, _Existing, {active, _}) -> - %% subsequent creation calls or update calls cannot modify active (it is modified directly - %% by riak_core_claimant) - {active, "Cannot modify active property"}; -validate_core_prop(_, _, _, _) -> - %% all other properties are valid from the perspective of riak_core - true. - -validate_reserved_names(Bucket) -> - case validate_reserved_name(Bucket) of - ok -> []; - ErrStr -> [{reserved_name, ErrStr}] - end. - -validate_reserved_name({<<"any">>, _}) -> - "The name 'any' may not be used for bucket types"; -validate_reserved_name(_) -> - ok. - --spec defaults() -> [{atom(), any()}]. -defaults() -> - application:get_env(riak_core, default_bucket_props, undefined). - --spec append_defaults([{atom(), any()}]) -> ok. -append_defaults(Items) when is_list(Items) -> - OldDefaults = application:get_env(riak_core, default_bucket_props, []), - NewDefaults = merge(OldDefaults, Items), - FixedDefaults = case riak_core:bucket_fixups() of - [] -> NewDefaults; - Fixups -> - riak_core_ring_manager:run_fixups(Fixups, default, NewDefaults) - end, - application:set_env(riak_core, default_bucket_props, FixedDefaults), - %% do a noop transform on the ring, to make the fixups re-run - catch(riak_core_ring_manager:ring_trans(fun(Ring, _) -> - {new_ring, Ring} - end, undefined)), - ok. - --spec resolve([{atom(), any()}], [{atom(), any()}]) -> [{atom(), any()}]. -%%noinspection ErlangUnusedVariable -resolve(PropsA, PropsB) when is_list(PropsA) andalso - is_list(PropsB) -> - PropsASorted = lists:ukeysort(1, PropsA), - PropsBSorted = lists:ukeysort(1, PropsB), - {_, Resolved} = lists:foldl(fun({KeyA, _}=PropA, {[{KeyA, _}=PropB | RestB], Acc}) -> - {RestB, [{KeyA, resolve_prop(PropA, PropB)} | Acc]}; - (PropA, {RestB, Acc}) -> - {RestB, [PropA | Acc]} - end, - {PropsBSorted, []}, - PropsASorted), - Resolved. - -resolve_prop({allow_mult, Mult1}, {allow_mult, Mult2}) -> - Mult1 orelse Mult2; %% assumes allow_mult=true is default -resolve_prop({basic_quorum, Basic1}, {basic_quorum, Basic2}) -> - Basic1 andalso Basic2; -resolve_prop({big_vclock, Big1}, {big_vclock, Big2}) -> - max(Big1, Big2); -resolve_prop({chash_keyfun, KeyFun1}, {chash_keyfun, _KeyFun2}) -> - KeyFun1; %% arbitrary choice -resolve_prop({dw, DW1}, {dw, DW2}) -> - %% 'quorum' wins over set numbers - max(DW1, DW2); -resolve_prop({last_write_wins, LWW1}, {last_write_wins, LWW2}) -> - LWW1 andalso LWW2; -resolve_prop({linkfun, LinkFun1}, {linkfun, _LinkFun2}) -> - LinkFun1; %% arbitrary choice -resolve_prop({n_val, N1}, {n_val, N2}) -> - max(N1, N2); -resolve_prop({notfound_ok, NF1}, {notfound_ok, NF2}) -> - NF1 orelse NF2; -resolve_prop({old_vclock, Old1}, {old_vclock, Old2}) -> - max(Old1, Old2); -resolve_prop({postcommit, PC1}, {postcommit, PC2}) -> - resolve_hooks(PC1, PC2); -resolve_prop({pr, PR1}, {pr, PR2}) -> - max(PR1, PR2); -resolve_prop({precommit, PC1}, {precommit, PC2}) -> - resolve_hooks(PC1, PC2); -resolve_prop({pw, PW1}, {pw, PW2}) -> - max(PW1, PW2); -resolve_prop({r, R1}, {r, R2}) -> - max(R1, R2); -resolve_prop({rw, RW1}, {rw, RW2}) -> - max(RW1, RW2); -resolve_prop({small_vclock, Small1}, {small_vclock, Small2}) -> - max(Small1, Small2); -resolve_prop({w, W1}, {w, W2}) -> - max(W1, W2); -resolve_prop({young_vclock, Young1}, {young_vclock, Young2}) -> - max(Young1, Young2); -resolve_prop({sync_on_write, _}, {sync_on_write, all}) -> - all; -resolve_prop({sync_on_write, all}, {sync_on_write, _}) -> - all; -resolve_prop({sync_on_write, _}, {sync_on_write, one}) -> - one; -resolve_prop({sync_on_write, one}, {sync_on_write, _}) -> - one; -resolve_prop({_, V1}, {_, _V2}) -> - V1. - -resolve_hooks(Hooks1, Hooks2) -> - lists:usort(Hooks1 ++ Hooks2). - -%% =================================================================== -%% EUnit tests -%% =================================================================== - --ifdef(TEST). - -simple_resolve_test() -> - Props1 = [{name,<<"test">>}, - {allow_mult,false}, - {basic_quorum,false}, - {big_vclock,50}, - {chash_keyfun,{riak_core_util,chash_std_keyfun}}, - {dw,quorum}, - {last_write_wins,false}, - {linkfun,{modfun,riak_kv_wm_link_walker,mapreduce_linkfun}}, - {n_val,3}, - {notfound_ok,true}, - {old_vclock,86400}, - {postcommit,[]}, - {pr,0}, - {precommit,[{a, b}]}, - {pw,0}, - {r,quorum}, - {rw,quorum}, - {small_vclock,50}, - {w,quorum}, - {sync_on_write, one}, - {young_vclock,20}], - Props2 = [{name,<<"test">>}, - {allow_mult, true}, - {basic_quorum, true}, - {big_vclock,60}, - {chash_keyfun,{riak_core_util,chash_std_keyfun}}, - {dw,3}, - {last_write_wins,true}, - {linkfun,{modfun,riak_kv_wm_link_walker,mapreduce_linkfun}}, - {n_val,5}, - {notfound_ok,false}, - {old_vclock,86401}, - {postcommit,[{a, b}]}, - {pr,1}, - {precommit,[{c, d}]}, - {pw,3}, - {r,3}, - {rw,3}, - {w,1}, - {sync_on_write, all}, - {young_vclock,30}], - Expected = [{name,<<"test">>}, - {allow_mult,true}, - {basic_quorum,false}, - {big_vclock,60}, - {chash_keyfun,{riak_core_util,chash_std_keyfun}}, - {dw,quorum}, - {last_write_wins,false}, - {linkfun,{modfun,riak_kv_wm_link_walker,mapreduce_linkfun}}, - {n_val,5}, - {notfound_ok,true}, - {old_vclock,86401}, - {postcommit,[{a, b}]}, - {pr,1}, - {precommit,[{a, b}, {c, d}]}, - {pw,3}, - {r,quorum}, - {rw,quorum}, - {small_vclock,50}, - {w,quorum}, - {sync_on_write, all}, - {young_vclock,30}], - ?assertEqual(lists:ukeysort(1, Expected), lists:ukeysort(1, resolve(Props1, Props2))). - --endif. diff --git a/src/riak_core_claim.erl b/src/riak_core_claim.erl index 10689c015..6636a28b5 100644 --- a/src/riak_core_claim.erl +++ b/src/riak_core_claim.erl @@ -47,33 +47,37 @@ %% In that case, Riak will minimize the cases where the constraint is violated %% and they will all exist near the origin point of the ring. -%% A good way to decide on the setting of target_n_val for your application is -%% to set it to the largest value you expect to use for any bucket's n_val. The -%% default is 4. - -module(riak_core_claim). --export([claim/1, claim/3, claim_until_balanced/2, claim_until_balanced/4]). + +-export([claim/1, claim/3, claim_until_balanced/2, + claim_until_balanced/4]). + -export([default_wants_claim/1, default_wants_claim/2, - default_choose_claim/1, default_choose_claim/2, default_choose_claim/3, - never_wants_claim/1, never_wants_claim/2, - random_choose_claim/1, random_choose_claim/2, random_choose_claim/3]). + default_choose_claim/1, default_choose_claim/2, + default_choose_claim/3, never_wants_claim/1, + never_wants_claim/2, random_choose_claim/1, + random_choose_claim/2, random_choose_claim/3]). + -export([wants_claim_v2/1, wants_claim_v2/2, choose_claim_v2/1, choose_claim_v2/2, choose_claim_v2/3, claim_rebalance_n/2, claim_diversify/3, claim_diagonal/3, wants/1, wants_owns_diff/2, meets_target_n/2, diagonal_stripe/2, sequential_claim/2, get_counts/2]). + claim_rebalance_n/2, claim_diversify/3, + claim_diagonal/3, wants/1, wants_owns_diff/2, + meets_target_n/2, diagonal_stripe/2]). -define(DEF_TARGET_N, 4). -claim(Ring) -> - claim(Ring, want, choose). +claim(Ring) -> claim(Ring, want, choose). claim(Ring, _, _) -> Members = riak_core_ring:claiming_members(Ring), - lists:foldl(fun(Node, Ring0) -> + lists:foldl(fun (Node, Ring0) -> claim_until_balanced(Ring0, Node, want, choose) - end, Ring, Members). + end, + Ring, Members). claim_until_balanced(Ring, Node) -> claim_until_balanced(Ring, Node, want, choose). @@ -81,14 +85,14 @@ claim_until_balanced(Ring, Node) -> claim_until_balanced(Ring, Node, want, choose) -> NeedsIndexes = wants_claim_v2(Ring, Node), case NeedsIndexes of - no -> Ring; - {yes, _NumToClaim} -> - NewRing = choose_claim_v2(Ring, Node), - claim_until_balanced(NewRing, Node, want, choose) + no -> Ring; + {yes, _NumToClaim} -> + NewRing = choose_claim_v2(Ring, Node), + claim_until_balanced(NewRing, Node, want, choose) end. %% =================================================================== -%% Claim Function Implementations +%% Claim Function Implementations %% =================================================================== %% @spec default_choose_claim(riak_core_ring()) -> riak_core_ring() @@ -110,8 +114,7 @@ default_wants_claim(Ring) -> default_wants_claim(Ring, Node) -> wants_claim_v2(Ring, Node). -wants_claim_v2(Ring) -> - wants_claim_v2(Ring, node()). +wants_claim_v2(Ring) -> wants_claim_v2(Ring, node()). wants_claim_v2(Ring, Node) -> Active = riak_core_ring:claiming_members(Ring), @@ -122,25 +125,23 @@ wants_claim_v2(Ring, Node) -> Avg = RingSize div NodeCount, Count = proplists:get_value(Node, Counts, 0), case Count < Avg of - false -> no; - true -> {yes, Avg - Count} + false -> no; + true -> {yes, Avg - Count} end. %% Provide default choose parameters if none given -default_choose_params() -> - default_choose_params([]). +default_choose_params() -> default_choose_params([]). default_choose_params(Params) -> case proplists:get_value(target_n_val, Params) of - undefined -> - TN = application:get_env(riak_core, target_n_val, ?DEF_TARGET_N), - [{target_n_val, TN} | Params]; - _-> - Params + undefined -> + TN = application:get_env(riak_core, target_n_val, + ?DEF_TARGET_N), + [{target_n_val, TN} | Params]; + _ -> Params end. -choose_claim_v2(Ring) -> - choose_claim_v2(Ring, node()). +choose_claim_v2(Ring) -> choose_claim_v2(Ring, node()). choose_claim_v2(Ring, Node) -> Params = default_choose_params(), @@ -158,69 +159,68 @@ choose_claim_v2(RingOrig, Node, Params0) -> RingSize = riak_core_ring:num_partitions(Ring), NodeCount = erlang:length(Active), %% Deltas::[node(), integer()] - Deltas = get_deltas(RingSize, NodeCount, Owners, Counts), + Deltas = get_deltas(RingSize, NodeCount, Owners, + Counts), {_, Want} = lists:keyfind(Node, 1, Deltas), TargetN = proplists:get_value(target_n_val, Params), - AllIndices = lists:zip(lists:seq(0, length(Owners)-1), + AllIndices = lists:zip(lists:seq(0, length(Owners) - 1), [Idx || {Idx, _} <- Owners]), - - EnoughNodes = - (NodeCount > TargetN) - or ((NodeCount == TargetN) and (RingSize rem TargetN =:= 0)), + EnoughNodes = (NodeCount > TargetN) or + (NodeCount == TargetN) and (RingSize rem TargetN =:= 0), case EnoughNodes of - true -> - %% If we have enough nodes to meet target_n, then we prefer to - %% claim indices that are currently causing violations, and then - %% fallback to indices in linear order. The filtering steps below - %% will ensure no new violations are introduced. - Violated = lists:flatten(find_violations(Ring, TargetN)), - Violated2 = [lists:keyfind(Idx, 2, AllIndices) || Idx <- Violated], - Indices = Violated2 ++ (AllIndices -- Violated2); - false -> - %% If we do not have enough nodes to meet target_n, then we prefer - %% claiming the same indices that would occur during a - %% re-diagonalization of the ring with target_n nodes, falling - %% back to linear offsets off these preferred indices when the - %% number of indices desired is less than the computed set. - Padding = lists:duplicate(TargetN, undefined), - Expanded = lists:sublist(Active ++ Padding, TargetN), - ExpandedLocation = get_nodes_by_location(Expanded, Ring), - PreferredClaim = riak_core_claim:diagonal_stripe(Ring, ExpandedLocation), - PreferredNth = [begin - {Nth, Idx} = lists:keyfind(Idx, 2, AllIndices), - Nth - end || {Idx,Owner} <- PreferredClaim, - Owner =:= Node], - Offsets = lists:seq(0, RingSize div length(PreferredNth)), - AllNth = lists:sublist([(X+Y) rem RingSize || Y <- Offsets, - X <- PreferredNth], - RingSize), - Indices = [lists:keyfind(Nth, 1, AllIndices) || Nth <- AllNth] + true -> + %% If we have enough nodes to meet target_n, then we prefer to + %% claim indices that are currently causing violations, and then + %% fallback to indices in linear order. The filtering steps below + %% will ensure no new violations are introduced. + Violated = lists:flatten(find_violations(Ring, + TargetN)), + Violated2 = [lists:keyfind(Idx, 2, AllIndices) + || Idx <- Violated], + Indices = Violated2 ++ AllIndices -- Violated2; + false -> + %% If we do not have enough nodes to meet target_n, then we prefer + %% claiming the same indices that would occur during a + %% re-diagonalization of the ring with target_n nodes, falling + %% back to linear offsets off these preferred indices when the + %% number of indices desired is less than the computed set. + Padding = lists:duplicate(TargetN, undefined), + Expanded = lists:sublist(Active ++ Padding, TargetN), + PreferredClaim = riak_core_claim:diagonal_stripe(Ring, + Expanded), + PreferredNth = [begin + {Nth, Idx} = lists:keyfind(Idx, 2, AllIndices), Nth + end + || {Idx, Owner} <- PreferredClaim, Owner =:= Node], + Offsets = lists:seq(0, + RingSize div length(PreferredNth)), + AllNth = lists:sublist([(X + Y) rem RingSize + || Y <- Offsets, X <- PreferredNth], + RingSize), + Indices = [lists:keyfind(Nth, 1, AllIndices) + || Nth <- AllNth] end, - %% Filter out indices that conflict with the node's existing ownership - Indices2 = prefilter_violations(Ring, Node, AllIndices, Indices, - TargetN, RingSize), + Indices2 = prefilter_violations(Ring, Node, AllIndices, + Indices, TargetN, RingSize), %% Claim indices from the remaining candidate set - Claim2 = case select_indices(Owners, Deltas, Indices2, TargetN, RingSize) of - [] -> []; - Claim -> lists:sublist(Claim, Want) - end, - NewRing = lists:foldl(fun(Idx, Ring0) -> + Claim = select_indices(Owners, Deltas, Indices2, + TargetN, RingSize), + Claim2 = lists:sublist(Claim, Want), + NewRing = lists:foldl(fun (Idx, Ring0) -> riak_core_ring:transfer_node(Idx, Node, Ring0) - end, Ring, Claim2), - - RingChanged = ([] /= Claim2), + end, + Ring, Claim2), + RingChanged = [] /= Claim2, RingMeetsTargetN = meets_target_n(NewRing, TargetN), case {RingChanged, EnoughNodes, RingMeetsTargetN} of - {false, _, _} -> - %% Unable to claim, fallback to re-diagonalization - sequential_claim(Ring, Node, TargetN); - {_, true, false} -> - %% Failed to meet target_n, fallback to re-diagonalization - sequential_claim(Ring, Node, TargetN); - _ -> - NewRing + {false, _, _} -> + %% Unable to claim, fallback to re-diagonalization + sequential_claim(Ring, Node, TargetN); + {_, true, false} -> + %% Failed to meet target_n, fallback to re-diagonalization + sequential_claim(Ring, Node, TargetN); + _ -> NewRing end. %% @private for each node in owners return a tuple of owner and delta @@ -228,24 +228,29 @@ choose_claim_v2(RingOrig, Node, Params0) -> %% needs it's ownership to change by. A positive means the owner needs %% that many more partitions, a negative means the owner can lose that %% many paritions. --spec get_deltas(RingSize::pos_integer(), - NodeCount::pos_integer(), - Owners::[{Index::non_neg_integer(), node()}], - Counts::[{node(), non_neg_integer()}]) -> - Deltas::[{node(), integer()}]. +-spec get_deltas(RingSize :: pos_integer(), + NodeCount :: pos_integer(), + Owners :: [{Index :: non_neg_integer(), node()}], + Counts :: [{node(), non_neg_integer()}]) -> Deltas :: + [{node(), + integer()}]. + get_deltas(RingSize, NodeCount, Owners, Counts) -> Avg = RingSize / NodeCount, %% the most any node should own Max = ceiling(RingSize / NodeCount), - ActiveDeltas = [{Member, Count, normalise_delta(Avg - Count)} + ActiveDeltas = [{Member, Count, + normalise_delta(Avg - Count)} || {Member, Count} <- Counts], - BalancedDeltas = rebalance_deltas(ActiveDeltas, Max, RingSize), + BalancedDeltas = rebalance_deltas(ActiveDeltas, Max, + RingSize), add_default_deltas(Owners, BalancedDeltas, 0). %% @private a node can only claim whole partitions, but if RingSize %% rem NodeCount /= 0, a delta will be a float. This function decides %% if that float should be floored or ceilinged -spec normalise_delta(float()) -> integer(). + normalise_delta(Delta) when Delta < 0 -> %% if the node has too many (a negative delta) give up the most %% you can (will be rebalanced) @@ -259,90 +264,101 @@ normalise_delta(Delta) -> %% node has more vnodes than it should (e.g. [{n1, 6}, {n2, 6}, {n3, %% 6}, {n4, 8}, {n5,6} we rebalance the deltas so that select_indices %% doesn't leave some node not giving up enough partitions --spec rebalance_deltas([{node(), integer()}], pos_integer(), pos_integer()) -> [{node(), integer()}]. -rebalance_deltas(NodeDeltas, Max, RingSize) -> - AppliedDeltas = [Own + Delta || {_, Own, Delta} <- NodeDeltas], +-spec rebalance_deltas([{node(), integer()}], + pos_integer(), pos_integer()) -> [{node(), integer()}]. +rebalance_deltas(NodeDeltas, Max, RingSize) -> + AppliedDeltas = [Own + Delta + || {_, Own, Delta} <- NodeDeltas], case lists:sum(AppliedDeltas) - RingSize of - 0 -> - [{Node, Delta} || {Node, _Cnt, Delta} <- NodeDeltas]; - N when N < 0 -> - increase_keeps(NodeDeltas, N, Max, []) + 0 -> + [{Node, Delta} || {Node, _Cnt, Delta} <- NodeDeltas]; + N when N < 0 -> increase_keeps(NodeDeltas, N, Max, []) end. %% @private increases the delta for (some) nodes giving away %% partitions to the max they can keep --spec increase_keeps(Deltas::[{node(), integer()}], - WantsError::integer(), - Max::pos_integer(), - Acc::[{node(), integer()}]) -> - Rebalanced::[{node(), integer()}]. +-spec increase_keeps(Deltas :: [{node(), integer()}], + WantsError :: integer(), Max :: pos_integer(), + Acc :: [{node(), integer()}]) -> Rebalanced :: [{node(), + integer()}]. + increase_keeps(Rest, 0, _Max, Acc) -> - [{Node, Delta} || {Node, _Own, Delta} <- lists:usort(lists:append(Rest, Acc))]; + [{Node, Delta} + || {Node, _Own, Delta} + <- lists:usort(lists:append(Rest, Acc))]; increase_keeps([], N, Max, Acc) when N < 0 -> increase_takes(lists:reverse(Acc), N, Max, []); -increase_keeps([{Node, Own, Delta} | Rest], N, Max, Acc) when Delta < 0 -> +increase_keeps([{Node, Own, Delta} | Rest], N, Max, Acc) + when Delta < 0 -> WouldOwn = Own + Delta, - Additive = case WouldOwn +1 =< Max of - true -> 1; - false -> 0 + Additive = case WouldOwn + 1 =< Max of + true -> 1; + false -> 0 end, - increase_keeps(Rest, N+Additive, Max, [{Node, Own+Delta+Additive} | Acc]); + increase_keeps(Rest, N + Additive, Max, + [{Node, Own + Delta + Additive} | Acc]); increase_keeps([NodeDelta | Rest], N, Max, Acc) -> increase_keeps(Rest, N, Max, [NodeDelta | Acc]). %% @private increases the delta for (some) nodes taking partitions to the max %% they can ask for --spec increase_takes(Deltas::[{node(), integer()}], - WantsError::integer(), - Max::pos_integer(), - Acc::[{node(), integer()}]) -> - Rebalanced::[{node(), integer()}]. +-spec increase_takes(Deltas :: [{node(), integer()}], + WantsError :: integer(), Max :: pos_integer(), + Acc :: [{node(), integer()}]) -> Rebalanced :: [{node(), + integer()}]. + increase_takes(Rest, 0, _Max, Acc) -> - [{Node, Delta} || {Node, _Own, Delta} <- lists:usort(lists:append(Rest, Acc))]; + [{Node, Delta} + || {Node, _Own, Delta} + <- lists:usort(lists:append(Rest, Acc))]; increase_takes([], N, _Max, Acc) when N < 0 -> - [{Node, Delta} || {Node, _Own, Delta} <- lists:usort(Acc)]; -increase_takes([{Node, Own, Delta} | Rest], N, Max, Acc) when Delta > 0 -> + [{Node, Delta} + || {Node, _Own, Delta} <- lists:usort(Acc)]; +increase_takes([{Node, Own, Delta} | Rest], N, Max, Acc) + when Delta > 0 -> WouldOwn = Own + Delta, - Additive = case WouldOwn +1 =< Max of - true -> 1; - false -> 0 + Additive = case WouldOwn + 1 =< Max of + true -> 1; + false -> 0 end, - increase_takes(Rest, N+Additive, Max, [{Node, Own, Delta+Additive} | Acc]); + increase_takes(Rest, N + Additive, Max, + [{Node, Own, Delta + Additive} | Acc]); increase_takes([NodeDelta | Rest], N, Max, Acc) -> increase_takes(Rest, N, Max, [NodeDelta | Acc]). meets_target_n(Ring, TargetN) -> - Owners = lists:keysort(1, riak_core_ring:all_owners(Ring)), + Owners = lists:keysort(1, + riak_core_ring:all_owners(Ring)), meets_target_n(Owners, TargetN, 0, [], []). -meets_target_n([{Part,Node}|Rest], TargetN, Index, First, Last) -> + +meets_target_n([{Part, Node} | Rest], TargetN, Index, + First, Last) -> case lists:keytake(Node, 1, Last) of - {value, {Node, LastIndex, _}, NewLast} -> - if Index-LastIndex >= TargetN -> - %% node repeat respects TargetN - meets_target_n(Rest, TargetN, Index+1, First, - [{Node, Index, Part}|NewLast]); - true -> - %% violation of TargetN - false - end; - false -> - %% haven't seen this node yet - meets_target_n(Rest, TargetN, Index+1, - [{Node, Index}|First], [{Node, Index, Part}|Last]) + {value, {Node, LastIndex, _}, NewLast} -> + if Index - LastIndex >= TargetN -> + %% node repeat respects TargetN + meets_target_n(Rest, TargetN, Index + 1, First, + [{Node, Index, Part} | NewLast]); + true -> + %% violation of TargetN + false + end; + false -> + %% haven't seen this node yet + meets_target_n(Rest, TargetN, Index + 1, + [{Node, Index} | First], [{Node, Index, Part} | Last]) end; meets_target_n([], TargetN, Index, First, Last) -> %% start through end guarantees TargetN %% compute violations at wrap around, but don't fail %% because of them: handle during reclaim - Violations = - lists:filter(fun({Node, L, _}) -> - {Node, F} = proplists:lookup(Node, First), - (Index-L)+F < TargetN - end, - Last), - {true, [ Part || {_, _, Part} <- Violations ]}. - + Violations = lists:filter(fun ({Node, L, _}) -> + {Node, F} = proplists:lookup(Node, First), + Index - L + F < TargetN + end, + Last), + {true, [Part || {_, _, Part} <- Violations]}. %% Claim diversify tries to build a perfectly diverse ownership list that meets %% target N. It uses wants to work out which nodes want partitions, but does @@ -350,18 +366,21 @@ meets_target_n([], TargetN, Index, First, Last) -> %% list, updating the adjacency matrix needed to compute the diversity score as each %% node is added and uses it to drive the selection of the next nodes. claim_diversify(Wants, Owners, Params) -> - TN = proplists:get_value(target_n_val, Params, ?DEF_TARGET_N), + TN = proplists:get_value(target_n_val, Params, + ?DEF_TARGET_N), Q = length(Owners), - Claiming = [N || {N,W} <- Wants, W > 0], - {ok, NewOwners, _AM} = riak_core_claim_util:construct( - riak_core_claim_util:gen_complete_len(Q), Claiming, TN), + Claiming = [N || {N, W} <- Wants, W > 0], + {ok, NewOwners, _AM} = + riak_core_claim_util:construct(riak_core_claim_util:gen_complete_len(Q), + Claiming, TN), {NewOwners, [diversified]}. %% Claim nodes in seq a,b,c,a,b,c trying to handle the wraparound %% case to meet target N claim_diagonal(Wants, Owners, Params) -> - TN = proplists:get_value(target_n_val, Params, ?DEF_TARGET_N), - Claiming = lists:sort([N || {N,W} <- Wants, W > 0]), + TN = proplists:get_value(target_n_val, Params, + ?DEF_TARGET_N), + Claiming = lists:sort([N || {N, W} <- Wants, W > 0]), S = length(Claiming), Q = length(Owners), Reps = Q div S, @@ -370,12 +389,12 @@ claim_diagonal(Wants, Owners, Params) -> %% are available. Tail = Q - Reps * S, Last = case S >= TN + Tail of - true -> % If number wanted can be filled excluding first TN nodes - lists:sublist(lists:nthtail(TN - Tail, Claiming), Tail); - _ -> - lists:sublist(Claiming, Tail) + true -> % If number wanted can be filled excluding first TN nodes + lists:sublist(lists:nthtail(TN - Tail, Claiming), Tail); + _ -> lists:sublist(Claiming, Tail) end, - {lists:flatten([lists:duplicate(Reps, Claiming), Last]), [diagonalized]}. + {lists:flatten([lists:duplicate(Reps, Claiming), Last]), + [diagonalized]}. sequential_claim(Ring, Node) -> TN = app_helper:get_env(riak_core, target_n_val, ?DEF_TARGET_N), @@ -387,111 +406,127 @@ sequential_claim(Ring, Node) -> %% attempts to eliminate tail violations (for example a ring that %% starts/ends n1 | n2 | ...| n3 | n4 | n1) -spec sequential_claim(riak_core_ring:riak_core_ring(), - node(), - integer()) -> - riak_core_ring:riak_core_ring(). + node(), integer()) -> riak_core_ring:riak_core_ring(). + sequential_claim(Ring, Node, TargetN) -> - Nodes = lists:usort([Node|riak_core_ring:claiming_members(Ring)]), + Nodes = lists:usort([Node + | riak_core_ring:claiming_members(Ring)]), NodeCount = length(Nodes), RingSize = riak_core_ring:num_partitions(Ring), - Overhang = RingSize rem NodeCount, - HasTailViolation = (Overhang > 0 andalso Overhang < TargetN), + HasTailViolation = Overhang > 0 andalso + Overhang < TargetN, Shortfall = TargetN - Overhang, CompleteSequences = RingSize div NodeCount, MaxFetchesPerSeq = NodeCount - TargetN, - MinFetchesPerSeq = ceiling(Shortfall / CompleteSequences), - CanSolveViolation = ((CompleteSequences * MaxFetchesPerSeq) >= Shortfall), - - Zipped = case (HasTailViolation andalso CanSolveViolation) of - true-> - Partitions = lists:sort([ I || {I, _} <- riak_core_ring:all_owners(Ring) ]), - Nodelist = solve_tail_violations(RingSize, Nodes, Shortfall, MinFetchesPerSeq), - lists:zip(Partitions, lists:flatten(Nodelist)); - false -> - diagonal_stripe(Ring, Nodes) - end, - - lists:foldl(fun({P, N}, Acc) -> + MinFetchesPerSeq = ceiling(Shortfall / + CompleteSequences), + CanSolveViolation = CompleteSequences * MaxFetchesPerSeq + >= Shortfall, + Zipped = case HasTailViolation andalso CanSolveViolation + of + true -> + Partitions = lists:sort([I + || {I, _} + <- riak_core_ring:all_owners(Ring)]), + Nodelist = solve_tail_violations(RingSize, Nodes, + Shortfall, + MinFetchesPerSeq), + lists:zip(Partitions, lists:flatten(Nodelist)); + false -> diagonal_stripe(Ring, Nodes) + end, + lists:foldl(fun ({P, N}, Acc) -> riak_core_ring:transfer_node(P, N, Acc) end, - Ring, - Zipped). - + Ring, Zipped). %% @private every module has a ceiling function -spec ceiling(float()) -> integer(). + ceiling(F) -> T = trunc(F), case F - T == 0 of - true -> - T; - false -> - T + 1 + true -> T; + false -> T + 1 end. - %% @private rem_fill increase the tail so that there is no wrap around %% preflist violation, by taking a `Shortfall' number nodes from %% earlier in the preflist --spec solve_tail_violations(integer(), [node()], integer(), integer()) -> [node()]. -solve_tail_violations(RingSize, Nodes, Shortfall, MinFetchesPerSeq) -> - StartingNode = (RingSize rem length(Nodes)) + 1, - build_nodelist(RingSize, Nodes, Shortfall, StartingNode, MinFetchesPerSeq, []). +-spec solve_tail_violations(integer(), [node()], + integer(), integer()) -> [node()]. + +solve_tail_violations(RingSize, Nodes, Shortfall, + MinFetchesPerSeq) -> + StartingNode = RingSize rem length(Nodes) + 1, + build_nodelist(RingSize, Nodes, Shortfall, StartingNode, + MinFetchesPerSeq, []). %% @private build the node list by building tail to satisfy TargetN, then removing %% the added nodes from earlier segments --spec build_nodelist(integer(), [node()], integer(), integer(), integer(), [node()]) -> [node()]. -build_nodelist(RingSize, Nodes, _Shortfall=0, _NodeCounter, _MinFetchesPerSeq, Acc) -> +-spec build_nodelist(integer(), [node()], integer(), + integer(), integer(), [node()]) -> [node()]. + +build_nodelist(RingSize, Nodes, _Shortfall = 0, + _NodeCounter, _MinFetchesPerSeq, Acc) -> %% Finished shuffling, backfill if required ShuffledRing = lists:flatten(Acc), backfill_ring(RingSize, Nodes, - (RingSize-length(ShuffledRing)) div (length(Nodes)), Acc); -build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, MinFetchesPerSeq, _Acc=[]) -> + (RingSize - length(ShuffledRing)) div length(Nodes), + Acc); +build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, + MinFetchesPerSeq, _Acc = []) -> %% Build the tail with sufficient nodes to satisfy TargetN NodeCount = length(Nodes), - LastSegLength = (RingSize rem NodeCount) + Shortfall, + LastSegLength = RingSize rem NodeCount + Shortfall, NewSeq = lists:sublist(Nodes, 1, LastSegLength), - build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, MinFetchesPerSeq, NewSeq); -build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, MinFetchesPerSeq, Acc) -> + build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, + MinFetchesPerSeq, NewSeq); +build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, + MinFetchesPerSeq, Acc) -> %% Build rest of list, subtracting minimum of MinFetchesPerSeq, Shortfall %% or (NodeCount - NodeCounter) each time NodeCount = length(Nodes), - NodesToRemove = min(min(MinFetchesPerSeq, Shortfall), NodeCount - NodeCounter), - RemovalList = lists:sublist(Nodes, NodeCounter, NodesToRemove), - NewSeq = lists:subtract(Nodes,RemovalList), + NodesToRemove = min(min(MinFetchesPerSeq, Shortfall), + NodeCount - NodeCounter), + RemovalList = lists:sublist(Nodes, NodeCounter, + NodesToRemove), + NewSeq = lists:subtract(Nodes, RemovalList), NewNodeCounter = NodeCounter + NodesToRemove, - build_nodelist(RingSize, Nodes, Shortfall - NodesToRemove, NewNodeCounter, - MinFetchesPerSeq, [ NewSeq | Acc]). + build_nodelist(RingSize, Nodes, + Shortfall - NodesToRemove, NewNodeCounter, + MinFetchesPerSeq, [NewSeq | Acc]). %% @private Backfill the ring with full sequences --spec backfill_ring(integer(), [node()], integer(), [node()]) -> [node()]. -backfill_ring(_RingSize, _Nodes, _Remaining=0, Acc) -> +-spec backfill_ring(integer(), [node()], integer(), + [node()]) -> [node()]. + +backfill_ring(_RingSize, _Nodes, _Remaining = 0, Acc) -> Acc; backfill_ring(RingSize, Nodes, Remaining, Acc) -> - backfill_ring(RingSize, Nodes, Remaining - 1, [Nodes | Acc]). - + backfill_ring(RingSize, Nodes, Remaining - 1, + [Nodes | Acc]). claim_rebalance_n(Ring, Node) -> - Nodes = lists:usort([Node|riak_core_ring:claiming_members(Ring)]), + Nodes = lists:usort([Node + | riak_core_ring:claiming_members(Ring)]), Zipped = diagonal_stripe(Ring, Nodes), - - lists:foldl(fun({P, N}, Acc) -> + lists:foldl(fun ({P, N}, Acc) -> riak_core_ring:transfer_node(P, N, Acc) end, - Ring, - Zipped). + Ring, Zipped). diagonal_stripe(Ring, Nodes) -> %% diagonal stripes guarantee most disperse data - Partitions = lists:sort([ I || {I, _} <- riak_core_ring:all_owners(Ring) ]), + Partitions = lists:sort([I + || {I, _} <- riak_core_ring:all_owners(Ring)]), Zipped = lists:zip(Partitions, - lists:sublist( - lists:flatten( - lists:duplicate( - 1+(length(Partitions) div length(Nodes)), - Nodes)), - 1, length(Partitions))), + lists:sublist(lists:flatten(lists:duplicate(1 + + length(Partitions) + div + length(Nodes), + Nodes)), + 1, length(Partitions))), Zipped. random_choose_claim(Ring) -> @@ -507,7 +542,8 @@ random_choose_claim(Ring, Node, _Params) -> %% @spec never_wants_claim(riak_core_ring()) -> no %% @doc For use by nodes that should not claim any partitions. never_wants_claim(_) -> no. -never_wants_claim(_,_) -> no. + +never_wants_claim(_, _) -> no. %% =================================================================== %% Private @@ -519,35 +555,37 @@ never_wants_claim(_,_) -> no. %% property. find_violations(Ring, TargetN) -> Owners = riak_core_ring:all_owners(Ring), - Suffix = lists:sublist(Owners, TargetN-1), + Suffix = lists:sublist(Owners, TargetN - 1), Owners2 = Owners ++ Suffix, %% Use a sliding window to determine violations - {Bad, _} = lists:foldl(fun(P={Idx, Owner}, {Out, Window}) -> - Window2 = lists:sublist([P|Window], TargetN-1), + {Bad, _} = lists:foldl(fun (P = {Idx, Owner}, + {Out, Window}) -> + Window2 = lists:sublist([P | Window], + TargetN - 1), case lists:keyfind(Owner, 2, Window) of - {PrevIdx, Owner} -> - {[[PrevIdx, Idx] | Out], Window2}; - false -> - {Out, Window2} + {PrevIdx, Owner} -> + {[[PrevIdx, Idx] | Out], Window2}; + false -> {Out, Window2} end - end, {[], []}, Owners2), + end, + {[], []}, Owners2), lists:reverse(Bad). %% @private %% %% @doc Counts up the number of partitions owned by each node. --spec get_counts([node()], [{integer(),_}]) -> - [{node(), non_neg_integer()}]. +-spec get_counts([node()], + [{integer(), _}]) -> [{node(), non_neg_integer()}]. + get_counts(Nodes, Ring) -> Empty = [{Node, 0} || Node <- Nodes], - Counts = lists:foldl(fun({_Idx, Node}, Counts) -> + Counts = lists:foldl(fun ({_Idx, Node}, Counts) -> case lists:member(Node, Nodes) of - true -> - dict:update_counter(Node, 1, Counts); - false -> - Counts + true -> dict:update_counter(Node, 1, Counts); + false -> Counts end - end, dict:from_list(Empty), Ring), + end, + dict:from_list(Empty), Ring), dict:to_list(Counts). %% @private @@ -561,13 +599,17 @@ add_default_deltas(IdxOwners, Deltas, Default) -> %% %% @doc Filter out candidate indices that would violate target_n given %% a node's current partition ownership. -prefilter_violations(Ring, Node, AllIndices, Indices, TargetN, RingSize) -> +prefilter_violations(Ring, Node, AllIndices, Indices, + TargetN, RingSize) -> CurrentIndices = riak_core_ring:indices(Ring, Node), - CurrentNth = [lists:keyfind(Idx, 2, AllIndices) || Idx <- CurrentIndices], - [{Nth, Idx} || {Nth, Idx} <- Indices, - lists:all(fun({CNth, _}) -> - spaced_by_n(CNth, Nth, TargetN, RingSize) - end, CurrentNth)]. + CurrentNth = [lists:keyfind(Idx, 2, AllIndices) + || Idx <- CurrentIndices], + [{Nth, Idx} + || {Nth, Idx} <- Indices, + lists:all(fun ({CNth, _}) -> + spaced_by_n(CNth, Nth, TargetN, RingSize) + end, + CurrentNth)]. %% @private %% @@ -581,9 +623,11 @@ prefilter_violations(Ring, Node, AllIndices, Indices, TargetN, RingSize) -> %% expected ownership. In other words, if A owns 5 partitions and %% the desired ownership is 3, then we try to claim at most 2 partitions %% from A. -select_indices(_Owners, _Deltas, [], _TargetN, _RingSize) -> +select_indices(_Owners, _Deltas, [], _TargetN, + _RingSize) -> []; -select_indices(Owners, Deltas, Indices, TargetN, RingSize) -> +select_indices(Owners, Deltas, Indices, TargetN, + RingSize) -> OwnerDT = dict:from_list(Owners), {FirstNth, _} = hd(Indices), %% The `First' symbol indicates whether or not this is the first @@ -592,23 +636,29 @@ select_indices(Owners, Deltas, Indices, TargetN, RingSize) -> %% _always_ safe to claim the first partition that another owner %% is willing to part with. It's the subsequent partitions %% claimed by this node that must not break the target_n invariant. - {Claim, _, _, _} = - lists:foldl(fun({Nth, Idx}, {Out, LastNth, DeltaDT, First}) -> - Owner = dict:fetch(Idx, OwnerDT), - Delta = dict:fetch(Owner, DeltaDT), - MeetsTN = spaced_by_n(LastNth, Nth, TargetN, - RingSize), - case (Delta < 0) and (First or MeetsTN) of - true -> - NextDeltaDT = - dict:update_counter(Owner, 1, DeltaDT), - {[Idx|Out], Nth, NextDeltaDT, false}; - false -> - {Out, LastNth, DeltaDT, First} - end - end, - {[], FirstNth, dict:from_list(Deltas), true}, - Indices), + {Claim, _, _, _} = lists:foldl(fun ({Nth, Idx}, + {Out, LastNth, DeltaDT, First}) -> + Owner = dict:fetch(Idx, OwnerDT), + Delta = dict:fetch(Owner, DeltaDT), + MeetsTN = spaced_by_n(LastNth, Nth, + TargetN, + RingSize), + case (Delta < 0) and + (First or MeetsTN) + of + true -> + NextDeltaDT = + dict:update_counter(Owner, + 1, + DeltaDT), + {[Idx | Out], Nth, NextDeltaDT, + false}; + false -> + {Out, LastNth, DeltaDT, First} + end + end, + {[], FirstNth, dict:from_list(Deltas), true}, + Indices), lists:reverse(Claim). %% @private @@ -616,75 +666,60 @@ select_indices(Owners, Deltas, Indices, TargetN, RingSize) -> %% @doc Determine if two positions in the ring meet target_n spacing. spaced_by_n(NthA, NthB, TargetN, RingSize) -> case NthA > NthB of - true -> - NFwd = NthA - NthB, - NBack = NthB - NthA + RingSize; - false -> - NFwd = NthA - NthB + RingSize, - NBack = NthB - NthA + true -> + NFwd = NthA - NthB, NBack = NthB - NthA + RingSize; + false -> + NFwd = NthA - NthB + RingSize, NBack = NthB - NthA end, (NFwd >= TargetN) and (NBack >= TargetN). - %% For each node in wants, work out how many more partition each node wants (positive) or is %% overloaded by (negative) compared to what it owns. wants_owns_diff(Wants, Owns) -> - [ case lists:keyfind(N, 1, Owns) of - {N, O} -> - {N, W - O}; - false -> - {N,W} - end || {N, W} <- Wants ]. - + [case lists:keyfind(N, 1, Owns) of + {N, O} -> {N, W - O}; + false -> {N, W} + end + || {N, W} <- Wants]. + %% Given a ring, work out how many partition each wants to be %% considered balanced wants(Ring) -> - Active = lists:sort(riak_core_ring:claiming_members(Ring)), + Active = + lists:sort(riak_core_ring:claiming_members(Ring)), Inactive = riak_core_ring:all_members(Ring) -- Active, Q = riak_core_ring:num_partitions(Ring), - ActiveWants = lists:zip(Active, wants_counts(length(Active), Q)), - InactiveWants = [ {N, 0} || N <- Inactive ], + ActiveWants = lists:zip(Active, + wants_counts(length(Active), Q)), + InactiveWants = [{N, 0} || N <- Inactive], lists:sort(ActiveWants ++ InactiveWants). %% @private -%% Given a number of nodes and ring size, return a list of +%% Given a number of nodes and ring size, return a list of %% desired ownership, S long that add up to Q wants_counts(S, Q) -> Max = roundup(Q / S), - case S * Max - Q of - 0 -> - lists:duplicate(S, Max); - X -> - lists:duplicate(X, Max - 1) ++ lists:duplicate(S - X, Max) + case S * Max - Q of + 0 -> lists:duplicate(S, Max); + X -> + lists:duplicate(X, Max - 1) ++ + lists:duplicate(S - X, Max) end. %% Round up to next whole integer - ceil roundup(I) when I >= 0 -> T = erlang:trunc(I), - case (I - T) of - Neg when Neg < 0 -> T; - Pos when Pos > 0 -> T + 1; - _ -> T + case I - T of + Neg when Neg < 0 -> T; + Pos when Pos > 0 -> T + 1; + _ -> T end. - -%% @private -%% Get active nodes ordered by take location parameters into account --spec get_nodes_by_location([node()|undefined], riak_core_ring:riak_core_ring()) -> - [node()|undefined]. -get_nodes_by_location(Nodes, Ring) -> - NodesLocations = riak_core_ring:get_nodes_locations(Ring), - case riak_core_location:has_location_set_in_cluster(NodesLocations) of - false -> - Nodes; - true -> - riak_core_location:stripe_nodes_by_location(Nodes, NodesLocations) - end. - %% =================================================================== %% Unit tests %% =================================================================== -ifdef(TEST). + -compile(export_all). -include_lib("eunit/include/eunit.hrl"). @@ -693,19 +728,21 @@ wants_claim_test() -> riak_core_ring_manager:setup_ets(test), riak_core_test_util:setup_mockring1(), {ok, Ring} = riak_core_ring_manager:get_my_ring(), - ?assertEqual({yes, 1}, default_wants_claim(Ring)), + ?assertEqual({yes, 1}, (default_wants_claim(Ring))), riak_core_ring_manager:cleanup_ets(test), riak_core_ring_manager:stop(). - %% @private console helper function to return node lists for claiming %% partitions --spec gen_diag(pos_integer(), pos_integer()) -> [Node::atom()]. +-spec gen_diag(pos_integer(), pos_integer()) -> [Node :: + atom()]. + gen_diag(RingSize, NodeCount) -> - Nodes = [list_to_atom(lists:concat(["n_", N])) || N <- lists:seq(1, NodeCount)], + Nodes = [list_to_atom(lists:concat(["n_", N])) + || N <- lists:seq(1, NodeCount)], {HeadNode, RestNodes} = {hd(Nodes), tl(Nodes)}, R0 = riak_core_ring:fresh(RingSize, HeadNode), - RAdded = lists:foldl(fun(Node, Racc) -> + RAdded = lists:foldl(fun (Node, Racc) -> riak_core_ring:add_member(HeadNode, Racc, Node) end, R0, RestNodes), @@ -715,388 +752,13 @@ gen_diag(RingSize, NodeCount) -> %% @private call with result of gen_diag/1 only, does the list have %% tail violations, returns true if so, false otherwise. --spec has_violations([Node::atom()]) -> boolean(). +-spec has_violations([Node :: atom()]) -> boolean(). + has_violations(Diag) -> RS = length(Diag), NC = length(lists:usort(Diag)), Overhang = RS rem NC, - (Overhang > 0 andalso Overhang < 4). %% hardcoded target n of 4 - - --ifdef(EQC). - --export([prop_claim_ensures_unique_nodes/1, prop_wants/0, prop_wants_counts/0, eqc_check/2]). --include_lib("eqc/include/eqc.hrl"). --include_lib("eunit/include/eunit.hrl"). - - --define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). - --define(POW_2(N), trunc(math:pow(2, N))). - -eqc_check(File, Prop) -> - {ok, Bytes} = file:read_file(File), - CE = binary_to_term(Bytes), - eqc:check(Prop, CE). - -test_nodes(Count) -> - [node() | [list_to_atom(lists:concat(["n_", N])) || N <- lists:seq(1, Count-1)]]. - -test_nodes(Count, StartNode) -> - [list_to_atom(lists:concat(["n_", N])) || N <- lists:seq(StartNode, StartNode + Count)]. - -property_claim_ensures_unique_nodes_v2_test_() -> - Prop = eqc:testing_time(30, ?QC_OUT(prop_claim_ensures_unique_nodes(choose_claim_v2))), - {timeout, 120, fun() -> ?assert(eqc:quickcheck(Prop)) end}. - -property_claim_ensures_unique_nodes_adding_groups_v2_test_() -> - Prop = eqc:testing_time(30, ?QC_OUT(prop_claim_ensures_unique_nodes_adding_groups(choose_claim_v2))), - {timeout, 120, fun() -> ?assert(eqc:quickcheck(Prop)) end}. - -property_claim_ensures_unique_nodes_adding_singly_v2_test_() -> - Prop = eqc:testing_time(30, ?QC_OUT(prop_claim_ensures_unique_nodes_adding_singly(choose_claim_v2))), - {timeout, 120, fun() -> ?assert(eqc:quickcheck(Prop)) end}. - -prop_claim_ensures_unique_nodes(ChooseFun) -> - %% NOTE: We know that this doesn't work for the case of {_, 3}. - %% NOTE2: uses undocumented "double_shrink", is expensive, but should get - %% around those case where we shrink to a non-minimal case because - %% some intermediate combinations of ring_size/node have no violations - ?FORALL({PartsPow, NodeCount}, eqc_gen:double_shrink({choose(4, 9), choose(4, 15)}), - begin - Nval = 3, - TNval = Nval + 1, - _Params = [{target_n_val, TNval}], - - Partitions = ?POW_2(PartsPow), - [Node0 | RestNodes] = test_nodes(NodeCount), - - R0 = riak_core_ring:fresh(Partitions, Node0), - RAdded = lists:foldl(fun(Node, Racc) -> - riak_core_ring:add_member(Node0, Racc, Node) - end, R0, RestNodes), - - Rfinal = claim(RAdded, {?MODULE, wants_claim_v2}, {?MODULE, ChooseFun}), - - Preflists = riak_core_ring:all_preflists(Rfinal, Nval), - ImperfectPLs = orddict:to_list( - lists:foldl(fun(PL,Acc) -> - PLNodes = lists:usort([N || {_,N} <- PL]), - case length(PLNodes) of - Nval -> - Acc; - _ -> - ordsets:add_element(PL, Acc) - end - end, [], Preflists)), - - ?WHENFAIL( - begin - io:format(user, "{Partitions, Nodes} {~p, ~p}~n", - [Partitions, NodeCount]), - io:format(user, "Owners: ~p~n", - [riak_core_ring:all_owners(Rfinal)]) - end, - conjunction([{meets_target_n, - equals({true,[]}, - meets_target_n(Rfinal, TNval))}, - {perfect_preflists, equals([], ImperfectPLs)}, - {balanced_ring, balanced_ring(Partitions, NodeCount, Rfinal)}])) - end). - - -prop_claim_ensures_unique_nodes_adding_groups(ChooseFun) -> - %% NOTE: We know that this doesn't work for the case of {_, 3}. - %% NOTE2: uses undocumented "double_shrink", is expensive, but should get - %% around those case where we shrink to a non-minimal case because - %% some intermediate combinations of ring_size/node have no violations - ?FORALL({PartsPow, BaseNodes, AddedNodes}, - eqc_gen:double_shrink({choose(4, 9), choose(2, 10), choose(2, 5)}), - begin - Nval = 3, - TNval = Nval + 1, - _Params = [{target_n_val, TNval}], - - Partitions = ?POW_2(PartsPow), - [Node0 | RestNodes] = test_nodes(BaseNodes), - AddNodes = test_nodes(AddedNodes-1, BaseNodes), - NodeCount = BaseNodes + AddedNodes, - %% io:format("Base: ~p~n",[[Node0 | RestNodes]]), - %% io:format("Added: ~p~n",[AddNodes]), - - R0 = riak_core_ring:fresh(Partitions, Node0), - RBase = lists:foldl(fun(Node, Racc) -> - riak_core_ring:add_member(Node0, Racc, Node) - end, R0, RestNodes), - - Rinterim = claim(RBase, {?MODULE, wants_claim_v2}, {?MODULE, ChooseFun}), - RAdded = lists:foldl(fun(Node, Racc) -> - riak_core_ring:add_member(Node0, Racc, Node) - end, Rinterim, AddNodes), - - Rfinal = claim(RAdded, {?MODULE, wants_claim_v2}, {?MODULE, ChooseFun}), - - Preflists = riak_core_ring:all_preflists(Rfinal, Nval), - ImperfectPLs = orddict:to_list( - lists:foldl(fun(PL,Acc) -> - PLNodes = lists:usort([N || {_,N} <- PL]), - case length(PLNodes) of - Nval -> - Acc; - _ -> - ordsets:add_element(PL, Acc) - end - end, [], Preflists)), - - ?WHENFAIL( - begin - io:format(user, "{Partitions, Nodes} {~p, ~p}~n", - [Partitions, NodeCount]), - io:format(user, "Owners: ~p~n", - [riak_core_ring:all_owners(Rfinal)]) - end, - conjunction([{meets_target_n, - equals({true,[]}, - meets_target_n(Rfinal, TNval))}, - {perfect_preflists, equals([], ImperfectPLs)}, - {balanced_ring, balanced_ring(Partitions, NodeCount, Rfinal)}])) - end). - - -prop_claim_ensures_unique_nodes_adding_singly(ChooseFun) -> - %% NOTE: We know that this doesn't work for the case of {_, 3}. - %% NOTE2: uses undocumented "double_shrink", is expensive, but should get - %% around those case where we shrink to a non-minimal case because - %% some intermediate combinations of ring_size/node have no violations - ?FORALL({PartsPow, NodeCount}, eqc_gen:double_shrink({choose(4, 9), choose(4, 15)}), - begin - Nval = 3, - TNval = Nval + 1, - Params = [{target_n_val, TNval}], - - Partitions = ?POW_2(PartsPow), - [Node0 | RestNodes] = test_nodes(NodeCount), - - R0 = riak_core_ring:fresh(Partitions, Node0), - Rfinal = lists:foldl(fun(Node, Racc) -> - Racc0 = riak_core_ring:add_member(Node0, Racc, Node), - %% TODO which is it? Claim or ChooseFun?? - %%claim(Racc0, {?MODULE, wants_claim_v2}, {?MODULE, ChooseFun}) - ?MODULE:ChooseFun(Racc0, Node, Params) - end, R0, RestNodes), - Preflists = riak_core_ring:all_preflists(Rfinal, Nval), - ImperfectPLs = orddict:to_list( - lists:foldl(fun(PL,Acc) -> - PLNodes = lists:usort([N || {_,N} <- PL]), - case length(PLNodes) of - Nval -> - Acc; - _ -> - ordsets:add_element(PL, Acc) - end - end, [], Preflists)), - - ?WHENFAIL( - begin - io:format(user, "{Partitions, Nodes} {~p, ~p}~n", - [Partitions, NodeCount]), - io:format(user, "Owners: ~p~n", - [riak_core_ring:all_owners(Rfinal)]) - end, - conjunction([{meets_target_n, - equals({true,[]}, - meets_target_n(Rfinal, TNval))}, - {perfect_preflists, equals([], ImperfectPLs)}, - {balanced_ring, balanced_ring(Partitions, NodeCount, Rfinal)}])) - end). - - - -%% @private check that no node claims more than it should --spec balanced_ring(RingSize::integer(), NodeCount::integer(), - riak_core_ring:riak_core_ring()) -> - boolean(). -balanced_ring(RingSize, NodeCount, Ring) -> - TargetClaim = ceiling(RingSize / NodeCount), - MinClaim = RingSize div NodeCount, - AllOwners0 = riak_core_ring:all_owners(Ring), - AllOwners = lists:keysort(2, AllOwners0), - {BalancedMax, AccFinal} = lists:foldl(fun({_Part, Node}, {_Balanced, [{Node, Cnt} | Acc]}) when Cnt >= TargetClaim -> - {false, [{Node, Cnt+1} | Acc]}; - ({_Part, Node}, {Balanced, [{Node, Cnt} | Acc]}) -> - {Balanced, [{Node, Cnt+1} | Acc]}; - ({_Part, NewNode}, {Balanced, Acc}) -> - {Balanced, [{NewNode, 1} | Acc]} - end, - {true, []}, - AllOwners), - BalancedMin = lists:all(fun({_Node, Cnt}) -> Cnt >= MinClaim end, AccFinal), - case BalancedMax andalso BalancedMin of - true -> - true; - false -> - {TargetClaim, MinClaim, lists:sort(AccFinal)} - end. - + Overhang > 0 andalso + Overhang < 4. %% hardcoded target n of 4 -wants_counts_test() -> - ?assert(eqc:quickcheck(?QC_OUT((prop_wants_counts())))). - -prop_wants_counts() -> - ?FORALL({S, Q}, {large_pos(100), large_pos(100000)}, - begin - Wants = wants_counts(S, Q), - conjunction([{len, equals(S, length(Wants))}, - {sum, equals(Q, lists:sum(Wants))}]) - end). - -wants_test() -> - ?assert(eqc:quickcheck(?QC_OUT((prop_wants())))). - -prop_wants() -> - ?FORALL({NodeStatus, Q}, - {?SUCHTHAT(L, non_empty(list(elements([leaving, joining]))), - lists:member(joining, L)), - ?LET(X, choose(1,16), trunc(math:pow(2, X)))}, - begin - R0 = riak_core_ring:fresh(Q, tnode(1)), - {_, R2, Active} = - lists:foldl( - fun(S, {I, R1, A1}) -> - N = tnode(I), - case S of - joining -> - {I+1, riak_core_ring:add_member(N, R1, N), [N|A1]}; - _ -> - {I+1, riak_core_ring:leave_member(N, R1, N), A1} - end - end, {1, R0, []}, NodeStatus), - Wants = wants(R2), - - %% Check any non-claiming nodes are set to 0 - %% Check all nodes are present - {ActiveWants, InactiveWants} = - lists:partition(fun({N,_W}) -> lists:member(N, Active) end, Wants), - - ActiveSum = lists:sum([W || {_,W} <- ActiveWants]), - InactiveSum = lists:sum([W || {_,W} <- InactiveWants]), - ?WHENFAIL( - begin - io:format(user, "NodeStatus: ~p\n", [NodeStatus]), - io:format(user, "Active: ~p\n", [Active]), - io:format(user, "Q: ~p\n", [Q]), - io:format(user, "Wants: ~p\n", [Wants]), - io:format(user, "ActiveWants: ~p\n", [ActiveWants]), - io:format(user, "InactiveWants: ~p\n", [InactiveWants]) - end, - conjunction([{wants, equals(length(Wants), length(NodeStatus))}, - {active, equals(Q, ActiveSum)}, - {inactive, equals(0, InactiveSum)}])) - end). - -%% Large positive integer between 1 and Max -large_pos(Max) -> - ?LET(X, largeint(), 1 + (abs(X) rem Max)). - -take_idxs_test() -> - ?assert(eqc:quickcheck(?QC_OUT((prop_take_idxs())))). - -prop_take_idxs() -> - ?FORALL({OwnersSeed, CIdxsSeed, ExchangesSeed, TNSeed}, - {non_empty(list(largeint())), % [OwnerSeed] - non_empty(list(largeint())), % [CIdxSeed] - non_empty(list({int(), int()})), % {GiveSeed, TakeSeed} - int()}, % TNSeed - begin - %% Generate Nis - duplicate owners seed to make sure Q > S - S = length(ExchangesSeed), - Dup = roundup(S / length(OwnersSeed)), - Owners = lists:flatten( - lists:duplicate(Dup, - [tnode(abs(OwnerSeed) rem S) || - OwnerSeed <- OwnersSeed])), - Q = length(Owners), - TN = 1+abs(TNSeed), - - - Ownership0 = orddict:from_list([{tnode(I), []} || I <- lists:seq(0, S -1)]), - Ownership = lists:foldl(fun({I,O},A) -> - orddict:append_list(O, [I], A) - end, - Ownership0, - lists:zip(lists:seq(0, Q-1), Owners)), - NIs = [{Node, undefined, Owned} || {Node, Owned} <- Ownership], - - %% Generate claimable indices - CIdxs = ordsets:from_list([abs(Idx) rem Q || Idx <- CIdxsSeed]), - - %% io:format(user, "ExchangesSeed (~p): ~p\n", [length(ExchangesSeed), - %% ExchangesSeed]), - %% io:format(user, "NIs (~p): ~p\n", [length(NIs), NIs]), - - %% Generate exchanges - Exchanges = [{Node, % node name - abs(GiveSeed) rem (length(OIdxs) + 1), % maximum indices to give - abs(TakeSeed) rem (Q+1), % maximum indices to take - CIdxs} || % indices that can be claimed by node - {{Node, _Want, OIdxs}, {GiveSeed, TakeSeed}} <- - lists:zip(NIs, ExchangesSeed)], - - %% Fire the test - NIs2 = take_idxs(Exchanges, NIs, Q, TN), - - %% Check All nodes are still in NIs - %% Check that no node lost more than it wanted to give - ?WHENFAIL( - begin - io:format(user, "Exchanges:\n~p\n", [Exchanges]), - io:format(user, "NIs:\n~p\n", [NIs]), - io:format(user, "NIs2:\n~p\n", [NIs2]), - io:format(user, "Q: ~p\nTN: ~p\n", [Q, TN]) - end, - check_deltas(Exchanges, NIs, NIs2, Q, TN)) - %% conjunction([{len, equals(length(NIs), length(NIs2))}, - %% {delta, check_deltas(Exchanges, NIs, NIs2, Q, TN)}])) - end). - -tnode(I) -> - list_to_atom("n"++integer_to_list(I)). - -%% Check that no node gained more than it wanted to take -%% Check that none of the nodes took more partitions than allowed -%% Check that no nodes violate target N -check_deltas(Exchanges, Before, After, Q, TN) -> - conjunction( - lists:flatten( - [begin - Gave = length(OIdxs1 -- OIdxs2), % in original and not new - Took = length(OIdxs2 -- OIdxs1), - V1 = count_violations(OIdxs1, Q, TN), - V2 = count_violations(OIdxs2, Q, TN), - [{{give, Node, Gave, Give}, Gave =< Give}, - {{take, Node, Took, Take}, Took =< Take}, - {{valid, Node, V1, V2}, - V2 == 0 orelse - V1 > 0 orelse % check no violations if there were not before - OIdxs1 == []}] % or the node held no indices so violation was impossible - end || {{Node, Give, Take, _CIdxs}, {Node, _Want1, OIdxs1}, {Node, _Want2, OIdxs2}} <- - lists:zip3(lists:sort(Exchanges), lists:sort(Before), lists:sort(After))])). - -count_violations([], _Q, _TN) -> - 0; -count_violations(Idxs, Q, TN) -> - SOIdxs = lists:sort(Idxs), - {_, Violations} = lists:foldl( - fun(This,{Last,Vs}) -> - case Last - This >= TN of - true -> - {This, Vs}; - _ -> - {This, Vs + 1} - end - end, {Q + hd(SOIdxs), 0}, lists:reverse(SOIdxs)), - Violations. - --endif. % EQC --endif. % TEST +-endif. diff --git a/src/riak_core_claim_util.erl b/src/riak_core_claim_util.erl index 1453ea7d9..ac7378f04 100644 --- a/src/riak_core_claim_util.erl +++ b/src/riak_core_claim_util.erl @@ -24,94 +24,73 @@ -module(riak_core_claim_util). --export([ring_stats/2, violation_stats/2, balance_stats/1, diversity_stats/2]). --export([print_failure_analysis/3, failure_analysis/3, node_sensitivity/3, node_load/3, - print_analysis/1, print_analysis/2, sort_by_down_fbmax/1]). --export([adjacency_matrix/1, summarize_am/1, adjacency_matrix_from_al/1, - adjacency_list/1, fixup_dam/2, score_am/2, count/2, rms/1]). --export([make_ring/1, gen_complete_diverse/1, gen_complete_len/1, construct/3]). --export([num_perms/2, num_combs/2, fac/1, perm_gen/1, down_combos/2, - rotations/1, substitutions/2]). --ifdef(TEST). --ifdef(EQC). --include_lib("eqc/include/eqc.hrl"). --endif. --include_lib("eunit/include/eunit.hrl"). --endif. - --record(load, {node, % Node name - num_pri, % Number of primaries - num_fb, % Number of fallbacks - norm_fb}). % Normalised fallbacks - ratio of how many there are - --record(failure, {down = [], % List of downed nodes - load = [], % List of #load{} records per up node - fbmin, - fbmean, - fbstddev, - fb10, - fb90, - fbmax}). - --define(DICT, dict). % macro for dictionary implementation, simplifies debugging - - +-export([ring_stats/2, violation_stats/2, + balance_stats/1, diversity_stats/2]). + +-export([node_load/3, print_analysis/1, + print_analysis/2, sort_by_down_fbmax/1]). + +-export([adjacency_matrix/1, summarize_am/1, + adjacency_matrix_from_al/1, adjacency_list/1, + fixup_dam/2, score_am/2, count/2, rms/1]). + +-export([make_ring/1, gen_complete_diverse/1, + gen_complete_len/1, construct/3]). + +-export([num_perms/2, num_combs/2, fac/1, perm_gen/1, + down_combos/2, rotations/1, substitutions/2]). + +-record(load, + {node, % Node name + num_pri, % Number of primaries + num_fb, % Number of fallbacks + norm_fb}). % Normalised fallbacks - ratio of how many there are + +-record(failure, + {down = [], % List of downed nodes + load = [], % List of #load{} records per up node + fbmin, fbmean, fbstddev, fb10, fb90, fbmax}). + %% ------------------------------------------------------------------- %% Ring statistics %% ------------------------------------------------------------------- ring_stats(R, TN) -> violation_stats(R, TN) ++ - balance_stats(R) ++ - diversity_stats(R, TN). - + balance_stats(R) ++ diversity_stats(R, TN). + %% TargetN violations violation_stats(R, TN) -> - [{violations, length(riak_core_ring_util:check_ring(R, TN))}]. + [{violations, + length(riak_core_ring_util:check_ring(R, TN))}]. balance_stats(R) -> Q = riak_core_ring:num_partitions(R), M = length(riak_core_ring:claiming_members(R)), AllOwners = riak_core_ring:all_owners(R), - Counts = lists:foldl(fun({_,N},A) -> orddict:update_counter(N,1,A) end, [], AllOwners), + Counts = lists:foldl(fun ({_, N}, A) -> + orddict:update_counter(N, 1, A) + end, + [], AllOwners), Avg = Q / M, Balance = lists:sum([begin - Delta = trunc(Avg - Count), - Delta * Delta - end || {_, Count} <- Counts]), - [{balance, Balance}, - {ownership, Counts}]. + Delta = trunc(Avg - Count), Delta * Delta + end + || {_, Count} <- Counts]), + [{balance, Balance}, {ownership, Counts}]. diversity_stats(R, TN) -> {_, Owners} = lists:unzip(riak_core_ring:all_owners(R)), AM = adjacency_matrix(Owners), - try - [{diversity, riak_core_claim_util:score_am(AM, TN)}] + try [{diversity, riak_core_claim_util:score_am(AM, TN)}] catch - _:empty_list -> - [{diversity, undefined}] + _:empty_list -> [{diversity, undefined}] end. - + %% ------------------------------------------------------------------- %% Failure analysis %% ------------------------------------------------------------------- -%% Print failure analysis on standard_io -print_failure_analysis(R, TargetN, NumFailures) -> - print_analysis(failure_analysis(R, TargetN, NumFailures)). - -failure_analysis(R, TargetN, NumFailures) -> - sort_by_down_fbmax(node_sensitivity(R, TargetN, NumFailures)). - -%% Mark each node down in turn and see how the spread of load is. -%% -%% Return a list of failures records, one for each case examined -node_sensitivity(R, NVal, Depth) -> - Members = riak_core_ring:all_members(R), - DownCombos = down_combos(Depth, Members), - LoadCombos = [{Down, node_load(R, NVal, Down)} || Down <- DownCombos], - [analyze_load(Down, Load) || {Down, Load} <- LoadCombos]. - %% For a given ring, with a list of downed nodes, compute %% all preference lists then count up the number that %% each node participates in. @@ -120,44 +99,33 @@ node_sensitivity(R, NVal, Depth) -> %% node_load(R, NVal, DownNodes) -> VL = vnode_load(R, NVal, DownNodes), - TotFBs = lists:sum([NumFBs || {_N,_,NumFBs} <- VL]), - [#load{node = N, - num_pri = NumPris, - num_fb = NumFBs, - norm_fb = norm_fb(NumFBs, TotFBs)} || - {N, NumPris, NumFBs} <- VL]. + TotFBs = lists:sum([NumFBs || {_N, _, NumFBs} <- VL]), + [#load{node = N, num_pri = NumPris, num_fb = NumFBs, + norm_fb = norm_fb(NumFBs, TotFBs)} + || {N, NumPris, NumFBs} <- VL]. vnode_load(R, NVal, DownNodes) -> UpNodes = riak_core_ring:all_members(R) -- DownNodes, - Keys = [<<(I+1):160/integer>> || - {I,_Owner} <- riak_core_ring:all_owners(R)], + Keys = [<<(I + 1):160/integer>> + || {I, _Owner} <- riak_core_ring:all_owners(R)], %% NValParts = Nval * riak_core_ring:num_partitions(R), - AllPLs = [riak_core_apl:get_apl_ann(Key, NVal, R, UpNodes) || Key <- Keys], + AllPLs = [riak_core_apl:get_apl_ann(Key, NVal, R, + UpNodes) + || Key <- Keys], FlatPLs = lists:flatten(AllPLs), [begin - Pris = lists:usort([_Idx || {{_Idx, PN}, primary} <- FlatPLs, PN == N]), - FBs = lists:usort([_Idx || {{_Idx, FN}, fallback} <- FlatPLs, FN == N]) -- Pris, - {N, length(Pris), length(FBs)} - end || N <- UpNodes]. + Pris = lists:usort([Idx + || {{Idx, PN}, primary} <- FlatPLs, PN == N]), + FBs = lists:usort([Idx + || {{Idx, FN}, fallback} <- FlatPLs, FN == N]) + -- Pris, + {N, length(Pris), length(FBs)} + end + || N <- UpNodes]. %% @private Normalize fallbacks -norm_fb(_, 0) -> - 0; -norm_fb(Num, Tot) -> - Num / Tot. - -%% @private analyze the load on each -analyze_load(Down, Load) -> - FBStats = lists:foldl(fun(#load{num_fb = NumFB}, Acc) -> - basho_stats_histogram:update(NumFB, Acc) - end, - basho_stats_histogram:new(1, 1024, 1024), Load), - {FBMin, FBMean, FBMax, _FBVar, FBStdDev} = basho_stats_histogram:summary_stats(FBStats), - FB10 = basho_stats_histogram:quantile(0.10, FBStats), - FB90 = basho_stats_histogram:quantile(0.90, FBStats), - #failure{down = Down, load = Load, fbmin = FBMin, fbmean = FBMean, fbstddev = FBStdDev, - fb10 = FB10, fb90 = FB90, fbmax = FBMax}. - +norm_fb(_, 0) -> 0; +norm_fb(Num, Tot) -> Num / Tot. %% %% Print the load analysis for each of the combinations of down nodes analyzed @@ -166,56 +134,54 @@ analyze_load(Down, Load) -> %% DownNodes - list of nodes that were down for the calculation %% Worst - list of {node,fallbacks} showing up to the 3 worst affected nodes %% as a result of DownNodes. -%% +%% print_analysis(LoadAnalysis) -> print_analysis(standard_io, LoadAnalysis). - + print_analysis(IoDev, LoadAnalysis) -> - io:format(IoDev, " Min Mean/ SD 10th 90th Max DownNodes/Worst\n", []), + io:format(IoDev, + " Min Mean/ SD 10th 90th Max DownNodes/" + "Worst\n", + []), print_analysis1(IoDev, LoadAnalysis). %% @private -print_analysis1(_IoDev, []) -> - ok; -print_analysis1(IoDev, [#failure{down = Down, load = Load, fbmin = FBMin, - fbmean = FBMean, fbstddev = FBStdDev, - fb10 = FB10, fb90 = FB90, fbmax = FBMax} | Rest]) -> +print_analysis1(_IoDev, []) -> ok; +print_analysis1(IoDev, + [#failure{down = Down, load = Load, fbmin = FBMin, + fbmean = FBMean, fbstddev = FBStdDev, fb10 = FB10, + fb90 = FB90, fbmax = FBMax} + | Rest]) -> %% Find the 3 worst FBmax - Worst = - [{N,NumFB} || #load{node = N, num_fb = NumFB} <- - lists:sublist(lists:reverse(lists:keysort(#load.num_fb, Load)), 3)], - - io:format(IoDev, "~4b ~4b/~4b ~4b ~4b ~4b ~w/~w\n", - [FBMin, toint(FBMean), toint(FBStdDev), toint(FB10), toint(FB90), FBMax, Down, Worst]), + Worst = [{N, NumFB} + || #load{node = N, num_fb = NumFB} + <- lists:sublist(lists:reverse(lists:keysort(#load.num_fb, + Load)), + 3)], + io:format(IoDev, "~4b ~4b/~4b ~4b ~4b ~4b ~w/~w\n", + [FBMin, toint(FBMean), toint(FBStdDev), toint(FB10), + toint(FB90), FBMax, Down, Worst]), print_analysis1(IoDev, Rest). %% @private round to nearest int -toint(F) when is_number(F) -> - round(F+0.5); -toint(X) -> - X. +toint(F) when is_number(F) -> round(F + 0.5); +toint(X) -> X. %% Order failures by number of nodes down ascending, then fbmax, then down list sort_by_down_fbmax(Failures) -> - Cmp = fun(#failure{down = DownA, fbmax = FBMaxA}, - #failure{down = DownB, fbmax = FBMaxB}) -> - %% length(DownA) =< length(DownB) andalso - %% FBMaxA >= FBMaxB andalso + Cmp = fun (#failure{down = DownA, fbmax = FBMaxA}, + #failure{down = DownB, fbmax = FBMaxB}) -> + %% length(DownA) =< length(DownB) andalso + %% FBMaxA >= FBMaxB andalso %% DownA =< DownB case {length(DownA), length(DownB)} of - {DownALen, DownBLen} when DownALen < DownBLen -> - true; - {DownALen, DownBLen} when DownALen > DownBLen -> - false; - _ -> - if - FBMaxA > FBMaxB -> - true; - FBMaxA < FBMaxB -> - false; - true -> - DownA >= DownB - end + {DownALen, DownBLen} when DownALen < DownBLen -> true; + {DownALen, DownBLen} when DownALen > DownBLen -> false; + _ -> + if FBMaxA > FBMaxB -> true; + FBMaxA < FBMaxB -> false; + true -> DownA >= DownB + end end end, lists:sort(Cmp, Failures). @@ -276,11 +242,11 @@ sort_by_down_fbmax(Failures) -> adjacency_matrix(Owners) -> M = lists:usort(Owners), Tid = ets:new(am, [private, duplicate_bag]), - try - adjacency_matrix_populate(Tid, M, Owners, Owners++Owners), + try adjacency_matrix_populate(Tid, M, Owners, + Owners ++ Owners), adjacency_matrix_result(Tid, ets:first(Tid), []) after - ets:delete(Tid) + ets:delete(Tid) end. %% @private extract the adjacency matrix from the duplicate bag @@ -288,29 +254,35 @@ adjacency_matrix_result(_Tid, '$end_of_table', Acc) -> Acc; adjacency_matrix_result(Tid, NodePair, Acc) -> ALs = ets:lookup(Tid, NodePair), - Ds = [ D || {_, D} <- ALs ], - adjacency_matrix_result(Tid, ets:next(Tid, NodePair), [{NodePair, Ds} | Acc]). + Ds = [D || {_, D} <- ALs], + adjacency_matrix_result(Tid, ets:next(Tid, NodePair), + [{NodePair, Ds} | Acc]). adjacency_matrix_populate(_Tid, _M, [], _OwnersCycle) -> ok; -adjacency_matrix_populate(Tid, M, [Node | Owners], [Node | OwnersCycle]) -> - adjacency_matrix_add_dist(Tid, Node, M--[Node], OwnersCycle, 0), +adjacency_matrix_populate(Tid, M, [Node | Owners], + [Node | OwnersCycle]) -> + adjacency_matrix_add_dist(Tid, Node, M -- [Node], + OwnersCycle, 0), adjacency_matrix_populate(Tid, M, Owners, OwnersCycle). %% @private Compute the distance from node to the next of M nodes -adjacency_matrix_add_dist(_Tid, _Node, _M, [], _) -> +adjacency_matrix_add_dist(_Tid, _Node, _M, [], _) -> ok; +adjacency_matrix_add_dist(_Tid, _Node, [], _OwnersCycle, + _) -> ok; -adjacency_matrix_add_dist(_Tid, _Node, [], _OwnersCycle, _) -> - ok; -adjacency_matrix_add_dist(Tid, Node, M, [OtherNode | OwnersCycle], Distance) -> +adjacency_matrix_add_dist(Tid, Node, M, + [OtherNode | OwnersCycle], Distance) -> case lists:member(OtherNode, M) of - true -> % haven't seen this node yet, add distance - ets:insert(Tid, {{Node, OtherNode}, Distance}), - adjacency_matrix_add_dist(Tid, Node, M -- [OtherNode], OwnersCycle, Distance + 1); - _ -> % already passed OtherNode - adjacency_matrix_add_dist(Tid, Node, M, OwnersCycle, Distance + 1) + true -> % haven't seen this node yet, add distance + ets:insert(Tid, {{Node, OtherNode}, Distance}), + adjacency_matrix_add_dist(Tid, Node, M -- [OtherNode], + OwnersCycle, Distance + 1); + _ -> % already passed OtherNode + adjacency_matrix_add_dist(Tid, Node, M, OwnersCycle, + Distance + 1) end. - + %% Make adjacency summary by working out counts of each distance %% (zero-padding to make it print nicely) summarize_am(AM) -> @@ -318,73 +290,75 @@ summarize_am(AM) -> %% Take a list of distances: [4, 3, 0, 1, 1, 3, 3] and %% create a list counting distance by position [1, 2, 0, 3, 1] -count_distances([]) -> - []; +count_distances([]) -> []; count_distances(Ds) -> - MaxD = lists:max(Ds), - PosCounts = lists:foldl(fun(D,Acc) -> + MaxD = lists:max(Ds), + PosCounts = lists:foldl(fun (D, Acc) -> orddict:update_counter(D, 1, Acc) - end, - orddict:from_list([{D,0} || D <- lists:seq(0,MaxD)]), + end, + orddict:from_list([{D, 0} + || D <- lists:seq(0, MaxD)]), Ds), %% PosCounts orddict must be initialized to make sure no distances %% are missing in the list comprehension - [Count || {_Pos, Count} <- PosCounts]. + [Count || {_Pos, Count} <- PosCounts]. %% Compute adjacency matrix from an adjacency list adjacency_matrix_from_al(AL) -> %% Make a count by distance of N1,N2 - ?DICT:to_list( - lists:foldl(fun({NPair,D}, Acc) -> - ?DICT:append_list(NPair, [D], Acc) - end, ?DICT:new(), AL)). - + dict:to_list(lists:foldl(fun ({NPair, D}, Acc) -> + dict:append_list(NPair, [D], Acc) + end, + dict:new(), AL)). %% Create a pair of node names and a list of distances adjacency_list(Owners) -> M = lists:usort(Owners), - adjacency_list(M, Owners, Owners++Owners, []). + adjacency_list(M, Owners, Owners ++ Owners, []). -adjacency_list(_M, [], _OwnersCycle, Acc) -> - Acc; -adjacency_list(M, [Node | Owners], [Node | OwnersCycle], Acc) -> - adjacency_list(M, Owners, OwnersCycle, distances(Node, M--[Node], OwnersCycle, 0, Acc)). +adjacency_list(_M, [], _OwnersCycle, Acc) -> Acc; +adjacency_list(M, [Node | Owners], [Node | OwnersCycle], + Acc) -> + adjacency_list(M, Owners, OwnersCycle, + distances(Node, M -- [Node], OwnersCycle, 0, Acc)). %% Compute the distance from node to the next of M nodes -distances(_Node, _M, [], _, Distances) -> - Distances; +distances(_Node, _M, [], _, Distances) -> Distances; distances(_Node, [], _OwnersCycle, _, Distances) -> Distances; -distances(Node, M, [OtherNode | OwnersCycle], Distance, Distances) -> +distances(Node, M, [OtherNode | OwnersCycle], Distance, + Distances) -> case lists:member(OtherNode, M) of - true -> % haven't seen this node yet, add distance - distances(Node, M -- [OtherNode], OwnersCycle, Distance + 1, - [{{Node, OtherNode}, Distance} | Distances]); - _ -> % already passed OtherNode - distances(Node, M, OwnersCycle, Distance + 1, Distances) + true -> % haven't seen this node yet, add distance + distances(Node, M -- [OtherNode], OwnersCycle, + Distance + 1, + [{{Node, OtherNode}, Distance} | Distances]); + _ -> % already passed OtherNode + distances(Node, M, OwnersCycle, Distance + 1, Distances) end. %% For each pair, get the count of distances < NVal -score_am([], _NVal) -> - undefined; +score_am([], _NVal) -> undefined; score_am(AM, NVal) -> - Cs = lists:flatten( - [begin - [C || {D,C} <- count(Ds, NVal), D < NVal] - end || {_Pair,Ds} <- AM]), + Cs = lists:flatten([begin + [C || {D, C} <- count(Ds, NVal), D < NVal] + end + || {_Pair, Ds} <- AM]), rms(Cs). count(L, NVal) -> - Acc0 = orddict:from_list([{D, 0} || D <- lists:seq(0, NVal-1)]), - lists:foldl(fun(E,A) -> orddict:update_counter(E, 1, A) end, Acc0, L). - -rms([]) -> - throw(empty_list); + Acc0 = orddict:from_list([{D, 0} + || D <- lists:seq(0, NVal - 1)]), + lists:foldl(fun (E, A) -> + orddict:update_counter(E, 1, A) + end, + Acc0, L). + +rms([]) -> throw(empty_list); rms(L) -> Mean = lists:sum(L) / length(L), lists:sum([(Mean - E) * (Mean - E) || E <- L]). - %% ------------------------------------------------------------------- %% Ring construction %% ------------------------------------------------------------------- @@ -392,32 +366,31 @@ rms(L) -> %% Make a ring of size length(Nodes) ordering the nodes as given make_ring(Nodes) -> R0 = riak_core_ring:fresh(length(Nodes), hd(Nodes)), - Idxs = [I || {I,_} <- riak_core_ring:all_owners(R0)], + Idxs = [I || {I, _} <- riak_core_ring:all_owners(R0)], NewOwners = lists:zip(Idxs, Nodes), - R1 = lists:foldl(fun(N,R) -> + R1 = lists:foldl(fun (N, R) -> riak_core_ring:add_member(hd(Nodes), R, N) - end, R0, Nodes), - lists:foldl(fun({I,N}, R) -> + end, + R0, Nodes), + lists:foldl(fun ({I, N}, R) -> riak_core_ring:transfer_node(I, N, R) - end, R1, NewOwners). - - + end, + R1, NewOwners). %% Generate a completion test function that makes sure all required %% distances are created gen_complete_diverse(RequiredDs) -> - fun(Owners, DAM) -> + fun (Owners, DAM) -> OwnersLen = length(Owners), NextPow2 = next_pow2(OwnersLen), {met_required(Owners, DAM, RequiredDs) andalso - OwnersLen == NextPow2, NextPow2} + OwnersLen == NextPow2, + NextPow2} end. %% Generate until a fixed length has been hit gen_complete_len(Len) -> - fun(Owners, _AM) -> - {length(Owners) == Len, Len} - end. + fun (Owners, _AM) -> {length(Owners) == Len, Len} end. %% M = list of node names %% NVal = target nval @@ -427,117 +400,127 @@ construct(Complete, M, NVal) -> %% Make an empty adjacency matrix for all pairs of members empty_adjacency_matrix(M) -> - lists:foldl(fun(Pair,AM0) -> - ?DICT:append_list(Pair, [], AM0) - end, ?DICT:new(), [{F,T} || F <- M, T <- M, F /= T]). + lists:foldl(fun (Pair, AM0) -> + dict:append_list(Pair, [], AM0) + end, + dict:new(), [{F, T} || F <- M, T <- M, F /= T]). construct(Complete, M, Owners, DAM, NVal) -> %% Work out which pairs do not have the requiredDs case Complete(Owners, DAM) of - {true, _DesiredLen}-> - {ok, Owners, DAM}; - {false, DesiredLen} -> - %% Easy ones - restrict the eligible list to not include the N-1 - %% previous nodes. If within NVal-1 of possibly closing the ring - %% then restrict in that direction as well. - Eligible0 = M -- lists:sublist(Owners, NVal - 1), - Eligible = case DesiredLen - length(Owners) of - Left when Left >= NVal -> - Eligible0; % At least Nval lest, no restriction - Left -> - Eligible0 -- lists:sublist(lists:reverse(Owners), NVal - Left) - end, - case Eligible of - [] -> - %% No eligible nodes - not enough to meet NVal, use any node - logger:debug("construct -- unable to construct without violating NVal"), - {Owners1, DAM1} = prepend_next_owner(M, M, Owners, DAM, NVal), - construct(Complete, M, Owners1, DAM1, NVal); - _ -> - {Owners1, DAM1} = prepend_next_owner(M, Eligible, Owners, DAM, NVal), - construct(Complete, M, Owners1, DAM1, NVal) - end + {true, _DesiredLen} -> {ok, Owners, DAM}; + {false, DesiredLen} -> + %% Easy ones - restrict the eligible list to not include the N-1 + %% previous nodes. If within NVal-1 of possibly closing the ring + %% then restrict in that direction as well. + Eligible0 = M -- lists:sublist(Owners, NVal - 1), + Eligible = case DesiredLen - length(Owners) of + Left when Left >= NVal -> + Eligible0; % At least Nval lest, no restriction + Left -> + Eligible0 -- + lists:sublist(lists:reverse(Owners), NVal - Left) + end, + case Eligible of + [] -> + %% No eligible nodes - not enough to meet NVal, use any node + logger:debug("construct -- unable to construct without " + "violating NVal"), + {Owners1, DAM1} = prepend_next_owner(M, M, Owners, DAM, + NVal), + construct(Complete, M, Owners1, DAM1, NVal); + _ -> + {Owners1, DAM1} = prepend_next_owner(M, Eligible, + Owners, DAM, NVal), + construct(Complete, M, Owners1, DAM1, NVal) + end end. %% Returns true only when we have met all required distances across all %% possible pairs in the adjacency matrix met_required(Owners, DAM, RequiredDs) -> FixupDAM = fixup_dam(Owners, DAM), - case [Pair || {Pair, Ds} <- ?DICT:to_list(FixupDAM), - (RequiredDs -- Ds) /= [] ] of - [] -> - true; - _ -> - false + case [Pair + || {Pair, Ds} <- dict:to_list(FixupDAM), + RequiredDs -- Ds /= []] + of + [] -> true; + _ -> false end. %% Return next greatest power of 2 -next_pow2(X) -> - next_pow2(X, 2). +next_pow2(X) -> next_pow2(X, 2). -next_pow2(X, R) when X =< R -> - R; -next_pow2(X, R) -> - next_pow2(X, R*2). +next_pow2(X, R) when X =< R -> R; +next_pow2(X, R) -> next_pow2(X, R * 2). %% For each eligible, work out which node improves diversity the most %% Take the AM scores and cap by TargetN and find the node that -%% improves the RMS -prepend_next_owner(M, [Node], Owners, DAM, _TN) -> % only one node, not a lot of decisions to make +%% improves the RMS +prepend_next_owner(M, [Node], Owners, DAM, + _TN) -> % only one node, not a lot of decisions to make prepend(M, Node, Owners, DAM); prepend_next_owner(M, Eligible, Owners, DAM, TN) -> - {_BestScore, Owners2, DAM2} = - lists:foldl(fun(Node, {RunningScore, _RunningO, _RunningDAM}=Acc) -> - {Owners1, DAM1} = prepend(M, Node, Owners, DAM), - case score_am(?DICT:to_list(DAM1), TN) of - BetterScore when BetterScore < RunningScore -> - {BetterScore, Owners1, DAM1}; - _ -> - Acc - end - end, {undefined, undefined, undefined}, Eligible), + {_BestScore, Owners2, DAM2} = lists:foldl(fun (Node, + {RunningScore, _RunningO, + _RunningDAM} = + Acc) -> + {Owners1, DAM1} = + prepend(M, Node, + Owners, DAM), + case + score_am(dict:to_list(DAM1), + TN) + of + BetterScore + when BetterScore < + RunningScore -> + {BetterScore, + Owners1, DAM1}; + _ -> Acc + end + end, + {undefined, undefined, undefined}, + Eligible), {Owners2, DAM2}. %% Prepend N to the front of Owners, and update AM prepend(M, N, Owners, DAM) -> Ds = distances2(M -- [N], Owners), - DAM2 = lists:foldl(fun({T,D},DAM1) -> - ?DICT:append_list({N,T},[D],DAM1) - end, DAM, Ds), + DAM2 = lists:foldl(fun ({T, D}, DAM1) -> + dict:append_list({N, T}, [D], DAM1) + end, + DAM, Ds), {[N | Owners], DAM2}. %% Calculate the distances to each of the M nodes until %% a distance for each has been found. -distances2(M, Owners) -> - distances2(M, Owners, 0, []). +distances2(M, Owners) -> distances2(M, Owners, 0, []). -distances2([], _Owners, _D, Acc) -> - Acc; -distances2(_M, [], _D, Acc) -> - Acc; +distances2([], _Owners, _D, Acc) -> Acc; +distances2(_M, [], _D, Acc) -> Acc; distances2(M, [T | Owners], D, Acc) -> case lists:member(T, M) of - true -> - distances2(M -- [T], Owners, D + 1, [{T, D} | Acc]); - false -> - distances2(M, Owners, D + 1, Acc) + true -> + distances2(M -- [T], Owners, D + 1, [{T, D} | Acc]); + false -> distances2(M, Owners, D + 1, Acc) end. %% Fix up the dictionary AM adding in entries for the end of the owners list %% wrapping around to the start. fixup_dam(Owners, DAM) -> - fixup_dam(lists:usort(Owners), lists:reverse(Owners), Owners, 0, DAM). + fixup_dam(lists:usort(Owners), lists:reverse(Owners), + Owners, 0, DAM). -fixup_dam([], _ToFix, _Owners, _D, DAM) -> - DAM; -fixup_dam(_M, [], _Owners, _D, DAM) -> - DAM; +fixup_dam([], _ToFix, _Owners, _D, DAM) -> DAM; +fixup_dam(_M, [], _Owners, _D, DAM) -> DAM; fixup_dam(M, [N | ToFix], Owners, D, DAM) -> M2 = M -- [N], Ds = distances2(M2, Owners, D, []), - DAM2 = lists:foldl(fun({T,D0},DAM1) -> - ?DICT:append_list({N,T},[D0],DAM1) - end, DAM, Ds), + DAM2 = lists:foldl(fun ({T, D0}, DAM1) -> + dict:append_list({N, T}, [D0], DAM1) + end, + DAM, Ds), fixup_dam(M2, ToFix, Owners, D + 1, DAM2). %% ------------------------------------------------------------------- @@ -545,27 +528,23 @@ fixup_dam(M, [N | ToFix], Owners, D, DAM) -> %% ------------------------------------------------------------------- %% Permutations - number of ways to pick N out of K -num_perms(K, N) when K =< N -> - fac(N) div (fac(N - K)). +num_perms(K, N) when K =< N -> fac(N) div fac(N - K). %% Combinations - number of ways to combine N elements out of K num_combs(K, N) when K =< N -> fac(N) div (K * fac(N - K)). %% Factorials -fac(0) -> - 1; -fac(N) when N > 0 -> - N * fac(N-1). +fac(0) -> 1; +fac(N) when N > 0 -> N * fac(N - 1). %% Generate all permutations of list L -perm_gen([E]) -> - [[E]]; +perm_gen([E]) -> [[E]]; perm_gen(L) -> - lists:append([ begin - [ [X | Y] || Y <- perm_gen(lists:delete(X, L))] - end || X <- L]). - + lists:append([begin + [[X | Y] || Y <- perm_gen(lists:delete(X, L))] + end + || X <- L]). %% Pick all combinations of Depth nodes from the MemFbers list %% 0 = [] @@ -583,17 +562,15 @@ down_combos(Depth, Members, Down) -> Down2 = [[N | D] || N <- Members, D <- Down], down_combos(Depth - 1, Members, Down2). - %% Generate all rotated versions of an ownership list -rotations([H|T] = L) -> +rotations([H | T] = L) -> rotations(length(L) - 1, T ++ [H], [L]). -rotations(0, _, Acc) -> - lists:reverse(Acc); -rotations(Rem, [H|T] = L, Acc) -> +rotations(0, _, Acc) -> lists:reverse(Acc); +rotations(Rem, [H | T] = L, Acc) -> rotations(Rem - 1, T ++ [H], [L | Acc]). -%% Generate a list with each possible substitution for a name +%% Generate a list with each possible substitution for a name substitutions(L, Names) -> PNames = perm_gen(Names), [substitute(Names, P, L) || P <- PNames]. @@ -607,48 +584,4 @@ substitute(Names, Mapping, L) -> %% Unit Tests %% ------------------------------------------------------------------- --ifdef(TEST). --ifdef(EQC). - -property_adjacency_summary_test_() -> - {timeout, 60, ?_test(eqc:quickcheck(eqc:testing_time(30, prop_adjacency_summary())))}. - -longer_list(K, G) -> - ?SIZED(Size, resize(trunc(K*Size), list(resize(Size, G)))). - -%% Compare directly constructing the adjacency matrix against -%% one using prepend/fixup. -prop_adjacency_summary() -> - ?FORALL({OwnersSeed, S}, - {non_empty(longer_list(40, largeint())), ?LET(X, int(), 1 + abs(X))}, - begin - Owners = [list_to_atom("n"++integer_to_list(1 + (abs(I) rem S))) || I <- OwnersSeed], - AM = adjacency_matrix(Owners), - AS = summarize_am(AM), - - {Owners2, _DAM2, FixDAM2} = build(Owners), - AS2 = summarize_am(?DICT:to_list(FixDAM2)), - - - ?WHENFAIL( - begin - io:format(user, "S=~p\nOwners =~p\n", [S, Owners]), - io:format(user, "=== AM ===\n~p\n", [AM]), - io:format(user, "=== FixAM2 ===\n~p\n", [?DICT:to_list(FixDAM2)]), - io:format(user, "=== AS2 ===\n~p\n", [AS2]) - end, - conjunction([{owners, equals(Owners, Owners2)}, - {am2, equals(lists:sort(AS), lists:sort(AS2))}])) - end). - -build(Owners) -> - build(lists:usort(Owners), lists:reverse(Owners), [], ?DICT:new()). - -build(_M, [], Owners, DAM) -> - {Owners, DAM, fixup_dam(Owners, DAM)}; -build(M, [N|Rest], Owners, DAM) -> - {Owners1, DAM1} = prepend(M, N, Owners, DAM), - build(M, Rest, Owners1, DAM1). - --endif. % EQC --endif. % TEST. +%See test - pqc - riak_core_claim_util_qc diff --git a/src/riak_core_claimant.erl b/src/riak_core_claimant.erl index 61c9b6be8..2795b5439 100644 --- a/src/riak_core_claimant.erl +++ b/src/riak_core_claimant.erl @@ -19,58 +19,51 @@ %% ------------------------------------------------------------------- -module(riak_core_claimant). + -behaviour(gen_server). %% API -export([start_link/0]). --export([leave_member/1, - remove_member/1, - force_replace/2, - replace/2, - resize_ring/1, - abort_resize/0, - plan/0, - commit/0, - clear/0, - ring_changed/2 -]). + +-export([leave_member/1, remove_member/1, + force_replace/2, replace/2, resize_ring/1, + abort_resize/0, plan/0, commit/0, clear/0, + ring_changed/2]). + -export([reassign_indices/1]). % helpers for claim sim %% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). --type action() :: leave - | remove - | {replace, node()} - | {force_replace, node()} - | {set_location, string()}. +-type action() :: leave | remove | {replace, node()} | + {force_replace, node()}. --type riak_core_ring() :: riak_core_ring:riak_core_ring(). +-type + riak_core_ring() :: riak_core_ring:riak_core_ring(). %% A tuple representing a given cluster transition: %% {Ring, NewRing} where NewRing = f(Ring) --type ring_transition() :: {riak_core_ring(), riak_core_ring()}. - --record(state, { - last_ring_id, - %% The set of staged cluster changes - changes :: [{node(), action()}], - - %% Ring computed during the last planning stage based on - %% applying a set of staged cluster changes. When commiting - %% changes, the computed ring must match the previous planned - %% ring to be allowed. - next_ring :: riak_core_ring() | undefined, - - %% Random number seed passed to remove_node to ensure the - %% current randomized remove algorithm is deterministic - %% between plan and commit phases - seed}). - --define(ROUT(S,A),ok). -%%-define(ROUT(S,A),?debugFmt(S,A)). -%%-define(ROUT(S,A),io:format(S,A)). +-type ring_transition() :: {riak_core_ring(), + riak_core_ring()}. + +-record(state, + {last_ring_id, + %% The set of staged cluster changes + changes :: [{node(), action()}], + %% Ring computed during the last planning stage based on + %% applying a set of staged cluster changes. When commiting + %% changes, the computed ring must match the previous planned + %% ring to be allowed. + next_ring :: riak_core_ring() | undefined, + %% Random number seed passed to remove_node to ensure the + %% current randomized remove algorithm is deterministic + %% between plan and commit phases + seed}). + +-define(ROUT(S, A), + ok).%%-define(ROUT(S,A),?debugFmt(S,A)). + %%-define(ROUT(S,A),io:format(S,A)). %%%=================================================================== %%% API @@ -88,37 +81,38 @@ stop() -> %% @doc Spawn and register the riak_core_claimant server start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, [], + []). %% @doc Determine how the cluster will be affected by the staged changes, %% returning the set of pending changes as well as a list of ring %% modifications that correspond to each resulting cluster transition %% (eg. the initial transition that applies the staged changes, and %% any additional transitions triggered by later rebalancing). --spec plan() -> {error, term()} | {ok, [action()], [ring_transition()]}. -plan() -> - gen_server:call(claimant(), plan, infinity). +-spec plan() -> {error, term()} | + {ok, [action()], [ring_transition()]}. + +plan() -> gen_server:call(claimant(), plan, infinity). %% @doc Commit the set of staged cluster changes, returning true on success. %% A commit is only allowed to succeed if the ring is ready and if the %% current set of changes matches those computed by the most recent %% call to plan/0. -spec commit() -> ok | {error, term()}. + commit() -> gen_server:call(claimant(), commit, infinity). %% @doc Stage a request for `Node' to leave the cluster. If committed, `Node' %% will handoff all of its data to other nodes in the cluster and then %% shutdown. -leave_member(Node) -> - stage(Node, leave). +leave_member(Node) -> stage(Node, leave). %% @doc Stage a request for `Node' to be forcefully removed from the cluster. %% If committed, all partitions owned by `Node' will immediately be %% re-assigned to other nodes. No data on `Node' will be transfered to %% other nodes, and all replicas on `Node' will be lost. -remove_member(Node) -> - stage(Node, remove). +remove_member(Node) -> stage(Node, remove). %% @doc Stage a request for `Node' to be replaced by `NewNode'. If committed, %% `Node' will handoff all of its data to `NewNode' and then shutdown. @@ -144,13 +138,14 @@ force_replace(Node, NewNode) -> %% removed from partitons no longer owner by a node or present %% in the ring. -spec resize_ring(integer()) -> ok | {error, atom()}. + resize_ring(NewRingSize) -> %% use the node making the request. it will be ignored stage(node(), {resize, NewRingSize}). -spec abort_resize() -> ok | {error, atom()}. -abort_resize() -> - stage(node(), abort_resize). + +abort_resize() -> stage(node(), abort_resize). -spec pending_close(riak_core_ring(), any()) -> ok. pending_close(Ring, RingID) -> @@ -162,8 +157,7 @@ set_node_location(Node, Location) -> stage(Node, {set_location, Location}). %% @doc Clear the current set of staged transfers -clear() -> - gen_server:call(claimant(), clear, infinity). +clear() -> gen_server:call(claimant(), clear, infinity). %% @doc This function is called as part of the ring reconciliation logic %% triggered by the gossip subsystem. This is only called on the one @@ -182,14 +176,16 @@ ring_changed(Node, Ring) -> %%%=================================================================== reassign_indices(CState) -> - reassign_indices(CState, [], riak_core_rand:rand_seed(), fun no_log/2). + reassign_indices(CState, [], erlang:timestamp(), + fun no_log/2). %%%=================================================================== %%% Internal API helpers %%%=================================================================== stage(Node, Action) -> - gen_server:call(claimant(), {stage, Node, Action}, infinity). + gen_server:call(claimant(), {stage, Node, Action}, + infinity). claimant() -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), @@ -201,55 +197,42 @@ claimant() -> init([]) -> schedule_tick(), - {ok, #state{changes=[], seed=riak_core_rand:rand_seed()}}. + {ok, #state{changes = [], seed = erlang:timestamp()}}. handle_call(clear, _From, State) -> - State2 = clear_staged(State), - {reply, ok, State2}; - + State2 = clear_staged(State), {reply, ok, State2}; handle_call({stage, Node, Action}, _From, State) -> {ok, Ring} = riak_core_ring_manager:get_raw_ring(), - {Reply, State2} = maybe_stage(Node, Action, Ring, State), + {Reply, State2} = maybe_stage(Node, Action, Ring, + State), {reply, Reply, State2}; - handle_call(plan, _From, State) -> {ok, Ring} = riak_core_ring_manager:get_raw_ring(), case riak_core_ring:ring_ready(Ring) of - false -> - Reply = {error, ring_not_ready}, - {reply, Reply, State}; - true -> - {Reply, State2} = generate_plan(Ring, State), - {reply, Reply, State2} + false -> + Reply = {error, ring_not_ready}, {reply, Reply, State}; + true -> + {Reply, State2} = generate_plan(Ring, State), + {reply, Reply, State2} end; - handle_call(commit, _From, State) -> {Reply, State2} = commit_staged(State), {reply, Reply, State2}; - handle_call(_Request, _From, State) -> - Reply = ok, - {reply, Reply, State}. + Reply = ok, {reply, Reply, State}. -handle_cast(_Msg, State) -> - {noreply, State}. +handle_cast(_Msg, State) -> {noreply, State}. handle_info(tick, State) -> - State2 = tick(none, riak_core_ring_manager:get_ring_id(), State), - {noreply, State2}; - + State2 = tick(State), {noreply, State2}; handle_info(reset_ring_id, State) -> - State2 = State#state{last_ring_id=undefined}, + State2 = State#state{last_ring_id = undefined}, {noreply, State2}; +handle_info(_Info, State) -> {noreply, State}. -handle_info(_Info, State) -> - {noreply, State}. +terminate(_Reason, _State) -> ok. -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. +code_change(_OldVsn, State, _Extra) -> {ok, State}. %%%=================================================================== %%% Internal functions @@ -258,90 +241,90 @@ code_change(_OldVsn, State, _Extra) -> %% @private %% @doc Verify that a cluster change request is valid and add it to %% the list of staged changes. -maybe_stage(Node, Action, Ring, State=#state{changes=Changes}) -> +maybe_stage(Node, Action, Ring, + State = #state{changes = Changes}) -> case valid_request(Node, Action, Changes, Ring) of - true -> - Changes2 = orddict:store(Node, Action, Changes), - Changes3 = filter_changes(Changes2, Ring), - State2 = State#state{changes=Changes3}, - {ok, State2}; - Error -> - {Error, State} + true -> + Changes2 = orddict:store(Node, Action, Changes), + Changes3 = filter_changes(Changes2, Ring), + State2 = State#state{changes = Changes3}, + {ok, State2}; + Error -> {Error, State} end. %% @private %% @doc Determine how the staged set of cluster changes will affect %% the cluster. See {@link plan/0} for additional details. -generate_plan(Ring, State=#state{changes=Changes}) -> +generate_plan(Ring, + State = #state{changes = Changes}) -> Changes2 = filter_changes(Changes, Ring), - Joining = [{Node, join} || Node <- riak_core_ring:members(Ring, [joining])], + Joining = [{Node, join} + || Node <- riak_core_ring:members(Ring, [joining])], AllChanges = lists:ukeysort(1, Changes2 ++ Joining), - State2 = State#state{changes=Changes2}, + State2 = State#state{changes = Changes2}, generate_plan(AllChanges, Ring, State2). generate_plan([], _, State) -> %% There are no changes to apply {{ok, [], []}, State}; -generate_plan(Changes, Ring, State=#state{seed=Seed}) -> +generate_plan(Changes, Ring, + State = #state{seed = Seed}) -> case compute_all_next_rings(Changes, Seed, Ring) of - {error, invalid_resize_claim} -> - {{error, invalid_resize_claim}, State}; - {ok, NextRings} -> - {_, NextRing} = hd(NextRings), - State2 = State#state{next_ring=NextRing}, - Reply = {ok, Changes, NextRings}, - {Reply, State2} + {error, invalid_resize_claim} -> + {{error, invalid_resize_claim}, State}; + {ok, NextRings} -> + {_, NextRing} = hd(NextRings), + State2 = State#state{next_ring = NextRing}, + Reply = {ok, Changes, NextRings}, + {Reply, State2} end. %% @private %% @doc Commit the set of staged cluster changes. See {@link commit/0} %% for additional details. -commit_staged(State=#state{next_ring=undefined}) -> +commit_staged(State = #state{next_ring = undefined}) -> {{error, nothing_planned}, State}; commit_staged(State) -> case maybe_commit_staged(State) of - {ok, _} -> - State2 = State#state{next_ring=undefined, - changes=[], - seed=riak_core_rand:rand_seed()}, - {ok, State2}; - not_changed -> - {error, State}; - {not_changed, Reason} -> - {{error, Reason}, State} + {ok, _} -> + State2 = State#state{next_ring = undefined, + changes = [], seed = erlang:timestamp()}, + {ok, State2}; + not_changed -> {error, State}; + {not_changed, Reason} -> {{error, Reason}, State} end. %% @private maybe_commit_staged(State) -> - riak_core_ring_manager:ring_trans(fun maybe_commit_staged/2, State). + riak_core_ring_manager:ring_trans(fun maybe_commit_staged/2, + State). %% @private -maybe_commit_staged(Ring, State=#state{changes=Changes, seed=Seed}) -> +maybe_commit_staged(Ring, + State = #state{changes = Changes, seed = Seed}) -> Changes2 = filter_changes(Changes, Ring), case compute_next_ring(Changes2, Seed, Ring) of - {error, invalid_resize_claim} -> - {ignore, invalid_resize_claim}; - {ok, NextRing} -> - maybe_commit_staged(Ring, NextRing, State) + {error, invalid_resize_claim} -> + {ignore, invalid_resize_claim}; + {ok, NextRing} -> + maybe_commit_staged(Ring, NextRing, State) end. %% @private -maybe_commit_staged(Ring, NextRing, #state{next_ring=PlannedRing}) -> +maybe_commit_staged(Ring, NextRing, + #state{next_ring = PlannedRing}) -> Claimant = riak_core_ring:claimant(Ring), IsReady = riak_core_ring:ring_ready(Ring), - IsClaimant = (Claimant == node()), + IsClaimant = Claimant == node(), IsSamePlan = same_plan(PlannedRing, NextRing), case {IsReady, IsClaimant, IsSamePlan} of - {false, _, _} -> - {ignore, ring_not_ready}; - {_, false, _} -> - ignore; - {_, _, false} -> - {ignore, plan_changed}; - _ -> - NewRing0 = riak_core_ring:clear_location_changed(NextRing), - NewRing1 = riak_core_ring:increment_vclock(Claimant, NewRing0), - {new_ring, NewRing1} + {false, _, _} -> {ignore, ring_not_ready}; + {_, false, _} -> ignore; + {_, _, false} -> {ignore, plan_changed}; + _ -> + NewRing = riak_core_ring:increment_vclock(Claimant, + NextRing), + {new_ring, NewRing} end. %% @private @@ -352,152 +335,139 @@ maybe_commit_staged(Ring, NextRing, #state{next_ring=PlannedRing}) -> %% call {@link clear/0}. clear_staged(State) -> remove_joining_nodes(), - State#state{changes=[], seed=riak_core_rand:rand_seed()}. + State#state{changes = [], seed = erlang:timestamp()}. %% @private remove_joining_nodes() -> - riak_core_ring_manager:ring_trans(fun remove_joining_nodes/2, ok). + riak_core_ring_manager:ring_trans(fun remove_joining_nodes/2, + ok). %% @private remove_joining_nodes(Ring, _) -> Claimant = riak_core_ring:claimant(Ring), - IsClaimant = (Claimant == node()), + IsClaimant = Claimant == node(), Joining = riak_core_ring:members(Ring, [joining]), - AreJoining = (Joining /= []), + AreJoining = Joining /= [], case IsClaimant and AreJoining of - false -> - ignore; - true -> - NewRing = remove_joining_nodes_from_ring(Claimant, Joining, Ring), - {new_ring, NewRing} + false -> ignore; + true -> + NewRing = remove_joining_nodes_from_ring(Claimant, + Joining, Ring), + {new_ring, NewRing} end. %% @private -remove_joining_nodes_from_ring(Claimant, Joining, Ring) -> - NewRing = - lists:foldl(fun(Node, RingAcc) -> - riak_core_ring:set_member(Claimant, RingAcc, Node, - invalid, same_vclock) - end, Ring, Joining), - NewRing2 = riak_core_ring:increment_vclock(Claimant, NewRing), +remove_joining_nodes_from_ring(Claimant, Joining, + Ring) -> + NewRing = lists:foldl(fun (Node, RingAcc) -> + riak_core_ring:set_member(Claimant, RingAcc, + Node, invalid, + same_vclock) + end, + Ring, Joining), + NewRing2 = riak_core_ring:increment_vclock(Claimant, + NewRing), NewRing2. %% @private valid_request(Node, Action, Changes, Ring) -> case Action of - leave -> - valid_leave_request(Node, Ring); - remove -> - valid_remove_request(Node, Ring); - {replace, NewNode} -> - valid_replace_request(Node, NewNode, Changes, Ring); - {force_replace, NewNode} -> - valid_force_replace_request(Node, NewNode, Changes, Ring); - {resize, NewRingSize} -> - valid_resize_request(NewRingSize, Changes, Ring); - abort_resize -> - valid_resize_abort_request(Ring); - {set_location, Location} -> - valid_set_location_request(Location, Node, Ring) + leave -> valid_leave_request(Node, Ring); + remove -> valid_remove_request(Node, Ring); + {replace, NewNode} -> + valid_replace_request(Node, NewNode, Changes, Ring); + {force_replace, NewNode} -> + valid_force_replace_request(Node, NewNode, Changes, + Ring); + {resize, NewRingSize} -> + valid_resize_request(NewRingSize, Changes, Ring); + abort_resize -> valid_resize_abort_request(Ring) end. %% @private valid_leave_request(Node, Ring) -> case {riak_core_ring:all_members(Ring), - riak_core_ring:member_status(Ring, Node)} of - {_, invalid} -> - {error, not_member}; - {[Node], _} -> - {error, only_member}; - {_, valid} -> - true; - {_, joining} -> - true; - {_, _} -> - {error, already_leaving} + riak_core_ring:member_status(Ring, Node)} + of + {_, invalid} -> {error, not_member}; + {[Node], _} -> {error, only_member}; + {_, valid} -> true; + {_, joining} -> true; + {_, _} -> {error, already_leaving} end. %% @private valid_remove_request(Node, Ring) -> - IsClaimant = (Node == riak_core_ring:claimant(Ring)), - case {IsClaimant, - riak_core_ring:all_members(Ring), - riak_core_ring:member_status(Ring, Node)} of - {true, _, _} -> - {error, is_claimant}; - {_, _, invalid} -> - {error, not_member}; - {_, [Node], _} -> - {error, only_member}; - _ -> - true + IsClaimant = Node == riak_core_ring:claimant(Ring), + case {IsClaimant, riak_core_ring:all_members(Ring), + riak_core_ring:member_status(Ring, Node)} + of + {true, _, _} -> {error, is_claimant}; + {_, _, invalid} -> {error, not_member}; + {_, [Node], _} -> {error, only_member}; + _ -> true end. %% @private valid_replace_request(Node, NewNode, Changes, Ring) -> - AlreadyReplacement = lists:member(NewNode, existing_replacements(Changes)), - NewJoining = - (riak_core_ring:member_status(Ring, NewNode) == joining) - and (not orddict:is_key(NewNode, Changes)), + AlreadyReplacement = lists:member(NewNode, + existing_replacements(Changes)), + NewJoining = (riak_core_ring:member_status(Ring, + NewNode) + == joining) + and not orddict:is_key(NewNode, Changes), case {riak_core_ring:member_status(Ring, Node), - AlreadyReplacement, - NewJoining} of - {invalid, _, _} -> - {error, not_member}; - {leaving, _, _} -> - {error, already_leaving}; - {_, true, _} -> - {error, already_replacement}; - {_, _, false} -> - {error, invalid_replacement}; - _ -> - true + AlreadyReplacement, NewJoining} + of + {invalid, _, _} -> {error, not_member}; + {leaving, _, _} -> {error, already_leaving}; + {_, true, _} -> {error, already_replacement}; + {_, _, false} -> {error, invalid_replacement}; + _ -> true end. %% @private -valid_force_replace_request(Node, NewNode, Changes, Ring) -> - IsClaimant = (Node == riak_core_ring:claimant(Ring)), - AlreadyReplacement = lists:member(NewNode, existing_replacements(Changes)), - NewJoining = - (riak_core_ring:member_status(Ring, NewNode) == joining) - and (not orddict:is_key(NewNode, Changes)), +valid_force_replace_request(Node, NewNode, Changes, + Ring) -> + IsClaimant = Node == riak_core_ring:claimant(Ring), + AlreadyReplacement = lists:member(NewNode, + existing_replacements(Changes)), + NewJoining = (riak_core_ring:member_status(Ring, + NewNode) + == joining) + and not orddict:is_key(NewNode, Changes), case {IsClaimant, riak_core_ring:member_status(Ring, Node), - AlreadyReplacement, - NewJoining} of - {true, _, _, _} -> - {error, is_claimant}; - {_, invalid, _, _} -> - {error, not_member}; - {_, _, true, _} -> - {error, already_replacement}; - {_, _, _, false} -> - {error, invalid_replacement}; - _ -> - true + AlreadyReplacement, NewJoining} + of + {true, _, _, _} -> {error, is_claimant}; + {_, invalid, _, _} -> {error, not_member}; + {_, _, true, _} -> {error, already_replacement}; + {_, _, _, false} -> {error, invalid_replacement}; + _ -> true end. %% @private %% restrictions preventing resize along with other operations are temporary valid_resize_request(NewRingSize, [], Ring) -> - IsResizing = riak_core_ring:num_partitions(Ring) =/= NewRingSize, - + IsResizing = riak_core_ring:num_partitions(Ring) =/= + NewRingSize, NodeCount = length(riak_core_ring:all_members(Ring)), - Changes = length(riak_core_ring:pending_changes(Ring)) > 0, + Changes = length(riak_core_ring:pending_changes(Ring)) > + 0, case {IsResizing, NodeCount, Changes} of - {true, N, false} when N > 1 -> true; - {false, _, _} -> {error, same_size}; - {_, 1, _} -> {error, single_node}; - {_, _, true} -> {error, pending_changes} + {true, N, false} when N > 1 -> true; + {false, _, _} -> {error, same_size}; + {_, 1, _} -> {error, single_node}; + {_, _, true} -> {error, pending_changes} end. - valid_resize_abort_request(Ring) -> IsResizing = riak_core_ring:is_resizing(Ring), IsPostResize = riak_core_ring:is_post_resize(Ring), case IsResizing andalso not IsPostResize of - true -> true; - false -> {error, not_resizing} + true -> true; + false -> {error, not_resizing} end. %% @private @@ -519,81 +489,84 @@ valid_set_location_request(_Location, Node, Ring) -> %% can become invalid based on other staged changes, or by cluster %% changes that bypass the staging system. filter_changes(Changes, Ring) -> - orddict:filter(fun(Node, Change) -> + orddict:filter(fun (Node, Change) -> filter_changes_pred(Node, Change, Changes, Ring) - end, Changes). + end, + Changes). %% @private -filter_changes_pred(Node, {Change, NewNode}, Changes, Ring) - when (Change == replace) or (Change == force_replace) -> - IsMember = (riak_core_ring:member_status(Ring, Node) /= invalid), - IsJoining = (riak_core_ring:member_status(Ring, NewNode) == joining), - NotChanging = (not orddict:is_key(NewNode, Changes)), +filter_changes_pred(Node, {Change, NewNode}, Changes, + Ring) + when (Change == replace) or (Change == force_replace) -> + IsMember = riak_core_ring:member_status(Ring, Node) /= + invalid, + IsJoining = riak_core_ring:member_status(Ring, NewNode) + == joining, + NotChanging = not orddict:is_key(NewNode, Changes), IsMember and IsJoining and NotChanging; filter_changes_pred(Node, _, _, Ring) -> - IsMember = (riak_core_ring:member_status(Ring, Node) /= invalid), + IsMember = riak_core_ring:member_status(Ring, Node) /= + invalid, IsMember. %% @private existing_replacements(Changes) -> - [Node || {_, {Change, Node}} <- Changes, - (Change == replace) or (Change == force_replace)]. + [Node + || {_, {Change, Node}} <- Changes, + (Change == replace) or (Change == force_replace)]. %% @private %% Determine if two rings have logically equal cluster state same_plan(RingA, RingB) -> - (riak_core_ring:all_member_status(RingA) == riak_core_ring:all_member_status(RingB)) andalso - (riak_core_ring:all_owners(RingA) == riak_core_ring:all_owners(RingB)) andalso - (riak_core_ring:pending_changes(RingA) == riak_core_ring:pending_changes(RingB)). + riak_core_ring:all_member_status(RingA) == + riak_core_ring:all_member_status(RingB) + andalso + riak_core_ring:all_owners(RingA) == + riak_core_ring:all_owners(RingB) + andalso + riak_core_ring:pending_changes(RingA) == + riak_core_ring:pending_changes(RingB). schedule_tick() -> - Tick = application:get_env(riak_core, - claimant_tick, - 10000), + Tick = application:get_env(riak_core, claimant_tick, + 10000), erlang:send_after(Tick, ?MODULE, tick). -tick(State=#state{last_ring_id=LastID}) -> +tick(State = #state{last_ring_id = LastID}) -> case riak_core_ring_manager:get_ring_id() of - LastID -> - schedule_tick(), - State; - RingID -> - {ok, Ring} = riak_core_ring_manager:get_raw_ring(), - maybe_force_ring_update(Ring), - schedule_tick(), - State#state{last_ring_id=RingID} + LastID -> schedule_tick(), State; + RingID -> + {ok, Ring} = riak_core_ring_manager:get_raw_ring(), + maybe_force_ring_update(Ring), + schedule_tick(), + State#state{last_ring_id = RingID} end. maybe_force_ring_update(Ring) -> - IsClaimant = (riak_core_ring:claimant(Ring) == node()), + IsClaimant = riak_core_ring:claimant(Ring) == node(), IsReady = riak_core_ring:ring_ready(Ring), %% Do not force if we have any joining nodes unless any of them are %% auto-joining nodes. Otherwise, we will force update continuously. - JoinBlock = (are_joining_nodes(Ring) - andalso (auto_joining_nodes(Ring) == [])), - case IsClaimant and IsReady and (not JoinBlock) of - true -> - do_maybe_force_ring_update(Ring); - false -> - ok + JoinBlock = are_joining_nodes(Ring) andalso + auto_joining_nodes(Ring) == [], + case IsClaimant and IsReady and not JoinBlock of + true -> do_maybe_force_ring_update(Ring); + false -> ok end. do_maybe_force_ring_update(Ring) -> - case compute_next_ring([], riak_core_rand:rand_seed(), Ring) of - {ok, NextRing} -> - case same_plan(Ring, NextRing) of - false -> - logger:warning("Forcing update of stalled ring"), - riak_core_ring_manager:force_update(); - true -> - ok - end; - _ -> - ok + case compute_next_ring([], erlang:timestamp(), Ring) of + {ok, NextRing} -> + case same_plan(Ring, NextRing) of + false -> + logger:warning("Forcing update of stalled ring"), + riak_core_ring_manager:force_update(); + true -> ok + end; + _ -> ok end. - %% ========================================================================= %% Claimant rebalance/reassign logic %% ========================================================================= @@ -605,41 +578,39 @@ compute_all_next_rings(Changes, Seed, Ring) -> %% @private compute_all_next_rings(Changes, Seed, Ring, Acc) -> case compute_next_ring(Changes, Seed, Ring) of - {error, invalid_resize_claim}=Err -> - Err; - {ok, NextRing} -> - Acc2 = [{Ring, NextRing}|Acc], - case not same_plan(Ring, NextRing) of - true -> - FutureRing = riak_core_ring:future_ring(NextRing), - compute_all_next_rings([], Seed, FutureRing, Acc2); - false -> - {ok, lists:reverse(Acc2)} - end + {error, invalid_resize_claim} = Err -> Err; + {ok, NextRing} -> + Acc2 = [{Ring, NextRing} | Acc], + case not same_plan(Ring, NextRing) of + true -> + FutureRing = riak_core_ring:future_ring(NextRing), + compute_all_next_rings([], Seed, FutureRing, Acc2); + false -> {ok, lists:reverse(Acc2)} + end end. %% @private compute_next_ring(Changes, Seed, Ring) -> - Replacing = [{Node, NewNode} || {Node, {replace, NewNode}} <- Changes], + Replacing = [{Node, NewNode} + || {Node, {replace, NewNode}} <- Changes], Ring2 = apply_changes(Ring, Changes), {_, Ring3} = maybe_handle_joining(node(), Ring2), - {_, Ring4} = do_claimant_quiet(node(), Ring3, Replacing, Seed), + {_, Ring4} = do_claimant_quiet(node(), Ring3, Replacing, + Seed), {Valid, Ring5} = maybe_compute_resize(Ring, Ring4), case Valid of - false -> - {error, invalid_resize_claim}; - true -> - {ok, Ring5} + false -> {error, invalid_resize_claim}; + true -> {ok, Ring5} end. %% @private maybe_compute_resize(Orig, MbResized) -> OrigSize = riak_core_ring:num_partitions(Orig), NewSize = riak_core_ring:num_partitions(MbResized), - case OrigSize =/= NewSize of - false -> {true, MbResized}; - true -> validate_resized_ring(compute_resize(Orig, MbResized)) + false -> {true, MbResized}; + true -> + validate_resized_ring(compute_resize(Orig, MbResized)) end. %% @private @@ -652,49 +623,58 @@ maybe_compute_resize(Orig, MbResized) -> compute_resize(Orig, Resized) -> %% need to operate on balanced, future ring (apply changes determined by claim) CState0 = riak_core_ring:future_ring(Resized), - - Type = case riak_core_ring:num_partitions(Orig) < riak_core_ring:num_partitions(Resized) of - true -> larger; - false -> smaller - end, - + Type = case riak_core_ring:num_partitions(Orig) < + riak_core_ring:num_partitions(Resized) + of + true -> larger; + false -> smaller + end, %% Each index in the original ring must perform several transfers %% to properly resize the ring. The first transfer for each index %% is scheduled here. Subsequent transfers are scheduled by vnode - CState1 = lists:foldl(fun({Idx, _} = IdxOwner, CStateAcc) -> + CState1 = lists:foldl(fun ({Idx, _} = IdxOwner, + CStateAcc) -> %% indexes being abandoned in a shrinking ring have %% no next owner - NextOwner = try riak_core_ring:index_owner(CStateAcc, Idx) - catch error:{badmatch, false} -> none + NextOwner = try + riak_core_ring:index_owner(CStateAcc, + Idx) + catch + error:{badmatch, false} -> none end, - schedule_first_resize_transfer(Type, - IdxOwner, + schedule_first_resize_transfer(Type, IdxOwner, NextOwner, CStateAcc) end, - CState0, - riak_core_ring:all_owners(Orig)), - + CState0, riak_core_ring:all_owners(Orig)), riak_core_ring:set_pending_resize(CState1, Orig). %% @private %% @doc determine the first resize transfer a partition should perform with %% the goal of ensuring the transfer will actually have data to send to the %% target. -schedule_first_resize_transfer(smaller, {Idx,_}=IdxOwner, none, Resized) -> +schedule_first_resize_transfer(smaller, + {Idx, _} = IdxOwner, none, Resized) -> %% partition no longer exists in shrunk ring, first successor will be %% new owner of its data - Target = hd(riak_core_ring:preflist(<>, Resized)), - riak_core_ring:schedule_resize_transfer(Resized, IdxOwner, Target); -schedule_first_resize_transfer(_Type,{Idx, Owner}=IdxOwner, Owner, Resized) -> + Target = hd(riak_core_ring:preflist(<>, + Resized)), + riak_core_ring:schedule_resize_transfer(Resized, + IdxOwner, Target); +schedule_first_resize_transfer(_Type, + {Idx, Owner} = IdxOwner, Owner, Resized) -> %% partition is not being moved during expansion, first predecessor will %% own at least a portion of its data - Target = hd(chash:predecessors(Idx-1, riak_core_ring:chash(Resized))), - riak_core_ring:schedule_resize_transfer(Resized, IdxOwner, Target); -schedule_first_resize_transfer(_,{Idx, _Owner}=IdxOwner, NextOwner, Resized) -> + Target = hd(chash:predecessors(Idx - 1, + riak_core_ring:chash(Resized))), + riak_core_ring:schedule_resize_transfer(Resized, + IdxOwner, Target); +schedule_first_resize_transfer(_, + {Idx, _Owner} = IdxOwner, NextOwner, Resized) -> %% partition is being moved during expansion, schedule transfer to partition %% on new owner since it will still own some of its data - riak_core_ring:schedule_resize_transfer(Resized, IdxOwner, {Idx, NextOwner}). + riak_core_ring:schedule_resize_transfer(Resized, + IdxOwner, {Idx, NextOwner}). %% @doc verify that resized ring was properly claimed (no owners are the dummy %% resized owner) in both the current and future ring @@ -704,25 +684,24 @@ validate_resized_ring(Ring) -> FutureOwners = riak_core_ring:all_owners(FutureRing), Members = riak_core_ring:all_members(Ring), FutureMembers = riak_core_ring:all_members(FutureRing), - Invalid1 = [{Idx, Owner} || {Idx, Owner} <- Owners, - not lists:member(Owner, Members)], - Invalid2 = [{Idx, Owner} || {Idx, Owner} <- FutureOwners, - not lists:member(Owner, FutureMembers)], + Invalid1 = [{Idx, Owner} + || {Idx, Owner} <- Owners, + not lists:member(Owner, Members)], + Invalid2 = [{Idx, Owner} + || {Idx, Owner} <- FutureOwners, + not lists:member(Owner, FutureMembers)], case Invalid1 ++ Invalid2 of - [] -> - {true, Ring}; - _ -> - {false, Ring} + [] -> {true, Ring}; + _ -> {false, Ring} end. %% @private apply_changes(Ring, Changes) -> - NewRing = - lists:foldl( - fun({Node, Cmd}, RingAcc2) -> - RingAcc3 = change({Cmd, Node}, RingAcc2), - RingAcc3 - end, Ring, Changes), + NewRing = lists:foldl(fun ({Node, Cmd}, RingAcc2) -> + RingAcc3 = change({Cmd, Node}, RingAcc2), + RingAcc3 + end, + Ring, Changes), NewRing. %% @private @@ -731,12 +710,14 @@ change({join, Node}, Ring) -> Ring2; change({leave, Node}, Ring) -> Members = riak_core_ring:all_members(Ring), - lists:member(Node, Members) orelse throw(invalid_member), + lists:member(Node, Members) orelse + throw(invalid_member), Ring2 = riak_core_ring:leave_member(Node, Ring, Node), Ring2; change({remove, Node}, Ring) -> Members = riak_core_ring:all_members(Ring), - lists:member(Node, Members) orelse throw(invalid_member), + lists:member(Node, Members) orelse + throw(invalid_member), Ring2 = riak_core_ring:remove_member(Node, Ring, Node), Ring2; change({{replace, _NewNode}, Node}, Ring) -> @@ -746,12 +727,14 @@ change({{replace, _NewNode}, Node}, Ring) -> change({{force_replace, NewNode}, Node}, Ring) -> Indices = riak_core_ring:indices(Ring, Node), Reassign = [{Idx, NewNode} || Idx <- Indices], - Ring2 = riak_core_ring:add_member(NewNode, Ring, NewNode), + Ring2 = riak_core_ring:add_member(NewNode, Ring, + NewNode), Ring3 = riak_core_ring:change_owners(Ring2, Reassign), Ring4 = riak_core_ring:remove_member(Node, Ring3, Node), case riak_core_ring:is_resizing(Ring4) of - true -> replace_node_during_resize(Ring4, Node, NewNode); - false -> Ring4 + true -> + replace_node_during_resize(Ring4, Node, NewNode); + false -> Ring4 end; change({{resize, NewRingSize}, _Node}, Ring) -> riak_core_ring:resize(Ring, NewRingSize); @@ -762,9 +745,9 @@ change({{set_location, Location}, Node}, Ring) -> %%noinspection ErlangUnboundVariable internal_ring_changed(Node, CState) -> - {Changed, CState5} = do_claimant(Node, CState, fun log/2), + {Changed, CState5} = do_claimant(Node, CState, + fun log/2), inform_removed_nodes(Node, CState, CState5), - %% Start/stop converge and rebalance delay timers %% (converge delay) %% -- Starts when claimant changes the ring @@ -773,152 +756,159 @@ internal_ring_changed(Node, CState) -> %% -- Starts when next changes from empty to non-empty %% -- Stops when next changes from non-empty to empty %% - IsClaimant = (riak_core_ring:claimant(CState5) =:= Node), - WasPending = ([] /= riak_core_ring:pending_changes(CState)), - IsPending = ([] /= riak_core_ring:pending_changes(CState5)), - + IsClaimant = riak_core_ring:claimant(CState5) =:= Node, + WasPending = [] /= + riak_core_ring:pending_changes(CState), + IsPending = [] /= + riak_core_ring:pending_changes(CState5), %% Outer case statement already checks for ring_ready case {IsClaimant, Changed} of - {true, true} -> - %% STATS -%% riak_core_stat:update(converge_timer_end), - %% STATS -%% riak_core_stat:update(converge_timer_begin); - ok; - {true, false} -> - %% STATS -%% riak_core_stat:update(converge_timer_end); - ok; - _ -> - ok + {true, true} -> + %% STATS + %% riak_core_stat:update(converge_timer_end), + %% STATS + %% riak_core_stat:update(converge_timer_begin); + ok; + {true, false} -> + %% STATS + %% riak_core_stat:update(converge_timer_end); + ok; + _ -> ok end, - case {IsClaimant, WasPending, IsPending} of - {true, false, true} -> - %% STATS -%% riak_core_stat:update(rebalance_timer_begin); - ok; - {true, true, false} -> - %% STATS -%% riak_core_stat:update(rebalance_timer_end); - ok; - _ -> - ok + {true, false, true} -> + %% STATS + %% riak_core_stat:update(rebalance_timer_begin); + ok; + {true, true, false} -> + %% STATS + %% riak_core_stat:update(rebalance_timer_end); + ok; + _ -> ok end, - %% Set cluster name if it is undefined - case {IsClaimant, riak_core_ring:cluster_name(CState5)} of - {true, undefined} -> - ClusterName = {Node, riak_core_rand:rand_seed()}, - {_,_} = riak_core_util:rpc_every_member(riak_core_ring_manager, - set_cluster_name, - [ClusterName], - 1000), - ok; - _ -> - ClusterName = riak_core_ring:cluster_name(CState5), - ok + case {IsClaimant, riak_core_ring:cluster_name(CState5)} + of + {true, undefined} -> + ClusterName = {Node, erlang:timestamp()}, + {_, _} = + riak_core_util:rpc_every_member(riak_core_ring_manager, + set_cluster_name, [ClusterName], + 1000), + ok; + _ -> + ClusterName = riak_core_ring:cluster_name(CState5), ok end, - case Changed of - true -> - CState6 = riak_core_ring:set_cluster_name(CState5, ClusterName), - riak_core_ring:increment_vclock(Node, CState6); - false -> - CState5 + true -> + CState6 = riak_core_ring:set_cluster_name(CState5, + ClusterName), + riak_core_ring:increment_vclock(Node, CState6); + false -> CState5 end. inform_removed_nodes(Node, OldRing, NewRing) -> CName = riak_core_ring:cluster_name(NewRing), - Exiting = riak_core_ring:members(OldRing, [exiting]) -- [Node], + Exiting = riak_core_ring:members(OldRing, [exiting]) -- + [Node], Invalid = riak_core_ring:members(NewRing, [invalid]), - Changed = ordsets:intersection(ordsets:from_list(Exiting), - ordsets:from_list(Invalid)), + Changed = + ordsets:intersection(ordsets:from_list(Exiting), + ordsets:from_list(Invalid)), %% Tell exiting node to shutdown. - _ = [riak_core_ring_manager:refresh_ring(ExitingNode, CName) || - ExitingNode <- Changed], + _ = [riak_core_ring_manager:refresh_ring(ExitingNode, + CName) + || ExitingNode <- Changed], ok. do_claimant_quiet(Node, CState, Replacing, Seed) -> - do_claimant(Node, CState, Replacing, Seed, fun no_log/2). + do_claimant(Node, CState, Replacing, Seed, + fun no_log/2). do_claimant(Node, CState, Log) -> - do_claimant(Node, CState, [], riak_core_rand:rand_seed(), Log). + do_claimant(Node, CState, [], erlang:timestamp(), Log). do_claimant(Node, CState, Replacing, Seed, Log) -> AreJoining = are_joining_nodes(CState), {C1, CState2} = maybe_update_claimant(Node, CState), - {C2, CState3} = maybe_handle_auto_joining(Node, CState2), + {C2, CState3} = maybe_handle_auto_joining(Node, + CState2), case AreJoining of - true -> - %% Do not rebalance if there are joining nodes - Changed = C1 or C2, - CState5 = CState3; - false -> - {C3, CState4} = - maybe_update_ring(Node, CState3, Replacing, Seed, Log), - {C4, CState5} = maybe_remove_exiting(Node, CState4), - Changed = (C1 or C2 or C3 or C4) + true -> + %% Do not rebalance if there are joining nodes + Changed = C1 or C2, + CState5 = CState3; + false -> + {C3, CState4} = maybe_update_ring(Node, CState3, + Replacing, Seed, Log), + {C4, CState5} = maybe_remove_exiting(Node, CState4), + Changed = C1 or C2 or C3 or C4 end, {Changed, CState5}. %% @private maybe_update_claimant(Node, CState) -> - Members = riak_core_ring:members(CState, [valid, leaving]), + Members = riak_core_ring:members(CState, + [valid, leaving]), Claimant = riak_core_ring:claimant(CState), NextClaimant = hd(Members ++ [undefined]), ClaimantMissing = not lists:member(Claimant, Members), - case {ClaimantMissing, NextClaimant} of - {true, Node} -> - %% Become claimant - CState2 = riak_core_ring:set_claimant(CState, Node), - CState3 = riak_core_ring:increment_ring_version(Claimant, CState2), - {true, CState3}; - _ -> - {false, CState} + {true, Node} -> + %% Become claimant + CState2 = riak_core_ring:set_claimant(CState, Node), + CState3 = + riak_core_ring:increment_ring_version(Claimant, + CState2), + {true, CState3}; + _ -> {false, CState} end. %% @private maybe_update_ring(Node, CState, Replacing, Seed, Log) -> Claimant = riak_core_ring:claimant(CState), case Claimant of - Node -> - case riak_core_ring:claiming_members(CState) of - [] -> - %% Consider logging an error/warning here or even - %% intentionally crashing. This state makes no logical - %% sense given that it represents a cluster without any - %% active nodes. - {false, CState}; - _ -> - Resizing = riak_core_ring:is_resizing(CState), - {Changed, CState2} = - update_ring(Node, CState, Replacing, Seed, Log, Resizing), - {Changed, CState2} - end; - _ -> - {false, CState} + Node -> + case riak_core_ring:claiming_members(CState) of + [] -> + %% Consider logging an error/warning here or even + %% intentionally crashing. This state makes no logical + %% sense given that it represents a cluster without any + %% active nodes. + {false, CState}; + _ -> + Resizing = riak_core_ring:is_resizing(CState), + {Changed, CState2} = update_ring(Node, CState, + Replacing, Seed, Log, + Resizing), + {Changed, CState2} + end; + _ -> {false, CState} end. %% @private maybe_remove_exiting(Node, CState) -> Claimant = riak_core_ring:claimant(CState), case Claimant of - Node -> - %% Change exiting nodes to invalid, skipping this node. - Exiting = riak_core_ring:members(CState, [exiting]) -- [Node], - Changed = (Exiting /= []), - CState2 = - lists:foldl(fun(ENode, CState0) -> - ClearedCS = - riak_core_ring:clear_member_meta(Node, CState0, ENode), - riak_core_ring:set_member(Node, ClearedCS, ENode, - invalid, same_vclock) - end, CState, Exiting), - {Changed, CState2}; - _ -> - {false, CState} + Node -> + %% Change exiting nodes to invalid, skipping this node. + Exiting = riak_core_ring:members(CState, [exiting]) -- + [Node], + Changed = Exiting /= [], + CState2 = lists:foldl(fun (ENode, CState0) -> + ClearedCS = + riak_core_ring:clear_member_meta(Node, + CState0, + ENode), + riak_core_ring:set_member(Node, + ClearedCS, + ENode, + invalid, + same_vclock) + end, + CState, Exiting), + {Changed, CState2}; + _ -> {false, CState} end. %% @private @@ -929,9 +919,13 @@ are_joining_nodes(CState) -> %% @private auto_joining_nodes(CState) -> Joining = riak_core_ring:members(CState, [joining]), -%% case application:get_env(riak_core, staged_joins, true) of false -> Joining; true -> - [Member || Member <- Joining, riak_core_ring:get_member_meta(CState, Member, '$autojoin') == true]. -%% end. + %% case application:get_env(riak_core, staged_joins, true) of false -> Joining; true -> + [Member + || Member <- Joining, + riak_core_ring:get_member_meta(CState, Member, + '$autojoin') + == + true].%% end. %% @private maybe_handle_auto_joining(Node, CState) -> @@ -947,141 +941,152 @@ maybe_handle_joining(Node, CState) -> maybe_handle_joining(Node, Joining, CState) -> Claimant = riak_core_ring:claimant(CState), case Claimant of - Node -> - Changed = (Joining /= []), - CState2 = - lists:foldl(fun(JNode, CState0) -> - riak_core_ring:set_member(Node, CState0, JNode, - valid, same_vclock) - end, CState, Joining), - {Changed, CState2}; - _ -> - {false, CState} + Node -> + Changed = Joining /= [], + CState2 = lists:foldl(fun (JNode, CState0) -> + riak_core_ring:set_member(Node, CState0, + JNode, valid, + same_vclock) + end, + CState, Joining), + {Changed, CState2}; + _ -> {false, CState} end. %% @private -update_ring(CNode, CState, Replacing, Seed, Log, false) -> +update_ring(CNode, CState, Replacing, Seed, Log, + false) -> Next0 = riak_core_ring:pending_changes(CState), - - ?ROUT("Members: ~p~n", [riak_core_ring:members(CState, [joining, valid, - leaving, exiting, - invalid])]), + ?ROUT("Members: ~p~n", + [riak_core_ring:members(CState, + [joining, valid, leaving, exiting, + invalid])]), ?ROUT("Updating ring :: next0 : ~p~n", [Next0]), - %% Remove tuples from next for removed nodes - InvalidMembers = riak_core_ring:members(CState, [invalid]), - Next2 = lists:filter(fun(NInfo) -> - {Owner, NextOwner, _} = riak_core_ring:next_owner(NInfo), + InvalidMembers = riak_core_ring:members(CState, + [invalid]), + Next2 = lists:filter(fun (NInfo) -> + {Owner, NextOwner, _} = + riak_core_ring:next_owner(NInfo), not lists:member(Owner, InvalidMembers) and - not lists:member(NextOwner, InvalidMembers) - end, Next0), - CState2 = riak_core_ring:set_pending_changes(CState, Next2), - + not lists:member(NextOwner, InvalidMembers) + end, + Next0), + CState2 = riak_core_ring:set_pending_changes(CState, + Next2), %% Transfer ownership after completed handoff - {RingChanged1, CState3} = transfer_ownership(CState2, Log), + {RingChanged1, CState3} = transfer_ownership(CState2, + Log), ?ROUT("Updating ring :: next1 : ~p~n", [riak_core_ring:pending_changes(CState3)]), - %% Ressign leaving/inactive indices - {RingChanged2, CState4} = reassign_indices(CState3, Replacing, Seed, Log), + {RingChanged2, CState4} = reassign_indices(CState3, + Replacing, Seed, Log), ?ROUT("Updating ring :: next2 : ~p~n", [riak_core_ring:pending_changes(CState4)]), - %% Rebalance the ring as necessary. If pending changes exist ring %% is not rebalanced Next3 = rebalance_ring(CNode, CState4), - Log(debug,{"Pending ownership transfers: ~b~n", - [length(riak_core_ring:pending_changes(CState4))]}), - + Log(debug, + {"Pending ownership transfers: ~b~n", + [length(riak_core_ring:pending_changes(CState4))]}), %% Remove transfers to/from down nodes Next4 = handle_down_nodes(CState4, Next3), - - NextChanged = (Next0 /= Next4), - Changed = (NextChanged or RingChanged1 or RingChanged2), + NextChanged = Next0 /= Next4, + Changed = NextChanged or RingChanged1 or RingChanged2, case Changed of - true -> - OldS = ordsets:from_list([{Idx,O,NO} || {Idx,O,NO,_,_} <- Next0]), - NewS = ordsets:from_list([{Idx,O,NO} || {Idx,O,NO,_,_} <- Next4]), - Diff = ordsets:subtract(NewS, OldS), - _ = [Log(next, NChange) || NChange <- Diff], - ?ROUT("Updating ring :: next3 : ~p~n", [Next4]), - CState5 = riak_core_ring:set_pending_changes(CState4, Next4), - CState6 = riak_core_ring:increment_ring_version(CNode, CState5), - {true, CState6}; - false -> - {false, CState} + true -> + OldS = ordsets:from_list([{Idx, O, NO} + || {Idx, O, NO, _, _} <- Next0]), + NewS = ordsets:from_list([{Idx, O, NO} + || {Idx, O, NO, _, _} <- Next4]), + Diff = ordsets:subtract(NewS, OldS), + _ = [Log(next, NChange) || NChange <- Diff], + ?ROUT("Updating ring :: next3 : ~p~n", [Next4]), + CState5 = riak_core_ring:set_pending_changes(CState4, + Next4), + CState6 = riak_core_ring:increment_ring_version(CNode, + CState5), + {true, CState6}; + false -> {false, CState} end; -update_ring(CNode, CState, _Replacing, _Seed, _Log, true) -> - {Installed, CState1} = maybe_install_resized_ring(CState), - {Aborted, CState2} = riak_core_ring:maybe_abort_resize(CState1), +update_ring(CNode, CState, _Replacing, _Seed, _Log, + true) -> + {Installed, CState1} = + maybe_install_resized_ring(CState), + {Aborted, CState2} = + riak_core_ring:maybe_abort_resize(CState1), Changed = Installed orelse Aborted, case Changed of - true -> - CState3 = riak_core_ring:increment_ring_version(CNode, CState2), - {true, CState3}; - false -> - {false, CState} + true -> + CState3 = riak_core_ring:increment_ring_version(CNode, + CState2), + {true, CState3}; + false -> {false, CState} end. maybe_install_resized_ring(CState) -> case riak_core_ring:is_resize_complete(CState) of - true -> - {true, riak_core_ring:future_ring(CState)}; - false -> {false, CState} + true -> {true, riak_core_ring:future_ring(CState)}; + false -> {false, CState} end. %% @private transfer_ownership(CState, Log) -> Next = riak_core_ring:pending_changes(CState), %% Remove already completed and transfered changes - Next2 = lists:filter(fun(NInfo={Idx, _, _, _, _}) -> - {_, NewOwner, S} = riak_core_ring:next_owner(NInfo), - not ((S == complete) and - (riak_core_ring:index_owner(CState, Idx) =:= NewOwner)) - end, Next), - - CState2 = lists:foldl( - fun(NInfo={Idx, _, _, _, _}, CState0) -> - case riak_core_ring:next_owner(NInfo) of - {_, Node, complete} -> - Log(ownership, {Idx, Node, CState0}), - riak_core_ring:transfer_node(Idx, Node, - CState0); - _ -> - CState0 - end - end, CState, Next2), - - NextChanged = (Next2 /= Next), - RingChanged = (riak_core_ring:all_owners(CState) /= riak_core_ring:all_owners(CState2)), - Changed = (NextChanged or RingChanged), - CState3 = riak_core_ring:set_pending_changes(CState2, Next2), + Next2 = lists:filter(fun (NInfo = {Idx, _, _, _, _}) -> + {_, NewOwner, S} = + riak_core_ring:next_owner(NInfo), + not + ((S == complete) and + (riak_core_ring:index_owner(CState, Idx) + =:= NewOwner)) + end, + Next), + CState2 = lists:foldl(fun (NInfo = {Idx, _, _, _, _}, + CState0) -> + case riak_core_ring:next_owner(NInfo) of + {_, Node, complete} -> + Log(ownership, {Idx, Node, CState0}), + riak_core_ring:transfer_node(Idx, Node, + CState0); + _ -> CState0 + end + end, + CState, Next2), + NextChanged = Next2 /= Next, + RingChanged = riak_core_ring:all_owners(CState) /= + riak_core_ring:all_owners(CState2), + Changed = NextChanged or RingChanged, + CState3 = riak_core_ring:set_pending_changes(CState2, + Next2), {Changed, CState3}. - %% @private reassign_indices(CState, Replacing, Seed, Log) -> Next = riak_core_ring:pending_changes(CState), Invalid = riak_core_ring:members(CState, [invalid]), - CState2 = - lists:foldl(fun(Node, CState0) -> - remove_node(CState0, Node, invalid, - Replacing, Seed, Log) - end, CState, Invalid), + CState2 = lists:foldl(fun (Node, CState0) -> + remove_node(CState0, Node, invalid, Replacing, + Seed, Log) + end, + CState, Invalid), CState3 = case Next of - [] -> - Leaving = riak_core_ring:members(CState, [leaving]), - lists:foldl(fun(Node, CState0) -> - remove_node(CState0, Node, leaving, - Replacing, Seed, Log) - end, CState2, Leaving); - _ -> - CState2 + [] -> + Leaving = riak_core_ring:members(CState, [leaving]), + lists:foldl(fun (Node, CState0) -> + remove_node(CState0, Node, leaving, + Replacing, Seed, Log) + end, + CState2, Leaving); + _ -> CState2 end, Owners1 = riak_core_ring:all_owners(CState), Owners2 = riak_core_ring:all_owners(CState3), - RingChanged = (Owners1 /= Owners2), - NextChanged = (Next /= riak_core_ring:pending_changes(CState3)), + RingChanged = Owners1 /= Owners2, + NextChanged = Next /= + riak_core_ring:pending_changes(CState3), {RingChanged or NextChanged, CState3}. %% @private @@ -1098,29 +1103,29 @@ rebalance_ring(_CNode, [], CState) -> || {{Idx, PrevOwner}, {Idx, NewOwner}} <- Owners3, PrevOwner /= NewOwner], Next; -rebalance_ring(_CNode, Next, _CState) -> - Next. +rebalance_ring(_CNode, Next, _CState) -> Next. %% @private handle_down_nodes(CState, Next) -> - LeavingMembers = riak_core_ring:members(CState, [leaving, invalid]), + LeavingMembers = riak_core_ring:members(CState, + [leaving, invalid]), DownMembers = riak_core_ring:members(CState, [down]), Next2 = [begin - OwnerLeaving = lists:member(O, LeavingMembers), - NextDown = lists:member(NO, DownMembers), - case (OwnerLeaving and NextDown) of - true -> - Active = riak_core_ring:active_members(CState) -- [O], - RNode = lists:nth(riak_core_rand:uniform(length(Active)), - Active), - {Idx, O, RNode, Mods, Status}; - _ -> - T - end - end || T={Idx, O, NO, Mods, Status} <- Next], - Next3 = [T || T={_, O, NO, _, _} <- Next2, - not lists:member(O, DownMembers), - not lists:member(NO, DownMembers)], + OwnerLeaving = lists:member(O, LeavingMembers), + NextDown = lists:member(NO, DownMembers), + case OwnerLeaving and NextDown of + true -> + Active = riak_core_ring:active_members(CState) -- [O], + RNode = lists:nth(rand:uniform(length(Active)), Active), + {Idx, O, RNode, Mods, Status}; + _ -> T + end + end + || T = {Idx, O, NO, Mods, Status} <- Next], + Next3 = [T + || T = {_, O, NO, _, _} <- Next2, + not lists:member(O, DownMembers), + not lists:member(NO, DownMembers)], Next3. %% @private @@ -1131,88 +1136,105 @@ reassign_indices_to(Node, NewNode, Ring) -> Ring2. %% @private -remove_node(CState, Node, Status, Replacing, Seed, Log) -> +remove_node(CState, Node, Status, Replacing, Seed, + Log) -> Indices = riak_core_ring:indices(CState, Node), - remove_node(CState, Node, Status, Replacing, Seed, Log, Indices). + remove_node(CState, Node, Status, Replacing, Seed, Log, + Indices). %% @private -remove_node(CState, _Node, _Status, _Replacing, _Seed, _Log, []) -> +remove_node(CState, _Node, _Status, _Replacing, _Seed, + _Log, []) -> CState; -remove_node(CState, Node, Status, Replacing, Seed, Log, Indices) -> +remove_node(CState, Node, Status, Replacing, Seed, Log, + Indices) -> CStateT1 = riak_core_ring:change_owners(CState, riak_core_ring:all_next_owners(CState)), case orddict:find(Node, Replacing) of - {ok, NewNode} -> - CStateT2 = reassign_indices_to(Node, NewNode, CStateT1); - error -> - CStateT2 = riak_core_gossip:remove_from_cluster(CStateT1, Node, Seed) + {ok, NewNode} -> + CStateT2 = reassign_indices_to(Node, NewNode, CStateT1); + error -> + CStateT2 = + riak_core_gossip:remove_from_cluster(CStateT1, Node, + Seed) end, - Owners1 = riak_core_ring:all_owners(CState), Owners2 = riak_core_ring:all_owners(CStateT2), Owners3 = lists:zip(Owners1, Owners2), RemovedIndices = case Status of - invalid -> - Indices; - leaving -> - [] + invalid -> Indices; + leaving -> [] end, - Reassign = [{Idx, NewOwner} || {Idx, NewOwner} <- Owners2, - lists:member(Idx, RemovedIndices)], + Reassign = [{Idx, NewOwner} + || {Idx, NewOwner} <- Owners2, + lists:member(Idx, RemovedIndices)], Next = [{Idx, PrevOwner, NewOwner, [], awaiting} || {{Idx, PrevOwner}, {Idx, NewOwner}} <- Owners3, PrevOwner /= NewOwner, not lists:member(Idx, RemovedIndices)], - - _ = [Log(reassign, {Idx, NewOwner, CState}) || {Idx, NewOwner} <- Reassign], - + _ = [Log(reassign, {Idx, NewOwner, CState}) + || {Idx, NewOwner} <- Reassign], %% Unlike rebalance_ring, remove_node can be called when Next is non-empty, %% therefore we need to merge the values. Original Next has priority. - Next2 = lists:ukeysort(1, riak_core_ring:pending_changes(CState) ++ Next), - CState2 = riak_core_ring:change_owners(CState, Reassign), - CState3 = riak_core_ring:set_pending_changes(CState2, Next2), + Next2 = lists:ukeysort(1, + riak_core_ring:pending_changes(CState) ++ Next), + CState2 = riak_core_ring:change_owners(CState, + Reassign), + CState3 = riak_core_ring:set_pending_changes(CState2, + Next2), CState3. replace_node_during_resize(CState0, Node, NewNode) -> PostResize = riak_core_ring:is_post_resize(CState0), - CState1 = replace_node_during_resize(CState0, Node, NewNode, PostResize), - riak_core_ring:increment_ring_version(riak_core_ring:claimant(CState1), CState1). + CState1 = replace_node_during_resize(CState0, Node, + NewNode, PostResize), + riak_core_ring:increment_ring_version(riak_core_ring:claimant(CState1), + CState1). -replace_node_during_resize(CState0, Node, NewNode, false) -> %% ongoing xfers +replace_node_during_resize(CState0, Node, NewNode, + false) -> %% ongoing xfers %% for each of the indices being moved from Node to NewNode, reschedule resize %% transfers where the target is owned by Node. - CState1 = riak_core_ring:reschedule_resize_transfers(CState0, Node, NewNode), - + CState1 = + riak_core_ring:reschedule_resize_transfers(CState0, + Node, NewNode), %% since the resized chash is carried directly in state vs. being rebuilt via next %% list, perform reassignment - {ok, FutureCHash} = riak_core_ring:resized_ring(CState1), - FutureCState = riak_core_ring:set_chash(CState1, FutureCHash), - ReassignedFuture = reassign_indices_to(Node, NewNode, FutureCState), - ReassignedCHash = riak_core_ring:chash(ReassignedFuture), - riak_core_ring:set_resized_ring(CState1, ReassignedCHash); -replace_node_during_resize(CState, Node, _NewNode, true) -> %% performing cleanup + {ok, FutureCHash} = + riak_core_ring:resized_ring(CState1), + FutureCState = riak_core_ring:set_chash(CState1, + FutureCHash), + ReassignedFuture = reassign_indices_to(Node, NewNode, + FutureCState), + ReassignedCHash = + riak_core_ring:chash(ReassignedFuture), + riak_core_ring:set_resized_ring(CState1, + ReassignedCHash); +replace_node_during_resize(CState, Node, _NewNode, + true) -> %% performing cleanup %% we are simply deleting data at this point, no reason to do that on either node - NewNext = [{I,N,O,M,S} || {I,N,O,M,S} <- riak_core_ring:pending_changes(CState), - N =/= Node], + NewNext = [{I, N, O, M, S} + || {I, N, O, M, S} + <- riak_core_ring:pending_changes(CState), + N =/= Node], riak_core_ring:set_pending_changes(CState, NewNext). -no_log(_, _) -> - ok. +no_log(_, _) -> ok. -log(debug, {Msg, Args}) -> - logger:debug(Msg, Args); +log(debug, {Msg, Args}) -> logger:debug(Msg, Args); log(ownership, {Idx, NewOwner, CState}) -> Owner = riak_core_ring:index_owner(CState, Idx), - logger:debug("(new-owner) ~b :: ~p -> ~p~n", [Idx, Owner, NewOwner]); + logger:debug("(new-owner) ~b :: ~p -> ~p~n", + [Idx, Owner, NewOwner]); log(reassign, {Idx, NewOwner, CState}) -> Owner = riak_core_ring:index_owner(CState, Idx), - logger:debug("(reassign) ~b :: ~p -> ~p~n", [Idx, Owner, NewOwner]); + logger:debug("(reassign) ~b :: ~p -> ~p~n", + [Idx, Owner, NewOwner]); log(next, {Idx, Owner, NewOwner}) -> - logger:debug("(pending) ~b :: ~p -> ~p~n", [Idx, Owner, NewOwner]); -log(_, _) -> - ok. + logger:debug("(pending) ~b :: ~p -> ~p~n", + [Idx, Owner, NewOwner]); +log(_, _) -> ok. %% =================================================================== %% EUnit tests %% =================================================================== - diff --git a/src/riak_core_eventhandler_guard.erl b/src/riak_core_eventhandler_guard.erl index 5381dce4d..b3e05ec2a 100644 --- a/src/riak_core_eventhandler_guard.erl +++ b/src/riak_core_eventhandler_guard.erl @@ -20,41 +20,50 @@ %% %% ------------------------------------------------------------------- -module(riak_core_eventhandler_guard). + -behaviour(gen_server). + -export([start_link/3, start_link/4]). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). + +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). + -record(state, {handlermod, handler, exitfun}). start_link(HandlerMod, Handler, Args) -> start_link(HandlerMod, Handler, Args, undefined). start_link(HandlerMod, Handler, Args, ExitFun) -> - gen_server:start_link(?MODULE, [HandlerMod, Handler, Args, ExitFun], []). + gen_server:start_link(?MODULE, + [HandlerMod, Handler, Args, ExitFun], []). init([HandlerMod, Handler, Args, ExitFun]) -> - ok = gen_event:add_sup_handler(HandlerMod, Handler, Args), - {ok, #state{handlermod=HandlerMod, handler=Handler, exitfun=ExitFun}}. + ok = gen_event:add_sup_handler(HandlerMod, Handler, + Args), + {ok, + #state{handlermod = HandlerMod, handler = Handler, + exitfun = ExitFun}}. -handle_call(_Request, _From, State) -> {reply, ok, State}. +handle_call(_Request, _From, State) -> + {reply, ok, State}. handle_cast(_Msg, State) -> {noreply, State}. - -handle_info({gen_event_EXIT, _Handler, shutdown}, State) -> +handle_info({gen_event_EXIT, _Handler, shutdown}, + State) -> {stop, normal, State}; -handle_info({gen_event_EXIT, _Handler, normal}, State) -> +handle_info({gen_event_EXIT, _Handler, normal}, + State) -> {stop, normal, State}; -handle_info({gen_event_EXIT, Handler, _Reason}, State=#state{exitfun=undefined}) -> +handle_info({gen_event_EXIT, Handler, _Reason}, + State = #state{exitfun = undefined}) -> {stop, {gen_event_EXIT, Handler}, State}; -handle_info({gen_event_EXIT, Handler, Reason}, State=#state{exitfun=ExitFun}) -> +handle_info({gen_event_EXIT, Handler, Reason}, + State = #state{exitfun = ExitFun}) -> ExitFun(Handler, Reason), {stop, {gen_event_EXIT, Handler}, State}; -handle_info(_Info, State) -> - {noreply, State}. +handle_info(_Info, State) -> {noreply, State}. -terminate(_Reason, #state{}) -> - ok. +terminate(_Reason, #state{}) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. - diff --git a/src/riak_core_eventhandler_sup.erl b/src/riak_core_eventhandler_sup.erl index 550069b6c..a9bb53f3e 100644 --- a/src/riak_core_eventhandler_sup.erl +++ b/src/riak_core_eventhandler_sup.erl @@ -22,45 +22,54 @@ %% @doc supervise riak_core_eventhandler_guard processes -module(riak_core_eventhandler_sup). + -behaviour(supervisor). + -export([start_link/0, init/1]). --export([start_guarded_handler/3, start_guarded_handler/4, stop_guarded_handler/3]). + +-export([start_guarded_handler/3, + start_guarded_handler/4, stop_guarded_handler/3]). start_guarded_handler(HandlerMod, Handler, Args) -> - start_guarded_handler(HandlerMod, Handler, Args, undefined). + start_guarded_handler(HandlerMod, Handler, Args, + undefined). -start_guarded_handler(HandlerMod, Handler, Args, ExitFun) -> - case supervisor:start_child(?MODULE, handler_spec(HandlerMod, Handler, Args, ExitFun)) of - {ok, _Pid} -> ok; - Other -> Other +start_guarded_handler(HandlerMod, Handler, Args, + ExitFun) -> + case supervisor:start_child(?MODULE, + handler_spec(HandlerMod, Handler, Args, + ExitFun)) + of + {ok, _Pid} -> ok; + Other -> Other end. stop_guarded_handler(HandlerMod, Handler, Args) -> - case lists:member(Handler, gen_event:which_handlers(HandlerMod)) of - true -> - case gen_event:delete_handler(HandlerMod, Handler, Args) of - {error, module_not_found} -> - {error, module_not_found}; - O -> - Id = {HandlerMod, Handler}, - ok = supervisor:terminate_child(?MODULE, Id), - ok = supervisor:delete_child(?MODULE, Id), - O - end; - false -> - {error, module_not_found} + case lists:member(Handler, + gen_event:which_handlers(HandlerMod)) + of + true -> + case gen_event:delete_handler(HandlerMod, Handler, Args) + of + {error, module_not_found} -> {error, module_not_found}; + O -> + Id = {HandlerMod, Handler}, + ok = supervisor:terminate_child(?MODULE, Id), + ok = supervisor:delete_child(?MODULE, Id), + O + end; + false -> {error, module_not_found} end. handler_spec(HandlerMod, Handler, Args, ExitFun) -> {{HandlerMod, Handler}, - {riak_core_eventhandler_guard, start_link, [HandlerMod, Handler, Args, ExitFun]}, - transient, 5000, worker, [riak_core_eventhandler_guard]}. + {riak_core_eventhandler_guard, start_link, + [HandlerMod, Handler, Args, ExitFun]}, + transient, 5000, worker, + [riak_core_eventhandler_guard]}. start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). %% @private -init([]) -> - {ok, {{one_for_one, 10, 10}, []}}. - - +init([]) -> {ok, {{one_for_one, 10, 10}, []}}. diff --git a/src/riak_core_gen_server.erl b/src/riak_core_gen_server.erl deleted file mode 100644 index 145f136aa..000000000 --- a/src/riak_core_gen_server.erl +++ /dev/null @@ -1,1052 +0,0 @@ -%% This file is a copy of gen_server.erl from the R13B-1 Erlang/OTP -%% distribution, with the following modifications: -%% -%% 1) the module name is riak_core_gen_server -%% -%% 2) more efficient handling of selective receives in callbacks -%% riak_core_gen_server processes drain their message queue into an internal -%% buffer before invoking any callback module functions. Messages are -%% dequeued from the buffer for processing. Thus the effective message -%% queue of a riak_core_gen_server process is the concatenation of the internal -%% buffer and the real message queue. -%% As a result of the draining, any selective receive invoked inside a -%% callback is less likely to have to scan a large message queue. -%% -%% 3) riak_core_gen_server:cast is guaranteed to be order-preserving -%% The original code could reorder messages when communicating with a -%% process on a remote node that was not currently connected. -%% -%% 4) The new functions riak_core_gen_server:pcall/3, pcall/4, and pcast/3 -%% allow callers to attach priorities to requests. Requests with -%% higher priorities are processed before requests with lower -%% priorities. The default priority is 0. -%% -%% 5) On return from init/1, the timeout value {binary, Min} creates a -%% binary exponential timeout, where Min is the minimum number of -%% milliseconds permitted, and is also used as the current timeout -%% value. Returning from handle_* with the timeout value set to -%% 'binary' will use the current binary timeout value. handle_info/2 -%% with the Info of 'timeout' will function normally, and supports the -%% return value of {noreply, State, hibernate} which will hibernate -%% the process. The current timeout value is: -%% -%% a) doubled if the time spent in hibernation is < 4 * the current value; -%% b) halved if the time spent in hibernation is > 16 * the current value; -%% c) maintained in all other cases -%% -%% Explicit timeouts (i.e. not 'binary') from the handle_* functions -%% are still supported, and do not have any effect on the current -%% timeout value. - -%% All modifications are (C) 2009 LShift Ltd. - -%% ``The contents of this file are subject to the Erlang Public License, -%% Version 1.1, (the "License"); you may not use this file except in -%% compliance with the License. You should have received a copy of the -%% Erlang Public License along with this software. If not, it can be -%% retrieved via the world wide web at http://www.erlang.org/. -%% -%% Software distributed under the License is distributed on an "AS IS" -%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See -%% the License for the specific language governing rights and limitations -%% under the License. -%% -%% The Initial Developer of the Original Code is Ericsson Utvecklings AB. -%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings -%% AB. All Rights Reserved.'' -%% -%% $Id$ -%% --module(riak_core_gen_server). - -%%% --------------------------------------------------- -%%% -%%% The idea behind THIS server is that the user module -%%% provides (different) functions to handle different -%%% kind of inputs. -%%% If the Parent process terminates the Module:terminate/2 -%%% function is called. -%%% -%%% The user module should export: -%%% -%%% init(Args) -%%% ==> {ok, State} -%%% {ok, State, Timeout} -%%% ignore -%%% {stop, Reason} -%%% -%%% handle_call(Msg, {From, Tag}, State) -%%% -%%% ==> {reply, Reply, State} -%%% {reply, Reply, State, Timeout} -%%% {noreply, State} -%%% {noreply, State, Timeout} -%%% {stop, Reason, Reply, State} -%%% Reason = normal | shutdown | Term terminate(State) is called -%%% -%%% handle_cast(Msg, State) -%%% -%%% ==> {noreply, State} -%%% {noreply, State, Timeout} -%%% {stop, Reason, State} -%%% Reason = normal | shutdown | Term terminate(State) is called -%%% -%%% handle_info(Info, State) Info is e.g. {'EXIT', P, R}, {nodedown, N}, ... -%%% -%%% ==> {noreply, State} -%%% {noreply, State, Timeout} -%%% {stop, Reason, State} -%%% Reason = normal | shutdown | Term, terminate(State) is called -%%% -%%% terminate(Reason, State) Let the user module clean up -%%% always called when server terminates -%%% -%%% ==> ok -%%% -%%% -%%% The work flow (of the server) can be described as follows: -%%% -%%% User module Generic -%%% ----------- ------- -%%% start -----> start -%%% init <----- . -%%% -%%% loop -%%% handle_call <----- . -%%% -----> reply -%%% -%%% handle_cast <----- . -%%% -%%% handle_info <----- . -%%% -%%% terminate <----- . -%%% -%%% -----> reply -%%% -%%% -%%% --------------------------------------------------- - -%% API --export([start/3, start/4, - start_link/3, start_link/4, - call/2, call/3, pcall/3, pcall/4, - cast/2, pcast/3, reply/2, - abcast/2, abcast/3, - multi_call/2, multi_call/3, multi_call/4, - enter_loop/3, enter_loop/4, enter_loop/5, wake_hib/7]). - - -%% System exports --export([system_continue/3, - system_terminate/4, - system_code_change/4, - format_status/2]). - -%% Internal exports --export([init_it/6, print_event/3]). - --import(error_logger, [format/2]). - -%%%========================================================================= -%%% API -%%%========================================================================= - --callback init(Args :: term()) -> - {ok, State :: term()} | {ok, State :: term(), timeout() | hibernate} | - {stop, Reason :: term()} | ignore. --callback handle_call(Request :: term(), From :: {pid(), Tag :: term()}, - State :: term()) -> - {reply, Reply :: term(), NewState :: term()} | - {reply, Reply :: term(), NewState :: term(), timeout() | hibernate} | - {noreply, NewState :: term()} | - {noreply, NewState :: term(), timeout() | hibernate} | - {stop, Reason :: term(), Reply :: term(), NewState :: term()} | - {stop, Reason :: term(), NewState :: term()}. --callback handle_cast(Request :: term(), State :: term()) -> - {noreply, NewState :: term()} | - {noreply, NewState :: term(), timeout() | hibernate} | - {stop, Reason :: term(), NewState :: term()}. --callback handle_info(Info :: timeout | term(), State :: term()) -> - {noreply, NewState :: term()} | - {noreply, NewState :: term(), timeout() | hibernate} | - {stop, Reason :: term(), NewState :: term()}. --callback terminate(Reason :: (normal | shutdown | {shutdown, term()} | - term()), - State :: term()) -> - term(). --callback code_change(OldVsn :: (term() | {down, term()}), State :: term(), - Extra :: term()) -> - {ok, NewState :: term()} | {error, Reason :: term()}. - -%%%========================================================================= -%%% Preprocessor -%%%========================================================================= - --ifdef(deprecated_22). -get_log(Debug) -> - sys:get_log(Debug). --else. -get_log(Debug) -> - sys:get_debug(log, Debug, []). --endif. - -%%% ----------------------------------------------------------------- -%%% Starts a generic server. -%%% start(Mod, Args, Options) -%%% start(Name, Mod, Args, Options) -%%% start_link(Mod, Args, Options) -%%% start_link(Name, Mod, Args, Options) where: -%%% Name ::= {local, atom()} | {global, atom()} -%%% Mod ::= atom(), callback module implementing the 'real' server -%%% Args ::= term(), init arguments (to Mod:init/1) -%%% Options ::= [{timeout, Timeout} | {debug, [Flag]}] -%%% Flag ::= trace | log | {logfile, File} | statistics | debug -%%% (debug == log && statistics) -%%% Returns: {ok, Pid} | -%%% {error, {already_started, Pid}} | -%%% {error, Reason} -%%% ----------------------------------------------------------------- -start(Mod, Args, Options) -> - gen:start(?MODULE, nolink, Mod, Args, Options). - -start(Name, Mod, Args, Options) -> - gen:start(?MODULE, nolink, Name, Mod, Args, Options). - -start_link(Mod, Args, Options) -> - gen:start(?MODULE, link, Mod, Args, Options). - -start_link(Name, Mod, Args, Options) -> - gen:start(?MODULE, link, Name, Mod, Args, Options). - - -%% ----------------------------------------------------------------- -%% Make a call to a generic server. -%% If the server is located at another node, that node will -%% be monitored. -%% If the client is trapping exits and is linked server termination -%% is handled here (? Shall we do that here (or rely on timeouts) ?). -%% ----------------------------------------------------------------- -call(Name, Request) -> - case catch gen:call(Name, '$gen_call', Request) of - {ok,Res} -> - Res; - {'EXIT',Reason} -> - exit({Reason, {?MODULE, call, [Name, Request]}}) - end. - -call(Name, Request, Timeout) -> - case catch gen:call(Name, '$gen_call', Request, Timeout) of - {ok,Res} -> - Res; - {'EXIT',Reason} -> - exit({Reason, {?MODULE, call, [Name, Request, Timeout]}}) - end. - -pcall(Name, Priority, Request) -> - case catch gen:call(Name, '$gen_pcall', {Priority, Request}) of - {ok,Res} -> - Res; - {'EXIT',Reason} -> - exit({Reason, {?MODULE, pcall, [Name, Priority, Request]}}) - end. - -pcall(Name, Priority, Request, Timeout) -> - case catch gen:call(Name, '$gen_pcall', {Priority, Request}, Timeout) of - {ok,Res} -> - Res; - {'EXIT',Reason} -> - exit({Reason, {?MODULE, pcall, [Name, Priority, Request, Timeout]}}) - end. - -%% ----------------------------------------------------------------- -%% Make a cast to a generic server. -%% ----------------------------------------------------------------- -cast({global,Name}, Request) -> - catch global:send(Name, cast_msg(Request)), - ok; -cast({Name,Node}=Dest, Request) when is_atom(Name), is_atom(Node) -> - do_cast(Dest, Request); -cast(Dest, Request) when is_atom(Dest) -> - do_cast(Dest, Request); -cast(Dest, Request) when is_pid(Dest) -> - do_cast(Dest, Request). - -do_cast(Dest, Request) -> - do_send(Dest, cast_msg(Request)), - ok. - -cast_msg(Request) -> {'$gen_cast',Request}. - -pcast({global,Name}, Priority, Request) -> - catch global:send(Name, cast_msg(Priority, Request)), - ok; -pcast({Name,Node}=Dest, Priority, Request) when is_atom(Name), is_atom(Node) -> - do_cast(Dest, Priority, Request); -pcast(Dest, Priority, Request) when is_atom(Dest) -> - do_cast(Dest, Priority, Request); -pcast(Dest, Priority, Request) when is_pid(Dest) -> - do_cast(Dest, Priority, Request). - -do_cast(Dest, Priority, Request) -> - do_send(Dest, cast_msg(Priority, Request)), - ok. - -cast_msg(Priority, Request) -> {'$gen_pcast', {Priority, Request}}. - -%% ----------------------------------------------------------------- -%% Send a reply to the client. -%% ----------------------------------------------------------------- -reply({To, Tag}, Reply) -> - catch To ! {Tag, Reply}. - -%% ----------------------------------------------------------------- -%% Asyncronous broadcast, returns nothing, it's just send'n prey -%%----------------------------------------------------------------- -abcast(Name, Request) when is_atom(Name) -> - do_abcast([node() | nodes()], Name, cast_msg(Request)). - -abcast(Nodes, Name, Request) when is_list(Nodes), is_atom(Name) -> - do_abcast(Nodes, Name, cast_msg(Request)). - -do_abcast([Node|Nodes], Name, Msg) when is_atom(Node) -> - do_send({Name,Node},Msg), - do_abcast(Nodes, Name, Msg); -do_abcast([], _,_) -> abcast. - -%%% ----------------------------------------------------------------- -%%% Make a call to servers at several nodes. -%%% Returns: {[Replies],[BadNodes]} -%%% A Timeout can be given -%%% -%%% A middleman process is used in case late answers arrives after -%%% the timeout. If they would be allowed to glog the callers message -%%% queue, it would probably become confused. Late answers will -%%% now arrive to the terminated middleman and so be discarded. -%%% ----------------------------------------------------------------- -multi_call(Name, Req) - when is_atom(Name) -> - do_multi_call([node() | nodes()], Name, Req, infinity). - -multi_call(Nodes, Name, Req) - when is_list(Nodes), is_atom(Name) -> - do_multi_call(Nodes, Name, Req, infinity). - -multi_call(Nodes, Name, Req, infinity) -> - do_multi_call(Nodes, Name, Req, infinity); -multi_call(Nodes, Name, Req, Timeout) - when is_list(Nodes), is_atom(Name), is_integer(Timeout), Timeout >= 0 -> - do_multi_call(Nodes, Name, Req, Timeout). - - -%%----------------------------------------------------------------- -%% enter_loop(Mod, Options, State, , ) ->_ -%% -%% Description: Makes an existing process into a gen_server. -%% The calling process will enter the gen_server receive -%% loop and become a gen_server process. -%% The process *must* have been started using one of the -%% start functions in proc_lib, see proc_lib(3). -%% The user is responsible for any initialization of the -%% process, including registering a name for it. -%%----------------------------------------------------------------- -enter_loop(Mod, Options, State) -> - enter_loop(Mod, Options, State, self(), infinity). - -enter_loop(Mod, Options, State, ServerName = {_, _}) -> - enter_loop(Mod, Options, State, ServerName, infinity); - -enter_loop(Mod, Options, State, Timeout) -> - enter_loop(Mod, Options, State, self(), Timeout). - -enter_loop(Mod, Options, State, ServerName, Timeout) -> - Name = get_proc_name(ServerName), - Parent = get_parent(), - Debug = debug_options(Name, Options), - Queue = riak_core_priority_queue:new(), - {Timeout1, TimeoutState} = build_timeout_state(Timeout), - loop(Parent, Name, State, Mod, Timeout1, TimeoutState, Queue, Debug). - -%%%======================================================================== -%%% Gen-callback functions -%%%======================================================================== - -%%% --------------------------------------------------- -%%% Initiate the new process. -%%% Register the name using the Rfunc function -%%% Calls the Mod:init/Args function. -%%% Finally an acknowledge is sent to Parent and the main -%%% loop is entered. -%%% --------------------------------------------------- -init_it(Starter, self, Name, Mod, Args, Options) -> - init_it(Starter, self(), Name, Mod, Args, Options); -init_it(Starter, Parent, Name0, Mod, Args, Options) -> - Name = name(Name0), - Debug = debug_options(Name, Options), - Queue = riak_core_priority_queue:new(), - case catch Mod:init(Args) of - {ok, State} -> - proc_lib:init_ack(Starter, {ok, self()}), - loop(Parent, Name, State, Mod, infinity, undefined, Queue, Debug); - {ok, State, Timeout} -> - proc_lib:init_ack(Starter, {ok, self()}), - {Timeout1, TimeoutState} = build_timeout_state(Timeout), - loop(Parent, Name, State, Mod, Timeout1, TimeoutState, Queue, - Debug); - {stop, Reason} -> - %% For consistency, we must make sure that the - %% registered name (if any) is unregistered before - %% the parent process is notified about the failure. - %% (Otherwise, the parent process could get - %% an 'already_started' error if it immediately - %% tried starting the process again.) - unregister_name(Name0), - proc_lib:init_ack(Starter, {error, Reason}), - exit(Reason); - ignore -> - unregister_name(Name0), - proc_lib:init_ack(Starter, ignore), - exit(normal); - {'EXIT', Reason} -> - unregister_name(Name0), - proc_lib:init_ack(Starter, {error, Reason}), - exit(Reason); - Else -> - Error = {bad_return_value, Else}, - proc_lib:init_ack(Starter, {error, Error}), - exit(Error) - end. - -name({local,Name}) -> Name; -name({global,Name}) -> Name; -%% name(Pid) when is_pid(Pid) -> Pid; -%% when R11 goes away, drop the line beneath and uncomment the line above -name(Name) -> Name. - -unregister_name({local,Name}) -> - _ = (catch unregister(Name)); -unregister_name({global,Name}) -> - _ = global:unregister_name(Name); -unregister_name(Pid) when is_pid(Pid) -> - Pid. - -build_timeout_state(Timeout) -> - case Timeout of - {binary, Min} -> {binary, {Min, Min, undefined}}; - _ -> {Timeout, undefined} - end. - -%%%======================================================================== -%%% Internal functions -%%%======================================================================== -%%% --------------------------------------------------- -%%% The MAIN loop. -%%% --------------------------------------------------- -loop(Parent, Name, State, Mod, hibernate, undefined, Queue, Debug) -> - proc_lib:hibernate(?MODULE,wake_hib, - [Parent, Name, State, Mod, undefined, Queue, Debug]); -loop(Parent, Name, State, Mod, hibernate, {Current, Min, undefined}, Queue, - Debug) -> - proc_lib:hibernate(?MODULE,wake_hib,[Parent, Name, State, Mod, - {Current, Min, os:timestamp()}, Queue, Debug]); -loop(Parent, Name, State, Mod, Time, TimeoutState, Queue, Debug) -> - receive - Input -> loop(Parent, Name, State, Mod, - Time, TimeoutState, in(Input, Queue), Debug) - after 0 -> - process_next_msg(Parent, Name, State, Mod, Time, TimeoutState, - Queue, Debug, false) - end. - -process_next_msg(Parent, Name, State, Mod, Time, TimeoutState, Queue, - Debug, Hib) -> - case riak_core_priority_queue:out(Queue) of - {{value, Msg}, Queue1} -> - process_msg(Parent, Name, State, Mod, - Time, TimeoutState, Queue1, Debug, Hib, Msg); - {empty, Queue1} -> - Time1 = case {Time, TimeoutState} of - {binary, {Current, _Min, undefined}} -> Current; - _ -> Time - end, - receive - Input -> - loop(Parent, Name, State, Mod, - Time, TimeoutState, in(Input, Queue1), Debug) - after Time1 -> - process_msg(Parent, Name, State, Mod, - Time, TimeoutState, Queue1, Debug, Hib, timeout) - end - end. - -wake_hib(Parent, Name, State, Mod, TimeoutState, Queue, Debug) -> - Msg = receive - Input -> - Input - end, - TimeoutState1 = adjust_hibernate_after(TimeoutState), - process_next_msg(Parent, Name, State, Mod, hibernate, TimeoutState1, - in(Msg, Queue), Debug, true). - -adjust_hibernate_after(undefined) -> - undefined; -adjust_hibernate_after({Current, Min, HibernatedAt}) -> - NapLengthMicros = timer:now_diff(os:timestamp(), HibernatedAt), - CurrentMicros = Current * 1000, - LowTargetMicros = CurrentMicros * 4, - HighTargetMicros = LowTargetMicros * 4, - if - NapLengthMicros < LowTargetMicros -> - %% nap was too short, don't go to sleep as soon - {Current * 2, Min, undefined}; - - NapLengthMicros > HighTargetMicros -> - %% nap was long, try going to sleep sooner - {lists:max([Min, round(Current / 2)]), Min, undefined}; - - true -> - %% nap and timeout seem to be in the right relationship. stay here - {Current, Min, undefined} - end. - -in({'$gen_pcast', {Priority, Msg}}, Queue) -> - riak_core_priority_queue:in({'$gen_cast', Msg}, Priority, Queue); -in({'$gen_pcall', From, {Priority, Msg}}, Queue) -> - riak_core_priority_queue:in({'$gen_call', From, Msg}, Priority, Queue); -in(Input, Queue) -> - riak_core_priority_queue:in(Input, Queue). - -process_msg(Parent, Name, State, Mod, Time, TimeoutState, Queue, - Debug, _Hib, Msg) -> - case Msg of - {system, From, Req} -> - sys:handle_system_msg - (Req, From, Parent, ?MODULE, Debug, - [Name, State, Mod, Time, TimeoutState, Queue]); - %% gen_server puts Hib on the end as the 7th arg, but that - %% version of the function seems not to be documented so - %% leaving out for now. - {'EXIT', Parent, Reason} -> - terminate(Reason, Name, Msg, Mod, State, Debug); - _Msg when Debug =:= [] -> - handle_msg(Msg, Parent, Name, State, Mod, TimeoutState, Queue); - _Msg -> - Debug1 = sys:handle_debug(Debug, fun print_event/3, - Name, {in, Msg}), - handle_msg(Msg, Parent, Name, State, Mod, TimeoutState, Queue, - Debug1) - end. - -%%% --------------------------------------------------- -%%% Send/recive functions -%%% --------------------------------------------------- -do_send(Dest, Msg) -> - catch erlang:send(Dest, Msg). - -do_multi_call(Nodes, Name, Req, infinity) -> - Tag = make_ref(), - Monitors = send_nodes(Nodes, Name, Tag, Req), - rec_nodes(Tag, Monitors, Name, undefined); -do_multi_call(Nodes, Name, Req, Timeout) -> - Tag = make_ref(), - Caller = self(), - Receiver = - spawn( - fun() -> - %% Middleman process. Should be unsensitive to regular - %% exit signals. The sychronization is needed in case - %% the receiver would exit before the caller started - %% the monitor. - process_flag(trap_exit, true), - Mref = erlang:monitor(process, Caller), - receive - {Caller,Tag} -> - Monitors = send_nodes(Nodes, Name, Tag, Req), - TimerId = erlang:start_timer(Timeout, self(), ok), - Result = rec_nodes(Tag, Monitors, Name, TimerId), - exit({self(),Tag,Result}); - {'DOWN',Mref,_,_,_} -> - %% Caller died before sending us the go-ahead. - %% Give up silently. - exit(normal) - end - end), - Mref = erlang:monitor(process, Receiver), - Receiver ! {self(),Tag}, - receive - {'DOWN',Mref,_,_,{Receiver,Tag,Result}} -> - Result; - {'DOWN',Mref,_,_,Reason} -> - %% The middleman code failed. Or someone did - %% exit(_, kill) on the middleman process => Reason==killed - exit(Reason) - end. - -send_nodes(Nodes, Name, Tag, Req) -> - send_nodes(Nodes, Name, Tag, Req, []). - -send_nodes([Node|Tail], Name, Tag, Req, Monitors) - when is_atom(Node) -> - Monitor = start_monitor(Node, Name), - %% Handle non-existing names in rec_nodes. - catch {Name, Node} ! {'$gen_call', {self(), {Tag, Node}}, Req}, - send_nodes(Tail, Name, Tag, Req, [Monitor | Monitors]); -send_nodes([_Node|Tail], Name, Tag, Req, Monitors) -> - %% Skip non-atom Node - send_nodes(Tail, Name, Tag, Req, Monitors); -send_nodes([], _Name, _Tag, _Req, Monitors) -> - Monitors. - -%% Against old nodes: -%% If no reply has been delivered within 2 secs. (per node) check that -%% the server really exists and wait for ever for the answer. -%% -%% Against contemporary nodes: -%% Wait for reply, server 'DOWN', or timeout from TimerId. - -rec_nodes(Tag, Nodes, Name, TimerId) -> - rec_nodes(Tag, Nodes, Name, [], [], 2000, TimerId). - -rec_nodes(Tag, [{N,R}|Tail], Name, Badnodes, Replies, Time, TimerId ) -> - receive - {'DOWN', R, _, _, _} -> - rec_nodes(Tag, Tail, Name, [N|Badnodes], Replies, Time, TimerId); - {{Tag, N}, Reply} -> %% Tag is bound !!! - unmonitor(R), - rec_nodes(Tag, Tail, Name, Badnodes, - [{N,Reply}|Replies], Time, TimerId); - {timeout, TimerId, _} -> - unmonitor(R), - %% Collect all replies that already have arrived - rec_nodes_rest(Tag, Tail, Name, [N|Badnodes], Replies) - end; -rec_nodes(Tag, [N|Tail], Name, Badnodes, Replies, Time, TimerId) -> - %% R6 node - receive - {nodedown, N} -> - monitor_node(N, false), - rec_nodes(Tag, Tail, Name, [N|Badnodes], Replies, 2000, TimerId); - {{Tag, N}, Reply} -> %% Tag is bound !!! - receive {nodedown, N} -> ok after 0 -> ok end, - monitor_node(N, false), - rec_nodes(Tag, Tail, Name, Badnodes, - [{N,Reply}|Replies], 2000, TimerId); - {timeout, TimerId, _} -> - receive {nodedown, N} -> ok after 0 -> ok end, - monitor_node(N, false), - %% Collect all replies that already have arrived - rec_nodes_rest(Tag, Tail, Name, [N | Badnodes], Replies) - after Time -> - case riak_core_util:safe_rpc(N, erlang, whereis, [Name]) of - Pid when is_pid(Pid) -> % It exists try again. - rec_nodes(Tag, [N|Tail], Name, Badnodes, - Replies, infinity, TimerId); - _ -> % badnode - receive {nodedown, N} -> ok after 0 -> ok end, - monitor_node(N, false), - rec_nodes(Tag, Tail, Name, [N|Badnodes], - Replies, 2000, TimerId) - end - end; -rec_nodes(_, [], _, Badnodes, Replies, _, TimerId) -> - case catch erlang:cancel_timer(TimerId) of - false -> % It has already sent it's message - receive - {timeout, TimerId, _} -> ok - after 0 -> - ok - end; - _ -> % Timer was cancelled, or TimerId was 'undefined' - ok - end, - {Replies, Badnodes}. - -%% Collect all replies that already have arrived -rec_nodes_rest(Tag, [{N,R}|Tail], Name, Badnodes, Replies) -> - receive - {'DOWN', R, _, _, _} -> - rec_nodes_rest(Tag, Tail, Name, [N|Badnodes], Replies); - {{Tag, N}, Reply} -> %% Tag is bound !!! - unmonitor(R), - rec_nodes_rest(Tag, Tail, Name, Badnodes, [{N,Reply}|Replies]) - after 0 -> - unmonitor(R), - rec_nodes_rest(Tag, Tail, Name, [N|Badnodes], Replies) - end; -rec_nodes_rest(Tag, [N|Tail], Name, Badnodes, Replies) -> - %% R6 node - receive - {nodedown, N} -> - monitor_node(N, false), - rec_nodes_rest(Tag, Tail, Name, [N|Badnodes], Replies); - {{Tag, N}, Reply} -> %% Tag is bound !!! - receive {nodedown, N} -> ok after 0 -> ok end, - monitor_node(N, false), - rec_nodes_rest(Tag, Tail, Name, Badnodes, [{N,Reply}|Replies]) - after 0 -> - receive {nodedown, N} -> ok after 0 -> ok end, - monitor_node(N, false), - rec_nodes_rest(Tag, Tail, Name, [N|Badnodes], Replies) - end; -rec_nodes_rest(_Tag, [], _Name, Badnodes, Replies) -> - {Replies, Badnodes}. - - -%%% --------------------------------------------------- -%%% Monitor functions -%%% --------------------------------------------------- - -start_monitor(Node, Name) when is_atom(Node), is_atom(Name) -> - if node() =:= nonode@nohost, Node =/= nonode@nohost -> - Ref = make_ref(), - self() ! {'DOWN', Ref, process, {Name, Node}, noconnection}, - {Node, Ref}; - true -> - case catch erlang:monitor(process, {Name, Node}) of - {'EXIT', _} -> - %% Remote node is R6 - monitor_node(Node, true), - Node; - Ref when is_reference(Ref) -> - {Node, Ref} - end - end. - -%% Cancels a monitor started with Ref=erlang:monitor(_, _). -unmonitor(Ref) when is_reference(Ref) -> - erlang:demonitor(Ref), - receive - {'DOWN', Ref, _, _, _} -> - true - after 0 -> - true - end. - -%%% --------------------------------------------------- -%%% Message handling functions -%%% --------------------------------------------------- - -dispatch({'$gen_cast', Msg}, Mod, State) -> - Mod:handle_cast(Msg, State); -dispatch(Info, Mod, State) -> - Mod:handle_info(Info, State). - -handle_msg({'$gen_call', From, Msg}, - Parent, Name, State, Mod, TimeoutState, Queue) -> - case catch Mod:handle_call(Msg, From, State) of - {reply, Reply, NState} -> - reply(From, Reply), - loop(Parent, Name, NState, Mod, infinity, TimeoutState, Queue, []); - {reply, Reply, NState, Time1} -> - reply(From, Reply), - loop(Parent, Name, NState, Mod, Time1, TimeoutState, Queue, []); - {noreply, NState} -> - loop(Parent, Name, NState, Mod, infinity, TimeoutState, Queue, []); - {noreply, NState, Time1} -> - loop(Parent, Name, NState, Mod, Time1, TimeoutState, Queue, []); - {stop, Reason, Reply, NState} -> - {'EXIT', R} = - (catch terminate(Reason, Name, Msg, Mod, NState, [])), - reply(From, Reply), - exit(R); - Other -> handle_common_reply(Other, Parent, Name, Msg, Mod, State, - TimeoutState, Queue) - end; -handle_msg(Msg, - Parent, Name, State, Mod, TimeoutState, Queue) -> - Reply = (catch dispatch(Msg, Mod, State)), - handle_common_reply(Reply, Parent, Name, Msg, Mod, State, - TimeoutState, Queue). - -handle_msg({'$gen_call', From, Msg}, - Parent, Name, State, Mod, TimeoutState, Queue, Debug) -> - case catch Mod:handle_call(Msg, From, State) of - {reply, Reply, NState} -> - Debug1 = reply(Name, From, Reply, NState, Debug), - loop(Parent, Name, NState, Mod, infinity, TimeoutState, Queue, - Debug1); - {reply, Reply, NState, Time1} -> - Debug1 = reply(Name, From, Reply, NState, Debug), - loop(Parent, Name, NState, Mod, Time1, TimeoutState, Queue, Debug1); - {noreply, NState} -> - Debug1 = sys:handle_debug(Debug, fun print_event/3, Name, - {noreply, NState}), - loop(Parent, Name, NState, Mod, infinity, TimeoutState, Queue, - Debug1); - {noreply, NState, Time1} -> - Debug1 = sys:handle_debug(Debug, fun print_event/3, Name, - {noreply, NState}), - loop(Parent, Name, NState, Mod, Time1, TimeoutState, Queue, Debug1); - {stop, Reason, Reply, NState} -> - {'EXIT', R} = - (catch terminate(Reason, Name, Msg, Mod, NState, Debug)), - _ = reply(Name, From, Reply, NState, Debug), - exit(R); - Other -> - handle_common_reply(Other, Parent, Name, Msg, Mod, State, - TimeoutState, Queue, Debug) - end; -handle_msg(Msg, - Parent, Name, State, Mod, TimeoutState, Queue, Debug) -> - Reply = (catch dispatch(Msg, Mod, State)), - handle_common_reply(Reply, Parent, Name, Msg, Mod, State, - TimeoutState, Queue, Debug). - -handle_common_reply(Reply, Parent, Name, Msg, Mod, State, - TimeoutState, Queue) -> - case Reply of - {noreply, NState} -> - loop(Parent, Name, NState, Mod, infinity, TimeoutState, Queue, []); - {noreply, NState, Time1} -> - loop(Parent, Name, NState, Mod, Time1, TimeoutState, Queue, []); - {stop, Reason, NState} -> - terminate(Reason, Name, Msg, Mod, NState, []); - {'EXIT', What} -> - terminate(What, Name, Msg, Mod, State, []); - _ -> - terminate({bad_return_value, Reply}, Name, Msg, Mod, State, []) - end. - -handle_common_reply(Reply, Parent, Name, Msg, Mod, State, TimeoutState, Queue, - Debug) -> - case Reply of - {noreply, NState} -> - Debug1 = sys:handle_debug(Debug, fun print_event/3, Name, - {noreply, NState}), - loop(Parent, Name, NState, Mod, infinity, TimeoutState, Queue, - Debug1); - {noreply, NState, Time1} -> - Debug1 = sys:handle_debug(Debug, fun print_event/3, Name, - {noreply, NState}), - loop(Parent, Name, NState, Mod, Time1, TimeoutState, Queue, Debug1); - {stop, Reason, NState} -> - terminate(Reason, Name, Msg, Mod, NState, Debug); - {'EXIT', What} -> - terminate(What, Name, Msg, Mod, State, Debug); - _ -> - terminate({bad_return_value, Reply}, Name, Msg, Mod, State, Debug) - end. - -reply(Name, {To, Tag}, Reply, State, Debug) -> - reply({To, Tag}, Reply), - sys:handle_debug(Debug, fun print_event/3, Name, - {out, Reply, To, State} ). - - -%%----------------------------------------------------------------- -%% Callback functions for system messages handling. -%%----------------------------------------------------------------- -system_continue(Parent, Debug, [Name, State, Mod, Time, TimeoutState, Queue]) -> - loop(Parent, Name, State, Mod, Time, TimeoutState, Queue, Debug). - - --spec system_terminate(_, _, _, [_]) -> no_return(). -system_terminate(Reason, _Parent, Debug, [Name, State, Mod, _Time, - _TimeoutState, _Queue]) -> - terminate(Reason, Name, [], Mod, State, Debug). - -system_code_change([Name, State, Mod, Time, TimeoutState, Queue], _Module, - OldVsn, Extra) -> - case catch Mod:code_change(OldVsn, State, Extra) of - {ok, NewState} -> - {ok, [Name, NewState, Mod, Time, TimeoutState, Queue]}; - Else -> - Else - end. - -%%----------------------------------------------------------------- -%% Format debug messages. Print them as the call-back module sees -%% them, not as the real erlang messages. Use trace for that. -%%----------------------------------------------------------------- -print_event(Dev, {in, Msg}, Name) -> - case Msg of - {'$gen_call', {From, _Tag}, Call} -> - io:format(Dev, "*DBG* ~p got call ~p from ~w~n", - [Name, Call, From]); - {'$gen_cast', Cast} -> - io:format(Dev, "*DBG* ~p got cast ~p~n", - [Name, Cast]); - _ -> - io:format(Dev, "*DBG* ~p got ~p~n", [Name, Msg]) - end; -print_event(Dev, {out, Msg, To, State}, Name) -> - io:format(Dev, "*DBG* ~p sent ~p to ~w, new state ~w~n", - [Name, Msg, To, State]); -print_event(Dev, {noreply, State}, Name) -> - io:format(Dev, "*DBG* ~p new state ~w~n", [Name, State]); -print_event(Dev, Event, Name) -> - io:format(Dev, "*DBG* ~p dbg ~p~n", [Name, Event]). - - -%%% --------------------------------------------------- -%%% Terminate the server. -%%% --------------------------------------------------- - -terminate(Reason, Name, Msg, Mod, State, Debug) -> - case catch Mod:terminate(Reason, State) of - {'EXIT', R} -> - error_info(R, Name, Msg, State, Debug), - exit(R); - _ -> - case Reason of - normal -> - exit(normal); - shutdown -> - exit(shutdown); - {shutdown,_}=Shutdown -> - exit(Shutdown); - _ -> - error_info(Reason, Name, Msg, State, Debug), - exit(Reason) - end - end. - -error_info(_Reason, application_controller, _Msg, _State, _Debug) -> - %% OTP-5811 Don't send an error report if it's the system process - %% application_controller which is terminating - let init take care - %% of it instead - ok; -error_info(Reason, Name, Msg, State, Debug) -> - Reason1 = - case Reason of - {undef,[{M,F,A}|MFAs]} -> - case code:is_loaded(M) of - false -> - {'module could not be loaded',[{M,F,A}|MFAs]}; - _ -> - case erlang:function_exported(M, F, length(A)) of - true -> - Reason; - false -> - {'function not exported',[{M,F,A}|MFAs]} - end - end; - _ -> - Reason - end, - format("** Generic server ~p terminating \n" - "** Last message in was ~p~n" - "** When Server state == ~p~n" - "** Reason for termination == ~n** ~p~n", - [Name, Msg, State, Reason1]), - sys:print_log(Debug), - ok. - -%%% --------------------------------------------------- -%%% Misc. functions. -%%% --------------------------------------------------- - -opt(Op, [{Op, Value}|_]) -> - {ok, Value}; -opt(Op, [_|Options]) -> - opt(Op, Options); -opt(_, []) -> - false. - -debug_options(Name, Opts) -> - case opt(debug, Opts) of - {ok, Options} -> dbg_options(Name, Options); - _ -> dbg_options(Name, []) - end. - -dbg_options(Name, []) -> - Opts = - case init:get_argument(generic_debug) of - error -> - []; - _ -> - [log, statistics] - end, - dbg_opts(Name, Opts); -dbg_options(Name, Opts) -> - dbg_opts(Name, Opts). - -dbg_opts(Name, Opts) -> - case catch sys:debug_options(Opts) of - {'EXIT',_} -> - format("~p: ignoring erroneous debug options - ~p~n", - [Name, Opts]), - []; - Dbg -> - Dbg - end. - -get_proc_name(Pid) when is_pid(Pid) -> - Pid; -get_proc_name({local, Name}) -> - case process_info(self(), registered_name) of - {registered_name, Name} -> - Name; - {registered_name, _Name} -> - exit(process_not_registered); - [] -> - exit(process_not_registered) - end; -get_proc_name({global, Name}) -> - case global:whereis_name(Name) of - undefined -> - exit(process_not_registered_globally); - Pid when Pid =:= self() -> - Name; - _Pid -> - exit(process_not_registered_globally) - end. - -get_parent() -> - case get('$ancestors') of - [Parent | _] when is_pid(Parent)-> - Parent; - [Parent | _] when is_atom(Parent)-> - name_to_pid(Parent); - _ -> - exit(process_was_not_started_by_proc_lib) - end. - -name_to_pid(Name) -> - case whereis(Name) of - undefined -> - case global:whereis_name(Name) of - undefined -> - exit(could_not_find_registerd_name); - Pid -> - Pid - end; - Pid -> - Pid - end. - -%%----------------------------------------------------------------- -%% Status information -%%----------------------------------------------------------------- -format_status(Opt, StatusData) -> - [PDict, SysState, Parent, Debug, [Name, State, Mod, _Time, - TimeoutState, Queue]] = - StatusData, - NameTag = if is_pid(Name) -> - pid_to_list(Name); - is_atom(Name) -> - Name - end, - Header = lists:concat(["Status for generic server ", NameTag]), - Log = sys:get_log(Debug), - Specfic = - case erlang:function_exported(Mod, format_status, 2) of - true -> - case catch Mod:format_status(Opt, [PDict, State]) of - {'EXIT', _} -> [{data, [{"State", State}]}]; - Else -> Else - end; - _ -> - [{data, [{"State", State}]}] - end, - Specfic1 = case TimeoutState of - undefined -> Specfic; - {Current, Min, undefined} -> - [ {"Binary Timeout Current and Min", {Current, Min}} - | Specfic] - end, - [{header, Header}, - {data, [{"Status", SysState}, - {"Parent", Parent}, - {"Logged events", Log}, - {"Queued messages", riak_core_priority_queue:to_list(Queue)}]} | - Specfic1]. diff --git a/src/riak_core_gossip.erl b/src/riak_core_gossip.erl index 200e5003b..d9dd74500 100644 --- a/src/riak_core_gossip.erl +++ b/src/riak_core_gossip.erl @@ -34,13 +34,14 @@ -behaviour(gen_server). -export([start_link/0, stop/0]). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). --export ([distribute_ring/1, send_ring/1, send_ring/2, remove_from_cluster/2, - remove_from_cluster/3, random_gossip/1, - recursive_gossip/1, random_recursive_gossip/1, rejoin/2 -]). +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). + +-export([distribute_ring/1, send_ring/1, send_ring/2, + remove_from_cluster/2, remove_from_cluster/3, + random_gossip/1, recursive_gossip/1, + random_recursive_gossip/1, rejoin/2]). %% Default gossip rate: allow at most 45 gossip messages every 10 seconds -define(DEFAULT_LIMIT, {45, 10000}). @@ -54,7 +55,8 @@ %% distribute_ring/1 - %% Distribute a ring to all members of that ring. distribute_ring(Ring) -> - gen_server:cast({?MODULE, node()}, {distribute_ring, Ring}). + gen_server:cast({?MODULE, node()}, + {distribute_ring, Ring}). %% send_ring/1 - %% Send the current node's ring to some other node. @@ -63,16 +65,16 @@ send_ring(ToNode) -> send_ring(node(), ToNode). %% send_ring/2 - %% Send the ring from one node to another node. %% Does nothing if the two nodes are the same. -send_ring(Node, Node) -> - ok; +send_ring(Node, Node) -> ok; send_ring(FromNode, ToNode) -> - gen_server:cast({?MODULE, FromNode}, {send_ring_to, ToNode}). + gen_server:cast({?MODULE, FromNode}, + {send_ring_to, ToNode}). start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, [], + []). -stop() -> - gen_server:cast(?MODULE, stop). +stop() -> gen_server:cast(?MODULE, stop). rejoin(Node, Ring) -> gen_server:cast({?MODULE, Node}, {rejoin, Ring}). @@ -80,10 +82,9 @@ rejoin(Node, Ring) -> %% @doc Gossip state to a random node in the ring. random_gossip(Ring) -> case riak_core_ring:random_other_active_node(Ring) of - no_node -> % must be single node cluster - ok; - RandomNode -> - send_ring(node(), RandomNode) + no_node -> % must be single node cluster + ok; + RandomNode -> send_ring(node(), RandomNode) end. %% @doc Gossip state to a fixed set of nodes determined from a binary @@ -98,22 +99,22 @@ recursive_gossip(Ring, Node) -> Nodes = riak_core_ring:active_members(Ring), Tree = riak_core_util:build_tree(2, Nodes, [cycles]), Children = orddict:fetch(Node, Tree), - _ = [send_ring(node(), OtherNode) || OtherNode <- Children], + _ = [send_ring(node(), OtherNode) + || OtherNode <- Children], ok. + recursive_gossip(Ring) -> %% A non-active member will not show-up in the tree decomposition %% and therefore we fallback to random_recursive_gossip as necessary. Active = riak_core_ring:active_members(Ring), case lists:member(node(), Active) of - true -> - recursive_gossip(Ring, node()); - false -> - random_recursive_gossip(Ring) + true -> recursive_gossip(Ring, node()); + false -> random_recursive_gossip(Ring) end. random_recursive_gossip(Ring) -> Active = riak_core_ring:active_members(Ring), - RNode = lists:nth(riak_core_rand:uniform(length(Active)), Active), + RNode = lists:nth(rand:uniform(length(Active)), Active), recursive_gossip(Ring, RNode). %% =================================================================== @@ -123,183 +124,192 @@ random_recursive_gossip(Ring) -> %% @private init(_State) -> schedule_next_reset(), - {Tokens, _} = application:get_env(riak_core, gossip_limit, ?DEFAULT_LIMIT), + {Tokens, _} = application:get_env(riak_core, + gossip_limit, ?DEFAULT_LIMIT), State = #state{gossip_tokens = Tokens}, {ok, State}. -handle_call(_, _From, State) -> - {reply, ok, State}. +handle_call(_, _From, State) -> {reply, ok, State}. %% @private -handle_cast({send_ring_to, _Node}, State=#state{gossip_tokens=0}) -> +handle_cast({send_ring_to, _Node}, + State = #state{gossip_tokens = 0}) -> %% Out of gossip tokens, ignore the send request {noreply, State}; handle_cast({send_ring_to, Node}, State) -> {ok, RingOut} = riak_core_ring_manager:get_raw_ring(), riak_core_ring:check_tainted(RingOut, - "Error: riak_core_gossip/send_ring_to :: " - "Sending tainted ring over gossip"), - gen_server:cast({?MODULE, Node}, {reconcile_ring, RingOut}), + "Error: riak_core_gossip/send_ring_to " + ":: Sending tainted ring over gossip"), + gen_server:cast({?MODULE, Node}, + {reconcile_ring, RingOut}), Tokens = State#state.gossip_tokens - 1, - {noreply, State#state{gossip_tokens=Tokens}}; - + {noreply, State#state{gossip_tokens = Tokens}}; handle_cast({distribute_ring, Ring}, State) -> Nodes = riak_core_ring:active_members(Ring), riak_core_ring:check_tainted(Ring, - "Error: riak_core_gossip/distribute_ring :: " - "Sending tainted ring over gossip"), - gen_server:abcast(Nodes, ?MODULE, {reconcile_ring, Ring}), + "Error: riak_core_gossip/distribute_ring " + ":: Sending tainted ring over gossip"), + gen_server:abcast(Nodes, ?MODULE, + {reconcile_ring, Ring}), {noreply, State}; - handle_cast({reconcile_ring, OtherRing}, State) -> %% Compare the two rings, see if there is anything that %% must be done to make them equal... %% STATS % riak_core_stat:update(gossip_received), - riak_core_ring_manager:ring_trans(fun reconcile/2, [OtherRing]), + riak_core_ring_manager:ring_trans(fun reconcile/2, + [OtherRing]), {noreply, State}; - handle_cast(gossip_ring, State) -> % Gossip the ring to some random other node... {ok, MyRing} = riak_core_ring_manager:get_raw_ring(), - random_gossip(MyRing), {noreply, State}; - handle_cast({rejoin, OtherRing}, State) -> {ok, Ring} = riak_core_ring_manager:get_raw_ring(), - SameCluster = - (riak_core_ring:cluster_name(Ring) =:= - riak_core_ring:cluster_name(OtherRing)), + SameCluster = riak_core_ring:cluster_name(Ring) =:= + riak_core_ring:cluster_name(OtherRing), case SameCluster of - true -> - OtherNode = riak_core_ring:owner_node(OtherRing), - case riak_core:join(node(), OtherNode, true, true) of - ok -> ok; - {error, Reason} -> - logger:error("Could not rejoin cluster: ~p", [Reason]), - ok - end, - {noreply, State}; - false -> - {noreply, State} + true -> + OtherNode = riak_core_ring:owner_node(OtherRing), + case riak_core:join(node(), OtherNode, true, true) of + ok -> ok; + {error, Reason} -> + logger:error("Could not rejoin cluster: ~p", [Reason]), + ok + end, + {noreply, State}; + false -> {noreply, State} end; - -handle_cast(_, State) -> - {noreply, State}. +handle_cast(_, State) -> {noreply, State}. handle_info(reset_tokens, State) -> schedule_next_reset(), gen_server:cast(?MODULE, gossip_ring), - {Tokens, _} = application:get_env(riak_core, gossip_limit, ?DEFAULT_LIMIT), - {noreply, State#state{gossip_tokens=Tokens}}; - + {Tokens, _} = application:get_env(riak_core, + gossip_limit, ?DEFAULT_LIMIT), + {noreply, State#state{gossip_tokens = Tokens}}; handle_info(_Info, State) -> {noreply, State}. %% @private -terminate(_Reason, _State) -> - ok. +terminate(_Reason, _State) -> ok. %% @private -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - +code_change(_OldVsn, State, _Extra) -> {ok, State}. %% =================================================================== %% Internal functions %% =================================================================== schedule_next_reset() -> - {_, Reset} = application:get_env(riak_core, gossip_limit, ?DEFAULT_LIMIT), + {_, Reset} = application:get_env(riak_core, + gossip_limit, ?DEFAULT_LIMIT), erlang:send_after(Reset, ?MODULE, reset_tokens). +%%noinspection ErlangUnboundVariable reconcile(Ring0, [OtherRing0]) -> - {Ring, OtherRing} = riak_core_ring:reconcile_names(Ring0, OtherRing0), + {Ring, OtherRing} = + riak_core_ring:reconcile_names(Ring0, OtherRing0), Node = node(), OtherNode = riak_core_ring:owner_node(OtherRing), - Members = riak_core_ring:reconcile_members(Ring, OtherRing), - WrongCluster = (riak_core_ring:cluster_name(Ring) /= - riak_core_ring:cluster_name(OtherRing)), - PreStatus = riak_core_ring:member_status(Members, OtherNode), - IgnoreGossip = (WrongCluster or - (PreStatus =:= invalid) or - (PreStatus =:= down)), - {Changed, Ring2} = - case IgnoreGossip of - true -> - {false, Ring}; - false -> - riak_core_ring:reconcile(OtherRing, Ring) - end, - OtherStatus = riak_core_ring:member_status(Ring2, OtherNode), + Members = riak_core_ring:reconcile_members(Ring, + OtherRing), + WrongCluster = riak_core_ring:cluster_name(Ring) /= + riak_core_ring:cluster_name(OtherRing), + PreStatus = riak_core_ring:member_status(Members, + OtherNode), + IgnoreGossip = WrongCluster or (PreStatus =:= invalid) + or (PreStatus =:= down), + case IgnoreGossip of + true -> Ring2 = Ring, Changed = false; + false -> + {Changed, Ring2} = riak_core_ring:reconcile(OtherRing, + Ring) + end, + OtherStatus = riak_core_ring:member_status(Ring2, + OtherNode), case {WrongCluster, OtherStatus, Changed} of - {true, _OS, _C} -> - %% TODO: Tell other node to stop gossiping to this node. - %% STATS - % riak_core_stat:update(ignored_gossip), - ignore; - {false, down, _C} -> - %% Tell other node to rejoin the cluster. - riak_core_gossip:rejoin(OtherNode, Ring2), - ignore; - {false, invalid, _C} -> - %% Exiting/Removed node never saw shutdown cast, re-send. - ClusterName = riak_core_ring:cluster_name(Ring), - riak_core_ring_manager:refresh_ring(OtherNode, ClusterName), - ignore; - {false, _OS, new_ring} -> - Ring3 = riak_core_ring:ring_changed(Node, Ring2), - %% STATS - % riak_core_stat:update(rings_reconciled), - log_membership_changes(Ring, Ring3), - {reconciled_ring, Ring3}; - {false, _OS, _C} -> - ignore + {true, _, _} -> + %% TODO: Tell other node to stop gossiping to this node. + %% STATS + % riak_core_stat:update(ignored_gossip), + ignore; + {_, down, _} -> + %% Tell other node to rejoin the cluster. + riak_core_gossip:rejoin(OtherNode, Ring2), + ignore; + {_, invalid, _} -> + %% Exiting/Removed node never saw shutdown cast, re-send. + ClusterName = riak_core_ring:cluster_name(Ring), + riak_core_ring_manager:refresh_ring(OtherNode, + ClusterName), + ignore; + {_, _, new_ring} -> + Ring3 = riak_core_ring:ring_changed(Node, Ring2), + %% STATS + % riak_core_stat:update(rings_reconciled), + log_membership_changes(Ring, Ring3), + {reconciled_ring, Ring3}; + {_, _, _} -> ignore end. log_membership_changes(OldRing, NewRing) -> OldStatus = riak_core_ring:all_member_status(OldRing), NewStatus = riak_core_ring:all_member_status(NewRing), + do_log_membership_changes(lists:sort(OldStatus), + lists:sort(NewStatus)). - do_log_membership_changes(lists:sort(OldStatus), lists:sort(NewStatus)). - -do_log_membership_changes([], []) -> - ok; -do_log_membership_changes([{Node, Status}|Old], [{Node, Status}|New]) -> +do_log_membership_changes([], []) -> ok; +do_log_membership_changes([{Node, Status} | Old], + [{Node, Status} | New]) -> %% No change do_log_membership_changes(Old, New); -do_log_membership_changes([{Node, Status1}|Old], [{Node, Status2}|New]) -> +do_log_membership_changes([{Node, Status1} | Old], + [{Node, Status2} | New]) -> %% State changed, did not join or leave log_node_changed(Node, Status1, Status2), do_log_membership_changes(Old, New); -do_log_membership_changes([{OldNode, _OldStatus}|_]=Old, [{NewNode, NewStatus}|New]) when NewNode < OldNode-> +do_log_membership_changes([{OldNode, _OldStatus} | _] = + Old, + [{NewNode, NewStatus} | New]) + when NewNode < OldNode -> %% Node added log_node_added(NewNode, NewStatus), do_log_membership_changes(Old, New); -do_log_membership_changes([{OldNode, OldStatus}|Old], [{NewNode, _NewStatus}|_]=New) when OldNode < NewNode -> +do_log_membership_changes([{OldNode, OldStatus} | Old], + [{NewNode, _NewStatus} | _] = New) + when OldNode < NewNode -> %% Node removed log_node_removed(OldNode, OldStatus), do_log_membership_changes(Old, New); -do_log_membership_changes([{OldNode, OldStatus}|Old], []) -> +do_log_membership_changes([{OldNode, OldStatus} | Old], + []) -> %% Trailing nodes were removed log_node_removed(OldNode, OldStatus), do_log_membership_changes(Old, []); -do_log_membership_changes([], [{NewNode, NewStatus}|New]) -> +do_log_membership_changes([], + [{NewNode, NewStatus} | New]) -> %% Trailing nodes were added log_node_added(NewNode, NewStatus), do_log_membership_changes([], New). log_node_changed(Node, Old, New) -> - logger:info("'~s' changed from '~s' to '~s'~n", [Node, Old, New]). + logger:info("'~s' changed from '~s' to '~s'~n", + [Node, Old, New]). log_node_added(Node, New) -> - logger:info("'~s' joined cluster with status '~s'~n", [Node, New]). + logger:info("'~s' joined cluster with status '~s'~n", + [Node, New]). log_node_removed(Node, Old) -> - logger:info("'~s' removed from cluster (previously: '~s')~n", [Node, Old]). + logger:info("'~s' removed from cluster (previously: " + "'~s')~n", + [Node, Old]). remove_from_cluster(Ring, ExitingNode) -> - remove_from_cluster(Ring, ExitingNode, riak_core_rand:rand_seed()). + remove_from_cluster(Ring, ExitingNode, + erlang:timestamp()). remove_from_cluster(Ring, ExitingNode, Seed) -> % Transfer indexes to other nodes... diff --git a/src/riak_core_handoff_listener.erl b/src/riak_core_handoff_listener.erl index 18daf4887..fb98c2eea 100644 --- a/src/riak_core_handoff_listener.erl +++ b/src/riak_core_handoff_listener.erl @@ -23,34 +23,43 @@ %% @doc entry point for TCP-based handoff -module(riak_core_handoff_listener). + -behavior(gen_nb_server). + -export([start_link/0]). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). --export([get_handoff_ip/0, sock_opts/0, new_connection/2]). --record(state, { - ipaddr :: string(), - portnum :: integer() - }). + +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). + +-export([get_handoff_ip/0, sock_opts/0, + new_connection/2]). + +-record(state, + {ipaddr :: string(), portnum :: integer()}). start_link() -> - PortNum = application:get_env(riak_core, handoff_port, undefined), - IpAddr = application:get_env(riak_core, handoff_ip, undefined), - gen_nb_server:start_link(?MODULE, IpAddr, PortNum, [IpAddr, PortNum]). + PortNum = application:get_env(riak_core, handoff_port, + undefined), + IpAddr = application:get_env(riak_core, handoff_ip, + undefined), + gen_nb_server:start_link(?MODULE, IpAddr, PortNum, + [IpAddr, PortNum]). get_handoff_ip() -> - riak_core_gen_server:call(?MODULE, handoff_ip, infinity). + gen_server:call(?MODULE, handoff_ip, infinity). init([IpAddr, PortNum]) -> register(?MODULE, self()), - {ok, #state{portnum=PortNum, ipaddr=IpAddr}}. + {ok, #state{portnum = PortNum, ipaddr = IpAddr}}. -sock_opts() -> [binary, {packet, 4}, {reuseaddr, true}, {backlog, 64}]. +sock_opts() -> + [binary, {packet, 4}, {reuseaddr, true}, {backlog, 64}]. -handle_call(handoff_ip, _From, State=#state{ipaddr=I}) -> +handle_call(handoff_ip, _From, + State = #state{ipaddr = I}) -> {reply, {ok, I}, State}; - -handle_call(handoff_port, _From, State=#state{portnum=P}) -> +handle_call(handoff_port, _From, + State = #state{portnum = P}) -> {reply, {ok, P}, State}. handle_cast(_Msg, State) -> {noreply, State}. @@ -63,14 +72,13 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}. new_connection(Socket, State) -> case riak_core_handoff_manager:add_inbound() of - {ok, Pid} -> - ok = gen_tcp:controlling_process(Socket, Pid), - ok = riak_core_handoff_receiver:set_socket(Pid, Socket), - {ok, State}; - {error, _Reason} -> + {ok, Pid} -> + ok = gen_tcp:controlling_process(Socket, Pid), + ok = riak_core_handoff_receiver:set_socket(Pid, Socket), + {ok, State}; + {error, _Reason} -> %% STATS -%% riak_core_stat:update(rejected_handoffs), - gen_tcp:close(Socket), - {ok, State} + %% riak_core_stat:update(rejected_handoffs), + gen_tcp:close(Socket), + {ok, State} end. - diff --git a/src/riak_core_handoff_listener_sup.erl b/src/riak_core_handoff_listener_sup.erl index 0c800bac9..ed7f87126 100644 --- a/src/riak_core_handoff_listener_sup.erl +++ b/src/riak_core_handoff_listener_sup.erl @@ -19,21 +19,22 @@ %% ------------------------------------------------------------------- -module(riak_core_handoff_listener_sup). + -behaviour(supervisor). %% beahvior functions --export([start_link/0, - init/1 - ]). +-export([start_link/0, init/1]). --define(CHILD(I,Type), {I,{I,start_link,[]},permanent,brutal_kill,Type,[I]}). +-define(CHILD(I, Type), + {I, {I, start_link, []}, permanent, brutal_kill, Type, + [I]}). %% begins the supervisor, init/1 will be called -start_link () -> - supervisor:start_link({local,?MODULE},?MODULE,[]). +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). %% @private -init ([]) -> - {ok,{{one_for_one,10,10}, - [?CHILD(riak_core_handoff_listener,worker) - ]}}. +init([]) -> + {ok, + {{one_for_one, 10, 10}, + [?CHILD(riak_core_handoff_listener, worker)]}}. diff --git a/src/riak_core_handoff_manager.erl b/src/riak_core_handoff_manager.erl index 8103546f6..e023a06f7 100644 --- a/src/riak_core_handoff_manager.erl +++ b/src/riak_core_handoff_manager.erl @@ -14,109 +14,108 @@ %% Copyright (c) 2007-2012 Basho Technologies, Inc. All Rights Reserved. -module(riak_core_handoff_manager). + -behaviour(gen_server). %% gen_server api --export([start_link/0, - init/1, - handle_call/3, - handle_cast/2, - handle_info/2, - terminate/2, - code_change/3 - ]). +-export([start_link/0, init/1, handle_call/3, + handle_cast/2, handle_info/2, terminate/2, + code_change/3]). %% exclusion api --export([add_exclusion/2, - get_exclusions/1, - remove_exclusion/2 - ]). +-export([add_exclusion/2, get_exclusions/1, + remove_exclusion/2]). %% handoff api --export([add_outbound/6, - add_outbound/7, - add_inbound/0, - xfer/3, - kill_xfer/3, - status/0, - status/1, - status_update/2, - set_concurrency/1, - get_concurrency/0, - set_recv_data/2, - kill_handoffs/0, +-export([add_outbound/6, add_outbound/7, add_inbound/0, + xfer/3, kill_xfer/3, status/0, status/1, + status_update/2, set_concurrency/1, get_concurrency/0, + set_recv_data/2, kill_handoffs/0, kill_handoffs_in_direction/1, - handoff_change_enabled_setting/2 - ]). + handoff_change_enabled_setting/2]). -include("riak_core_handoff.hrl"). -export_type([ho_type/0]). -ifdef(TEST). + -include_lib("eunit/include/eunit.hrl"). + -endif. -record(state, - { excl, - handoffs=[] :: [handoff_status()] - }). + {excl, handoffs = [] :: [handoff_status()]}). %% this can be overridden with riak_core handoff_concurrency --define(HANDOFF_CONCURRENCY,2). +-define(HANDOFF_CONCURRENCY, 2). + -define(HO_EQ(HOA, HOB), - HOA#handoff_status.mod_src_tgt == HOB#handoff_status.mod_src_tgt - andalso HOA#handoff_status.timestamp == HOB#handoff_status.timestamp). + HOA#handoff_status.mod_src_tgt == + HOB#handoff_status.mod_src_tgt + andalso + HOA#handoff_status.timestamp == + HOB#handoff_status.timestamp). %%%=================================================================== %%% API %%%=================================================================== start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, [], + []). init([]) -> - {ok, #state{excl=sets:new(), handoffs=[]}}. - -add_outbound(HOType,Module,Idx,Node,VnodePid,Opts) -> - add_outbound(HOType,Module,Idx,Idx,Node,VnodePid,Opts). - -add_outbound(HOType,Module,SrcIdx,TargetIdx,Node,VnodePid,Opts) -> - case application:get_env(riak_core, disable_outbound_handoff) of - {ok, true} -> - {error, max_concurrency}; - _ -> - gen_server:call(?MODULE, - {add_outbound,HOType,Module,SrcIdx,TargetIdx,Node,VnodePid,Opts}, - infinity) + {ok, #state{excl = sets:new(), handoffs = []}}. + +add_outbound(HOType, Module, Idx, Node, VnodePid, + Opts) -> + add_outbound(HOType, Module, Idx, Idx, Node, VnodePid, + Opts). + +add_outbound(HOType, Module, SrcIdx, TargetIdx, Node, + VnodePid, Opts) -> + case application:get_env(riak_core, + disable_outbound_handoff) + of + {ok, true} -> {error, max_concurrency}; + _ -> + gen_server:call(?MODULE, + {add_outbound, HOType, Module, SrcIdx, TargetIdx, + Node, VnodePid, Opts}, + infinity) end. add_inbound() -> - case application:get_env(riak_core, disable_inbound_handoff) of - {ok, true} -> - {error, max_concurrency}; - _ -> - gen_server:call(?MODULE,{add_inbound},infinity) + case application:get_env(riak_core, + disable_inbound_handoff) + of + {ok, true} -> {error, max_concurrency}; + _ -> gen_server:call(?MODULE, {add_inbound}, infinity) end. %% @doc Initiate a transfer from `SrcPartition' to `TargetPartition' %% for the given `Module' using the `FilterModFun' filter. --spec xfer({index(), node()}, mod_partition(), {module(), atom()}) -> ok. -xfer({SrcPartition, SrcOwner}, {Module, TargetPartition}, FilterModFun) -> +-spec xfer({index(), node()}, mod_partition(), + {module(), atom()}) -> ok. + +xfer({SrcPartition, SrcOwner}, + {Module, TargetPartition}, FilterModFun) -> %% NOTE: This will not work with old nodes ReqOrigin = node(), gen_server:cast({?MODULE, SrcOwner}, {send_handoff, repair, Module, - {SrcPartition, TargetPartition}, - ReqOrigin, FilterModFun}). + {SrcPartition, TargetPartition}, ReqOrigin, + FilterModFun}). %% @doc Associate `Data' with the inbound handoff `Recv'. -spec set_recv_data(pid(), proplists:proplist()) -> ok. + set_recv_data(Recv, Data) -> - gen_server:call(?MODULE, {set_recv_data, Recv, Data}, infinity). + gen_server:call(?MODULE, {set_recv_data, Recv, Data}, + infinity). -status() -> - status(none). +status() -> status(none). status(Filter) -> gen_server:call(?MODULE, {status, Filter}, infinity). @@ -124,349 +123,379 @@ status(Filter) -> %% @doc Send status updates `Stats' to the handoff manager for a %% particular handoff identified by `ModSrcTgt'. -spec status_update(mod_src_tgt(), ho_stats()) -> ok. + status_update(ModSrcTgt, Stats) -> - gen_server:cast(?MODULE, {status_update, ModSrcTgt, Stats}). + gen_server:cast(?MODULE, + {status_update, ModSrcTgt, Stats}). set_concurrency(Limit) -> - gen_server:call(?MODULE,{set_concurrency,Limit}, infinity). + gen_server:call(?MODULE, {set_concurrency, Limit}, + infinity). get_concurrency() -> gen_server:call(?MODULE, get_concurrency, infinity). %% @doc Kill the transfer of `ModSrcTarget' with `Reason'. -spec kill_xfer(node(), tuple(), any()) -> ok. + kill_xfer(SrcNode, ModSrcTarget, Reason) -> - gen_server:cast({?MODULE, SrcNode}, {kill_xfer, ModSrcTarget, Reason}). + gen_server:cast({?MODULE, SrcNode}, + {kill_xfer, ModSrcTarget, Reason}). + +kill_handoffs() -> set_concurrency(0). -kill_handoffs() -> - set_concurrency(0). +-spec kill_handoffs_in_direction(inbound | + outbound) -> ok. --spec kill_handoffs_in_direction(inbound | outbound) -> ok. kill_handoffs_in_direction(Direction) -> - gen_server:call(?MODULE, {kill_in_direction, Direction}, infinity). + gen_server:call(?MODULE, {kill_in_direction, Direction}, + infinity). add_exclusion(Module, Index) -> - gen_server:cast(?MODULE, {add_exclusion, {Module, Index}}). + gen_server:cast(?MODULE, + {add_exclusion, {Module, Index}}). remove_exclusion(Module, Index) -> - gen_server:cast(?MODULE, {del_exclusion, {Module, Index}}). + gen_server:cast(?MODULE, + {del_exclusion, {Module, Index}}). get_exclusions(Module) -> - gen_server:call(?MODULE, {get_exclusions, Module}, infinity). - + gen_server:call(?MODULE, {get_exclusions, Module}, + infinity). %%%=================================================================== %%% Callbacks %%%=================================================================== -handle_call({get_exclusions, Module}, _From, State=#state{excl=Excl}) -> - Reply = [I || {M, I} <- sets:to_list(Excl), M =:= Module], +handle_call({get_exclusions, Module}, _From, + State = #state{excl = Excl}) -> + Reply = [I + || {M, I} <- sets:to_list(Excl), M =:= Module], {reply, {ok, Reply}, State}; -handle_call({add_outbound,Type,Mod,SrcIdx,TargetIdx,Node,Pid,Opts},_From, - State=#state{handoffs=HS}) -> - case send_handoff(Type,{Mod,SrcIdx,TargetIdx},Node,Pid,HS,Opts) of - {ok,Handoff=#handoff_status{transport_pid=Sender}} -> - HS2 = HS ++ [Handoff], - {reply, {ok,Sender}, State#state{handoffs=HS2}}; - {false,_ExistingHandoff=#handoff_status{transport_pid=Sender}} -> - {reply, {ok,Sender}, State}; - Error -> - {reply, Error, State} +handle_call({add_outbound, Type, Mod, SrcIdx, TargetIdx, + Node, Pid, Opts}, + _From, State = #state{handoffs = HS}) -> + case send_handoff(Type, {Mod, SrcIdx, TargetIdx}, Node, + Pid, HS, Opts) + of + {ok, + Handoff = #handoff_status{transport_pid = Sender}} -> + HS2 = HS ++ [Handoff], + {reply, {ok, Sender}, State#state{handoffs = HS2}}; + {false, + _ExistingHandoff = #handoff_status{transport_pid = + Sender}} -> + {reply, {ok, Sender}, State}; + Error -> {reply, Error, State} end; -handle_call({add_inbound},_From,State=#state{handoffs=HS}) -> +handle_call({add_inbound}, _From, + State = #state{handoffs = HS}) -> case receive_handoff() of - {ok,Handoff=#handoff_status{transport_pid=Receiver}} -> - HS2 = HS ++ [Handoff], - {reply, {ok,Receiver}, State#state{handoffs=HS2}}; - Error -> - {reply, Error, State} + {ok, + Handoff = #handoff_status{transport_pid = Receiver}} -> + HS2 = HS ++ [Handoff], + {reply, {ok, Receiver}, State#state{handoffs = HS2}}; + Error -> {reply, Error, State} end; - -handle_call({set_recv_data, Recv, Data}, _From, State=#state{handoffs=HS}) -> - case lists:keyfind(Recv, #handoff_status.transport_pid, HS) of - false -> - throw({error, "set_recv_data called for non-existing receiver", - Recv, Data}); - #handoff_status{}=H -> - H2 = H#handoff_status{ - mod_src_tgt=proplists:get_value(mod_src_tgt, Data), - vnode_pid=proplists:get_value(vnode_pid, Data) - }, - HS2 = lists:keyreplace(Recv, #handoff_status.transport_pid, HS, H2), - {reply, ok, State#state{handoffs=HS2}} +handle_call({set_recv_data, Recv, Data}, _From, + State = #state{handoffs = HS}) -> + case lists:keyfind(Recv, #handoff_status.transport_pid, + HS) + of + false -> + throw({error, + "set_recv_data called for non-existing " + "receiver", + Recv, Data}); + #handoff_status{} = H -> + H2 = H#handoff_status{mod_src_tgt = + proplists:get_value(mod_src_tgt, Data), + vnode_pid = + proplists:get_value(vnode_pid, Data)}, + HS2 = lists:keyreplace(Recv, + #handoff_status.transport_pid, HS, H2), + {reply, ok, State#state{handoffs = HS2}} end; - -handle_call({xfer_status, Xfer}, _From, State=#state{handoffs=HS}) -> +handle_call({xfer_status, Xfer}, _From, + State = #state{handoffs = HS}) -> TP = Xfer#handoff_status.transport_pid, - case lists:keyfind(TP, #handoff_status.transport_pid, HS) of - false -> {reply, not_found, State}; - _ -> {reply, in_progress, State} + case lists:keyfind(TP, #handoff_status.transport_pid, + HS) + of + false -> {reply, not_found, State}; + _ -> {reply, in_progress, State} end; - -handle_call({status, Filter}, _From, State=#state{handoffs=HS}) -> - Status = lists:filter(filter(Filter), [build_status(HO) || HO <- HS]), +handle_call({status, Filter}, _From, + State = #state{handoffs = HS}) -> + Status = lists:filter(filter(Filter), + [build_status(HO) || HO <- HS]), {reply, Status, State}; - -handle_call({set_concurrency,Limit},_From,State=#state{handoffs=HS}) -> - application:set_env(riak_core,handoff_concurrency,Limit), +handle_call({set_concurrency, Limit}, _From, + State = #state{handoffs = HS}) -> + application:set_env(riak_core, handoff_concurrency, + Limit), case Limit < erlang:length(HS) of - true -> - %% Note: we don't update the state with the handoffs that we're - %% keeping because we'll still get the 'DOWN' messages with - %% a reason of 'max_concurrency' and we want to be able to do - %% something with that if necessary. - {_Keep,Discard}=lists:split(Limit,HS), - _ = [erlang:exit(Pid,max_concurrency) || - #handoff_status{transport_pid=Pid} <- Discard], - {reply, ok, State}; - false -> - {reply, ok, State} + true -> + %% Note: we don't update the state with the handoffs that we're + %% keeping because we'll still get the 'DOWN' messages with + %% a reason of 'max_concurrency' and we want to be able to do + %% something with that if necessary. + {_Keep, Discard} = lists:split(Limit, HS), + _ = [erlang:exit(Pid, max_concurrency) + || #handoff_status{transport_pid = Pid} <- Discard], + {reply, ok, State}; + false -> {reply, ok, State} end; - handle_call(get_concurrency, _From, State) -> Concurrency = get_concurrency_limit(), {reply, Concurrency, State}; - -handle_call({kill_in_direction, Direction}, _From, State=#state{handoffs=HS}) -> +handle_call({kill_in_direction, Direction}, _From, + State = #state{handoffs = HS}) -> %% TODO (atb): Refactor this to comply with max_concurrency logspam PR's exit codes %% NB. As-is this handles worker termination the same way as set_concurrency; %% no state update is performed here, we let the worker DOWNs mark them %% as dead rather than trimming here. - Kill = [H || H=#handoff_status{direction=D} <- HS, D =:= Direction], - _ = [erlang:exit(Pid, max_concurrency) || - #handoff_status{transport_pid=Pid} <- Kill], + Kill = [H + || H = #handoff_status{direction = D} <- HS, + D =:= Direction], + _ = [erlang:exit(Pid, max_concurrency) + || #handoff_status{transport_pid = Pid} <- Kill], {reply, ok, State}. -handle_cast({del_exclusion, {Mod, Idx}}, State=#state{excl=Excl}) -> +handle_cast({del_exclusion, {Mod, Idx}}, + State = #state{excl = Excl}) -> Excl2 = sets:del_element({Mod, Idx}, Excl), - {noreply, State#state{excl=Excl2}}; - -handle_cast({add_exclusion, {Mod, Idx}}, State=#state{excl=Excl}) -> + {noreply, State#state{excl = Excl2}}; +handle_cast({add_exclusion, {Mod, Idx}}, + State = #state{excl = Excl}) -> %% Note: This function used to trigger a ring event after adding an %% exclusion to ensure that an exiting node would eventually shutdown %% after all vnodes had finished handoff. This behavior is now handled %% by riak_core_vnode_manager:maybe_ensure_vnodes_started Excl2 = sets:add_element({Mod, Idx}, Excl), - {noreply, State#state{excl=Excl2}}; - -handle_cast({status_update, ModSrcTgt, StatsUpdate}, State=#state{handoffs=HS}) -> - case lists:keyfind(ModSrcTgt, #handoff_status.mod_src_tgt, HS) of - false -> - logger:error("status_update for non-existing handoff ~p", [ModSrcTgt]), - {noreply, State}; - HO -> - Stats2 = update_stats(StatsUpdate, HO#handoff_status.stats), - HO2 = HO#handoff_status{stats=Stats2}, - HS2 = lists:keyreplace(ModSrcTgt, #handoff_status.mod_src_tgt, HS, HO2), - {noreply, State#state{handoffs=HS2}} + {noreply, State#state{excl = Excl2}}; +handle_cast({status_update, ModSrcTgt, StatsUpdate}, + State = #state{handoffs = HS}) -> + case lists:keyfind(ModSrcTgt, + #handoff_status.mod_src_tgt, HS) + of + false -> + logger:error("status_update for non-existing handoff ~p", + [ModSrcTgt]), + {noreply, State}; + HO -> + Stats2 = update_stats(StatsUpdate, + HO#handoff_status.stats), + HO2 = HO#handoff_status{stats = Stats2}, + HS2 = lists:keyreplace(ModSrcTgt, + #handoff_status.mod_src_tgt, HS, HO2), + {noreply, State#state{handoffs = HS2}} end; - -handle_cast({send_handoff, Type, Mod, {Src, Target}, ReqOrigin, - {FilterMod, FilterFun}=FMF}, - State=#state{handoffs=HS}) -> - Filter = FilterMod:FilterFun(Target), +handle_cast({send_handoff, Type, Mod, {Src, Target}, + ReqOrigin, {Module, FilterFun} = FMF}, + State = #state{handoffs = HS}) -> + Filter = Module:FilterFun(Target), %% TODO: make a record? - {ok, VNode} = riak_core_vnode_manager:get_vnode_pid(Src, Mod), - case send_handoff(Type, {Mod, Src, Target}, ReqOrigin, VNode, HS, - {Filter, FMF}, ReqOrigin, []) of - {ok, Handoff} -> - HS2 = HS ++ [Handoff], - {noreply, State#state{handoffs=HS2}}; - _ -> - {noreply, State} + {ok, VNode} = riak_core_vnode_manager:get_vnode_pid(Src, + Mod), + case send_handoff(Type, {Mod, Src, Target}, ReqOrigin, + VNode, HS, {Filter, FMF}, ReqOrigin, []) + of + {ok, Handoff} -> + HS2 = HS ++ [Handoff], + {noreply, State#state{handoffs = HS2}}; + _ -> {noreply, State} end; - handle_cast({kill_xfer, ModSrcTarget, Reason}, State) -> HS = State#state.handoffs, HS2 = kill_xfer_i(ModSrcTarget, Reason, HS), - {noreply, State#state{handoffs=HS2}}. - -handle_info({'DOWN', Ref, process, _Pid, Reason}, State=#state{handoffs=HS}) -> - case lists:keytake(Ref, #handoff_status.transport_mon, HS) of - {value, - #handoff_status{mod_src_tgt={M, S, I}, direction=Dir, vnode_pid=Vnode, - vnode_mon=VnodeM, req_origin=Origin}, - NewHS - } -> - WarnVnode = - case Reason of - %% if the reason the handoff process died was anything other - %% than 'normal' we should log the reason why as an error - normal -> - false; - X when X == max_concurrency orelse - (element(1, X) == shutdown andalso - element(2, X) == max_concurrency) -> - logger:info("An ~w handoff of partition ~w ~w was terminated for reason: ~w~n", [Dir,M,I,Reason]), - true; - _ -> - logger:error("An ~w handoff of partition ~w ~w was terminated for reason: ~w~n", [Dir,M,I,Reason]), - true - end, - - %% if we have the vnode process pid, tell the vnode why the - %% handoff stopped so it can clean up its state - case WarnVnode andalso is_pid(Vnode) of - true -> - riak_core_vnode:handoff_error(Vnode, 'DOWN', Reason); - _ -> - case Origin of - none -> ok; + {noreply, State#state{handoffs = HS2}}. + +handle_info({'DOWN', Ref, process, _Pid, Reason}, + State = #state{handoffs = HS}) -> + case lists:keytake(Ref, #handoff_status.transport_mon, + HS) + of + {value, + #handoff_status{mod_src_tgt = {M, S, I}, + direction = Dir, vnode_pid = Vnode, vnode_mon = VnodeM, + req_origin = Origin}, + NewHS} -> + WarnVnode = case Reason of + %% if the reason the handoff process died was anything other + %% than 'normal' we should log the reason why as an error + normal -> false; + X + when X == max_concurrency orelse + element(1, X) == shutdown andalso + element(2, X) == max_concurrency -> + logger:info("An ~w handoff of partition ~w ~w was " + "terminated\n " + " for reason: ~w~n", + [Dir, M, I, Reason]), + true; _ -> - %% Use proplist instead so it's more - %% flexible in future, or does - %% capabilities nullify that? - Msg = {M, S, I}, - riak_core_vnode_manager:xfer_complete(Origin, Msg) - end, - ok - end, - - %% No monitor on vnode for receiver - if VnodeM /= undefined -> demonitor(VnodeM); - true -> ok - end, - - %% removed the handoff from the list of active handoffs - {noreply, State#state{handoffs=NewHS}}; - false -> - case lists:keytake(Ref, #handoff_status.vnode_mon, HS) of - {value, - #handoff_status{mod_src_tgt={M,_,I}, direction=Dir, - transport_pid=Trans, transport_mon=TransM}, - NewHS} -> - %% In this case the vnode died and the handoff - %% sender must be killed. - logger:error("An ~w handoff of partition ~w ~w was " - "terminated because the vnode died", - [Dir, M, I]), - demonitor(TransM), - exit(Trans, vnode_died), - {noreply, State#state{handoffs=NewHS}}; - _ -> - {noreply, State} - end + logger:error("An ~w handoff of partition ~w ~w was " + "terminated\n " + " for reason: ~w~n", + [Dir, M, I, Reason]), + true + end, + %% if we have the vnode process pid, tell the vnode why the + %% handoff stopped so it can clean up its state + case WarnVnode andalso is_pid(Vnode) of + true -> + riak_core_vnode:handoff_error(Vnode, 'DOWN', Reason); + _ -> + case Origin of + none -> ok; + _ -> + %% Use proplist instead so it's more + %% flexible in future, or does + %% capabilities nullify that? + Msg = {M, S, I}, + riak_core_vnode_manager:xfer_complete(Origin, Msg) + end, + ok + end, + %% No monitor on vnode for receiver + if VnodeM /= undefined -> demonitor(VnodeM); + true -> ok + end, + %% removed the handoff from the list of active handoffs + {noreply, State#state{handoffs = NewHS}}; + false -> + case lists:keytake(Ref, #handoff_status.vnode_mon, HS) + of + {value, + #handoff_status{mod_src_tgt = {M, _, I}, + direction = Dir, transport_pid = Trans, + transport_mon = TransM}, + NewHS} -> + %% In this case the vnode died and the handoff + %% sender must be killed. + logger:error("An ~w handoff of partition ~w ~w was " + "terminated because the vnode died", + [Dir, M, I]), + demonitor(TransM), + exit(Trans, vnode_died), + {noreply, State#state{handoffs = NewHS}}; + _ -> {noreply, State} + end end. +terminate(_Reason, _State) -> ok. -terminate(_Reason, _State) -> - ok. - - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - +code_change(_OldVsn, State, _Extra) -> {ok, State}. %%%=================================================================== %%% Private %%%=================================================================== build_status(HO) -> - #handoff_status{mod_src_tgt={Mod, SrcP, TargetP}, - src_node=SrcNode, - target_node=TargetNode, - direction=Dir, - status=Status, - timestamp=StartTS, - transport_pid=TPid, - type=Type}=HO, - {status_v2, [{mod, Mod}, - {src_partition, SrcP}, - {target_partition, TargetP}, - {src_node, SrcNode}, - {target_node, TargetNode}, - {direction, Dir}, - {status, Status}, - {start_ts, StartTS}, - {sender_pid, TPid}, - {stats, calc_stats(HO)}, - {type, Type}]}. - -calc_stats(#handoff_status{stats=Stats,timestamp=StartTS,size=Size}) -> + #handoff_status{mod_src_tgt = {Mod, SrcP, TargetP}, + src_node = SrcNode, target_node = TargetNode, + direction = Dir, status = Status, timestamp = StartTS, + transport_pid = TPid, type = Type} = + HO, + {status_v2, + [{mod, Mod}, {src_partition, SrcP}, + {target_partition, TargetP}, {src_node, SrcNode}, + {target_node, TargetNode}, {direction, Dir}, + {status, Status}, {start_ts, StartTS}, + {sender_pid, TPid}, {stats, calc_stats(HO)}, + {type, Type}]}. + +calc_stats(#handoff_status{stats = Stats, + timestamp = StartTS, size = Size}) -> case dict:find(last_update, Stats) of - error -> - no_stats; - {ok, LastUpdate} -> - Objs = dict:fetch(objs, Stats), - Bytes = dict:fetch(bytes, Stats), - CalcSize = get_size(Size), - Done = calc_pct_done(Objs, Bytes, CalcSize), - ElapsedS = timer:now_diff(LastUpdate, StartTS) / 1000000, - ObjsS = round(Objs / ElapsedS), - BytesS = round(Bytes / ElapsedS), - [{objs_total, Objs}, - {objs_per_s, ObjsS}, - {bytes_per_s, BytesS}, - {last_update, LastUpdate}, - {size, CalcSize}, - {pct_done_decimal, Done}] + error -> no_stats; + {ok, LastUpdate} -> + Objs = dict:fetch(objs, Stats), + Bytes = dict:fetch(bytes, Stats), + CalcSize = get_size(Size), + Done = calc_pct_done(Objs, Bytes, CalcSize), + ElapsedS = timer:now_diff(LastUpdate, StartTS) / + 1000000, + ObjsS = round(Objs / ElapsedS), + BytesS = round(Bytes / ElapsedS), + [{objs_total, Objs}, {objs_per_s, ObjsS}, + {bytes_per_s, BytesS}, {last_update, LastUpdate}, + {size, CalcSize}, {pct_done_decimal, Done}] end. -get_size({F, dynamic}) -> - F(); -get_size(S) -> - S. - -calc_pct_done(_, _, undefined) -> - undefined; -calc_pct_done(Objs, _, {Size, objects}) -> - Objs / Size; -calc_pct_done(_, Bytes, {Size, bytes}) -> - Bytes / Size. - -filter(none) -> - fun(_) -> true end; -filter({Key, Value}=_Filter) -> - fun({status_v2, Status}) -> +get_size({F, dynamic}) -> F(); +get_size(S) -> S. + +calc_pct_done(_, _, undefined) -> undefined; +calc_pct_done(Objs, _, {Size, objects}) -> Objs / Size; +calc_pct_done(_, Bytes, {Size, bytes}) -> Bytes / Size. + +filter(none) -> fun (_) -> true end; +filter({Key, Value} = _Filter) -> + fun ({status_v2, Status}) -> case proplists:get_value(Key, Status) of - Value -> true; - _ -> false + Value -> true; + _ -> false end end. -resize_transfer_filter(Ring, Mod, Src, Target) -> - fun(K) -> - {_, Hashed} = Mod:object_info(K), - riak_core_ring:is_future_index(Hashed, - Src, - Target, +resize_transfer_filter(Ring, Module, Src, Target) -> + fun (K) -> + {_, Hashed} = Module:object_info(K), + riak_core_ring:is_future_index(Hashed, Src, Target, Ring) end. -resize_transfer_notsent_fun(Ring, Mod, Src) -> - Shrinking = riak_core_ring:num_partitions(Ring) > riak_core_ring:future_num_partitions(Ring), - case Shrinking of - false -> NValMap = DefaultN = undefined; - true -> - NValMap = Mod:nval_map(Ring), - DefaultN = riak_core_bucket:default_object_nval() - end, - fun(Key, Acc) -> record_seen_index(Ring, Shrinking, NValMap, DefaultN, Mod, Src, Key, Acc) end. - -record_seen_index(Ring, Shrinking, NValMap, DefaultN, Mod, Src, Key, Seen) -> - {Bucket, Hashed} = Mod:object_info(Key), +resize_transfer_notsent_fun(Ring, Module, Src) -> + Shrinking = riak_core_ring:num_partitions(Ring) > + riak_core_ring:future_num_partitions(Ring), + {NValMap, DefaultN} = case Shrinking of + false -> {undefined, undefined}; + true -> + {ok, DefN} = application:get_env(riak_core, + target_n_val), + {Module:nval_map(Ring), DefN} + end, + fun (Key, Acc) -> + record_seen_index(Ring, Shrinking, NValMap, DefaultN, + Module, Src, Key, Acc) + end. + +record_seen_index(Ring, Shrinking, NValMap, DefaultN, + Module, Src, Key, Seen) -> + {Bucket, Hashed} = Module:object_info(Key), CheckNVal = case Shrinking of - false -> undefined; - true -> proplists:get_value(Bucket, NValMap, DefaultN) + false -> undefined; + true -> proplists:get_value(Bucket, NValMap, DefaultN) end, - case riak_core_ring:future_index(Hashed, Src, CheckNVal, Ring) of - undefined -> Seen; - FutureIndex -> ordsets:add_element(FutureIndex, Seen) + case riak_core_ring:future_index(Hashed, Src, CheckNVal, + Ring) + of + undefined -> Seen; + FutureIndex -> ordsets:add_element(FutureIndex, Seen) end. -get_concurrency_limit () -> - application:get_env(riak_core,handoff_concurrency,?HANDOFF_CONCURRENCY). +get_concurrency_limit() -> + application:get_env(riak_core, handoff_concurrency, + ?HANDOFF_CONCURRENCY). %% true if handoff_concurrency (inbound + outbound) hasn't yet been reached -handoff_concurrency_limit_reached () -> - Receivers=supervisor:count_children(riak_core_handoff_receiver_sup), - Senders=supervisor:count_children(riak_core_handoff_sender_sup), - ActiveReceivers=proplists:get_value(active,Receivers), - ActiveSenders=proplists:get_value(active,Senders), - get_concurrency_limit() =< (ActiveReceivers + ActiveSenders). - -send_handoff(HOType, ModSrcTarget, Node, Pid, HS,Opts) -> - send_handoff(HOType, ModSrcTarget, Node, Pid, HS, {none, none}, none, Opts). +handoff_concurrency_limit_reached() -> + Receivers = + supervisor:count_children(riak_core_handoff_receiver_sup), + Senders = + supervisor:count_children(riak_core_handoff_sender_sup), + ActiveReceivers = proplists:get_value(active, + Receivers), + ActiveSenders = proplists:get_value(active, Senders), + get_concurrency_limit() =< + ActiveReceivers + ActiveSenders. + +send_handoff(HOType, ModSrcTarget, Node, Pid, HS, + Opts) -> + send_handoff(HOType, ModSrcTarget, Node, Pid, HS, + {none, none}, none, Opts). %% @private %% @@ -475,126 +504,115 @@ send_handoff(HOType, ModSrcTarget, Node, Pid, HS,Opts) -> %% function which is a predicate applied to the key. The %% `Origin' is the node this request originated from so a reply %% can't be sent on completion. --spec send_handoff(ho_type(), {module(), index(), index()}, node(), - pid(), list(), - {predicate() | none, {module(), atom()} | none}, node(), [{atom(), term()}]) -> - {ok, handoff_status()} - | {error, max_concurrency} - | {false, handoff_status()}. -send_handoff(HOType, {Mod, Src, Target}, Node, Vnode, HS, {Filter, FilterModFun}, Origin, Opts) -> +-spec send_handoff(ho_type(), + {module(), index(), index()}, node(), pid(), list(), + {predicate() | none, {module(), atom()} | none}, node(), + [{atom(), term()}]) -> {ok, handoff_status()} | + {error, max_concurrency} | + {false, handoff_status()}. + +send_handoff(HOType, {Mod, Src, Target}, Node, Vnode, + HS, {Filter, FilterModFun}, Origin, Opts) -> case handoff_concurrency_limit_reached() of - true -> - {error, max_concurrency}; - false -> - ShouldHandoff= - case lists:keyfind({Mod, Src, Target}, #handoff_status.mod_src_tgt, HS) of - false -> - true; - Handoff=#handoff_status{target_node=Node,vnode_pid=Vnode} -> - {false,Handoff}; - #handoff_status{transport_pid=Sender} -> - %% found a running handoff with a different vnode - %% source or a different target node, kill the current - %% one and the new one will start up - erlang:exit(Sender,resubmit_handoff_change), - true + true -> {error, max_concurrency}; + false -> + ShouldHandoff = case lists:keyfind({Mod, Src, Target}, + #handoff_status.mod_src_tgt, HS) + of + false -> true; + Handoff = #handoff_status{target_node = Node, + vnode_pid = Vnode} -> + {false, Handoff}; + #handoff_status{transport_pid = Sender} -> + %% found a running handoff with a different vnode + %% source or a different target node, kill the current + %% one and the new one will start up + erlang:exit(Sender, resubmit_handoff_change), + true + end, + case ShouldHandoff of + true -> + VnodeM = monitor(process, Vnode), + %% start the sender process + BaseOpts = [{src_partition, Src}, + {target_partition, Target}], + case HOType of + repair -> + HOFilter = Filter, + HOAcc0 = undefined, + HONotSentFun = undefined; + resize -> + {ok, Ring} = riak_core_ring_manager:get_my_ring(), + HOFilter = resize_transfer_filter(Ring, Mod, Src, + Target), + HOAcc0 = ordsets:new(), + HONotSentFun = resize_transfer_notsent_fun(Ring, Mod, + Src); + _ -> + HOFilter = none, + HOAcc0 = undefined, + HONotSentFun = undefined end, - - case ShouldHandoff of - true -> - VnodeM = monitor(process, Vnode), - %% start the sender process - BaseOpts = [{src_partition, Src}, {target_partition, Target}], - case HOType of - repair -> - HOFilter = Filter, - HOAcc0 = undefined, - HONotSentFun = undefined; - resize -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - HOFilter = resize_transfer_filter(Ring, Mod, Src, Target), - HOAcc0 = ordsets:new(), - HONotSentFun = resize_transfer_notsent_fun(Ring, Mod, Src); - _ -> - HOFilter = none, - HOAcc0 = undefined, - HONotSentFun = undefined - end, - HOOpts = [{filter, HOFilter}, - {notsent_acc0, HOAcc0}, - {notsent_fun, HONotSentFun} | BaseOpts], - {ok, Pid} = riak_core_handoff_sender_sup:start_sender(HOType, - Mod, - Node, - Vnode, - HOOpts), - PidM = monitor(process, Pid), - Size = validate_size(proplists:get_value(size, Opts)), - - %% successfully started up a new sender handoff - {ok, #handoff_status{ transport_pid=Pid, - transport_mon=PidM, - direction=outbound, - timestamp=os:timestamp(), - src_node=node(), - target_node=Node, - mod_src_tgt={Mod, Src, Target}, - vnode_pid=Vnode, - vnode_mon=VnodeM, - status=[], - stats=dict:new(), - type=HOType, - req_origin=Origin, - filter_mod_fun=FilterModFun, - size=Size - } - }; - - %% handoff already going, just return it - AlreadyExists={false,_CurrentHandoff} -> - AlreadyExists - end + HOOpts = [{filter, HOFilter}, {notsent_acc0, HOAcc0}, + {notsent_fun, HONotSentFun} + | BaseOpts], + {ok, Pid} = + riak_core_handoff_sender_sup:start_sender(HOType, Mod, + Node, Vnode, + HOOpts), + PidM = monitor(process, Pid), + Size = validate_size(proplists:get_value(size, Opts)), + %% successfully started up a new sender handoff + {ok, + #handoff_status{transport_pid = Pid, + transport_mon = PidM, direction = outbound, + timestamp = os:timestamp(), src_node = node(), + target_node = Node, + mod_src_tgt = {Mod, Src, Target}, + vnode_pid = Vnode, vnode_mon = VnodeM, + status = [], stats = dict:new(), type = HOType, + req_origin = Origin, + filter_mod_fun = FilterModFun, size = Size}}; + %% handoff already going, just return it + AlreadyExists = {false, _CurrentHandoff} -> + AlreadyExists + end end. %% spawn a receiver process -receive_handoff () -> +receive_handoff() -> case handoff_concurrency_limit_reached() of - true -> - {error, max_concurrency}; - false -> - {ok,Pid}=riak_core_handoff_receiver_sup:start_receiver(), - PidM = monitor(process, Pid), - - %% successfully started up a new receiver - {ok, #handoff_status{ transport_pid=Pid, - transport_mon=PidM, - direction=inbound, - timestamp=os:timestamp(), - mod_src_tgt={undefined, undefined, undefined}, - src_node=undefined, - target_node=undefined, - status=[], - stats=dict:new(), - req_origin=none - } - } + true -> {error, max_concurrency}; + false -> + {ok, Pid} = + riak_core_handoff_receiver_sup:start_receiver(), + PidM = monitor(process, Pid), + %% successfully started up a new receiver + {ok, + #handoff_status{transport_pid = Pid, + transport_mon = PidM, direction = inbound, + timestamp = os:timestamp(), + mod_src_tgt = {undefined, undefined, undefined}, + src_node = undefined, target_node = undefined, + status = [], stats = dict:new(), req_origin = none}} end. update_stats(StatsUpdate, Stats) -> - #ho_stats{last_update=LU, objs=Objs, bytes=Bytes}=StatsUpdate, + #ho_stats{last_update = LU, objs = Objs, + bytes = Bytes} = + StatsUpdate, Stats2 = dict:update_counter(objs, Objs, Stats), Stats3 = dict:update_counter(bytes, Bytes, Stats2), dict:store(last_update, LU, Stats3). -validate_size(Size={N, U}) when is_number(N) andalso - N > 0 andalso - (U =:= bytes orelse U =:= objects) -> +validate_size(Size = {N, U}) + when is_number(N) andalso + N > 0 andalso (U =:= bytes orelse U =:= objects) -> Size; -validate_size(Size={F, dynamic}) when is_function(F) -> +validate_size(Size = {F, dynamic}) + when is_function(F) -> Size; -validate_size(_) -> - undefined. - +validate_size(_) -> undefined. %% @private %% @@ -602,154 +620,137 @@ validate_size(_) -> %% with `Reason'. There might be more than one because repair %% can have two simultaneous inbound xfers. kill_xfer_i(ModSrcTarget, Reason, HS) -> - case lists:keytake(ModSrcTarget, #handoff_status.mod_src_tgt, HS) of - false -> - HS; - {value, Xfer, HS2} -> - #handoff_status{mod_src_tgt={Mod, SrcPartition, TargetPartition}, - type=Type, - target_node=TargetNode, - src_node=SrcNode, - transport_pid=TP - } = Xfer, - Msg = "~p transfer of ~p from ~p ~p to ~p ~p killed for reason ~p", - case Type of - undefined -> - ok; - _ -> - logger:info(Msg, [Type, Mod, SrcNode, SrcPartition, - TargetNode, TargetPartition, Reason]) - end, - exit(TP, {kill_xfer, Reason}), - kill_xfer_i(ModSrcTarget, Reason, HS2) + case lists:keytake(ModSrcTarget, + #handoff_status.mod_src_tgt, HS) + of + false -> HS; + {value, Xfer, HS2} -> + #handoff_status{mod_src_tgt = + {Mod, SrcPartition, TargetPartition}, + type = Type, target_node = TargetNode, + src_node = SrcNode, transport_pid = TP} = + Xfer, + Msg = "~p transfer of ~p from ~p ~p to ~p ~p " + "killed for reason ~p", + case Type of + undefined -> ok; + _ -> + logger:info(Msg, + [Type, Mod, SrcNode, SrcPartition, TargetNode, + TargetPartition, Reason]) + end, + exit(TP, {kill_xfer, Reason}), + kill_xfer_i(ModSrcTarget, Reason, HS2) end. handoff_change_enabled_setting(EnOrDis, Direction) -> SetFun = case EnOrDis of - enable -> fun handoff_enable/1; - disable -> fun handoff_disable/1 + enable -> fun handoff_enable/1; + disable -> fun handoff_disable/1 end, case Direction of - inbound -> - SetFun(inbound); - outbound -> - SetFun(outbound); - both -> - SetFun(inbound), - SetFun(outbound) + inbound -> SetFun(inbound); + outbound -> SetFun(outbound); + both -> SetFun(inbound), SetFun(outbound) end. handoff_enable(inbound) -> - application:set_env(riak_core, disable_inbound_handoff, false); + application:set_env(riak_core, disable_inbound_handoff, + false); handoff_enable(outbound) -> - application:set_env(riak_core, disable_outbound_handoff, false). + application:set_env(riak_core, disable_outbound_handoff, + false). handoff_disable(inbound) -> - application:set_env(riak_core, disable_inbound_handoff, true), + application:set_env(riak_core, disable_inbound_handoff, + true), kill_handoffs_in_direction(inbound); handoff_disable(outbound) -> - application:set_env(riak_core, disable_outbound_handoff, true), + application:set_env(riak_core, disable_outbound_handoff, + true), kill_handoffs_in_direction(outbound). %%%=================================================================== %%% Tests %%%=================================================================== --ifdef (TEST). +-ifdef(TEST). -handoff_test_ () -> +handoff_test_() -> {spawn, {setup, - %% called when the tests start and complete... fun () -> {ok, ManPid} = start_link(), - {ok, RSupPid} = riak_core_handoff_receiver_sup:start_link(), - {ok, SSupPid} = riak_core_handoff_sender_sup:start_link(), + {ok, RSupPid} = + riak_core_handoff_receiver_sup:start_link(), + {ok, SSupPid} = + riak_core_handoff_sender_sup:start_link(), [ManPid, RSupPid, SSupPid] end, - fun (PidList) -> lists:foreach(fun(Pid) -> exit(Pid, kill) end, PidList) end, - + fun (PidList) -> + lists:foreach(fun (Pid) -> exit(Pid, kill) end, PidList) + end, %% actual list of test - [?_test(simple_handoff()), - ?_test(config_disable()) - ]}}. - -simple_handoff () -> - ?assertEqual([],status()), + [?_test((simple_handoff())), + ?_test((config_disable()))]}}. +simple_handoff() -> + ?assertEqual([], (status())), %% clear handoff_concurrency and make sure a handoff fails - ?assertEqual(ok,set_concurrency(0)), - ?assertEqual({error,max_concurrency},add_inbound()), - ?assertEqual({error,max_concurrency},add_outbound(ownership,riak_kv_vnode, 0,node(),self(),[])), - + ?assertEqual(ok, (set_concurrency(0))), + ?assertEqual({error, max_concurrency}, (add_inbound())), + ?assertEqual({error, max_concurrency}, + (add_outbound(ownership, riak_kv_vnode, 0, node(), + self(), []))), %% allow for a single handoff - ?assertEqual(ok,set_concurrency(1)), - + ?assertEqual(ok, (set_concurrency(1))), %% done ok. -config_disable () -> +config_disable() -> %% expect error log error_logger:tty(false), - - ?assertEqual(ok, handoff_enable(inbound)), - ?assertEqual(ok, handoff_enable(outbound)), - ?assertEqual(ok, set_concurrency(2)), - - ?assertEqual([], status()), - + ?assertEqual(ok, (handoff_enable(inbound))), + ?assertEqual(ok, (handoff_enable(outbound))), + ?assertEqual(ok, (set_concurrency(2))), + ?assertEqual([], (status())), Res = add_inbound(), ?assertMatch({ok, _}, Res), {ok, Pid} = Res, - - ?assertEqual(1, length(status())), - + ?assertEqual(1, (length(status()))), Ref = monitor(process, Pid), - - CatchDownFun = fun() -> + CatchDownFun = fun () -> receive - {'DOWN', Ref, process, Pid, max_concurrency} -> - ok; - Other -> - {error, unexpected_message, Other} - after - 1000 -> - {error, timeout_waiting_for_down_msg} + {'DOWN', Ref, process, Pid, max_concurrency} -> ok; + Other -> {error, unexpected_message, Other} + after 1000 -> {error, timeout_waiting_for_down_msg} end end, - - ?assertEqual(ok, handoff_disable(inbound)), - ?assertEqual(ok, CatchDownFun()), + ?assertEqual(ok, (handoff_disable(inbound))), + ?assertEqual(ok, (CatchDownFun())), %% We use wait_until because it's possible that the handoff manager process %% could get our call to status/0 before it receives the 'DOWN' message, %% so we periodically retry the call for a while until we get the answer we %% expect, or until we time out. - Status0 = fun() -> length(status()) =:= 0 end, - ?assertEqual(ok, wait_until(Status0, 500, 1)), - - - ?assertEqual({error, max_concurrency}, add_inbound()), - - ?assertEqual(ok, handoff_enable(inbound)), - ?assertEqual(ok, handoff_enable(outbound)), - ?assertEqual(0, length(status())), - - ?assertMatch({ok, _}, add_inbound()), - ?assertEqual(1, length(status())), + Status0 = fun () -> length(status()) =:= 0 end, + ?assertEqual(ok, (wait_until(Status0, 500, 1))), + ?assertEqual({error, max_concurrency}, (add_inbound())), + ?assertEqual(ok, (handoff_enable(inbound))), + ?assertEqual(ok, (handoff_enable(outbound))), + ?assertEqual(0, (length(status()))), + ?assertMatch({ok, _}, (add_inbound())), + ?assertEqual(1, (length(status()))), error_logger:tty(true). %% Copied from riak_test's rt.erl: wait_until(Fun, Retry, Delay) when Retry > 0 -> Res = Fun(), case Res of - true -> - ok; - _ when Retry == 1 -> - {fail, Res}; - _ -> - timer:sleep(Delay), - wait_until(Fun, Retry-1, Delay) + true -> ok; + _ when Retry == 1 -> {fail, Res}; + _ -> + timer:sleep(Delay), wait_until(Fun, Retry - 1, Delay) end. -endif. diff --git a/src/riak_core_handoff_receiver.erl b/src/riak_core_handoff_receiver.erl index 663a2b2c1..d6558297e 100644 --- a/src/riak_core_handoff_receiver.erl +++ b/src/riak_core_handoff_receiver.erl @@ -21,138 +21,156 @@ %% @doc incoming data handler for TCP-based handoff -module(riak_core_handoff_receiver). + -include("riak_core_handoff.hrl"). --behaviour(riak_core_gen_server). --export([start_link/0, - set_socket/2, + +-behaviour(gen_server). + +-export([start_link/0, set_socket/2, supports_batching/0]). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --record(state, {sock :: port() | undefined, - peer :: term(), - recv_timeout_len :: non_neg_integer(), - vnode_timeout_len :: non_neg_integer(), - partition :: non_neg_integer() | undefined, - vnode_mod = riak_kv_vnode:: module(), - vnode :: pid() | undefined, - count = 0 :: non_neg_integer()}). + +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). + +-record(state, + {sock :: port() | undefined, peer :: term(), + recv_timeout_len :: non_neg_integer(), + vnode_timeout_len :: non_neg_integer(), + partition :: non_neg_integer() | undefined, + vnode_mod = riak_kv_vnode :: module(), + vnode :: pid() | undefined, + count = 0 :: non_neg_integer()}). %% set the TCP receive timeout to five minutes to be conservative. -define(RECV_TIMEOUT, 300000). + %% set the timeout for the vnode to process the handoff_data msg to 60s -define(VNODE_TIMEOUT, 60000). --ifdef(deprecated_21). -ssl_handshake(Socket, SslOpts, Timeout) -> - ssl:handshake(Socket, SslOpts, Timeout). --else. -ssl_handshake(Socket, SslOpts, Timeout) -> - ssl:ssl_accept(Socket, SslOpts, Timeout). --endif. - -start_link() -> - riak_core_gen_server:start_link(?MODULE, [], []). +start_link() -> gen_server:start_link(?MODULE, [], []). set_socket(Pid, Socket) -> - riak_core_gen_server:call(Pid, {set_socket, Socket}). + gen_server:call(Pid, {set_socket, Socket}). -supports_batching() -> - true. +supports_batching() -> true. init([]) -> - {ok, #state{recv_timeout_len = application:get_env(riak_core, handoff_receive_timeout, ?RECV_TIMEOUT), - vnode_timeout_len = application:get_env(riak_core, handoff_receive_vnode_timeout, ?VNODE_TIMEOUT)}}. + {ok, + #state{recv_timeout_len = + application:get_env(riak_core, handoff_receive_timeout, + ?RECV_TIMEOUT), + vnode_timeout_len = + application:get_env(riak_core, + handoff_receive_vnode_timeout, + ?VNODE_TIMEOUT)}}. handle_call({set_socket, Socket0}, _From, State) -> SockOpts = [{active, once}, {packet, 4}, {header, 1}], ok = inet:setopts(Socket0, SockOpts), Peer = safe_peername(Socket0, inet), Socket = Socket0, - {reply, ok, State#state { sock = Socket, peer = Peer }}. - -handle_info({tcp_closed,_Socket},State=#state{partition=Partition,count=Count, - peer=Peer}) -> - logger:info("Handoff receiver for partition ~p exited after processing ~p" - " objects from ~p", [Partition, Count, Peer]), + {reply, ok, State#state{sock = Socket, peer = Peer}}. + +handle_info({tcp_closed, _Socket}, + State = #state{partition = Partition, count = Count, + peer = Peer}) -> + logger:info("Handoff receiver for partition ~p exited " + "after processing ~p objects from ~p", + [Partition, Count, Peer]), {stop, normal, State}; -handle_info({tcp_error, _Socket, Reason}, State=#state{partition=Partition,count=Count, - peer=Peer}) -> - logger:info("Handoff receiver for partition ~p exited after processing ~p" - " objects from ~p: TCP error ~p", [Partition, Count, Peer, Reason]), +handle_info({tcp_error, _Socket, Reason}, + State = #state{partition = Partition, count = Count, + peer = Peer}) -> + logger:info("Handoff receiver for partition ~p exited " + "after processing ~p objects from ~p: " + "TCP error ~p", + [Partition, Count, Peer, Reason]), {stop, normal, State}; handle_info({tcp, Socket, Data}, State) -> - [MsgType|MsgData] = Data, - case catch(process_message(MsgType, MsgData, State)) of - {'EXIT', Reason} -> - logger:error("Handoff receiver for partition ~p exited abnormally after " - "processing ~p objects from ~p: ~p", [State#state.partition, State#state.count, State#state.peer, Reason]), - {stop, normal, State}; - NewState when is_record(NewState, state) -> - InetMod = inet, - InetMod:setopts(Socket, [{active, once}]), - {noreply, NewState, State#state.recv_timeout_len} + [MsgType | MsgData] = Data, + case catch process_message(MsgType, MsgData, State) of + {'EXIT', Reason} -> + logger:error("Handoff receiver for partition ~p exited " + "abnormally after processing ~p objects " + "from ~p: ~p", + [State#state.partition, State#state.count, + State#state.peer, Reason]), + {stop, normal, State}; + NewState when is_record(NewState, state) -> + inet:setopts(Socket, [{active, once}]), + {noreply, NewState, State#state.recv_timeout_len} end; handle_info(timeout, State) -> - logger:error("Handoff receiver for partition ~p timed out after " - "processing ~p objects from ~p.", [State#state.partition, State#state.count, State#state.peer]), + logger:error("Handoff receiver for partition ~p timed " + "out after processing ~p objects from " + "~p.", + [State#state.partition, State#state.count, + State#state.peer]), {stop, normal, State}. -process_message(?PT_MSG_INIT, MsgData, State=#state{vnode_mod=VNodeMod, - peer=Peer}) -> +process_message(?PT_MSG_INIT, MsgData, + State = #state{vnode_mod = VNodeMod, peer = Peer}) -> <> = MsgData, - logger:info("Receiving handoff data for partition ~p:~p from ~p", [VNodeMod, Partition, Peer]), - {ok, VNode} = riak_core_vnode_master:get_vnode_pid(Partition, VNodeMod), + logger:info("Receiving handoff data for partition " + "~p:~p from ~p", + [VNodeMod, Partition, Peer]), + {ok, VNode} = + riak_core_vnode_master:get_vnode_pid(Partition, + VNodeMod), Data = [{mod_src_tgt, {VNodeMod, undefined, Partition}}, {vnode_pid, VNode}], riak_core_handoff_manager:set_recv_data(self(), Data), - State#state{partition=Partition, vnode=VNode}; - + State#state{partition = Partition, vnode = VNode}; process_message(?PT_MSG_BATCH, MsgData, State) -> - lists:foldl(fun(Obj, StateAcc) -> process_message(?PT_MSG_OBJ, Obj, StateAcc) end, - State, - binary_to_term(MsgData)); - -process_message(?PT_MSG_OBJ, MsgData, State=#state{vnode=VNode, count=Count, - vnode_timeout_len=VNodeTimeout}) -> - Msg = {handoff_data, MsgData}, - try gen_fsm:sync_send_all_state_event(VNode, Msg, VNodeTimeout) of - ok -> - State#state{count=Count+1}; - E={error, _} -> - exit(E) + lists:foldl(fun (Obj, StateAcc) -> + process_message(?PT_MSG_OBJ, Obj, StateAcc) + end, + State, binary_to_term(MsgData)); +process_message(?PT_MSG_OBJ, MsgData, + State = #state{vnode = VNode, count = Count, + vnode_timeout_len = VNodeTimeout}) -> + try riak_core_vnode:handoff_data(VNode, MsgData, + VNodeTimeout) + of + ok -> State#state{count = Count + 1}; + E = {error, _} -> exit(E) catch - exit:{timeout, _} -> - exit({error, {vnode_timeout, VNodeTimeout, size(MsgData), - binary:part(MsgData, {0,min(size(MsgData),128)})}}) + exit:{timeout, _} -> + exit({error, + {vnode_timeout, VNodeTimeout, size(MsgData), + binary:part(MsgData, {0, min(size(MsgData), 128)})}}) end; -process_message(?PT_MSG_OLDSYNC, MsgData, State=#state{sock=Socket}) -> - gen_tcp:send(Socket, <>), +process_message(?PT_MSG_OLDSYNC, MsgData, + State = #state{sock = Socket}) -> + gen_tcp:send(Socket, <<(?PT_MSG_OLDSYNC):8, "sync">>), <> = MsgData, VNodeMod = binary_to_atom(VNodeModBin, utf8), - State#state{vnode_mod=VNodeMod}; -process_message(?PT_MSG_SYNC, _MsgData, State=#state{sock=Socket}) -> - gen_tcp:send(Socket, <>), + State#state{vnode_mod = VNodeMod}; +process_message(?PT_MSG_SYNC, _MsgData, + State = #state{sock = Socket}) -> + gen_tcp:send(Socket, <<(?PT_MSG_SYNC):8, "sync">>), State; - -process_message(?PT_MSG_VERIFY_NODE, ExpectedName, State=#state{sock=Socket, - peer=Peer}) -> +process_message(?PT_MSG_VERIFY_NODE, ExpectedName, + State = #state{sock = Socket, peer = Peer}) -> case binary_to_term(ExpectedName) of - _Node when _Node =:= node() -> - gen_tcp:send(Socket, <>), - State; - Node -> - logger:error("Handoff from ~p expects us to be ~s but we are ~s.", - [Peer, Node, node()]), - exit({error, {wrong_node, Node}}) + _Node when _Node =:= node() -> + gen_tcp:send(Socket, <<(?PT_MSG_VERIFY_NODE):8>>), + State; + Node -> + logger:error("Handoff from ~p expects us to be ~s " + "but we are ~s.", + [Peer, Node, node()]), + exit({error, {wrong_node, Node}}) end; - process_message(?PT_MSG_CONFIGURE, MsgData, State) -> ConfProps = binary_to_term(MsgData), - State#state{vnode_mod=proplists:get_value(vnode_mod, ConfProps), - partition=proplists:get_value(partition, ConfProps)}; -process_message(_, _MsgData, State=#state{sock=Socket}) -> - gen_tcp:send(Socket, <>), + State#state{vnode_mod = + proplists:get_value(vnode_mod, ConfProps), + partition = proplists:get_value(partition, ConfProps)}; +process_message(_, _MsgData, + State = #state{sock = Socket}) -> + gen_tcp:send(Socket, + <<(?PT_MSG_UNKNOWN):8, "unknown_msg">>), State. handle_cast(_Msg, State) -> {noreply, State}. @@ -161,10 +179,10 @@ terminate(_Reason, _State) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. -safe_peername(Skt, Mod) -> - case Mod:peername(Skt) of - {ok, {Host, Port}} -> - {inet_parse:ntoa(Host), Port}; - _ -> - {unknown, unknown} % Real info is {Addr, Port} +safe_peername(Skt, Module) -> + case Module:peername(Skt) of + {ok, {Host, Port}} -> {inet_parse:ntoa(Host), Port}; + _ -> + {unknown, + unknown} % Real info is {Addr, Port} end. diff --git a/src/riak_core_handoff_receiver_sup.erl b/src/riak_core_handoff_receiver_sup.erl index 3f50f0e17..0a9402f10 100644 --- a/src/riak_core_handoff_receiver_sup.erl +++ b/src/riak_core_handoff_receiver_sup.erl @@ -19,6 +19,7 @@ %% ------------------------------------------------------------------- -module(riak_core_handoff_receiver_sup). + -behaviour(supervisor). %% beahvior functions @@ -27,18 +28,19 @@ %% public functions -export([start_receiver/0]). --define(CHILD(I,Type), {I,{I,start_link,[]},temporary,brutal_kill,Type,[I]}). +-define(CHILD(I, Type), + {I, {I, start_link, []}, temporary, brutal_kill, Type, + [I]}). %% begins the supervisor, init/1 will be called -start_link () -> - supervisor:start_link({local,?MODULE},?MODULE,[]). +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). %% @private -init ([]) -> - {ok,{{simple_one_for_one,10,10}, - [?CHILD(riak_core_handoff_receiver,worker) - ]}}. +init([]) -> + {ok, + {{simple_one_for_one, 10, 10}, + [?CHILD(riak_core_handoff_receiver, worker)]}}. %% start a sender process -start_receiver () -> - supervisor:start_child(?MODULE,[]). +start_receiver() -> supervisor:start_child(?MODULE, []). diff --git a/src/riak_core_handoff_sender.erl b/src/riak_core_handoff_sender.erl index ad0daa730..6da4f0a37 100644 --- a/src/riak_core_handoff_sender.erl +++ b/src/riak_core_handoff_sender.erl @@ -21,66 +21,62 @@ %% @doc send a partition's data via TCP-based handoff -module(riak_core_handoff_sender). + -export([start_link/4]). + -include("riak_core_vnode.hrl"). + -include("riak_core_handoff.hrl"). --include("stacktrace.hrl"). + -define(ACK_COUNT, 1000). + %% can be set with env riak_core, handoff_timeout -define(TCP_TIMEOUT, 60000). + %% can be set with env riak_core, handoff_status_interval %% note this is in seconds -define(STATUS_INTERVAL, 2). --define(log_info(Str, Args), - logger:info("~p transfer of ~p from ~p ~p to ~p ~p failed " ++ Str, - [Type, Module, SrcNode, SrcPartition, TargetNode, - TargetPartition] ++ Args)). --define(log_fail(Str, Args), - logger:error("~p transfer of ~p from ~p ~p to ~p ~p failed " ++ Str, +-define(LOG_INFO(Str, Args), + logger:info("~p transfer of ~p from ~p ~p to ~p ~p " + "failed " + ++ Str, [Type, Module, SrcNode, SrcPartition, TargetNode, - TargetPartition] ++ Args)). + TargetPartition] + ++ Args)). + +-define(LOG_FAIL(Str, Args), + logger:error("~p transfer of ~p from ~p ~p to ~p ~p " + "failed " + ++ Str, + [Type, Module, SrcNode, SrcPartition, TargetNode, + TargetPartition] + ++ Args)). %% Accumulator for the visit item HOF -record(ho_acc, - { - ack :: non_neg_integer(), - error :: ok | {error, any()}, - filter :: function(), - module :: module(), - parent :: pid(), - socket :: any(), - src_target :: {non_neg_integer(), non_neg_integer()}, - stats :: #ho_stats{}, - - total_objects :: non_neg_integer(), - total_bytes :: non_neg_integer(), - - use_batching :: boolean(), - - item_queue :: [binary()], - item_queue_length :: non_neg_integer(), - item_queue_byte_size :: non_neg_integer(), - - acksync_threshold :: non_neg_integer(), - acksync_timer :: timer:tref() | undefined, - - type :: ho_type(), - - notsent_acc :: term(), - notsent_fun :: function() | undefined - }). + {ack :: non_neg_integer(), + error :: ok | {error, any()}, filter :: function(), + module :: module(), parent :: pid(), socket :: any(), + src_target :: {non_neg_integer(), non_neg_integer()}, + stats :: #ho_stats{}, + total_objects :: non_neg_integer(), + total_bytes :: non_neg_integer(), + use_batching :: boolean(), item_queue :: [binary()], + item_queue_length :: non_neg_integer(), + item_queue_byte_size :: non_neg_integer(), + acksync_threshold :: non_neg_integer(), + acksync_timer :: timer:tref() | undefined, + type :: ho_type(), notsent_acc :: term(), + notsent_fun :: function() | undefined}). %%%=================================================================== %%% API %%%=================================================================== start_link(TargetNode, Module, {Type, Opts}, Vnode) -> - Pid = spawn_link(fun()->start_fold(TargetNode, - Module, - {Type, Opts}, - Vnode - ) + Pid = spawn_link(fun () -> + start_fold(TargetNode, Module, {Type, Opts}, Vnode) end), {ok, Pid}. @@ -88,29 +84,25 @@ start_link(TargetNode, Module, {Type, Opts}, Vnode) -> %%% Private %%%=================================================================== - -start_fold_(TargetNode, Module, Type, Opts, ParentPid, SrcNode, SrcPartition, TargetPartition) -> +start_fold_(TargetNode, Module, Type, Opts, ParentPid, + SrcNode, SrcPartition, TargetPartition) -> %% Give workers one more chance to abort or get a lock or whatever. - FoldOpts = maybe_call_handoff_started(Module, SrcPartition), - + FoldOpts = maybe_call_handoff_started(Module, + SrcPartition), Filter = get_filter(Opts), - [_Name,Host] = string:tokens(atom_to_list(TargetNode), "@"), + [_Name, Host] = string:tokens(atom_to_list(TargetNode), + "@"), {ok, Port} = get_handoff_port(TargetNode), - TNHandoffIP = - case get_handoff_ip(TargetNode) of - error -> - Host; - {ok, "0.0.0.0"} -> - Host; - {ok, Other} -> - Other - end, - SockOpts = [binary, {packet, 4}, {header,1}, {active, false}], - {ok, Socket} = gen_tcp:connect(TNHandoffIP, Port, SockOpts, 15000), - - + TNHandoffIP = case get_handoff_ip(TargetNode) of + error -> Host; + {ok, "0.0.0.0"} -> Host; + {ok, Other} -> Other + end, + SockOpts = [binary, {packet, 4}, {header, 1}, + {active, false}], + {ok, Socket} = gen_tcp:connect(TNHandoffIP, Port, + SockOpts, 15000), RecvTimeout = get_handoff_receive_timeout(), - %% We want to ensure that the node we think we are talking to %% really is the node we expect. %% The remote node will reply with PT_MSG_VERIFY_NODE if it @@ -118,30 +110,30 @@ start_fold_(TargetNode, Module, Type, Opts, ParentPid, SrcNode, SrcPartition, Ta %% If the node does not support this functionality we %% print an error and keep going with our fingers crossed. TargetBin = term_to_binary(TargetNode), - VerifyNodeMsg = <>, + VerifyNodeMsg = <<(?PT_MSG_VERIFY_NODE):8, + TargetBin/binary>>, ok = gen_tcp:send(Socket, VerifyNodeMsg), case gen_tcp:recv(Socket, 0, RecvTimeout) of - {ok,[?PT_MSG_VERIFY_NODE | _]} -> ok; - {ok,[?PT_MSG_UNKNOWN | _]} -> - logger:warning("Could not verify identity of peer ~s.", - [TargetNode]), - ok; - {error, timeout} -> exit({shutdown, timeout}); - {error, closed} -> exit({shutdown, wrong_node}) + {ok, [?PT_MSG_VERIFY_NODE | _]} -> ok; + {ok, [?PT_MSG_UNKNOWN | _]} -> + logger:warning("Could not verify identity of peer ~s.", + [TargetNode]), + ok; + {error, timeout} -> exit({shutdown, timeout}); + {error, closed} -> exit({shutdown, wrong_node}) end, - %% Piggyback the sync command from previous releases to send %% the vnode type across. If talking to older nodes they'll %% just do a sync, newer nodes will decode the module name. %% After 0.12.0 the calls can be switched to use PT_MSG_SYNC %% and PT_MSG_CONFIGURE - VMaster = list_to_atom(atom_to_list(Module) ++ "_master"), + VMaster = list_to_atom(atom_to_list(Module) ++ + "_master"), ModBin = atom_to_binary(Module, utf8), - Msg = <>, + Msg = <<(?PT_MSG_OLDSYNC):8, ModBin/binary>>, ok = gen_tcp:send(Socket, Msg), - - AckSyncThreshold = application:get_env(riak_core, handoff_acksync_threshold, 25), - + AckSyncThreshold = application:get_env(riak_core, + handoff_acksync_threshold, 25), %% Now that handoff_concurrency applies to both outbound and %% inbound conns there is a chance that the receiver may %% decide to reject the senders attempt to start a handoff. @@ -150,350 +142,318 @@ start_fold_(TargetNode, Module, Type, Opts, ParentPid, SrcNode, SrcPartition, Ta %% socket at this point is a rejection by the receiver to %% enforce handoff_concurrency. case gen_tcp:recv(Socket, 0, RecvTimeout) of - {ok,[?PT_MSG_OLDSYNC|<<"sync">>]} -> ok; - {error, timeout} -> exit({shutdown, timeout}); - {error, closed} -> exit({shutdown, max_concurrency}) + {ok, [?PT_MSG_OLDSYNC | <<"sync">>]} -> ok; + {error, timeout} -> exit({shutdown, timeout}); + {error, closed} -> exit({shutdown, max_concurrency}) end, - - RemoteSupportsBatching = remote_supports_batching(TargetNode), - - logger:info("Starting ~p transfer of ~p from ~p ~p to ~p ~p", - [Type, Module, SrcNode, SrcPartition, - TargetNode, TargetPartition]), - - M = <>, + RemoteSupportsBatching = + remote_supports_batching(TargetNode), + logger:info("Starting ~p transfer of ~p from ~p ~p " + "to ~p ~p", + [Type, Module, SrcNode, SrcPartition, TargetNode, + TargetPartition]), + M = <<(?PT_MSG_INIT):8, TargetPartition:160/integer>>, ok = gen_tcp:send(Socket, M), StartFoldTime = os:timestamp(), - Stats = #ho_stats{interval_end=future_now(get_status_interval())}, + Stats = #ho_stats{interval_end = + future_now(get_status_interval())}, UnsentAcc0 = get_notsent_acc0(Opts), UnsentFun = get_notsent_fun(Opts), - - Req = riak_core_util:make_fold_req( - fun visit_item/3, - #ho_acc{ack=0, - error=ok, - filter=Filter, - module=Module, - parent=ParentPid, - socket=Socket, - src_target={SrcPartition, TargetPartition}, - stats=Stats, - - total_bytes=0, - total_objects=0, - - use_batching=RemoteSupportsBatching, - - item_queue=[], - item_queue_length=0, - item_queue_byte_size=0, - - acksync_threshold=AckSyncThreshold, - - type=Type, - notsent_acc=UnsentAcc0, - notsent_fun=UnsentFun}, - false, - FoldOpts), + Req = riak_core_util:make_fold_req(fun visit_item/3, + #ho_acc{ack = 0, error = ok, + filter = Filter, module = Module, + parent = ParentPid, + socket = Socket, + src_target = + {SrcPartition, + TargetPartition}, + stats = Stats, total_bytes = 0, + total_objects = 0, + use_batching = + RemoteSupportsBatching, + item_queue = [], + item_queue_length = 0, + item_queue_byte_size = 0, + acksync_threshold = + AckSyncThreshold, + type = Type, + notsent_acc = UnsentAcc0, + notsent_fun = UnsentFun}, + false, FoldOpts), %% IFF the vnode is using an async worker to perform the fold %% then sync_command will return error on vnode crash, %% otherwise it will wait forever but vnode crash will be %% caught by handoff manager. I know, this is confusing, a %% new handoff system will be written soon enough. - - AccRecord0 = case riak_core_vnode_master:sync_command( - {SrcPartition, SrcNode}, Req, VMaster, infinity) of - #ho_acc{} = Ret -> - Ret; - Ret -> - logger:error("[handoff] Bad handoff record: ~p", - [Ret]), - Ret + AccRecord0 = case + riak_core_vnode_master:sync_command({SrcPartition, + SrcNode}, + Req, VMaster, infinity) + of + #ho_acc{} = Ret -> Ret; + Ret -> + logger:error("[handoff] Bad handoff record: ~p", [Ret]), + Ret end, %% Send any straggler entries remaining in the buffer: - AccRecord = send_objects(AccRecord0#ho_acc.item_queue, AccRecord0), - + AccRecord = send_objects(AccRecord0#ho_acc.item_queue, + AccRecord0), if AccRecord == {error, vnode_shutdown} -> - ?log_info("because the local vnode was shutdown", []), - throw({be_quiet, error, local_vnode_shutdown_requested}); + ?LOG_INFO("because the local vnode was shutdown", []), + throw({be_quiet, error, + local_vnode_shutdown_requested}); true -> - ok % If not #ho_acc, get badmatch below + ok % If not #ho_acc, get badmatch below end, - #ho_acc{ - error=ErrStatus, - module=Module, - parent=ParentPid, - total_objects=TotalObjects, - total_bytes=TotalBytes, - stats=FinalStats, - acksync_timer=TRef, - notsent_acc=NotSentAcc} = AccRecord, - + #ho_acc{error = ErrStatus, module = Module, + parent = ParentPid, total_objects = TotalObjects, + total_bytes = TotalBytes, stats = FinalStats, + acksync_timer = TRef, notsent_acc = NotSentAcc} = + AccRecord, _ = timer:cancel(TRef), case ErrStatus of - ok -> - %% One last sync to make sure the message has been received. - %% post-0.14 vnodes switch to handoff to forwarding immediately - %% so handoff_complete can only be sent once all of the data is - %% written. handle_handoff_data is a sync call, so once - %% we receive the sync the remote side will be up to date. - logger:debug("~p ~p Sending final sync", - [SrcPartition, Module]), - ok = gen_tcp:send(Socket, <>), - - case gen_tcp:recv(Socket, 0, RecvTimeout) of - {ok,[?PT_MSG_SYNC|<<"sync">>]} -> - logger:debug("~p ~p Final sync received", - [SrcPartition, Module]); - {error, timeout} -> exit({shutdown, timeout}) - end, - - FoldTimeDiff = end_fold_time(StartFoldTime), - ThroughputBytes = TotalBytes/FoldTimeDiff, - - ok = logger:info("~p transfer of ~p from ~p ~p to ~p ~p" - " completed: sent ~p bytes in ~p of ~p objects" - " in ~p seconds (~p/second)", - [Type, Module, SrcNode, SrcPartition, TargetNode, TargetPartition, - TotalBytes, - FinalStats#ho_stats.objs, TotalObjects, FoldTimeDiff, - ThroughputBytes]), - case Type of - repair -> ok; - resize -> gen_fsm_compat:send_event(ParentPid, {resize_transfer_complete, - NotSentAcc}); - _ -> gen_fsm_compat:send_event(ParentPid, handoff_complete) - end; - {error, ErrReason} -> - if ErrReason == timeout -> - exit({shutdown, timeout}); - true -> - exit({shutdown, {error, ErrReason}}) - end + ok -> + %% One last sync to make sure the message has been received. + %% post-0.14 vnodes switch to handoff to forwarding immediately + %% so handoff_complete can only be sent once all of the data is + %% written. handle_handoff_data is a sync call, so once + %% we receive the sync the remote side will be up to date. + logger:debug("~p ~p Sending final sync", + [SrcPartition, Module]), + ok = gen_tcp:send(Socket, <<(?PT_MSG_SYNC):8>>), + case gen_tcp:recv(Socket, 0, RecvTimeout) of + {ok, [?PT_MSG_SYNC | <<"sync">>]} -> + logger:debug("~p ~p Final sync received", + [SrcPartition, Module]); + {error, timeout} -> exit({shutdown, timeout}) + end, + FoldTimeDiff = end_fold_time(StartFoldTime), + ThroughputBytes = TotalBytes / FoldTimeDiff, + ok = + logger:info("~p transfer of ~p from ~p ~p to ~p ~p " + "completed: sent ~p bytes in ~p of ~p " + "objects in ~p seconds (~p/second)", + [Type, Module, SrcNode, SrcPartition, TargetNode, + TargetPartition, TotalBytes, + FinalStats#ho_stats.objs, TotalObjects, FoldTimeDiff, + ThroughputBytes]), + case Type of + repair -> ok; + resize -> + riak_core_vnode:resize_transfer_complete(ParentPid, + NotSentAcc); + _ -> riak_core_vnode:handoff_complete(ParentPid) + end; + {error, ErrReason} -> + if ErrReason == timeout -> exit({shutdown, timeout}); + true -> exit({shutdown, {error, ErrReason}}) + end end. -start_fold(TargetNode, Module, {Type, Opts}, ParentPid) -> +start_fold(TargetNode, Module, {Type, Opts}, + ParentPid) -> SrcNode = node(), SrcPartition = get_src_partition(Opts), TargetPartition = get_target_partition(Opts), - try - start_fold_(TargetNode, Module, Type, Opts, ParentPid, SrcNode, SrcPartition, TargetPartition) + try start_fold_(TargetNode, Module, Type, Opts, + ParentPid, SrcNode, SrcPartition, TargetPartition) catch - exit:{shutdown,max_concurrency} -> - %% Need to fwd the error so the handoff mgr knows - exit({shutdown, max_concurrency}); - exit:{shutdown, timeout} -> - %% A receive timeout during handoff - %% STATS -%% riak_core_stat:update(handoff_timeouts), - ?log_fail("because of TCP recv timeout", []), - exit({shutdown, timeout}); - exit:{shutdown, {error, Reason}} -> - ?log_fail("because of ~p", [Reason]), - gen_fsm:send_event(ParentPid, {handoff_error, - fold_error, Reason}), - exit({shutdown, {error, Reason}}); - throw:{be_quiet, Err, Reason} -> - gen_fsm_compat:send_event(ParentPid, {handoff_error, Err, Reason}); - Err:Reason:Stacktrace -> - ?log_fail("because of ~p:~p ~p", - [Err, Reason, Stacktrace]), - gen_fsm_compat:send_event(ParentPid, {handoff_error, Err, Reason}) - end. + exit:{shutdown, max_concurrency} -> + %% Need to fwd the error so the handoff mgr knows + exit({shutdown, max_concurrency}); + exit:{shutdown, timeout} -> + %% A receive timeout during handoff + %% STATS + %% riak_core_stat:update(handoff_timeouts), + ?LOG_FAIL("because of TCP recv timeout", []), + exit({shutdown, timeout}); + exit:{shutdown, {error, Reason}} -> + ?LOG_FAIL("because of ~p", [Reason]), + riak_core_vnode:handoff_error(ParentPid, fold_error, + Reason), + exit({shutdown, {error, Reason}}); + {be_quiet, Err, Reason} -> + riak_core_vnode:handoff_error(ParentPid, Err, Reason); + Err:Reason:Stacktrace -> + ?LOG_FAIL("because of ~p:~p ~p", + [Err, Reason, Stacktrace]), + riak_core_vnode:handoff_error(ParentPid, Err, Reason) + end. start_visit_item_timer() -> - Ival = case application:get_env(riak_core, handoff_receive_timeout, undefined) of - TO when is_integer(TO) -> - erlang:max(1000, TO div 3); - _ -> - 60*1000 + Ival = case application:get_env(riak_core, + handoff_receive_timeout, undefined) + of + TO when is_integer(TO) -> erlang:max(1000, TO div 3); + _ -> 60 * 1000 end, timer:send_interval(Ival, tick_send_sync). -visit_item(K, V, Acc0 = #ho_acc{acksync_threshold = AccSyncThreshold}) -> +visit_item(K, V, + Acc0 = #ho_acc{acksync_threshold = AccSyncThreshold}) -> %% Eventually, a vnode worker proc will be doing this fold, but we don't %% know the pid of that proc ahead of time. So we have to start the %% timer some time after the fold has started execution on that proc %% ... like now, perhaps. Acc = case get(is_visit_item_timer_set) of - undefined -> - put(is_visit_item_timer_set, true), - {ok, TRef} = start_visit_item_timer(), - Acc0#ho_acc{acksync_timer = TRef}; - _ -> - Acc0 + undefined -> + put(is_visit_item_timer_set, true), + {ok, TRef} = start_visit_item_timer(), + Acc0#ho_acc{acksync_timer = TRef}; + _ -> Acc0 end, receive - tick_send_sync -> - visit_item2(K, V, Acc#ho_acc{ack = AccSyncThreshold}) - after 0 -> - visit_item2(K, V, Acc) + tick_send_sync -> + visit_item2(K, V, Acc#ho_acc{ack = AccSyncThreshold}) + after 0 -> visit_item2(K, V, Acc) end. %% When a tcp error occurs, the ErrStatus argument is set to {error, Reason}. %% Since we can't abort the fold, this clause is just a no-op. -visit_item2(_K, _V, Acc=#ho_acc{error={error, _Reason}}) -> +visit_item2(_K, _V, + Acc = #ho_acc{error = {error, _Reason}}) -> %% When a TCP error occurs, #ho_acc.error is set to {error, Reason}. throw(Acc); -visit_item2(K, V, Acc = #ho_acc{ack = _AccSyncThreshold, acksync_threshold = _AccSyncThreshold}) -> - #ho_acc{module=Module, - socket=Sock, - src_target={SrcPartition, TargetPartition}, - stats=Stats - } = Acc, - +visit_item2(K, V, + Acc = #ho_acc{ack = _AccSyncThreshold, + acksync_threshold = _AccSyncThreshold}) -> + #ho_acc{module = Module, socket = Sock, + src_target = {SrcPartition, TargetPartition}, + stats = Stats} = + Acc, RecvTimeout = get_handoff_receive_timeout(), - M = <>, + M = <<(?PT_MSG_OLDSYNC):8, "sync">>, NumBytes = byte_size(M), - Stats2 = incr_bytes(Stats, NumBytes), - Stats3 = maybe_send_status({Module, SrcPartition, TargetPartition}, Stats2), - + Stats3 = maybe_send_status({Module, SrcPartition, + TargetPartition}, + Stats2), case gen_tcp:send(Sock, M) of - ok -> - case gen_tcp:recv(Sock, 0, RecvTimeout) of - {ok,[?PT_MSG_OLDSYNC|<<"sync">>]} -> - Acc2 = Acc#ho_acc{ack=0, error=ok, stats=Stats3}, - visit_item2(K, V, Acc2); - {error, Reason} -> - Acc#ho_acc{ack=0, error={error, Reason}, stats=Stats3} - end; - {error, Reason} -> - Acc#ho_acc{ack=0, error={error, Reason}, stats=Stats3} + ok -> + case gen_tcp:recv(Sock, 0, RecvTimeout) of + {ok, [?PT_MSG_OLDSYNC | <<"sync">>]} -> + Acc2 = Acc#ho_acc{ack = 0, error = ok, stats = Stats3}, + visit_item2(K, V, Acc2); + {error, Reason} -> + Acc#ho_acc{ack = 0, error = {error, Reason}, + stats = Stats3} + end; + {error, Reason} -> + Acc#ho_acc{ack = 0, error = {error, Reason}, + stats = Stats3} end; visit_item2(K, V, Acc) -> - #ho_acc{filter=Filter, - module=Module, - total_objects=TotalObjects, - use_batching=UseBatching, - item_queue=ItemQueue, - item_queue_length=ItemQueueLength, - item_queue_byte_size=ItemQueueByteSize, - notsent_fun=NotSentFun, - notsent_acc=NotSentAcc} = Acc, + #ho_acc{filter = Filter, module = Module, + total_objects = TotalObjects, + use_batching = UseBatching, item_queue = ItemQueue, + item_queue_length = ItemQueueLength, + item_queue_byte_size = ItemQueueByteSize, + notsent_fun = NotSentFun, notsent_acc = NotSentAcc} = + Acc, case Filter(K) of - true -> - case Module:encode_handoff_item(K, V) of - corrupted -> - {Bucket, Key} = K, - logger:warning("Unreadable object ~p/~p discarded", - [Bucket, Key]), - Acc; - BinObj -> - - case UseBatching of - true -> - ItemQueue2 = [BinObj | ItemQueue], - ItemQueueLength2 = ItemQueueLength + 1, - ItemQueueByteSize2 = ItemQueueByteSize + byte_size(BinObj), - - Acc2 = Acc#ho_acc{item_queue_length=ItemQueueLength2, - item_queue_byte_size=ItemQueueByteSize2}, - - %% Unit size is bytes: - HandoffBatchThreshold = application:get_env(riak_core, - handoff_batch_threshold, - 1024*1024), - - case ItemQueueByteSize2 =< HandoffBatchThreshold of - true -> Acc2#ho_acc{item_queue=ItemQueue2}; - false -> send_objects(ItemQueue2, Acc2) - end; - _ -> - #ho_acc{ack=Ack, - socket=Sock, - src_target={SrcPartition, TargetPartition}, - stats=Stats, - total_objects=TotalObjects, - total_bytes=TotalBytes} = Acc, - M = <>, - NumBytes = byte_size(M), - - Stats2 = incr_bytes(incr_objs(Stats), NumBytes), - Stats3 = maybe_send_status({Module, SrcPartition, - TargetPartition}, Stats2), - - case gen_tcp:send(Sock, M) of - ok -> - Acc#ho_acc{ack=Ack+1, - error=ok, - stats=Stats3, - total_bytes=TotalBytes+NumBytes, - total_objects=TotalObjects+1}; - {error, Reason} -> - Acc#ho_acc{error={error, Reason}, stats=Stats3} - end - end - end; - false -> - NewNotSentAcc = handle_not_sent_item(NotSentFun, NotSentAcc, K), - Acc#ho_acc{error=ok, - total_objects=TotalObjects+1, - notsent_acc=NewNotSentAcc} + true -> + case Module:encode_handoff_item(K, V) of + corrupted -> + {Bucket, Key} = K, + logger:warning("Unreadable object ~p/~p discarded", + [Bucket, Key]), + Acc; + BinObj -> + case UseBatching of + true -> + ItemQueue2 = [BinObj | ItemQueue], + ItemQueueLength2 = ItemQueueLength + 1, + ItemQueueByteSize2 = ItemQueueByteSize + + byte_size(BinObj), + Acc2 = Acc#ho_acc{item_queue_length = ItemQueueLength2, + item_queue_byte_size = + ItemQueueByteSize2}, + %% Unit size is bytes: + HandoffBatchThreshold = application:get_env(riak_core, + handoff_batch_threshold, + 1024 * 1024), + case ItemQueueByteSize2 =< HandoffBatchThreshold of + true -> Acc2#ho_acc{item_queue = ItemQueue2}; + false -> send_objects(ItemQueue2, Acc2) + end; + _ -> + #ho_acc{ack = Ack, socket = Sock, + src_target = {SrcPartition, TargetPartition}, + stats = Stats, total_objects = TotalObjects, + total_bytes = TotalBytes} = + Acc, + M = <<(?PT_MSG_OBJ):8, BinObj/binary>>, + NumBytes = byte_size(M), + Stats2 = incr_bytes(incr_objs(Stats), NumBytes), + Stats3 = maybe_send_status({Module, SrcPartition, + TargetPartition}, + Stats2), + case gen_tcp:send(Sock, M) of + ok -> + Acc#ho_acc{ack = Ack + 1, error = ok, + stats = Stats3, + total_bytes = TotalBytes + NumBytes, + total_objects = TotalObjects + 1}; + {error, Reason} -> + Acc#ho_acc{error = {error, Reason}, stats = Stats3} + end + end + end; + false -> + NewNotSentAcc = handle_not_sent_item(NotSentFun, + NotSentAcc, K), + Acc#ho_acc{error = ok, total_objects = TotalObjects + 1, + notsent_acc = NewNotSentAcc} end. -handle_not_sent_item(NotSentFun, Acc, Key) when is_function(NotSentFun) -> - NotSentFun(Key, Acc); -handle_not_sent_item(undefined, _, _) -> - undefined. +handle_not_sent_item(undefined, _, _) -> undefined; +handle_not_sent_item(NotSentFun, Acc, Key) + when is_function(NotSentFun) -> + NotSentFun(Key, Acc). -send_objects([], Acc) -> - Acc; +send_objects([], Acc) -> Acc; send_objects(ItemsReverseList, Acc) -> - Items = lists:reverse(ItemsReverseList), - - #ho_acc{ack=Ack, - module=Module, - socket=Sock, - src_target={SrcPartition, TargetPartition}, - stats=Stats, - - total_objects=TotalObjects, - total_bytes=TotalBytes, - item_queue_length=NObjects - } = Acc, - + #ho_acc{ack = Ack, module = Module, socket = Sock, + src_target = {SrcPartition, TargetPartition}, + stats = Stats, total_objects = TotalObjects, + total_bytes = TotalBytes, + item_queue_length = NObjects} = + Acc, ObjectList = term_to_binary(Items), - - M = <>, - + M = <<(?PT_MSG_BATCH):8, ObjectList/binary>>, NumBytes = byte_size(M), - - Stats2 = incr_bytes(incr_objs(Stats, NObjects), NumBytes), - Stats3 = maybe_send_status({Module, SrcPartition, TargetPartition}, Stats2), - + Stats2 = incr_bytes(incr_objs(Stats, NObjects), + NumBytes), + Stats3 = maybe_send_status({Module, SrcPartition, + TargetPartition}, + Stats2), case gen_tcp:send(Sock, M) of - ok -> - Acc#ho_acc{ack=Ack+1, error=ok, stats=Stats3, - total_objects=TotalObjects+NObjects, - total_bytes=TotalBytes+NumBytes, - item_queue=[], - item_queue_length=0, - item_queue_byte_size=0}; - {error, Reason} -> - Acc#ho_acc{error={error, Reason}, stats=Stats3} + ok -> + Acc#ho_acc{ack = Ack + 1, error = ok, stats = Stats3, + total_objects = TotalObjects + NObjects, + total_bytes = TotalBytes + NumBytes, item_queue = [], + item_queue_length = 0, item_queue_byte_size = 0}; + {error, Reason} -> + Acc#ho_acc{error = {error, Reason}, stats = Stats3} end. get_handoff_ip(Node) when is_atom(Node) -> - case riak_core_util:safe_rpc(Node, riak_core_handoff_listener, get_handoff_ip, [], - infinity) of - {badrpc, _} -> - error; - Res -> - Res + case riak_core_util:safe_rpc(Node, + riak_core_handoff_listener, get_handoff_ip, [], + infinity) + of + {badrpc, _} -> error; + Res -> Res end. get_handoff_port(Node) when is_atom(Node) -> - case catch(riak_core_gen_server:call({riak_core_handoff_listener, Node}, handoff_port, infinity)) of - {'EXIT', _} -> - %% Check old location from previous release - riak_core_gen_server:call({riak_kv_handoff_listener, Node}, handoff_port, infinity); - Other -> Other - end. + gen_server:call({riak_core_handoff_listener, Node}, + handoff_port, infinity). get_handoff_receive_timeout() -> - application:get_env(riak_core, handoff_timeout, ?TCP_TIMEOUT). + application:get_env(riak_core, handoff_timeout, + ?TCP_TIMEOUT). end_fold_time(StartFoldTime) -> EndFoldTime = os:timestamp(), @@ -504,6 +464,7 @@ end_fold_time(StartFoldTime) -> %% @doc Produce the value of `now/0' as if it were called `S' seconds %% in the future. -spec future_now(pos_integer()) -> erlang:timestamp(). + future_now(S) -> {Megas, Secs, Micros} = os:timestamp(), {Megas, Secs + S, Micros}. @@ -512,46 +473,54 @@ future_now(S) -> %% %% @doc Check if the given timestamp `TS' has elapsed. -spec is_elapsed(erlang:timestamp()) -> boolean(). -is_elapsed(TS) -> - os:timestamp() >= TS. + +is_elapsed(TS) -> os:timestamp() >= TS. %% @private %% %% @doc Increment `Stats' byte count by `NumBytes'. --spec incr_bytes(ho_stats(), non_neg_integer()) -> NewStats::ho_stats(). -incr_bytes(Stats=#ho_stats{bytes=Bytes}, NumBytes) -> - Stats#ho_stats{bytes=Bytes + NumBytes}. +-spec incr_bytes(ho_stats(), + non_neg_integer()) -> NewStats :: ho_stats(). + +incr_bytes(Stats = #ho_stats{bytes = Bytes}, + NumBytes) -> + Stats#ho_stats{bytes = Bytes + NumBytes}. -incr_objs(Stats) -> - incr_objs(Stats, 1). +incr_objs(Stats) -> incr_objs(Stats, 1). %% @private %% %% @doc Increment `Stats' object count by NObjs: --spec incr_objs(ho_stats(), non_neg_integer()) -> NewStats::ho_stats(). -incr_objs(Stats=#ho_stats{objs=Objs}, NObjs) -> - Stats#ho_stats{objs=Objs+NObjs}. +-spec incr_objs(ho_stats(), + non_neg_integer()) -> NewStats :: ho_stats(). + +incr_objs(Stats = #ho_stats{objs = Objs}, NObjs) -> + Stats#ho_stats{objs = Objs + NObjs}. %% @private %% %% @doc Check if the interval has elapsed and if so send handoff stats %% for `ModSrcTgt' to the manager and return a new stats record %% `NetStats'. --spec maybe_send_status({module(), non_neg_integer(), non_neg_integer()}, - ho_stats()) -> - NewStats::ho_stats(). -maybe_send_status(ModSrcTgt, Stats=#ho_stats{interval_end=IntervalEnd}) -> +-spec maybe_send_status({module(), non_neg_integer(), + non_neg_integer()}, + ho_stats()) -> NewStats :: ho_stats(). + +maybe_send_status(ModSrcTgt, + Stats = #ho_stats{interval_end = IntervalEnd}) -> case is_elapsed(IntervalEnd) of - true -> - Stats2 = Stats#ho_stats{last_update=os:timestamp()}, - riak_core_handoff_manager:status_update(ModSrcTgt, Stats2), - #ho_stats{interval_end=future_now(get_status_interval())}; - false -> - Stats + true -> + Stats2 = Stats#ho_stats{last_update = os:timestamp()}, + riak_core_handoff_manager:status_update(ModSrcTgt, + Stats2), + #ho_stats{interval_end = + future_now(get_status_interval())}; + false -> Stats end. get_status_interval() -> - application:get_env(riak_core, handoff_status_interval, ?STATUS_INTERVAL). + application:get_env(riak_core, handoff_status_interval, + ?STATUS_INTERVAL). get_src_partition(Opts) -> proplists:get_value(src_partition, Opts). @@ -564,15 +533,16 @@ get_notsent_acc0(Opts) -> get_notsent_fun(Opts) -> case proplists:get_value(notsent_fun, Opts) of - none -> fun(_, _) -> undefined end; - Fun -> Fun + none -> fun (_, _) -> undefined end; + Fun -> Fun end. -spec get_filter(proplists:proplist()) -> predicate(). + get_filter(Opts) -> case proplists:get_value(filter, Opts) of - none -> fun(_) -> true end; - Filter -> Filter + none -> fun (_) -> true end; + Filter -> Filter end. %% @private @@ -581,17 +551,17 @@ get_filter(Opts) -> %% otherwise fall back to the slower, object-at-a-time path remote_supports_batching(Node) -> - case catch rpc:call(Node, riak_core_handoff_receiver, - supports_batching, []) of - true -> - logger:debug("remote node supports batching, enabling"), - true; - _ -> - %% whatever the problem here, just revert to the old behavior - %% which shouldn't matter too much for any single handoff - logger:debug("remote node doesn't support batching"), - false + supports_batching, []) + of + true -> + logger:debug("remote node supports batching, enabling"), + true; + _ -> + %% whatever the problem here, just revert to the old behavior + %% which shouldn't matter too much for any single handoff + logger:debug("remote node doesn't support batching"), + false end. %% @private @@ -604,20 +574,20 @@ remote_supports_batching(Node) -> %% decision to cancel the handoff or not e.g. get a lock on behalf of %% the process. maybe_call_handoff_started(Module, SrcPartition) -> - case lists:member({handoff_started, 2}, Module:module_info(exports)) of - true -> - WorkerPid = self(), - case Module:handoff_started(SrcPartition, WorkerPid) of - {ok, FoldOpts} -> - FoldOpts; - {error, max_concurrency} -> - %% Handoff of that partition is busy or can't proceed. Stopping with - %% max_concurrency will cause this partition to be retried again later. - exit({shutdown, max_concurrency}); - {error, Error} -> - exit({shutdown, Error}) - end; - false -> - %% optional callback not implemented, so we carry on, w/ no addition fold options - [] + case lists:member({handoff_started, 2}, + Module:module_info(exports)) + of + true -> + WorkerPid = self(), + case Module:handoff_started(SrcPartition, WorkerPid) of + {ok, FoldOpts} -> FoldOpts; + {error, max_concurrency} -> + %% Handoff of that partition is busy or can't proceed. Stopping with + %% max_concurrency will cause this partition to be retried again later. + exit({shutdown, max_concurrency}); + {error, Error} -> exit({shutdown, Error}) + end; + false -> + %% optional callback not implemented, so we carry on, w/ no addition fold options + [] end. diff --git a/src/riak_core_handoff_sender_sup.erl b/src/riak_core_handoff_sender_sup.erl index 0b485f3b8..cbb503c0d 100644 --- a/src/riak_core_handoff_sender_sup.erl +++ b/src/riak_core_handoff_sender_sup.erl @@ -19,25 +19,27 @@ %% ------------------------------------------------------------------- -module(riak_core_handoff_sender_sup). + -behaviour(supervisor). %% callbacks --export([start_link/0, - init/1 - ]). +-export([start_link/0, init/1]). %% API -export([start_sender/5]). -include("riak_core_handoff.hrl"). --define(CHILD(I,Type), {I,{I,start_link,[]},temporary,brutal_kill,Type,[I]}). + +-define(CHILD(I, Type), + {I, {I, start_link, []}, temporary, brutal_kill, Type, + [I]}). %%%=================================================================== %%% API %%%=================================================================== start_link() -> - supervisor:start_link({local,?MODULE},?MODULE,[]). + supervisor:start_link({local, ?MODULE}, ?MODULE, []). %% @doc Start the handoff process for the module (`Module'), partition %% (`Partition'), and vnode (`VNode') from the local node to the @@ -53,16 +55,19 @@ start_link() -> %% for each unsent key. %% * unsent_acc0 - optional. The intial accumulator value passed to unsent_fun %% for the first unsent key --spec start_sender(ho_type(), atom(), term(), pid(), [{atom(), term()}]) -> {ok, pid()}. +-spec start_sender(ho_type(), atom(), term(), pid(), + [{atom(), term()}]) -> {ok, pid()}. + start_sender(Type, Module, TargetNode, VNode, Opts) -> - supervisor:start_child(?MODULE, [TargetNode, Module, {Type, Opts}, VNode]). + supervisor:start_child(?MODULE, + [TargetNode, Module, {Type, Opts}, VNode]). %%%=================================================================== %%% Callbacks %%%=================================================================== %% @private -init ([]) -> - {ok,{{simple_one_for_one,10,10}, - [?CHILD(riak_core_handoff_sender,worker) - ]}}. +init([]) -> + {ok, + {{simple_one_for_one, 10, 10}, + [?CHILD(riak_core_handoff_sender, worker)]}}. diff --git a/src/riak_core_handoff_sup.erl b/src/riak_core_handoff_sup.erl index 06fdfa65d..518f89eaf 100644 --- a/src/riak_core_handoff_sup.erl +++ b/src/riak_core_handoff_sup.erl @@ -19,24 +19,25 @@ %% ------------------------------------------------------------------- -module(riak_core_handoff_sup). + -behaviour(supervisor). %% beahvior functions --export([start_link/0, - init/1 - ]). +-export([start_link/0, init/1]). --define(CHILD(I,Type), {I,{I,start_link,[]},permanent,brutal_kill,Type,[I]}). +-define(CHILD(I, Type), + {I, {I, start_link, []}, permanent, brutal_kill, Type, + [I]}). %% begins the supervisor, init/1 will be called -start_link () -> - supervisor:start_link({local,?MODULE},?MODULE,[]). +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). %% @private -init ([]) -> - {ok,{{one_for_all,10,10}, - [?CHILD(riak_core_handoff_receiver_sup,supervisor), - ?CHILD(riak_core_handoff_sender_sup,supervisor), - ?CHILD(riak_core_handoff_listener_sup,supervisor), - ?CHILD(riak_core_handoff_manager,worker) - ]}}. +init([]) -> + {ok, + {{one_for_all, 10, 10}, + [?CHILD(riak_core_handoff_receiver_sup, supervisor), + ?CHILD(riak_core_handoff_sender_sup, supervisor), + ?CHILD(riak_core_handoff_listener_sup, supervisor), + ?CHILD(riak_core_handoff_manager, worker)]}}. diff --git a/src/riak_core_mochiglobal.erl b/src/riak_core_mochiglobal.erl deleted file mode 100644 index c7fde0027..000000000 --- a/src/riak_core_mochiglobal.erl +++ /dev/null @@ -1,107 +0,0 @@ -%% @author Bob Ippolito -%% @copyright 2010 Mochi Media, Inc. -%% @doc Abuse module constant pools as a "read-only shared heap" (since erts 5.6) -%% [1]. --module(riak_core_mochiglobal). --author("Bob Ippolito "). --export([get/1, get/2, put/2, delete/1]). - --spec get(atom()) -> any() | undefined. -%% @equiv get(K, undefined) -get(K) -> - get(K, undefined). - --spec get(atom(), T) -> any() | T. -%% @doc Get the term for K or return Default. -get(K, Default) -> - get(K, Default, key_to_module(K)). - -get(_K, Default, Mod) -> - try Mod:term() - catch error:undef -> - Default - end. - --spec put(atom(), any()) -> ok. -%% @doc Store term V at K, replaces an existing term if present. -put(K, V) -> - put(K, V, key_to_module(K)). - -put(_K, V, Mod) -> - Bin = compile(Mod, V), - code:purge(Mod), - {module, Mod} = code:load_binary(Mod, atom_to_list(Mod) ++ ".erl", Bin), - ok. - --spec delete(atom()) -> boolean(). -%% @doc Delete term stored at K, no-op if non-existent. -delete(K) -> - delete(K, key_to_module(K)). - -delete(_K, Mod) -> - code:purge(Mod), - code:delete(Mod). - --spec key_to_module(atom()) -> atom(). -key_to_module(K) -> - list_to_atom("mochiglobal:" ++ atom_to_list(K)). - --spec compile(atom(), any()) -> binary(). -compile(Module, T) -> - {ok, Module, Bin} = compile:forms(forms(Module, T), - [verbose, report_errors]), - Bin. - --spec forms(atom(), any()) -> [erl_syntax:syntaxTree()]. -forms(Module, T) -> - [erl_syntax:revert(X) || X <- term_to_abstract(Module, term, T)]. - --spec term_to_abstract(atom(), atom(), any()) -> [erl_syntax:syntaxTree()]. -term_to_abstract(Module, Getter, T) -> - [%% -module(Module). - erl_syntax:attribute( - erl_syntax:atom(module), - [erl_syntax:atom(Module)]), - %% -export([Getter/0]). - erl_syntax:attribute( - erl_syntax:atom(export), - [erl_syntax:list( - [erl_syntax:arity_qualifier( - erl_syntax:atom(Getter), - erl_syntax:integer(0))])]), - %% Getter() -> T. - erl_syntax:function( - erl_syntax:atom(Getter), - [erl_syntax:clause([], none, [erl_syntax:abstract(T)])])]. - -%% -%% Tests -%% --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). -get_put_delete_test() -> - K = '$$test$$mochiglobal', - delete(K), - ?assertEqual( - bar, - get(K, bar)), - try - ?MODULE:put(K, baz), - ?assertEqual( - baz, - get(K, bar)), - ?MODULE:put(K, wibble), - ?assertEqual( - wibble, - ?MODULE:get(K)) - after - delete(K) - end, - ?assertEqual( - bar, - get(K, bar)), - ?assertEqual( - undefined, - ?MODULE:get(K)), - ok. --endif. diff --git a/src/riak_core_node_watcher.erl b/src/riak_core_node_watcher.erl index 21c4fc46e..eecd1c345 100644 --- a/src/riak_core_node_watcher.erl +++ b/src/riak_core_node_watcher.erl @@ -24,78 +24,85 @@ -behaviour(gen_server). -define(DEFAULT_HEALTH_CHECK_INTERVAL, 60000). + %% API --export([start_link/0, - service_up/2, - service_up/3, - service_up/4, - check_health/1, - suspend_health_checks/0, - resume_health_checks/0, - service_down/1, - service_down/2, - node_up/0, - node_down/0, - services/0, services/1, +-export([start_link/0, service_up/2, service_up/3, + service_up/4, check_health/1, suspend_health_checks/0, + resume_health_checks/0, service_down/1, service_down/2, + node_up/0, node_down/0, services/0, services/1, nodes/1]). %% TEST API -ifdef(TEST). --export([avsn/0, - set_broadcast_module/2]). +-ifdef(PROPER). + +-compile(export_all). + +-endif. + +-export([avsn/0, set_broadcast_module/2]). -endif. -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --record(state, { status = up, - services = [], - health_checks = [], - healths_enabled = true, - peers = [], - avsn = 0, - bcast_tref, - bcast_mod = {gen_server, abcast}}). - --record(health_check, { state = 'waiting' :: 'waiting' | 'checking' | 'suspend', - callback :: {atom(), atom(), [any()]}, - service_pid :: pid(), - checking_pid :: pid() | undefined, - health_failures = 0 :: non_neg_integer(), - callback_failures = 0 :: non_neg_integer(), - interval_tref, - %% how many milliseconds to wait after a check has - %% finished before starting a new one - check_interval = ?DEFAULT_HEALTH_CHECK_INTERVAL :: timeout(), - max_callback_failures = 3, - max_health_failures = 1 }). +%% gen_server callbacks +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). + +-record(state, + {status = up, services = [], health_checks = [], + healths_enabled = true, peers = [], avsn = 0, + bcast_tref, bcast_mod = {gen_server, abcast}}). + +-record(health_check, + {state = waiting :: waiting | checking | suspend, + callback :: {atom(), atom(), [any()]}, + service_pid :: pid(), + checking_pid :: pid() | undefined, + health_failures = 0 :: non_neg_integer(), + callback_failures = 0 :: non_neg_integer(), + interval_tref, + %% how many milliseconds to wait after a check has + %% finished before starting a new one + check_interval = ?DEFAULT_HEALTH_CHECK_INTERVAL :: + timeout(), + max_callback_failures = 3, max_health_failures = 1}). %% =================================================================== %% Public API %% =================================================================== start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, [], + []). service_up(Id, Pid) -> - gen_server:call(?MODULE, {service_up, Id, Pid}, infinity). + gen_server:call(?MODULE, {service_up, Id, Pid}, + infinity). %% @doc {@link service_up/4} with default options. %% @see service_up/4 --spec service_up(Id :: atom(), Pid :: pid(), MFA :: mfa()) -> 'ok'. +-spec service_up(Id :: atom(), Pid :: pid(), + MFA :: mfa()) -> ok. + service_up(Id, Pid, MFA) -> service_up(Id, Pid, MFA, []). --type hc_check_interval_opt() :: {check_interval, timeout()}. --type hc_max_callback_fails_opt() :: {max_callback_failures, non_neg_integer()}. --type hc_max_health_fails_opt() :: {max_health_failures, non_neg_integer()}. +-type hc_check_interval_opt() :: {check_interval, + timeout()}. + +-type + hc_max_callback_fails_opt() :: {max_callback_failures, + non_neg_integer()}. + +-type hc_max_health_fails_opt() :: {max_health_failures, + non_neg_integer()}. + -type health_opt() :: hc_check_interval_opt() | - hc_max_callback_fails_opt() | - hc_max_health_fails_opt(). + hc_max_callback_fails_opt() | hc_max_health_fails_opt(). + -type health_opts() :: [health_opt()]. + %% @doc Create a service that can be declared up or down based on the %% result of a function in addition to usual monitoring. The function can %% be set to be called automatically every interval, or only explicitly. @@ -113,21 +120,24 @@ service_up(Id, Pid, MFA) -> %% of the argument list provided. A service added this way is removed like %% any other, using {@link service_down/1}. %% @see service_up/2 --spec service_up(Id :: atom(), Pid :: pid(), Callback :: mfa(), - Options :: health_opts()) -> 'ok'. -service_up(Id, Pid, {Module, Function, Args}, Options) -> +-spec service_up(Id :: atom(), Pid :: pid(), + Callback :: mfa(), Options :: health_opts()) -> ok. + +service_up(Id, Pid, {Module, Function, Args}, + Options) -> gen_server:call(?MODULE, - {service_up, Id, Pid, {Module, Function, Args}, Options}, + {service_up, Id, Pid, {Module, Function, Args}, + Options}, infinity). %% @doc Force a health check for the given service. If the service does %% not have a health check associated with it, this is ignored. Resets the %% automatic health check timer if there is one. %% @see service_up/4 --spec check_health(Service :: atom()) -> 'ok'. +-spec check_health(Service :: atom()) -> ok. + check_health(Service) -> - ?MODULE ! {check_health, Service}, - ok. + (?MODULE) ! {check_health, Service}, ok. suspend_health_checks() -> gen_server:call(?MODULE, suspend_healths, infinity). @@ -139,9 +149,9 @@ service_down(Id) -> gen_server:call(?MODULE, {service_down, Id}, infinity). service_down(Id, true) -> - gen_server:call(?MODULE, {service_down, Id, health_check}, infinitiy); -service_down(Id, false) -> - service_down(Id). + gen_server:call(?MODULE, + {service_down, Id, health_check}, infinitiy); +service_down(Id, false) -> service_down(Id). node_up() -> gen_server:call(?MODULE, {node_status, up}, infinity). @@ -154,15 +164,11 @@ services() -> services(Node) -> case check_node_valid(Node) of - true -> - internal_get_services(Node); - _ -> - invalid_node + true -> internal_get_services(Node); + _ -> invalid_node end. -nodes(Service) -> - internal_get_nodes(Service). - +nodes(Service) -> internal_get_nodes(Service). %% =================================================================== %% Test API @@ -170,11 +176,11 @@ nodes(Service) -> -ifdef(TEST). -avsn() -> - gen_server:call(?MODULE, get_avsn, infinity). +avsn() -> gen_server:call(?MODULE, get_avsn, infinity). set_broadcast_module(Module, Fn) -> - gen_server:call(?MODULE, {set_bcast_mod, Module, Fn}, infinity). + gen_server:call(?MODULE, {set_bcast_mod, Module, Fn}, + infinity). -endif. @@ -185,195 +191,182 @@ set_broadcast_module(Module, Fn) -> init([]) -> %% Trap exits so that terminate/2 will get called process_flag(trap_exit, true), - %% Setup callback notification for ring changes; note that we use the %% supervised variation so that the callback gets removed if this process %% exits watch_for_ring_events(), - %% Watch for node up/down events ok = net_kernel:monitor_nodes(true), - %% Setup ETS table to track node status - ?MODULE = ets:new(?MODULE, [protected, {read_concurrency, true}, named_table]), - + (?MODULE) = ets:new(?MODULE, + [protected, {read_concurrency, true}, named_table]), {ok, schedule_broadcast(#state{})}. -handle_call({set_bcast_mod, Module, Fn}, _From, State) -> +handle_call({set_bcast_mod, Module, Fn}, _From, + State) -> %% Call available for swapping out how broadcasts are generated - {reply, ok, State#state {bcast_mod = {Module, Fn}}}; - + {reply, ok, State#state{bcast_mod = {Module, Fn}}}; handle_call(get_avsn, _From, State) -> {reply, State#state.avsn, State}; - handle_call({service_up, Id, Pid}, _From, State) -> %% remove any existing health checks S2 = remove_health_check(Id, State), - S3 = add_service(Id, Pid, S2), - {reply, ok, S3}; - -handle_call({service_up, Id, Pid, MFA, Options}, From, State) -> +handle_call({service_up, Id, Pid, MFA, Options}, From, + State) -> %% update the active set of services if needed. - {reply, _, State1} = handle_call({service_up, Id, Pid}, From, State), - + {reply, _, State1} = handle_call({service_up, Id, Pid}, + From, State), State2 = remove_health_check(Id, State1), - - case application:get_env(riak_core, enable_health_checks, true) of - true -> - %% install the health check - CheckInterval = proplists:get_value(check_interval, Options, - ?DEFAULT_HEALTH_CHECK_INTERVAL), - IntervalTref = case CheckInterval of - infinity -> undefined; - N -> erlang:send_after(N, self(), {check_health, Id}) - end, - CheckRec = #health_check{ - callback = MFA, - check_interval = CheckInterval, - service_pid = Pid, - max_health_failures = proplists:get_value(max_health_failures, Options, 1), - max_callback_failures = proplists:get_value(max_callback_failures, Options, 3), - interval_tref = IntervalTref - }, - Healths = orddict:store(Id, CheckRec, State2#state.health_checks); - false -> - Healths = State2#state.health_checks + case application:get_env(riak_core, + enable_health_checks, true) + of + true -> + %% install the health check + CheckInterval = proplists:get_value(check_interval, + Options, + ?DEFAULT_HEALTH_CHECK_INTERVAL), + IntervalTref = case CheckInterval of + infinity -> undefined; + N -> erlang:send_after(N, self(), {check_health, Id}) + end, + CheckRec = #health_check{callback = MFA, + check_interval = CheckInterval, + service_pid = Pid, + max_health_failures = + proplists:get_value(max_health_failures, + Options, 1), + max_callback_failures = + proplists:get_value(max_callback_failures, + Options, 3), + interval_tref = IntervalTref}, + Healths = orddict:store(Id, CheckRec, + State2#state.health_checks); + false -> Healths = State2#state.health_checks end, - {reply, ok, State2#state{health_checks = Healths}}; - handle_call({service_down, Id}, _From, State) -> %% Remove health check if any S2 = remove_health_check(Id, State), - S3 = drop_service(Id, S2), - - {reply, ok, S3}; - + {reply, ok, S3}; handle_call({node_status, Status}, _From, State) -> Transition = {State#state.status, Status}, S2 = case Transition of - {up, down} -> %% up -> down - case State#state.healths_enabled of - true -> - Healths = all_health_fsms(suspend, State#state.health_checks); - false -> - Healths = State#state.health_checks - end, - local_delete(State#state { status = down, health_checks = Healths}); - - {down, up} -> %% down -> up - case State#state.healths_enabled of - true -> - Healths = all_health_fsms(resume, State#state.health_checks); - false -> - Healths = State#state.health_checks - end, - local_update(State#state { status = up, health_checks = Healths }); - - {Status, Status} -> %% noop - State - end, + {up, down} -> %% up -> down + case State#state.healths_enabled of + true -> + Healths = all_health_fsms(suspend, + State#state.health_checks); + false -> Healths = State#state.health_checks + end, + local_delete(State#state{status = down, + health_checks = Healths}); + {down, up} -> %% down -> up + case State#state.healths_enabled of + true -> + Healths = all_health_fsms(resume, + State#state.health_checks); + false -> Healths = State#state.health_checks + end, + local_update(State#state{status = up, + health_checks = Healths}); + {Status, Status} -> %% noop + State + end, {reply, ok, update_avsn(S2)}; handle_call(services, _From, State) -> - Res = [Service || {{by_service, Service}, Nds} <- ets:tab2list(?MODULE), - Nds /= []], + Res = [Service + || {{by_service, Service}, Nds} + <- ets:tab2list(?MODULE), + Nds /= []], {reply, lists:sort(Res), State}; -handle_call(suspend_healths, _From, State = #state{healths_enabled=false}) -> +handle_call(suspend_healths, _From, + State = #state{healths_enabled = false}) -> {reply, already_disabled, State}; -handle_call(suspend_healths, _From, State = #state{healths_enabled=true}) -> +handle_call(suspend_healths, _From, + State = #state{healths_enabled = true}) -> logger:info("suspending all health checks"), - Healths = all_health_fsms(suspend, State#state.health_checks), - {reply, ok, update_avsn(State#state{health_checks = Healths, healths_enabled = false})}; -handle_call(resume_healths, _From, State = #state{healths_enabled=true}) -> + Healths = all_health_fsms(suspend, + State#state.health_checks), + {reply, ok, + update_avsn(State#state{health_checks = Healths, + healths_enabled = false})}; +handle_call(resume_healths, _From, + State = #state{healths_enabled = true}) -> {reply, already_enabled, State}; -handle_call(resume_healths, _From, State = #state{healths_enabled=false}) -> +handle_call(resume_healths, _From, + State = #state{healths_enabled = false}) -> logger:info("resuming all health checks"), - Healths = all_health_fsms(resume, State#state.health_checks), - {reply, ok, update_avsn(State#state{health_checks = Healths, healths_enabled = true})}. - + Healths = all_health_fsms(resume, + State#state.health_checks), + {reply, ok, + update_avsn(State#state{health_checks = Healths, + healths_enabled = true})}. handle_cast({ring_update, R}, State) -> %% Ring has changed; determine what peers are new to us %% and broadcast out current status to those peers. - Peers0 = ordsets:from_list(riak_core_ring:all_members(R)), + Peers0 = + ordsets:from_list(riak_core_ring:all_members(R)), Peers = ordsets:del_element(node(), Peers0), - S2 = peers_update(Peers, State), {noreply, update_avsn(S2)}; - handle_cast({up, Node, Services}, State) -> S2 = node_up(Node, Services, State), {noreply, update_avsn(S2)}; - handle_cast({down, Node}, State) -> - node_down(Node, State), - {noreply, update_avsn(State)}; - + node_down(Node, State), {noreply, update_avsn(State)}; handle_cast({health_check_result, Pid, R}, State) -> Service = erlang:erase(Pid), - State2 = handle_check_msg({result, Pid, R}, Service, State), + State2 = handle_check_msg({result, Pid, R}, Service, + State), {noreply, State2}. handle_info({nodeup, _Node}, State) -> %% Ignore node up events; nothing to do here... {noreply, State}; - handle_info({nodedown, Node}, State) -> - node_down(Node, State), - {noreply, update_avsn(State)}; - + node_down(Node, State), {noreply, update_avsn(State)}; handle_info({'DOWN', Mref, _, _Pid, _Info}, State) -> %% A sub-system monitored process has terminated. Identify %% the sub-system in question and notify our peers. case erlang:get(Mref) of - undefined -> - %% No entry found for this monitor; ignore the message - {noreply, update_avsn(State)}; - - Id -> - %% Remove the id<->mref entries in the pdict - delete_service_mref(Id), - - %% remove any health checks in place - S2 = remove_health_check(Id, State), - - %% Update our list of active services and ETS table - Services = ordsets:del_element(Id, State#state.services), - S3 = local_update(S2#state { services = Services }), - {noreply, update_avsn(S3)} + undefined -> + %% No entry found for this monitor; ignore the message + {noreply, update_avsn(State)}; + Id -> + %% Remove the id<->mref entries in the pdict + delete_service_mref(Id), + %% remove any health checks in place + S2 = remove_health_check(Id, State), + %% Update our list of active services and ETS table + Services = ordsets:del_element(Id, + State#state.services), + S3 = local_update(S2#state{services = Services}), + {noreply, update_avsn(S3)} end; - handle_info({'EXIT', Pid, _Cause} = Msg, State) -> Service = erlang:erase(Pid), State2 = handle_check_msg(Msg, Service, State), {noreply, State2}; - handle_info({check_health, Id}, State) -> State2 = handle_check_msg(check_health, Id, State), {noreply, State2}; - handle_info({gen_event_EXIT, _, _}, State) -> %% Ring event handler has been removed for some reason; re-register watch_for_ring_events(), {noreply, update_avsn(State)}; - handle_info(broadcast, State) -> - S2 = broadcast(State#state.peers, State), - {noreply, S2}. - + S2 = broadcast(State#state.peers, State), {noreply, S2}. terminate(_Reason, State) -> %% Let our peers know that we are shutting down - broadcast(State#state.peers, State#state { status = down }). - - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - + broadcast(State#state.peers, + State#state{status = down}). +code_change(_OldVsn, State, _Extra) -> {ok, State}. %% ==================================================================== %% Internal functions @@ -385,98 +378,81 @@ check_node_valid(Node) -> lists:member(Node, Members). update_avsn(State) -> - State#state { avsn = State#state.avsn + 1 }. + State#state{avsn = State#state.avsn + 1}. watch_for_ring_events() -> Self = self(), - Fn = fun(R) -> - gen_server:cast(Self, {ring_update, R}) + Fn = fun (R) -> gen_server:cast(Self, {ring_update, R}) end, riak_core_ring_events:add_sup_callback(Fn). delete_service_mref(Id) -> %% Cleanup the monitor if one exists case erlang:get(Id) of - undefined -> - ok; - Mref -> - erlang:erase(Mref), - erlang:erase(Id), - erlang:demonitor(Mref) + undefined -> ok; + Mref -> + erlang:erase(Mref), + erlang:erase(Id), + erlang:demonitor(Mref) end. - broadcast(Nodes, State) -> - case (State#state.status) of - up -> - Msg = {up, node(), State#state.services}; - down -> - Msg = {down, node()} + case State#state.status of + up -> Msg = {up, node(), State#state.services}; + down -> Msg = {down, node()} end, - {Mod, Fn} = State#state.bcast_mod, - Mod:Fn(Nodes, ?MODULE, Msg), + {Module, Fn} = State#state.bcast_mod, + Module:Fn(Nodes, ?MODULE, Msg), schedule_broadcast(State). schedule_broadcast(State) -> - case (State#state.bcast_tref) of - undefined -> - ok; - OldTref -> - _ = erlang:cancel_timer(OldTref), - ok + case State#state.bcast_tref of + undefined -> ok; + OldTref -> _ = erlang:cancel_timer(OldTref), ok end, - {ok, Interval} = application:get_env(riak_core, gossip_interval), + {ok, Interval} = application:get_env(riak_core, + gossip_interval), Tref = erlang:send_after(Interval, self(), broadcast), - State#state { bcast_tref = Tref }. + State#state{bcast_tref = Tref}. is_peer(Node, State) -> ordsets:is_element(Node, State#state.peers). -is_node_up(Node) -> - ets:member(?MODULE, Node). - +is_node_up(Node) -> ets:member(?MODULE, Node). node_up(Node, Services, State) -> case is_peer(Node, State) of - true -> - %% Before we alter the ETS table, see if this node was previously - %% down. In that situation, we'll go ahead and broadcast out. - S2 = case is_node_up(Node) of - false -> - broadcast([Node], State); - true -> - State - end, - - case node_update(Node, Services) of - [] -> - ok; - AffectedServices -> - riak_core_node_watcher_events:service_update(AffectedServices) - end, - S2; - - false -> - State + true -> + %% Before we alter the ETS table, see if this node was previously + %% down. In that situation, we'll go ahead and broadcast out. + S2 = case is_node_up(Node) of + false -> broadcast([Node], State); + true -> State + end, + case node_update(Node, Services) of + [] -> ok; + AffectedServices -> + riak_core_node_watcher_events:service_update(AffectedServices) + end, + S2; + false -> State end. node_down(Node, State) -> case is_peer(Node, State) of - true -> - case node_delete(Node) of - [] -> - ok; - AffectedServices -> - riak_core_node_watcher_events:service_update(AffectedServices) - end; - false -> - ok + true -> + case node_delete(Node) of + [] -> ok; + AffectedServices -> + riak_core_node_watcher_events:service_update(AffectedServices) + end; + false -> ok end. - node_delete(Node) -> Services = internal_get_services(Node), - _ = [internal_delete(Node, Service) || Service <- Services], + _ = [internal_delete(Node, Service) + || Service <- Services], ets:delete(?MODULE, Node), Services. @@ -485,172 +461,163 @@ node_update(Node, Services) -> %% know and determine what's changed (if anything). Now = riak_core_util:moment(), NewStatus = ordsets:from_list(Services), - OldStatus = ordsets:from_list(internal_get_services(Node)), - - Added = ordsets:subtract(NewStatus, OldStatus), - Deleted = ordsets:subtract(OldStatus, NewStatus), - + OldStatus = + ordsets:from_list(internal_get_services(Node)), + Added = ordsets:subtract(NewStatus, OldStatus), + Deleted = ordsets:subtract(OldStatus, NewStatus), %% Update ets table with changes; make sure to touch unchanged %% service with latest timestamp _ = [internal_delete(Node, Ss) || Ss <- Deleted], _ = [internal_insert(Node, Ss) || Ss <- Added], - %% Keep track of the last time we recv'd data from a node ets:insert(?MODULE, {Node, Now}), - %% Return the list of affected services (added or deleted) ordsets:union(Added, Deleted). -local_update(#state { status = down } = State) -> +local_update(#state{status = down} = State) -> %% Ignore subsystem changes when we're marked as down State; local_update(State) -> %% Update our local ETS table case node_update(node(), State#state.services) of - [] -> - %% No material changes; no local notification necessary - ok; - - AffectedServices -> - %% Generate a local notification about the affected services and - %% also broadcast our status - riak_core_node_watcher_events:service_update(AffectedServices) + [] -> + %% No material changes; no local notification necessary + ok; + AffectedServices -> + %% Generate a local notification about the affected services and + %% also broadcast our status + riak_core_node_watcher_events:service_update(AffectedServices) end, broadcast(State#state.peers, State). local_delete(State) -> case node_delete(node()) of - [] -> - %% No services changed; no local notification required - ok; - - AffectedServices -> - riak_core_node_watcher_events:service_update(AffectedServices) + [] -> + %% No services changed; no local notification required + ok; + AffectedServices -> + riak_core_node_watcher_events:service_update(AffectedServices) end, broadcast(State#state.peers, State). peers_update(NewPeers, State) -> %% Identify what peers have been added and deleted - Added = ordsets:subtract(NewPeers, State#state.peers), + Added = ordsets:subtract(NewPeers, State#state.peers), Deleted = ordsets:subtract(State#state.peers, NewPeers), - %% For peers that have been deleted, remove their entries from %% the ETS table; we no longer care about their status - Services0 = (lists:foldl(fun(Node, Acc) -> - S = node_delete(Node), - S ++ Acc - end, [], Deleted)), + Services0 = lists:foldl(fun (Node, Acc) -> + S = node_delete(Node), S ++ Acc + end, + [], Deleted), Services = ordsets:from_list(Services0), - %% Notify local parties if any services are affected by this change case Services of - [] -> - ok; - _ -> - riak_core_node_watcher_events:service_update(Services) + [] -> ok; + _ -> + riak_core_node_watcher_events:service_update(Services) end, - %% Broadcast our current status to new peers - broadcast(Added, State#state { peers = NewPeers }). + broadcast(Added, State#state{peers = NewPeers}). internal_delete(Node, Service) -> Svcs = internal_get_services(Node), - ets:insert(?MODULE, {{by_node, Node}, Svcs -- [Service]}), + ets:insert(?MODULE, + {{by_node, Node}, Svcs -- [Service]}), Nds = internal_get_nodes(Service), - ets:insert(?MODULE, {{by_service, Service}, Nds -- [Node]}). + ets:insert(?MODULE, + {{by_service, Service}, Nds -- [Node]}). internal_insert(Node, Service) -> %% Remove Service & node before adding: avoid accidental duplicates Svcs = internal_get_services(Node) -- [Service], - ets:insert(?MODULE, {{by_node, Node}, [Service|Svcs]}), + ets:insert(?MODULE, + {{by_node, Node}, [Service | Svcs]}), Nds = internal_get_nodes(Service) -- [Node], - ets:insert(?MODULE, {{by_service, Service}, [Node|Nds]}). + ets:insert(?MODULE, + {{by_service, Service}, [Node | Nds]}). internal_get_services(Node) -> case ets:lookup(?MODULE, {by_node, Node}) of - [{{by_node, Node}, Ss}] -> - Ss; - [] -> - [] + [{{by_node, Node}, Ss}] -> Ss; + [] -> [] end. internal_get_nodes(Service) -> case ets:lookup(?MODULE, {by_service, Service}) of - [{{by_service, Service}, Ns}] -> - Ns; - [] -> - [] + [{{by_service, Service}, Ns}] -> Ns; + [] -> [] end. add_service(ServiceId, Pid, State) -> %% Update the set of active services locally - Services = ordsets:add_element(ServiceId, State#state.services), - S2 = State#state { services = Services }, - + Services = ordsets:add_element(ServiceId, + State#state.services), + S2 = State#state{services = Services}, %% Remove any existing mrefs for this service delete_service_mref(ServiceId), - %% Setup a monitor for the Pid representing this service Mref = erlang:monitor(process, Pid), erlang:put(Mref, ServiceId), erlang:put(ServiceId, Mref), - %% Update our local ETS table and broadcast S3 = local_update(S2), update_avsn(S3). drop_service(ServiceId, State) -> %% Update the set of active services locally - Services = ordsets:del_element(ServiceId, State#state.services), - S2 = State#state { services = Services }, - + Services = ordsets:del_element(ServiceId, + State#state.services), + S2 = State#state{services = Services}, %% Remove any existing mrefs for this service delete_service_mref(ServiceId), - %% Update local ETS table and broadcast S3 = local_update(S2), - update_avsn(S3). -handle_check_msg(_Msg, undefined, State) -> - State; -handle_check_msg(_Msg, _ServiceId, #state{status = down} = State) -> +handle_check_msg(_Msg, undefined, State) -> State; +handle_check_msg(_Msg, _ServiceId, + #state{status = down} = State) -> %% most likely a late message State; handle_check_msg(Msg, ServiceId, State) -> - case orddict:find(ServiceId, State#state.health_checks) of - error -> - State; - {ok, Check} -> - CheckReturn = health_fsm(Msg, ServiceId, Check), - handle_check_return(CheckReturn, ServiceId, State) + case orddict:find(ServiceId, State#state.health_checks) + of + error -> State; + {ok, Check} -> + CheckReturn = health_fsm(Msg, ServiceId, Check), + handle_check_return(CheckReturn, ServiceId, State) end. -handle_check_return({remove, _Check}, ServiceId, State) -> - Healths = orddict:erase(ServiceId, State#state.health_checks), +handle_check_return({remove, _Check}, ServiceId, + State) -> + Healths = orddict:erase(ServiceId, + State#state.health_checks), State#state{health_checks = Healths}; handle_check_return({ok, Check}, ServiceId, State) -> - Healths = orddict:store(ServiceId, Check, State#state.health_checks), + Healths = orddict:store(ServiceId, Check, + State#state.health_checks), State#state{health_checks = Healths}; handle_check_return({up, Check}, ServiceId, State) -> #health_check{service_pid = Pid} = Check, - Healths = orddict:store(ServiceId, Check, State#state.health_checks), + Healths = orddict:store(ServiceId, Check, + State#state.health_checks), S2 = State#state{health_checks = Healths}, add_service(ServiceId, Pid, S2); handle_check_return({down, Check}, ServiceId, State) -> - Healths = orddict:store(ServiceId, Check, State#state.health_checks), + Healths = orddict:store(ServiceId, Check, + State#state.health_checks), S2 = State#state{health_checks = Healths}, drop_service(ServiceId, S2). remove_health_check(ServiceId, State) -> #state{health_checks = Healths} = State, Healths2 = case orddict:find(ServiceId, Healths) of - error -> - Healths; - {ok, Check} -> - {_, _} = health_fsm(remove, ServiceId, Check), - orddict:erase(ServiceId, Healths) - end, + error -> Healths; + {ok, Check} -> + {_, _} = health_fsm(remove, ServiceId, Check), + orddict:erase(ServiceId, Healths) + end, State#state{health_checks = Healths2}. %% health checks are an fsm to make mental modeling easier. @@ -664,157 +631,167 @@ remove_health_check(ServiceId, State) -> %% remove health check %% health check finished -health_fsm(Msg, Service, #health_check{state = StateName} = Check) -> - {Reply, NextState, Check2} = health_fsm(StateName, Msg, Service, Check), +health_fsm(Msg, Service, + #health_check{state = StateName} = Check) -> + {Reply, NextState, Check2} = health_fsm(StateName, Msg, + Service, Check), Check3 = Check2#health_check{state = NextState}, {Reply, Check3}. %% suspend state health_fsm(suspend, resume, Service, InCheck) -> - #health_check{health_failures = N, check_interval = V} = InCheck, + #health_check{health_failures = N, check_interval = V} = + InCheck, Tref = next_health_tref(N, V, Service), - OutCheck = InCheck#health_check{ - interval_tref = Tref - }, + OutCheck = InCheck#health_check{interval_tref = Tref}, {ok, waiting, OutCheck}; - health_fsm(suspend, remove, _Service, InCheck) -> {remove, suspend, InCheck}; - %% message handling when checking state health_fsm(checking, suspend, _Service, InCheck) -> #health_check{checking_pid = Pid} = InCheck, erlang:erase(Pid), - {ok, suspend, InCheck#health_check{checking_pid = undefined}}; - + {ok, suspend, + InCheck#health_check{checking_pid = undefined}}; health_fsm(checking, check_health, _Service, InCheck) -> {ok, checking, InCheck}; - health_fsm(checking, remove, _Service, InCheck) -> {remove, checking, InCheck}; - -health_fsm(checking, {result, Pid, Cause}, Service, #health_check{checking_pid = Pid} = InCheck) -> +health_fsm(checking, {result, Pid, Cause}, Service, + #health_check{checking_pid = Pid} = InCheck) -> %% handle result from checking pid - #health_check{health_failures = HPFails, max_health_failures = HPMaxFails} = InCheck, - {Reply, HPFails1} = handle_fsm_exit(Cause, HPFails, HPMaxFails), - Tref = next_health_tref(HPFails1, InCheck#health_check.check_interval, Service), - OutCheck = InCheck#health_check{ - checking_pid = undefined, - health_failures = HPFails1, - callback_failures = 0, - interval_tref = Tref - }, + #health_check{health_failures = HPFails, + max_health_failures = HPMaxFails} = + InCheck, + {Reply, HPFails1} = handle_fsm_exit(Cause, HPFails, + HPMaxFails), + Tref = next_health_tref(HPFails1, + InCheck#health_check.check_interval, Service), + OutCheck = InCheck#health_check{checking_pid = + undefined, + health_failures = HPFails1, + callback_failures = 0, + interval_tref = Tref}, {Reply, waiting, OutCheck}; - -health_fsm(checking, {'EXIT', Pid, Cause}, Service, #health_check{checking_pid = Pid} = InCheck) - when Cause =/= normal -> - logger:error("health check process for ~p error'ed: ~p", [Service, Cause]), +health_fsm(checking, {'EXIT', Pid, Cause}, Service, + #health_check{checking_pid = Pid} = InCheck) + when Cause =/= normal -> + logger:error("health check process for ~p error'ed: " + " ~p", + [Service, Cause]), Fails = InCheck#health_check.callback_failures + 1, - if - Fails == InCheck#health_check.max_callback_failures -> - logger:error("health check callback for ~p failed too " - "many times, disabling.", [Service]), - {down, suspend, InCheck#health_check{checking_pid = undefined, - callback_failures = Fails}}; - Fails < InCheck#health_check.max_callback_failures -> - #health_check{health_failures = N, check_interval = Inter} = InCheck, - Tref = next_health_tref(N, Inter, Service), - OutCheck = InCheck#health_check{checking_pid = undefined, - callback_failures = Fails, interval_tref = Tref}, - {ok, waiting, OutCheck}; - true -> - %% likely a late message, or a faker - {ok, suspend, InCheck#health_check{checking_pid = undefined, - callback_failures = Fails}} + if Fails == + InCheck#health_check.max_callback_failures -> + logger:error("health check callback for ~p failed " + "too many times, disabling.", + [Service]), + {down, suspend, + InCheck#health_check{checking_pid = undefined, + callback_failures = Fails}}; + Fails < InCheck#health_check.max_callback_failures -> + #health_check{health_failures = N, + check_interval = Inter} = + InCheck, + Tref = next_health_tref(N, Inter, Service), + OutCheck = InCheck#health_check{checking_pid = + undefined, + callback_failures = Fails, + interval_tref = Tref}, + {ok, waiting, OutCheck}; + true -> + %% likely a late message, or a faker + {ok, suspend, + InCheck#health_check{checking_pid = undefined, + callback_failures = Fails}} end; - %% message handling when in a waiting state health_fsm(waiting, suspend, _Service, InCheck) -> case InCheck#health_check.interval_tref of - undefined -> ok; - _ -> - _ = erlang:cancel_timer(InCheck#health_check.interval_tref), - ok + undefined -> ok; + _ -> + _ = + erlang:cancel_timer(InCheck#health_check.interval_tref), + ok end, - {ok, suspend, InCheck#health_check{interval_tref = undefined}}; - + {ok, suspend, + InCheck#health_check{interval_tref = undefined}}; health_fsm(waiting, check_health, Service, InCheck) -> InCheck1 = start_health_check(Service, InCheck), {ok, checking, InCheck1}; - health_fsm(waiting, remove, _Service, InCheck) -> case InCheck#health_check.interval_tref of - undefined -> ok; - Tref -> - _ = erlang:cancel_timer(Tref), - ok + undefined -> ok; + Tref -> _ = erlang:cancel_timer(Tref), ok end, - OutCheck = InCheck#health_check{interval_tref = undefined}, + OutCheck = InCheck#health_check{interval_tref = + undefined}, {remove, waiting, OutCheck}; - %% fallthrough handling health_fsm(StateName, _Msg, _Service, Health) -> {ok, StateName, Health}. -handle_fsm_exit(true, HPFails, MaxHPFails) when HPFails >= MaxHPFails -> +handle_fsm_exit(true, HPFails, MaxHPFails) + when HPFails >= MaxHPFails -> %% service was failed, but recovered {up, 0}; - -handle_fsm_exit(true, HPFails, MaxHPFails) when HPFails < MaxHPFails -> +handle_fsm_exit(true, HPFails, MaxHPFails) + when HPFails < MaxHPFails -> %% service never fully failed {ok, 0}; - -handle_fsm_exit(false, HPFails, MaxHPFails) when HPFails + 1 == MaxHPFails -> +handle_fsm_exit(false, HPFails, MaxHPFails) + when HPFails + 1 == MaxHPFails -> %% service has failed enough to go down {down, HPFails + 1}; - handle_fsm_exit(false, HPFails, __) -> %% all other cases handled, this is health continues to fail {ok, HPFails + 1}. -start_health_check(Service, #health_check{checking_pid = undefined} = CheckRec) -> +start_health_check(Service, + #health_check{checking_pid = undefined} = CheckRec) -> {Mod, Func, Args} = CheckRec#health_check.callback, Pid = CheckRec#health_check.service_pid, case CheckRec#health_check.interval_tref of - undefined -> ok; - Tref -> - _ = erlang:cancel_timer(Tref), - ok + undefined -> ok; + Tref -> _ = erlang:cancel_timer(Tref), ok end, - CheckingPid = proc_lib:spawn_link(fun() -> - case erlang:apply(Mod, Func, [Pid | Args]) of - R when R =:= true orelse R =:= false -> - health_check_result(self(), R); - Else -> exit(Else) - end - end), + CheckingPid = proc_lib:spawn_link(fun () -> + case erlang:apply(Mod, Func, + [Pid | Args]) + of + R + when R =:= true orelse + R =:= false -> + health_check_result(self(), + R); + Else -> exit(Else) + end + end), erlang:put(CheckingPid, Service), CheckRec#health_check{state = checking, checking_pid = CheckingPid, interval_tref = undefined}; -start_health_check(_Service, Check) -> - Check. +start_health_check(_Service, Check) -> Check. health_check_result(CheckPid, Result) -> - gen_server:cast(?MODULE, {health_check_result, CheckPid, Result}). + gen_server:cast(?MODULE, + {health_check_result, CheckPid, Result}). -next_health_tref(_, infinity, _) -> - undefined; +next_health_tref(_, infinity, _) -> undefined; next_health_tref(N, V, Service) -> Time = determine_time(N, V), - erlang:send_after(Time, self(), {check_health, Service}). + erlang:send_after(Time, self(), + {check_health, Service}). all_health_fsms(Msg, Healths) -> - [begin - {ok, C1} = health_fsm(Msg, S, C), - {S, C1} - end || {S, C} <- Healths]. + [begin {ok, C1} = health_fsm(Msg, S, C), {S, C1} end + || {S, C} <- Healths]. -determine_time(Failures, BaseInterval) when Failures < 4 -> +determine_time(Failures, BaseInterval) + when Failures < 4 -> BaseInterval; - -determine_time(Failures, BaseInterval) when Failures < 11 -> - erlang:trunc(BaseInterval * (math:pow(Failures, 1.3))); - -determine_time(Failures, BaseInterval) when Failures > 10 -> +determine_time(Failures, BaseInterval) + when Failures < 11 -> + erlang:trunc(BaseInterval * math:pow(Failures, 1.3)); +determine_time(Failures, BaseInterval) + when Failures > 10 -> BaseInterval * 20. diff --git a/src/riak_core_node_watcher_events.erl b/src/riak_core_node_watcher_events.erl index bbac031f5..a141c9bc2 100644 --- a/src/riak_core_node_watcher_events.erl +++ b/src/riak_core_node_watcher_events.erl @@ -24,27 +24,22 @@ -behaviour(gen_event). %% API --export([start_link/0, - add_handler/2, - add_sup_handler/2, - add_guarded_handler/2, - add_callback/1, - add_sup_callback/1, - add_guarded_callback/1, +-export([start_link/0, add_handler/2, add_sup_handler/2, + add_guarded_handler/2, add_callback/1, + add_sup_callback/1, add_guarded_callback/1, service_update/1]). %% gen_event callbacks -export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]). --record(state, { callback }). +-record(state, {callback}). %% =================================================================== %% API functions %% =================================================================== -start_link() -> - gen_event:start_link({local, ?MODULE}). +start_link() -> gen_event:start_link({local, ?MODULE}). add_handler(Handler, Args) -> gen_event:add_handler(?MODULE, Handler, Args). @@ -53,21 +48,24 @@ add_sup_handler(Handler, Args) -> gen_event:add_sup_handler(?MODULE, Handler, Args). add_guarded_handler(Handler, Args) -> - riak_core:add_guarded_event_handler(?MODULE, Handler, Args). + riak_core:add_guarded_event_handler(?MODULE, Handler, + Args). add_callback(Fn) when is_function(Fn) -> - gen_event:add_handler(?MODULE, {?MODULE, make_ref()}, [Fn]). + gen_event:add_handler(?MODULE, {?MODULE, make_ref()}, + [Fn]). add_sup_callback(Fn) when is_function(Fn) -> - gen_event:add_sup_handler(?MODULE, {?MODULE, make_ref()}, [Fn]). + gen_event:add_sup_handler(?MODULE, + {?MODULE, make_ref()}, [Fn]). add_guarded_callback(Fn) when is_function(Fn) -> - riak_core:add_guarded_event_handler(?MODULE, {?MODULE, make_ref()}, [Fn]). + riak_core:add_guarded_event_handler(?MODULE, + {?MODULE, make_ref()}, [Fn]). service_update(Services) -> gen_event:notify(?MODULE, {service_update, Services}). - %% =================================================================== %% gen_event callbacks %% =================================================================== @@ -75,21 +73,15 @@ service_update(Services) -> init([Fn]) -> %% Get the initial list of available services Fn(riak_core_node_watcher:services()), - {ok, #state { callback = Fn }}. + {ok, #state{callback = Fn}}. handle_event({service_update, Services}, State) -> - (State#state.callback)(Services), - {ok, State}. - -handle_call(_Request, State) -> - {ok, ok, State}. + (State#state.callback)(Services), {ok, State}. -handle_info(_Info, State) -> - {ok, State}. +handle_call(_Request, State) -> {ok, ok, State}. -terminate(_Reason, _State) -> - ok. +handle_info(_Info, State) -> {ok, State}. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. +terminate(_Reason, _State) -> ok. +code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/src/riak_core_priority_queue.erl b/src/riak_core_priority_queue.erl index b2cea75e4..b3cfad917 100644 --- a/src/riak_core_priority_queue.erl +++ b/src/riak_core_priority_queue.erl @@ -52,242 +52,256 @@ %% calls into the same function knowing that ordinary queues represent %% a base case. - -module(riak_core_priority_queue). --export([new/0, is_queue/1, is_empty/1, len/1, to_list/1, in/2, in/3, - out/1, out/2, pout/1, join/2]). +-export([new/0, is_queue/1, is_empty/1, len/1, + to_list/1, in/2, in/3, out/1, out/2, pout/1, join/2]). %%---------------------------------------------------------------------------- -type priority() :: integer(). + -type squeue() :: {queue, [any()], [any()]}. --type pqueue() :: squeue() | {pqueue, [{priority(), squeue()}]}. +-type pqueue() :: squeue() | + {pqueue, [{priority(), squeue()}]}. %%---------------------------------------------------------------------------- -spec new() -> pqueue(). -new() -> {queue, [], []}. +new() -> {queue, [], []}. -spec is_queue(any()) -> boolean(). + is_queue({queue, R, F}) when is_list(R), is_list(F) -> true; is_queue({pqueue, Queues}) when is_list(Queues) -> - lists:all(fun ({P, Q}) -> is_integer(P) andalso is_queue(Q) end, Queues); -is_queue(_) -> - false. + lists:all(fun ({P, Q}) -> + is_integer(P) andalso is_queue(Q) + end, + Queues); +is_queue(_) -> false. -spec is_empty(pqueue()) -> boolean(). -is_empty({queue, [], []}) -> - true; -is_empty(_) -> - false. + +is_empty({queue, [], []}) -> true; +is_empty(_) -> false. -spec len(pqueue()) -> non_neg_integer(). + len({queue, R, F}) when is_list(R), is_list(F) -> length(R) + length(F); len({pqueue, Queues}) -> lists:sum([len(Q) || {_, Q} <- Queues]). -spec to_list(pqueue()) -> [{priority(), any()}]. -to_list({queue, In, Out}) when is_list(In), is_list(Out) -> + +to_list({queue, In, Out}) + when is_list(In), is_list(Out) -> [{0, V} || V <- Out ++ lists:reverse(In, [])]; to_list({pqueue, Queues}) -> [{-P, V} || {P, Q} <- Queues, {0, V} <- to_list(Q)]. -spec in(any(), pqueue()) -> pqueue(). -in(Item, Q) -> - in(Item, 0, Q). + +in(Item, Q) -> in(Item, 0, Q). -spec in(any(), priority(), pqueue()) -> pqueue(). -in(X, 0, {queue, [_] = In, []}) -> - {queue, [X], In}; -in(X, 0, {queue, In, Out}) when is_list(In), is_list(Out) -> - {queue, [X|In], Out}; + +in(X, 0, {queue, [_] = In, []}) -> {queue, [X], In}; +in(X, 0, {queue, In, Out}) + when is_list(In), is_list(Out) -> + {queue, [X | In], Out}; in(X, Priority, _Q = {queue, [], []}) -> in(X, Priority, {pqueue, []}); in(X, Priority, Q = {queue, _, _}) -> in(X, Priority, {pqueue, [{0, Q}]}); in(X, Priority, {pqueue, Queues}) -> P = -Priority, - {pqueue, case lists:keysearch(P, 1, Queues) of - {value, {_, Q}} -> - lists:keyreplace(P, 1, Queues, {P, in(X, Q)}); - false -> - lists:keysort(1, [{P, {queue, [X], []}} | Queues]) - end}. - --spec out(pqueue()) -> {(empty | {value, any()}), pqueue()}. -out({queue, [], []} = Q) -> - {empty, Q}; -out({queue, [V], []}) -> - {{value, V}, {queue, [], []}}; -out({queue, [Y|In], []}) -> - [V|Out] = lists:reverse(In, []), + {pqueue, + case lists:keysearch(P, 1, Queues) of + {value, {_, Q}} -> + lists:keyreplace(P, 1, Queues, {P, in(X, Q)}); + false -> + lists:keysort(1, [{P, {queue, [X], []}} | Queues]) + end}. + +-spec out(pqueue()) -> {empty | {value, any()}, + pqueue()}. + +out({queue, [], []} = Q) -> {empty, Q}; +out({queue, [V], []}) -> {{value, V}, {queue, [], []}}; +out({queue, [Y | In], []}) -> + [V | Out] = lists:reverse(In, []), {{value, V}, {queue, [Y], Out}}; out({queue, In, [V]}) when is_list(In) -> - {{value,V}, r2f(In)}; -out({queue, In,[V|Out]}) when is_list(In) -> + {{value, V}, r2f(In)}; +out({queue, In, [V | Out]}) when is_list(In) -> {{value, V}, {queue, In, Out}}; out({pqueue, [{P, Q} | Queues]}) -> {R, Q1} = out(Q), NewQ = case is_empty(Q1) of - true -> case Queues of - [] -> {queue, [], []}; - [{0, OnlyQ}] -> OnlyQ; - [_|_] -> {pqueue, Queues} - end; - false -> {pqueue, [{P, Q1} | Queues]} + true -> + case Queues of + [] -> {queue, [], []}; + [{0, OnlyQ}] -> OnlyQ; + [_ | _] -> {pqueue, Queues} + end; + false -> {pqueue, [{P, Q1} | Queues]} end, {R, NewQ}. --spec out(priority(), pqueue()) -> {(empty | {value, any()}), pqueue()}. -out(_Priority, {queue, [], []} = Q) -> - {empty, Q}; +-spec out(priority(), pqueue()) -> {empty | + {value, any()}, + pqueue()}. + +out(_Priority, {queue, [], []} = Q) -> {empty, Q}; out(Priority, {queue, _, _} = Q) when Priority =< 0 -> out(Q); -out(_Priority, {queue, _, _} = Q) -> - {empty, Q}; -out(Priority, {pqueue, [{P, _Q} | _Queues]} = Q) when Priority =< (-P) -> +out(_Priority, {queue, _, _} = Q) -> {empty, Q}; +out(Priority, {pqueue, [{P, _Q} | _Queues]} = Q) + when Priority =< -P -> out(Q); -out(_Priority, {pqueue, [_|_]} = Q) -> - {empty, Q}. +out(_Priority, {pqueue, [_ | _]} = Q) -> {empty, Q}. +-spec pout(pqueue()) -> {empty | + {value, any(), priority()}, + pqueue()}. --spec pout(pqueue()) -> {(empty | {value, any(), priority()}), pqueue()}. -pout({queue, [], []} = Q) -> - {empty, Q}; +pout({queue, [], []} = Q) -> {empty, Q}; pout({queue, _, _} = Q) -> - {{value, V}, Q1} = out(Q), - {{value, V, 0}, Q1}; + {{value, V}, Q1} = out(Q), {{value, V, 0}, Q1}; pout({pqueue, [{P, Q} | Queues]}) -> {{value, V}, Q1} = out(Q), NewQ = case is_empty(Q1) of - true -> case Queues of - [] -> {queue, [], []}; - [{0, OnlyQ}] -> OnlyQ; - [_|_] -> {pqueue, Queues} - end; - false -> {pqueue, [{P, Q1} | Queues]} + true -> + case Queues of + [] -> {queue, [], []}; + [{0, OnlyQ}] -> OnlyQ; + [_ | _] -> {pqueue, Queues} + end; + false -> {pqueue, [{P, Q1} | Queues]} end, {{value, V, -P}, NewQ}. -spec join(pqueue(), pqueue()) -> pqueue(). -join(A, {queue, [], []}) -> - A; -join({queue, [], []}, B) -> - B; + +join(A, {queue, [], []}) -> A; +join({queue, [], []}, B) -> B; join({queue, AIn, AOut}, {queue, BIn, BOut}) -> {queue, BIn, AOut ++ lists:reverse(AIn, BOut)}; join(A = {queue, _, _}, {pqueue, BPQ}) -> - {Pre, Post} = lists:splitwith(fun ({P, _}) -> P < 0 end, BPQ), + {Pre, Post} = lists:splitwith(fun ({P, _}) -> P < 0 end, + BPQ), Post1 = case Post of - [] -> [ {0, A} ]; - [ {0, ZeroQueue} | Rest ] -> [ {0, join(A, ZeroQueue)} | Rest ]; - _ -> [ {0, A} | Post ] + [] -> [{0, A}]; + [{0, ZeroQueue} | Rest] -> + [{0, join(A, ZeroQueue)} | Rest]; + _ -> [{0, A} | Post] end, {pqueue, Pre ++ Post1}; join({pqueue, APQ}, B = {queue, _, _}) -> - {Pre, Post} = lists:splitwith(fun ({P, _}) -> P < 0 end, APQ), + {Pre, Post} = lists:splitwith(fun ({P, _}) -> P < 0 end, + APQ), Post1 = case Post of - [] -> [ {0, B} ]; - [ {0, ZeroQueue} | Rest ] -> [ {0, join(ZeroQueue, B)} | Rest ]; - _ -> [ {0, B} | Post ] + [] -> [{0, B}]; + [{0, ZeroQueue} | Rest] -> + [{0, join(ZeroQueue, B)} | Rest]; + _ -> [{0, B} | Post] end, {pqueue, Pre ++ Post1}; join({pqueue, APQ}, {pqueue, BPQ}) -> {pqueue, merge(APQ, BPQ, [])}. -merge([], BPQ, Acc) -> - lists:reverse(Acc, BPQ); -merge(APQ, [], Acc) -> - lists:reverse(Acc, APQ); -merge([{P, A}|As], [{P, B}|Bs], Acc) -> - merge(As, Bs, [ {P, join(A, B)} | Acc ]); -merge([{PA, A}|As], Bs = [{PB, _}|_], Acc) when PA < PB -> - merge(As, Bs, [ {PA, A} | Acc ]); -merge(As = [{_, _}|_], [{PB, B}|Bs], Acc) -> - merge(As, Bs, [ {PB, B} | Acc ]). - -r2f([]) -> {queue, [], []}; +merge([], BPQ, Acc) -> lists:reverse(Acc, BPQ); +merge(APQ, [], Acc) -> lists:reverse(Acc, APQ); +merge([{P, A} | As], [{P, B} | Bs], Acc) -> + merge(As, Bs, [{P, join(A, B)} | Acc]); +merge([{PA, A} | As], Bs = [{PB, _} | _], Acc) + when PA < PB -> + merge(As, Bs, [{PA, A} | Acc]); +merge(As = [{_, _} | _], [{PB, B} | Bs], Acc) -> + merge(As, Bs, [{PB, B} | Acc]). + +r2f([]) -> {queue, [], []}; r2f([_] = R) -> {queue, [], R}; -r2f([X,Y]) -> {queue, [X], [Y]}; -r2f([X,Y|R]) -> {queue, [X,Y], lists:reverse(R, [])}. +r2f([X, Y]) -> {queue, [X], [Y]}; +r2f([X, Y | R]) -> + {queue, [X, Y], lists:reverse(R, [])}. -ifdef(TEST). + -include_lib("eunit/include/eunit.hrl"). simple_case(Order) -> - Queue = ?MODULE:new(), - ?assertEqual(true, ?MODULE:is_queue(Queue)), - ?assertEqual(true, ?MODULE:is_empty(Queue)), - ?assertEqual(0, ?MODULE:len(Queue)), - ?assertEqual([], ?MODULE:to_list(Queue)), + Queue = (?MODULE):new(), + ?assertEqual(true, ((?MODULE):is_queue(Queue))), + ?assertEqual(true, ((?MODULE):is_empty(Queue))), + ?assertEqual(0, ((?MODULE):len(Queue))), + ?assertEqual([], ((?MODULE):to_list(Queue))), case Order of - forward -> - Queue2 = ?MODULE:in(low, Queue), - Queue3 = ?MODULE:in(mid, 500, Queue2), - Queue4 = ?MODULE:in(high, 1000, Queue3); - reverse -> - Queue2 = ?MODULE:in(high, 1000, Queue), - Queue3 = ?MODULE:in(mid, 500, Queue2), - Queue4 = ?MODULE:in(low, Queue3); - mixed -> - Queue2 = ?MODULE:in(high, 1000, Queue), - Queue3 = ?MODULE:in(low, Queue2), - Queue4 = ?MODULE:in(mid, 500, Queue3) + forward -> + Queue2 = (?MODULE):in(low, Queue), + Queue3 = (?MODULE):in(mid, 500, Queue2), + Queue4 = (?MODULE):in(high, 1000, Queue3); + reverse -> + Queue2 = (?MODULE):in(high, 1000, Queue), + Queue3 = (?MODULE):in(mid, 500, Queue2), + Queue4 = (?MODULE):in(low, Queue3); + mixed -> + Queue2 = (?MODULE):in(high, 1000, Queue), + Queue3 = (?MODULE):in(low, Queue2), + Queue4 = (?MODULE):in(mid, 500, Queue3) end, - ?assertEqual(false, ?MODULE:is_empty(Queue4)), - ?assertEqual(3, ?MODULE:len(Queue4)), - ?assertMatch({{value, high}, _}, ?MODULE:out(Queue4)), - {{value, high}, Queue5} = ?MODULE:out(Queue4), - ?assertMatch({{value, mid}, _}, ?MODULE:out(Queue5)), - {{value, mid}, Queue6} = ?MODULE:out(Queue5), - ?assertMatch({{value, low}, _}, ?MODULE:out(Queue6)), - {{value, low}, Queue7} = ?MODULE:out(Queue6), - ?assertEqual(0, ?MODULE:len(Queue7)), - - ?assertEqual(true, ?MODULE:is_queue(Queue2)), - ?assertEqual(true, ?MODULE:is_queue(Queue3)), - ?assertEqual(true, ?MODULE:is_queue(Queue4)), - ?assertEqual(false, ?MODULE:is_queue([])), + ?assertEqual(false, ((?MODULE):is_empty(Queue4))), + ?assertEqual(3, ((?MODULE):len(Queue4))), + ?assertMatch({{value, high}, _}, + ((?MODULE):out(Queue4))), + {{value, high}, Queue5} = (?MODULE):out(Queue4), + ?assertMatch({{value, mid}, _}, + ((?MODULE):out(Queue5))), + {{value, mid}, Queue6} = (?MODULE):out(Queue5), + ?assertMatch({{value, low}, _}, + ((?MODULE):out(Queue6))), + {{value, low}, Queue7} = (?MODULE):out(Queue6), + ?assertEqual(0, ((?MODULE):len(Queue7))), + ?assertEqual(true, ((?MODULE):is_queue(Queue2))), + ?assertEqual(true, ((?MODULE):is_queue(Queue3))), + ?assertEqual(true, ((?MODULE):is_queue(Queue4))), + ?assertEqual(false, ((?MODULE):is_queue([]))), ok. merge_case() -> - QueueA1 = ?MODULE:new(), - QueueA2 = ?MODULE:in(1, QueueA1), - QueueA3 = ?MODULE:in(3, QueueA2), - QueueA4 = ?MODULE:in(5, QueueA3), - - QueueB1 = ?MODULE:new(), - QueueB2 = ?MODULE:in(2, QueueB1), - QueueB3 = ?MODULE:in(4, QueueB2), - QueueB4 = ?MODULE:in(6, QueueB3), - - Merged1 = ?MODULE:join(QueueA4, QueueB4), - ?assertEqual([{0,1},{0,3},{0,5},{0,2},{0,4},{0,6}], - ?MODULE:to_list(Merged1)), - - QueueC1 = ?MODULE:new(), - QueueC2 = ?MODULE:in(1, 10, QueueC1), - QueueC3 = ?MODULE:in(3, 30, QueueC2), - QueueC4 = ?MODULE:in(5, 50, QueueC3), - - QueueD1 = ?MODULE:new(), - QueueD2 = ?MODULE:in(2, 20, QueueD1), - QueueD3 = ?MODULE:in(4, 40, QueueD2), - QueueD4 = ?MODULE:in(6, 60, QueueD3), - - Merged2 = ?MODULE:join(QueueC4, QueueD4), - ?assertEqual([{60,6},{50,5},{40,4},{30,3},{20,2},{10,1}], - ?MODULE:to_list(Merged2)), + QueueA1 = (?MODULE):new(), + QueueA2 = (?MODULE):in(1, QueueA1), + QueueA3 = (?MODULE):in(3, QueueA2), + QueueA4 = (?MODULE):in(5, QueueA3), + QueueB1 = (?MODULE):new(), + QueueB2 = (?MODULE):in(2, QueueB1), + QueueB3 = (?MODULE):in(4, QueueB2), + QueueB4 = (?MODULE):in(6, QueueB3), + Merged1 = (?MODULE):join(QueueA4, QueueB4), + ?assertEqual([{0, 1}, {0, 3}, {0, 5}, {0, 2}, {0, 4}, + {0, 6}], + ((?MODULE):to_list(Merged1))), + QueueC1 = (?MODULE):new(), + QueueC2 = (?MODULE):in(1, 10, QueueC1), + QueueC3 = (?MODULE):in(3, 30, QueueC2), + QueueC4 = (?MODULE):in(5, 50, QueueC3), + QueueD1 = (?MODULE):new(), + QueueD2 = (?MODULE):in(2, 20, QueueD1), + QueueD3 = (?MODULE):in(4, 40, QueueD2), + QueueD4 = (?MODULE):in(6, 60, QueueD3), + Merged2 = (?MODULE):join(QueueC4, QueueD4), + ?assertEqual([{60, 6}, {50, 5}, {40, 4}, {30, 3}, + {20, 2}, {10, 1}], + ((?MODULE):to_list(Merged2))), ok. basic_test() -> simple_case(forward), -simple_case(reverse), + simple_case(reverse), simple_case(mixed), merge_case(), ok. diff --git a/src/riak_core_rand.erl b/src/riak_core_rand.erl deleted file mode 100644 index 277259fa3..000000000 --- a/src/riak_core_rand.erl +++ /dev/null @@ -1,65 +0,0 @@ -%% Generalized random module that offers a backwards compatible API -%% around some of the changes in rand, crypto and for time units. - --module(riak_core_rand). - -%% API --export([ - uniform/0, - uniform/1, - uniform_s/2, - seed/0, - seed/1, - rand_seed/0, - rand_bytes/1 - ]). - -%% As the algorithm is not changed in any place we can use the default -%% algorithm for all call here. --define(ALGO, exsplus). - -uniform() -> - rand:uniform(). - -uniform(N) -> - rand:uniform(N). - -%% The old random:uniform_s took a 3 touple however this is no longer -%% the case, so what we need to do if we see such a situation is to first -%% create a state using seed_s (which can take the old data) and then -%% using uniform_s with this newly generated state. -%% -%% Note that seed_s does **not** change the current seed but just -%% create a new seed state. -uniform_s(N, {A, B, C}) -> - State = rand:seed_s(?ALGO, {A, B, C}), - rand:uniform_s(N, State); -uniform_s(N, State) -> - rand:uniform_s(N, State). - -seed() -> - rand:seed(?ALGO). - -%% We are a bit tricky here, while random:seed did return the **prior** seed -%% rand:seed will return the **new** seed. We can work around this by first -%% getting the exported seed then using this instead. --spec seed({integer(),integer(),integer()} | rand:export_state()) -> - rand:export_state() | undefined. -seed({_, _, _} = Seed) -> - Old = rand:export_seed(), - _New = rand:seed(?ALGO, Seed), - Old; -seed(Seed) -> - Old = rand:export_seed(), - _New = rand:seed(Seed), - Old. - -rand_bytes(Size) -> - crypto:strong_rand_bytes(Size). - -%%%=================================================================== -%%% General functions -%%%=================================================================== - -rand_seed() -> - erlang:timestamp(). diff --git a/src/riak_core_ring.erl b/src/riak_core_ring.erl index d411150bd..e9ec2ebe3 100644 --- a/src/riak_core_ring.erl +++ b/src/riak_core_ring.erl @@ -28,164 +28,107 @@ -module(riak_core_ring). --export([all_members/1, - all_owners/1, - all_preflists/2, - diff_nodes/2, - equal_rings/2, - fresh/0, - fresh/1, - fresh/2, - get_meta/2, - get_buckets/1, - index_owner/2, - my_indices/1, - num_partitions/1, - owner_node/1, - preflist/2, - random_node/1, - random_other_index/1, - random_other_index/2, - random_other_node/1, - reconcile/2, - rename_node/3, - responsible_index/2, - transfer_node/3, - update_meta/3, - remove_meta/2]). - --export([cluster_name/1, -%% upgrade/1, -%% downgrade/2, - set_tainted/1, - check_tainted/2, - unset_tainted/1, - set_lastgasp/1, - check_lastgasp/1, - unset_lastgasp/1, - nearly_equal/2, - claimant/1, - member_status/2, - pretty_print/2, - all_member_status/1, - update_member_meta/5, - clear_member_meta/3, - get_member_meta/3, - add_member/3, - remove_member/3, - leave_member/3, - exit_member/3, - down_member/3, - set_member/4, - set_member/5, - members/2, - has_location_changed/1, - clear_location_changed/1, - set_node_location/3, - get_nodes_locations/1, - set_claimant/2, - increment_vclock/2, - ring_version/1, - increment_ring_version/2, - set_pending_changes/2, - active_members/1, - claiming_members/1, - ready_members/1, - random_other_active_node/1, - down_members/1, - set_owner/2, - indices/2, - future_indices/2, - future_ring/1, - disowning_indices/2, - cancel_transfers/1, - pending_changes/1, - next_owner/1, - next_owner/2, - next_owner/3, - completed_next_owners/2, - all_next_owners/1, - change_owners/2, - handoff_complete/3, - ring_ready/0, - ring_ready/1, - ring_ready_info/1, - ring_changed/2, - set_cluster_name/2, - reconcile_names/2, - reconcile_members/2, - is_primary/2, - chash/1, - set_chash/2, - resize/2, - set_pending_resize/2, - set_pending_resize_abort/1, - maybe_abort_resize/1, - schedule_resize_transfer/3, - awaiting_resize_transfer/3, - resize_transfer_status/4, - resize_transfer_complete/4, +-export([all_members/1, all_owners/1, all_preflists/2, + diff_nodes/2, equal_rings/2, fresh/0, fresh/1, fresh/2, + get_meta/2, index_owner/2, my_indices/1, + num_partitions/1, owner_node/1, preflist/2, + random_node/1, random_other_index/1, + random_other_index/2, random_other_node/1, reconcile/2, + rename_node/3, responsible_index/2, transfer_node/3, + update_meta/3, remove_meta/2]). + +-export([cluster_name/1, set_tainted/1, check_tainted/2, + nearly_equal/2, claimant/1, member_status/2, + pretty_print/2, all_member_status/1, + update_member_meta/5, clear_member_meta/3, + get_member_meta/3, add_member/3, remove_member/3, + leave_member/3, exit_member/3, down_member/3, + set_member/4, set_member/5, members/2, set_claimant/2, + increment_vclock/2, ring_version/1, + increment_ring_version/2, set_pending_changes/2, + active_members/1, claiming_members/1, ready_members/1, + random_other_active_node/1, down_members/1, set_owner/2, + indices/2, future_indices/2, future_ring/1, + disowning_indices/2, cancel_transfers/1, + pending_changes/1, next_owner/1, next_owner/2, + next_owner/3, completed_next_owners/2, + all_next_owners/1, change_owners/2, handoff_complete/3, + ring_ready/0, ring_ready/1, ring_ready_info/1, + ring_changed/2, set_cluster_name/2, reconcile_names/2, + reconcile_members/2, is_primary/2, chash/1, set_chash/2, + resize/2, set_pending_resize/2, + set_pending_resize_abort/1, maybe_abort_resize/1, + schedule_resize_transfer/3, awaiting_resize_transfer/3, + resize_transfer_status/4, resize_transfer_complete/4, complete_resize_transfers/3, - reschedule_resize_transfers/3, - is_resizing/1, - is_post_resize/1, - is_resize_complete/1, - resized_ring/1, - set_resized_ring/2, - future_index/3, - future_index/4, - future_index/5, - is_future_index/4, - future_owner/2, - future_num_partitions/1, - vnode_type/2, + reschedule_resize_transfers/3, is_resizing/1, + is_post_resize/1, is_resize_complete/1, resized_ring/1, + set_resized_ring/2, future_index/3, future_index/4, + future_index/5, is_future_index/4, future_owner/2, + future_num_partitions/1, vnode_type/2, deletion_complete/3]). --export_type([riak_core_ring/0, ring_size/0, partition_id/0]). + %% upgrade/1, + %% downgrade/2, + +-export_type([riak_core_ring/0, ring_size/0, + partition_id/0]). -ifdef(TEST). + -include_lib("eunit/include/eunit.hrl"). + -endif. --record(chstate, { - nodename :: term(), % the Node responsible for this chstate - vclock :: vclock:vclock() | undefined, % for this chstate object, entries are - % {Node, Ctr} - chring :: chash:chash() | undefined, % chash ring of {IndexAsInt, Node} mappings - meta :: dict:dict() | undefined, - % dict of cluster-wide other data (primarily - % bucket N-value, etc) - clustername :: {term(), term()} | undefined, - next :: [{integer(), term(), term(), [module()], awaiting | complete}], - members :: [{node(), {member_status(), vclock:vclock(), [{atom(), term()}]}}] | undefined, - claimant :: term(), - seen :: [{term(), vclock:vclock()}] | undefined, - rvsn :: vclock:vclock() | undefined - }). - - --type member_status() :: joining | valid | invalid | leaving | exiting | down. +-record(chstate, + {nodename :: + term(), % the Node responsible for this chstate + vclock :: + vclock:vclock() | + undefined, % for this chstate object, entries are + % {Node, Ctr} + chring :: + chash:chash() | + undefined, % chash ring of {IndexAsInt, Node} mappings + meta :: dict:dict() | undefined, + % dict of cluster-wide other data (primarily N-value, etc) + clustername :: {term(), term()} | undefined, + next :: + [{integer(), term(), term(), [module()], + awaiting | complete}], + members :: + [{node(), + {member_status(), vclock:vclock(), + [{atom(), term()}]}}] | + undefined, + claimant :: term(), + seen :: [{term(), vclock:vclock()}] | undefined, + rvsn :: vclock:vclock() | undefined}). + +-type member_status() :: joining | valid | invalid | + leaving | exiting | down. %% type meta_entry(). Record for each entry in #chstate.meta --record(meta_entry, { - value, % The value stored under this entry - lastmod % The last modified time of this entry, - % from calendar:datetime_to_gregorian_seconds( - % calendar:universal_time()), -}). +-record(meta_entry, + {value, % The value stored under this entry + lastmod}). % The last modified time of this entry, + % from calendar:datetime_to_gregorian_seconds( + % calendar:universal_time()), %% @type riak_core_ring(). Opaque data type used for partition ownership -type riak_core_ring() :: #chstate{}. + -type chstate() :: riak_core_ring(). -type pending_change() :: {Owner :: node(), - NextOwner :: node(), - awaiting | complete} - | {undefined, undefined, undefined}. + NextOwner :: node(), awaiting | complete} | + {undefined, undefined, undefined}. --type resize_transfer() :: {{integer(),term()}, ordsets:ordset(node()), awaiting | complete}. +-type resize_transfer() :: {{integer(), term()}, + ordsets:ordset(node()), awaiting | complete}. -type ring_size() :: non_neg_integer(). + %% @type partition_id(). This integer represents a value in the range [0, ring_size-1]. -type partition_id() :: non_neg_integer(). @@ -196,17 +139,13 @@ set_tainted(Ring) -> update_meta(riak_core_ring_tainted, true, Ring). -check_tainted(Ring=#chstate{}, Msg) -> - Exit = application:get_env(riak_core, exit_when_tainted, false), +check_tainted(Ring = #chstate{}, Msg) -> + Exit = application:get_env(riak_core, exit_when_tainted, + false), case {get_meta(riak_core_ring_tainted, Ring), Exit} of - {{ok, true}, true} -> - riak_core:stop(Msg), - ok; - {{ok, true}, false} -> - logger:error(Msg), - ok; - _ -> - ok + {{ok, true}, true} -> riak_core:stop(Msg), ok; + {{ok, true}, false} -> logger:error(Msg), ok; + _ -> ok end. -spec unset_tainted(chstate()) -> chstate(). @@ -235,34 +174,42 @@ unset_lastgasp(Ring) -> %% descendant of RingA's vclock. This matches the changes that the %% fix-up logic may make to a ring. -spec nearly_equal(chstate(), chstate()) -> boolean(). + nearly_equal(RingA, RingB) -> - TestVC = vclock:descends(RingB#chstate.vclock, RingA#chstate.vclock), - RingA2 = RingA#chstate{vclock=undefined, meta=undefined}, - RingB2 = RingB#chstate{vclock=undefined, meta=undefined}, - TestRing = (RingA2 =:= RingB2), + TestVC = vclock:descends(RingB#chstate.vclock, + RingA#chstate.vclock), + RingA2 = RingA#chstate{vclock = undefined, + meta = undefined}, + RingB2 = RingB#chstate{vclock = undefined, + meta = undefined}, + TestRing = RingA2 =:= RingB2, TestVC and TestRing. %% @doc Determine if a given Index/Node `IdxNode' combination is a %% primary. --spec is_primary(chstate(), {chash:index_as_int(), node()}) -> boolean(). +-spec is_primary(chstate(), + {chash:index_as_int(), node()}) -> boolean(). + is_primary(Ring, IdxNode) -> Owners = all_owners(Ring), lists:member(IdxNode, Owners). %% @doc Return the `CHash' of the ring. --spec chash(chstate()) -> CHash::chash:chash(). -chash(#chstate{chring=CHash}) -> - CHash. +-spec chash(chstate()) -> CHash :: chash:chash(). + +chash(#chstate{chring = CHash}) -> CHash. set_chash(State, CHash) -> - State#chstate{chring=CHash}. + State#chstate{chring = CHash}. %% @doc Produce a list of all nodes that are members of the cluster --spec all_members(State :: chstate()) -> [Node :: term()]. -all_members(#chstate{members=Members}) -> +-spec all_members(State :: chstate()) -> [Node :: + term()]. + +all_members(#chstate{members = Members}) -> get_members(Members). -members(#chstate{members=Members}, Types) -> +members(#chstate{members = Members}, Types) -> get_members(Members, Types). -spec has_location_changed(chstate()) -> boolean(). @@ -288,44 +235,55 @@ get_nodes_locations(?CHSTATE{members =Members} = ChState) -> dict:filter(fun(Node, _) -> lists:member(Node, Nodes) end, Value). %% @doc Produce a list of all active (not marked as down) cluster members -active_members(#chstate{members=Members}) -> - get_members(Members, [joining, valid, leaving, exiting]). +active_members(#chstate{members = Members}) -> + get_members(Members, + [joining, valid, leaving, exiting]). %% @doc Returns a list of members guaranteed safe for requests -ready_members(#chstate{members=Members}) -> +ready_members(#chstate{members = Members}) -> get_members(Members, [valid, leaving]). %% @doc Provide all ownership information in the form of {Index,Node} pairs. --spec all_owners(State :: chstate()) -> [{Index :: integer(), Node :: term()}]. -all_owners(State) -> - chash:nodes(State#chstate.chring). +-spec all_owners(State :: chstate()) -> [{Index :: + integer(), + Node :: term()}]. + +all_owners(State) -> chash:nodes(State#chstate.chring). %% @doc Provide every preflist in the ring, truncated at N. --spec all_preflists(State :: chstate(), N :: integer()) -> - [[{Index :: integer(), Node :: term()}]]. +-spec all_preflists(State :: chstate(), + N :: integer()) -> [[{Index :: integer(), + Node :: term()}]]. + all_preflists(State, N) -> - [lists:sublist(preflist(Key, State),N) || - Key <- [<<(I+1):160/integer>> || - {I,_Owner} <- ?MODULE:all_owners(State)]]. + [lists:sublist(preflist(Key, State), N) + || Key + <- [<<(I + 1):160/integer>> + || {I, _Owner} <- (?MODULE):all_owners(State)]]. %% @doc For two rings, return the list of owners that have differing ownership. -spec diff_nodes(chstate(), chstate()) -> [node()]. -diff_nodes(State1,State2) -> - AO = lists:zip(all_owners(State1),all_owners(State2)), - AllDiff = [[N1,N2] || {{I,N1},{I,N2}} <- AO, N1 =/= N2], + +diff_nodes(State1, State2) -> + AO = lists:zip(all_owners(State1), all_owners(State2)), + AllDiff = [[N1, N2] + || {{I, N1}, {I, N2}} <- AO, N1 =/= N2], lists:usort(lists:flatten(AllDiff)). -spec equal_rings(chstate(), chstate()) -> boolean(). -equal_rings(_A=#chstate{chring=RA,meta=MA},_B=#chstate{chring=RB,meta=MB}) -> + +equal_rings(_A = #chstate{chring = RA, meta = MA}, + _B = #chstate{chring = RB, meta = MB}) -> MDA = lists:sort(dict:to_list(MA)), MDB = lists:sort(dict:to_list(MB)), case MDA =:= MDB of - false -> false; - true -> RA =:= RB + false -> false; + true -> RA =:= RB end. %% @doc This is used only when this node is creating a brand new cluster. -spec fresh() -> chstate(). + fresh() -> % use this when starting a new cluster via this node fresh(node()). @@ -333,31 +291,34 @@ fresh() -> %% @doc Equivalent to fresh/0 but allows specification of the local node name. %% Called by fresh/0, and otherwise only intended for testing purposes. -spec fresh(NodeName :: term()) -> chstate(). + fresh(NodeName) -> - fresh(application:get_env(riak_core, ring_creation_size, undefined), NodeName). + fresh(application:get_env(riak_core, ring_creation_size, + undefined), + NodeName). %% @doc Equivalent to fresh/1 but allows specification of the ring size. %% Called by fresh/1, and otherwise only intended for testing purposes. --spec fresh(ring_size(), NodeName :: term()) -> chstate(). +-spec fresh(ring_size(), + NodeName :: term()) -> chstate(). + fresh(RingSize, NodeName) -> - VClock=vclock:increment(NodeName, vclock:fresh()), - #chstate{nodename=NodeName, - clustername={NodeName, erlang:timestamp()}, - members=[{NodeName, {valid, VClock, [{gossip_vsn, 2}]}}], - chring=chash:fresh(RingSize, NodeName), - next=[], - claimant=NodeName, - seen=[{NodeName, VClock}], - rvsn=VClock, - vclock=VClock, - meta=dict:new()}. + VClock = vclock:increment(NodeName, vclock:fresh()), + #chstate{nodename = NodeName, + clustername = {NodeName, erlang:timestamp()}, + members = + [{NodeName, {valid, VClock, [{gossip_vsn, 2}]}}], + chring = chash:fresh(RingSize, NodeName), next = [], + claimant = NodeName, seen = [{NodeName, VClock}], + rvsn = VClock, vclock = VClock, meta = dict:new()}. %% @doc change the size of the ring to `NewRingSize'. If the ring %% is larger than the current ring any new indexes will be owned %% by a dummy host -spec resize(chstate(), ring_size()) -> chstate(). + resize(State, NewRingSize) -> - NewRing = lists:foldl(fun({Idx,Owner}, RingAcc) -> + NewRing = lists:foldl(fun ({Idx, Owner}, RingAcc) -> chash:update(Idx, Owner, RingAcc) end, chash:fresh(NewRingSize, '$dummyhost@resized'), @@ -365,36 +326,31 @@ resize(State, NewRingSize) -> set_chash(State, NewRing). % @doc Return a value from the cluster metadata dict --spec get_meta(Key :: term(), State :: chstate()) -> - {ok, term()} | undefined. +-spec get_meta(Key :: term(), + State :: chstate()) -> {ok, term()} | undefined. + get_meta(Key, State) -> case dict:find(Key, State#chstate.meta) of - error -> undefined; - {ok, '$removed'} -> undefined; - {ok, M} when M#meta_entry.value =:= '$removed' -> undefined; - {ok, M} -> {ok, M#meta_entry.value} + error -> undefined; + {ok, '$removed'} -> undefined; + {ok, M} when M#meta_entry.value =:= '$removed' -> + undefined; + {ok, M} -> {ok, M#meta_entry.value} end. --spec get_meta(term(), term(), chstate()) -> {ok, term()}. +-spec get_meta(term(), term(), chstate()) -> {ok, + term()}. + get_meta(Key, Default, State) -> case get_meta(Key, State) of - undefined -> {ok, Default}; - Res -> Res + undefined -> {ok, Default}; + Res -> Res end. -%% @doc return the names of all the custom buckets stored in the ring. --spec get_buckets(State :: chstate()) -> [term()]. -get_buckets(State) -> - Keys = dict:fetch_keys(State#chstate.meta), - lists:foldl( - fun({bucket, Bucket}, Acc) -> - [Bucket|Acc]; - (_, Acc) -> - Acc - end, [], Keys). - %% @doc Return the node that owns the given index. --spec index_owner(State :: chstate(), Idx :: chash:index_as_int()) -> Node :: term(). +-spec index_owner(State :: chstate(), + Idx :: chash:index_as_int()) -> Node :: term(). + index_owner(State, Idx) -> {Idx, Owner} = lists:keyfind(Idx, 1, all_owners(State)), Owner. @@ -402,131 +358,169 @@ index_owner(State, Idx) -> %% @doc Return the node that will own this index after transtions have completed %% this function will error if the ring is shrinking and Idx no longer exists %% in it --spec future_owner(chstate(), chash:index_as_int()) -> term(). +-spec future_owner(chstate(), + chash:index_as_int()) -> term(). + future_owner(State, Idx) -> index_owner(future_ring(State), Idx). %% @doc Return all partition indices owned by the node executing this function. --spec my_indices(State :: chstate()) -> [chash:index_as_int()]. +-spec my_indices(State :: + chstate()) -> [chash:index_as_int()]. + my_indices(State) -> - [I || {I,Owner} <- ?MODULE:all_owners(State), Owner =:= node()]. + [I + || {I, Owner} <- (?MODULE):all_owners(State), + Owner =:= node()]. %% @doc Return the number of partitions in this Riak ring. --spec num_partitions(State :: chstate()) -> pos_integer(). +-spec num_partitions(State :: + chstate()) -> pos_integer(). + num_partitions(State) -> chash:size(State#chstate.chring). -spec future_num_partitions(chstate()) -> pos_integer(). -future_num_partitions(State=#chstate{chring=CHRing}) -> + +future_num_partitions(State = #chstate{chring = + CHRing}) -> case resized_ring(State) of - {ok, C} -> chash:size(C); - undefined -> chash:size(CHRing) + {ok, C} -> chash:size(C); + undefined -> chash:size(CHRing) end. %% @doc Return the node that is responsible for a given chstate. -spec owner_node(State :: chstate()) -> Node :: term(). -owner_node(State) -> - State#chstate.nodename. + +owner_node(State) -> State#chstate.nodename. %% @doc For a given object key, produce the ordered list of %% {partition,node} pairs that could be responsible for that object. --spec preflist(Key :: binary(), State :: chstate()) -> - [{Index :: chash:index_as_int(), Node :: term()}]. -preflist(Key, State) -> chash:successors(Key, State#chstate.chring). +-spec preflist(Key :: binary(), + State :: chstate()) -> [{Index :: chash:index_as_int(), + Node :: term()}]. + +preflist(Key, State) -> + chash:successors(Key, State#chstate.chring). %% @doc Return a randomly-chosen node from amongst the owners. -spec random_node(State :: chstate()) -> Node :: term(). + random_node(State) -> L = all_members(State), - lists:nth(riak_core_rand:uniform(length(L)), L). + lists:nth(rand:uniform(length(L)), L). %% @doc Return a partition index not owned by the node executing this function. %% If this node owns all partitions, return any index. --spec random_other_index(State :: chstate()) -> chash:index_as_int(). +-spec random_other_index(State :: + chstate()) -> chash:index_as_int(). + random_other_index(State) -> - L = [I || {I,Owner} <- ?MODULE:all_owners(State), Owner =/= node()], + L = [I + || {I, Owner} <- (?MODULE):all_owners(State), + Owner =/= node()], case L of - [] -> hd(my_indices(State)); - _ -> lists:nth(riak_core_rand:uniform(length(L)), L) + [] -> hd(my_indices(State)); + _ -> lists:nth(rand:uniform(length(L)), L) end. --spec random_other_index(State :: chstate(), Exclude :: [term()]) -> chash:index_as_int() | no_indices. -random_other_index(State, Exclude) when is_list(Exclude) -> - L = [I || {I, Owner} <- ?MODULE:all_owners(State), - Owner =/= node(), - not lists:member(I, Exclude)], +-spec random_other_index(State :: chstate(), + Exclude :: [term()]) -> chash:index_as_int() | + no_indices. + +random_other_index(State, Exclude) + when is_list(Exclude) -> + L = [I + || {I, Owner} <- (?MODULE):all_owners(State), + Owner =/= node(), not lists:member(I, Exclude)], case L of - [] -> no_indices; - _ -> lists:nth(riak_core_rand:uniform(length(L)), L) + [] -> no_indices; + _ -> lists:nth(rand:uniform(length(L)), L) end. %% @doc Return a randomly-chosen node from amongst the owners other than this one. --spec random_other_node(State :: chstate()) -> Node :: term() | no_node. +-spec random_other_node(State :: chstate()) -> Node :: + term() | no_node. + random_other_node(State) -> case lists:delete(node(), all_members(State)) of - [] -> - no_node; - L -> - lists:nth(riak_core_rand:uniform(length(L)), L) + [] -> no_node; + L -> lists:nth(rand:uniform(length(L)), L) end. %% @doc Return a randomly-chosen active node other than this one. --spec random_other_active_node(State :: chstate()) -> Node :: term() | no_node. +-spec random_other_active_node(State :: + chstate()) -> Node :: term() | no_node. + random_other_active_node(State) -> case lists:delete(node(), active_members(State)) of - [] -> - no_node; - L -> - lists:nth(riak_core_rand:uniform(length(L)), L) + [] -> no_node; + L -> lists:nth(rand:uniform(length(L)), L) end. %% @doc Incorporate another node's state into our view of the Riak world. --spec reconcile(ExternState :: chstate(), MyState :: chstate()) -> - {no_change | new_ring, chstate()}. +-spec reconcile(ExternState :: chstate(), + MyState :: chstate()) -> {no_change | new_ring, + chstate()}. + reconcile(ExternState, MyState) -> check_tainted(ExternState, - "Error: riak_core_ring/reconcile :: " - "reconciling tainted external ring"), + "Error: riak_core_ring/reconcile :: reconcilin" + "g tainted external ring"), check_tainted(MyState, - "Error: riak_core_ring/reconcile :: " - "reconciling tainted internal ring"), - case check_lastgasp(ExternState) of - true -> - {no_change, MyState}; - false -> - case internal_reconcile(MyState, ExternState) of - {false, State} -> - {no_change, State}; - {true, State} -> - {new_ring, State} - end + "Error: riak_core_ring/reconcile :: reconcilin" + "g tainted internal ring"), + case internal_reconcile(MyState, ExternState) of + {false, State} -> {no_change, State}; + {true, State} -> {new_ring, State} end. %% @doc Rename OldNode to NewNode in a Riak ring. --spec rename_node(State :: chstate(), OldNode :: atom(), NewNode :: atom()) -> - chstate(). -rename_node(State=#chstate{chring=Ring, nodename=ThisNode, members=Members, - claimant=Claimant, seen=Seen}, OldNode, NewNode) - when is_atom(OldNode), is_atom(NewNode) -> - State#chstate{ - chring=lists:foldl( - fun({Idx, Owner}, AccIn) -> - case Owner of - OldNode -> - chash:update(Idx, NewNode, AccIn); - _ -> AccIn - end - end, Ring, riak_core_ring:all_owners(State)), - members=orddict:from_list(proplists:substitute_aliases([{OldNode, NewNode}], Members)), - seen=orddict:from_list(proplists:substitute_aliases([{OldNode, NewNode}], Seen)), - nodename=case ThisNode of OldNode -> NewNode; _ -> ThisNode end, - claimant=case Claimant of OldNode -> NewNode; _ -> Claimant end, - vclock=vclock:increment(NewNode, State#chstate.vclock)}. +-spec rename_node(State :: chstate(), OldNode :: atom(), + NewNode :: atom()) -> chstate(). + +rename_node(State = #chstate{chring = Ring, + nodename = ThisNode, members = Members, + claimant = Claimant, seen = Seen}, + OldNode, NewNode) + when is_atom(OldNode), is_atom(NewNode) -> + State#chstate{chring = + lists:foldl(fun ({Idx, Owner}, AccIn) -> + case Owner of + OldNode -> + chash:update(Idx, NewNode, + AccIn); + _ -> AccIn + end + end, + Ring, riak_core_ring:all_owners(State)), + members = + orddict:from_list(proplists:substitute_aliases([{OldNode, + NewNode}], + Members)), + seen = + orddict:from_list(proplists:substitute_aliases([{OldNode, + NewNode}], + Seen)), + nodename = + case ThisNode of + OldNode -> NewNode; + _ -> ThisNode + end, + claimant = + case Claimant of + OldNode -> NewNode; + _ -> Claimant + end, + vclock = + vclock:increment(NewNode, State#chstate.vclock)}. %% @doc Determine the integer ring index responsible %% for a chash key. --spec responsible_index(binary(), chstate()) -> integer(). -responsible_index(ChashKey, #chstate{chring=Ring}) -> +-spec responsible_index(binary(), + chstate()) -> integer(). + +responsible_index(ChashKey, #chstate{chring = Ring}) -> <> = ChashKey, chash:next_index(IndexAsInt, Ring). @@ -538,69 +532,69 @@ responsible_index(ChashKey, #chstate{chring=Ring}) -> %% for `CHashKey' in the future ring. For regular transitions %% the returned index will always be `OrigIdx'. If the ring is %% resizing the index may be different --spec future_index(chash:index(), - integer(), +-spec future_index(chash:index(), integer(), chstate()) -> integer() | undefined. + future_index(CHashKey, OrigIdx, State) -> future_index(CHashKey, OrigIdx, undefined, State). --spec future_index(chash:index(), - integer(), - undefined | integer(), - chstate()) -> integer() | undefined. +-spec future_index(chash:index(), integer(), + undefined | integer(), chstate()) -> integer() | + undefined. + future_index(CHashKey, OrigIdx, NValCheck, State) -> OrigCount = num_partitions(State), NextCount = future_num_partitions(State), - future_index(CHashKey, OrigIdx, NValCheck, OrigCount, NextCount). + future_index(CHashKey, OrigIdx, NValCheck, OrigCount, + NextCount). -future_index(CHashKey, OrigIdx, NValCheck, OrigCount, NextCount) -> +future_index(CHashKey, OrigIdx, NValCheck, OrigCount, + NextCount) -> <> = CHashKey, OrigInc = chash:ring_increment(OrigCount), NextInc = chash:ring_increment(NextCount), - %% Determine position in the ring of partition that owns key (head of preflist) %% Position is 1-based starting from partition (0 + ring increment), e.g. %% index 0 is always position N. - OwnerPos = ((CHashInt div OrigInc) + 1), - + OwnerPos = CHashInt div OrigInc + 1, %% Determine position of the source partition in the ring %% if OrigIdx is 0 we know the position is OrigCount (number of partitions) OrigPos = case OrigIdx of - 0 -> OrigCount; - _ -> OrigIdx div OrigInc + 0 -> OrigCount; + _ -> OrigIdx div OrigInc end, - %% The distance between the key's owner (head of preflist) and the source partition %% is the position of the source in the preflist, the distance may be negative %% in which case we have wrapped around the ring. distance of zero means the source %% is the head of the preflist. OrigDist = case OrigPos - OwnerPos of - P when P < 0 -> OrigCount + P; - P -> P + P when P < 0 -> OrigCount + P; + P -> P end, - %% In the case that the ring is shrinking the future index for a key whose position %% in the preflist is >= ring size may be calculated, any transfer is invalid in %% this case, return undefined. The position may also be >= an optional N value for %% the key, if this is true undefined is also returned - case check_invalid_future_index(OrigDist, NextCount, NValCheck) of - true -> undefined; - false -> - %% Determine the partition (head of preflist) that will own the key in the future ring - FuturePos = ((CHashInt div NextInc) + 1), - NextOwner = FuturePos * NextInc, - - %% Determine the partition that the key should be transferred to (has same position - %% in future preflist as source partition does in current preflist) - RingTop = trunc(math:pow(2,160)-1), - (NextOwner + (NextInc * OrigDist)) rem RingTop + case check_invalid_future_index(OrigDist, NextCount, + NValCheck) + of + true -> undefined; + false -> + %% Determine the partition (head of preflist) that will own the key in the future ring + FuturePos = CHashInt div NextInc + 1, + NextOwner = FuturePos * NextInc, + %% Determine the partition that the key should be transferred to (has same position + %% in future preflist as source partition does in current preflist) + RingTop = trunc(math:pow(2, 160) - 1), + (NextOwner + NextInc * OrigDist) rem RingTop end. -check_invalid_future_index(OrigDist, NextCount, NValCheck) -> +check_invalid_future_index(OrigDist, NextCount, + NValCheck) -> OverRingSize = OrigDist >= NextCount, OverNVal = case NValCheck of - undefined -> false; - _ -> OrigDist >= NValCheck + undefined -> false; + _ -> OrigDist >= NValCheck end, OverRingSize orelse OverNVal. @@ -608,158 +602,159 @@ check_invalid_future_index(OrigDist, NextCount, NValCheck) -> %% in the current preflist for the key. Returns true if `TargetIdx' %% is in the same position in the future preflist for that key. %% @see future_index/4 --spec is_future_index(chash:index(), integer(), integer(), chstate()) -> boolean(). +-spec is_future_index(chash:index(), integer(), + integer(), chstate()) -> boolean(). + is_future_index(CHashKey, OrigIdx, TargetIdx, State) -> - FutureIndex = future_index(CHashKey, OrigIdx, undefined, State), + FutureIndex = future_index(CHashKey, OrigIdx, undefined, + State), FutureIndex =:= TargetIdx. --spec transfer_node(Idx :: integer(), Node :: term(), MyState :: chstate()) -> - chstate(). +-spec transfer_node(Idx :: integer(), Node :: term(), + MyState :: chstate()) -> chstate(). + transfer_node(Idx, Node, MyState) -> case chash:lookup(Idx, MyState#chstate.chring) of - Node -> - MyState; - _ -> - Me = MyState#chstate.nodename, - VClock = vclock:increment(Me, MyState#chstate.vclock), - CHRing = chash:update(Idx, Node, MyState#chstate.chring), - MyState#chstate{vclock=VClock,chring=CHRing} + Node -> MyState; + _ -> + Me = MyState#chstate.nodename, + VClock = vclock:increment(Me, MyState#chstate.vclock), + CHRing = chash:update(Idx, Node, + MyState#chstate.chring), + MyState#chstate{vclock = VClock, chring = CHRing} end. % @doc Set a key in the cluster metadata dict --spec update_meta(Key :: term(), Val :: term(), State :: chstate()) -> chstate(). +-spec update_meta(Key :: term(), Val :: term(), + State :: chstate()) -> chstate(). + update_meta(Key, Val, State) -> Change = case dict:find(Key, State#chstate.meta) of - {ok, OldM} -> - Val /= OldM#meta_entry.value; - error -> - true + {ok, OldM} -> Val /= OldM#meta_entry.value; + error -> true end, if Change -> - M = #meta_entry { - lastmod = calendar:datetime_to_gregorian_seconds( - calendar:universal_time()), - value = Val - }, - VClock = vclock:increment(State#chstate.nodename, - State#chstate.vclock), - State#chstate{vclock=VClock, - meta=dict:store(Key, M, State#chstate.meta)}; - true -> - State + M = #meta_entry{lastmod = + calendar:datetime_to_gregorian_seconds(calendar:universal_time()), + value = Val}, + VClock = vclock:increment(State#chstate.nodename, + State#chstate.vclock), + State#chstate{vclock = VClock, + meta = dict:store(Key, M, State#chstate.meta)}; + true -> State end. %% @doc Logical delete of a key in the cluster metadata dict --spec remove_meta(Key :: term(), State :: chstate()) -> chstate(). +-spec remove_meta(Key :: term(), + State :: chstate()) -> chstate(). + remove_meta(Key, State) -> case dict:find(Key, State#chstate.meta) of - {ok, _} -> update_meta(Key, '$removed', State); - error -> State + {ok, _} -> update_meta(Key, '$removed', State); + error -> State end. %% @doc Return the current claimant. -spec claimant(State :: chstate()) -> node(). -claimant(#chstate{claimant=Claimant}) -> - Claimant. + +claimant(#chstate{claimant = Claimant}) -> Claimant. set_claimant(State, Claimant) -> - State#chstate{claimant=Claimant}. + State#chstate{claimant = Claimant}. %% @doc Returns the unique identifer for this cluster. -spec cluster_name(State :: chstate()) -> term(). -cluster_name(State) -> - State#chstate.clustername. + +cluster_name(State) -> State#chstate.clustername. %% @doc Sets the unique identifer for this cluster. set_cluster_name(State, Name) -> - State#chstate{clustername=Name}. + State#chstate{clustername = Name}. -reconcile_names(RingA=#chstate{clustername=NameA}, - RingB=#chstate{clustername=NameB}) -> +reconcile_names(RingA = #chstate{clustername = NameA}, + RingB = #chstate{clustername = NameB}) -> case (NameA =:= undefined) or (NameB =:= undefined) of - true -> - {RingA#chstate{clustername=undefined}, - RingB#chstate{clustername=undefined}}; - false -> - {RingA, RingB} + true -> + {RingA#chstate{clustername = undefined}, + RingB#chstate{clustername = undefined}}; + false -> {RingA, RingB} end. increment_vclock(Node, State) -> VClock = vclock:increment(Node, State#chstate.vclock), - State#chstate{vclock=VClock}. + State#chstate{vclock = VClock}. -ring_version(#chstate{rvsn=RVsn}) -> - RVsn. +ring_version(#chstate{rvsn = RVsn}) -> RVsn. increment_ring_version(Node, State) -> RVsn = vclock:increment(Node, State#chstate.rvsn), - State#chstate{rvsn=RVsn}. + State#chstate{rvsn = RVsn}. %% @doc Returns the current membership status for a node in the cluster. --spec member_status(chstate() | [node()], Node :: node()) -> member_status(). -member_status(#chstate{members=Members}, Node) -> +-spec member_status(chstate() | [node()], + Node :: node()) -> member_status(). + +member_status(#chstate{members = Members}, Node) -> member_status(Members, Node); member_status(Members, Node) -> case orddict:find(Node, Members) of - {ok, {Status, _, _}} -> - Status; - _ -> - invalid + {ok, {Status, _, _}} -> Status; + _ -> invalid end. %% @doc Returns the current membership status for all nodes in the cluster. --spec all_member_status(State :: chstate()) -> [{node(), member_status()}]. -all_member_status(#chstate{members=Members}) -> - [{Node, Status} || {Node, {Status, _VC, _}} <- Members, Status /= invalid]. +-spec all_member_status(State :: chstate()) -> [{node(), + member_status()}]. + +all_member_status(#chstate{members = Members}) -> + [{Node, Status} + || {Node, {Status, _VC, _}} <- Members, + Status /= invalid]. get_member_meta(State, Member, Key) -> case orddict:find(Member, State#chstate.members) of - error -> undefined; - {ok, {_, _, Meta}} -> - case orddict:find(Key, Meta) of - error -> - undefined; - {ok, Value} -> - Value - end + error -> undefined; + {ok, {_, _, Meta}} -> + case orddict:find(Key, Meta) of + error -> undefined; + {ok, Value} -> Value + end end. %% @doc Set a key in the member metadata orddict update_member_meta(Node, State, Member, Key, Val) -> VClock = vclock:increment(Node, State#chstate.vclock), - State2 = update_member_meta(Node, State, Member, Key, Val, same_vclock), - State2#chstate{vclock=VClock}. + State2 = update_member_meta(Node, State, Member, Key, + Val, same_vclock), + State2#chstate{vclock = VClock}. -update_member_meta(Node, State, Member, Key, Val, same_vclock) -> +update_member_meta(Node, State, Member, Key, Val, + same_vclock) -> Members = State#chstate.members, case orddict:is_key(Member, Members) of - true -> - Members2 = orddict:update(Member, - fun({Status, VC, MD}) -> - {Status, - vclock:increment(Node, VC), - orddict:store(Key, Val, MD)} - end, - Members), - State#chstate{members=Members2}; - false -> - State + true -> + Members2 = orddict:update(Member, + fun ({Status, VC, MD}) -> + {Status, vclock:increment(Node, VC), + orddict:store(Key, Val, MD)} + end, + Members), + State#chstate{members = Members2}; + false -> State end. clear_member_meta(Node, State, Member) -> Members = State#chstate.members, case orddict:is_key(Member, Members) of - true -> - Members2 = orddict:update(Member, - fun({Status, VC, _MD}) -> - {Status, - vclock:increment(Node, VC), - orddict:new()} - end, - Members), - State#chstate{members=Members2}; - false -> - State + true -> + Members2 = orddict:update(Member, + fun ({Status, VC, _MD}) -> + {Status, vclock:increment(Node, VC), + orddict:new()} + end, + Members), + State#chstate{members = Members2}; + false -> State end. add_member(PNode, State, Node) -> @@ -780,83 +775,99 @@ down_member(PNode, State, Node) -> set_member(Node, CState, Member, Status) -> VClock = vclock:increment(Node, CState#chstate.vclock), - CState2 = set_member(Node, CState, Member, Status, same_vclock), - CState2#chstate{vclock=VClock}. + CState2 = set_member(Node, CState, Member, Status, + same_vclock), + CState2#chstate{vclock = VClock}. set_member(Node, CState, Member, Status, same_vclock) -> Members2 = orddict:update(Member, - fun({_, VC, MD}) -> + fun ({_, VC, MD}) -> {Status, vclock:increment(Node, VC), MD} end, - {Status, vclock:increment(Node, - vclock:fresh()), []}, + {Status, vclock:increment(Node, vclock:fresh()), + []}, CState#chstate.members), - CState#chstate{members=Members2}. + CState#chstate{members = Members2}. %% @doc Return a list of all members of the cluster that are eligible to %% claim partitions. --spec claiming_members(State :: chstate()) -> [Node :: node()]. -claiming_members(#chstate{members=Members}) -> +-spec claiming_members(State :: chstate()) -> [Node :: + node()]. + +claiming_members(#chstate{members = Members}) -> get_members(Members, [joining, valid, down]). %% @doc Return a list of all members of the cluster that are marked as down. --spec down_members(State :: chstate()) -> [Node :: node()]. -down_members(#chstate{members=Members}) -> +-spec down_members(State :: chstate()) -> [Node :: + node()]. + +down_members(#chstate{members = Members}) -> get_members(Members, [down]). %% @doc Set the node that is responsible for a given chstate. --spec set_owner(State :: chstate(), Node :: node()) -> chstate(). +-spec set_owner(State :: chstate(), + Node :: node()) -> chstate(). + set_owner(State, Node) -> - State#chstate{nodename=Node}. + State#chstate{nodename = Node}. %% @doc Return all partition indices owned by a node. --spec indices(State :: chstate(), Node :: node()) -> [integer()]. +-spec indices(State :: chstate(), + Node :: node()) -> [integer()]. + indices(State, Node) -> AllOwners = all_owners(State), [Idx || {Idx, Owner} <- AllOwners, Owner =:= Node]. %% @doc Return all partition indices that will be owned by a node after all %% pending ownership transfers have completed. --spec future_indices(State :: chstate(), Node :: node()) -> [integer()]. +-spec future_indices(State :: chstate(), + Node :: node()) -> [integer()]. + future_indices(State, Node) -> indices(future_ring(State), Node). --spec all_next_owners(chstate()) -> [{integer(), term()}]. +-spec all_next_owners(chstate()) -> [{integer(), + term()}]. + all_next_owners(CState) -> Next = riak_core_ring:pending_changes(CState), [{Idx, NextOwner} || {Idx, _, NextOwner, _, _} <- Next]. %% @private change_owners(CState, Reassign) -> - lists:foldl(fun({Idx, NewOwner}, CState0) -> + lists:foldl(fun ({Idx, NewOwner}, CState0) -> %% if called for indexes not in the current ring (during resizing) %% ignore the error try riak_core_ring:transfer_node(Idx, NewOwner, CState0) catch - error:{badmatch, _} -> CState0 + error:{badmatch, _} -> CState0 end - end, CState, Reassign). + end, + CState, Reassign). %% @doc Return all indices that a node is scheduled to give to another. disowning_indices(State, Node) -> case is_resizing(State) of - false -> - [Idx || {Idx, Owner, _NextOwner, _Mods, _Status} <- State#chstate.next, - Owner =:= Node]; - true -> - [Idx || {Idx, Owner} <- all_owners(State), - Owner =:= Node, - disowned_during_resize(State, Idx, Owner)] + false -> + [Idx + || {Idx, Owner, _NextOwner, _Mods, _Status} + <- State#chstate.next, + Owner =:= Node]; + true -> + [Idx + || {Idx, Owner} <- all_owners(State), Owner =:= Node, + disowned_during_resize(State, Idx, Owner)] end. disowned_during_resize(CState, Idx, Owner) -> %% catch error when index doesn't exist, we are disowning it if its going away - NextOwner = try future_owner(CState, Idx) - catch _:_ -> undefined + NextOwner = try future_owner(CState, Idx) catch + _:_ -> undefined end, case NextOwner of - Owner -> false; - _ -> true + Owner -> false; + _ -> true end. %% @doc Returns a list of all pending ownership transfers. @@ -865,16 +876,17 @@ pending_changes(State) -> State#chstate.next. set_pending_changes(State, Transfers) -> - State#chstate{next=Transfers}. + State#chstate{next = Transfers}. %% @doc Given a ring, `Resizing', that has been resized (and presumably rebalanced) %% schedule a resize transition for `Orig'. --spec set_pending_resize(chstate(), chstate()) -> chstate(). +-spec set_pending_resize(chstate(), + chstate()) -> chstate(). + set_pending_resize(Resizing, Orig) -> %% all existing indexes must transfer data when the ring is being resized - Next = [{Idx, Owner, '$resize', [], awaiting} || - {Idx, Owner} <- riak_core_ring:all_owners(Orig)], - + Next = [{Idx, Owner, '$resize', [], awaiting} + || {Idx, Owner} <- riak_core_ring:all_owners(Orig)], %% Whether or not the ring is shrinking or expanding, some %% ownership may be shared between the old and new ring. To prevent %% degenerate cases where partitions whose ownership does not @@ -882,7 +894,8 @@ set_pending_resize(Resizing, Orig) -> %% ignore on each subsequent transfer, we move them to the front %% of the next list which is treated as ordered. FutureOwners = riak_core_ring:all_owners(Resizing), - SortedNext = lists:sort(fun({Idx, Owner, _, _, _}, _) -> + SortedNext = lists:sort(fun ({Idx, Owner, _, _, _}, + _) -> %% we only need to check one element because the end result %% is the same as if we checked both: %% @@ -891,135 +904,174 @@ set_pending_resize(Resizing, Orig) -> %% false, false -> false %% false, true -> false lists:member({Idx, Owner}, FutureOwners) - end, Next), - + end, + Next), %% Resizing is assumed to have a modified chring, we need to put back %% the original chring to not install the resized one pre-emptively. The %% resized ring is stored in ring metadata for later use FutureCHash = chash(Resizing), ResetRing = set_chash(Resizing, chash(Orig)), - set_resized_ring(set_pending_changes(ResetRing, SortedNext), FutureCHash). + set_resized_ring(set_pending_changes(ResetRing, + SortedNext), + FutureCHash). + +-spec maybe_abort_resize(chstate()) -> {boolean(), + chstate()}. --spec maybe_abort_resize(chstate()) -> {boolean(), chstate()}. maybe_abort_resize(State) -> Resizing = is_resizing(State), PostResize = is_post_resize(State), PendingAbort = is_resize_aborted(State), - case PendingAbort andalso Resizing andalso not PostResize of - true -> - State1 = State#chstate{next=[]}, - State2 = clear_all_resize_transfers(State1), - State3 = remove_meta('$resized_ring_abort', State2), - {true, remove_meta('$resized_ring', State3)}; - false -> - {false, State} + case PendingAbort andalso + Resizing andalso not PostResize + of + true -> + State1 = State#chstate{next = []}, + State2 = clear_all_resize_transfers(State1), + State3 = remove_meta('$resized_ring_abort', State2), + {true, remove_meta('$resized_ring', State3)}; + false -> {false, State} end. - -spec set_pending_resize_abort(chstate()) -> chstate(). + set_pending_resize_abort(State) -> update_meta('$resized_ring_abort', true, State). -spec schedule_resize_transfer(chstate(), {integer(), term()}, integer() | {integer(), term()}) -> chstate(). -schedule_resize_transfer(State, Source, TargetIdx) when is_integer(TargetIdx) -> + +schedule_resize_transfer(State, Source, TargetIdx) + when is_integer(TargetIdx) -> TargetNode = index_owner(future_ring(State), TargetIdx), - schedule_resize_transfer(State, Source, {TargetIdx, TargetNode}); + schedule_resize_transfer(State, Source, + {TargetIdx, TargetNode}); schedule_resize_transfer(State, Source, Source) -> State; schedule_resize_transfer(State, Source, Target) -> Transfers = resize_transfers(State, Source), %% ignore if we have already scheduled a transfer from source -> target case lists:keymember(Target, 1, Transfers) of - true -> State; - false -> - Transfers1 = lists:keystore(Target, 1, Transfers, - {Target, ordsets:new(), awaiting}), - set_resize_transfers(State, Source, Transfers1) + true -> State; + false -> + Transfers1 = lists:keystore(Target, 1, Transfers, + {Target, ordsets:new(), awaiting}), + set_resize_transfers(State, Source, Transfers1) end. %% @doc reassign all outbound and inbound resize transfers from `Node' to `NewNode' --spec reschedule_resize_transfers(chstate(), term(), term()) -> chstate(). -reschedule_resize_transfers(State=#chstate{next=Next}, Node, NewNode) -> - {NewNext, NewState} = lists:mapfoldl( - fun(Entry, StateAcc) -> reschedule_resize_operation(Node, NewNode, - Entry, StateAcc) - end, - State, Next), - NewState#chstate{next=NewNext}. - -reschedule_resize_operation(N, NewNode, {Idx, N, '$resize', _Mods, _Status}, State) -> - NewEntry = {Idx, NewNode, '$resize', ordsets:new(), awaiting}, - NewState = reschedule_outbound_resize_transfers(State, Idx, N, NewNode), +-spec reschedule_resize_transfers(chstate(), term(), + term()) -> chstate(). + +reschedule_resize_transfers(State = #chstate{next = + Next}, + Node, NewNode) -> + {NewNext, NewState} = lists:mapfoldl(fun (Entry, + StateAcc) -> + reschedule_resize_operation(Node, + NewNode, + Entry, + StateAcc) + end, + State, Next), + NewState#chstate{next = NewNext}. + +reschedule_resize_operation(N, NewNode, + {Idx, N, '$resize', _Mods, _Status}, State) -> + NewEntry = {Idx, NewNode, '$resize', ordsets:new(), + awaiting}, + NewState = reschedule_outbound_resize_transfers(State, + Idx, N, NewNode), {NewEntry, NewState}; reschedule_resize_operation(Node, NewNode, - {Idx, OtherNode, '$resize', _Mods, _Status}=Entry, + {Idx, OtherNode, '$resize', _Mods, _Status} = Entry, State) -> - {Changed, NewState} = reschedule_inbound_resize_transfers({Idx, OtherNode}, Node, - NewNode, State), + {Changed, NewState} = + reschedule_inbound_resize_transfers({Idx, OtherNode}, + Node, NewNode, State), case Changed of - true -> - NewEntry = {Idx, OtherNode, '$resize', ordsets:new(), awaiting}, - {NewEntry, NewState}; - false -> - {Entry, State} + true -> + NewEntry = {Idx, OtherNode, '$resize', ordsets:new(), + awaiting}, + {NewEntry, NewState}; + false -> {Entry, State} end. -reschedule_inbound_resize_transfers(Source, Node, NewNode, State) -> - F = fun(Transfer, Acc) -> - {NewXfer, NewAcc} = reschedule_inbound_resize_transfer(Transfer, Node, NewNode), +reschedule_inbound_resize_transfers(Source, Node, + NewNode, State) -> + F = fun (Transfer, Acc) -> + {NewXfer, NewAcc} = + reschedule_inbound_resize_transfer(Transfer, Node, + NewNode), {NewXfer, NewAcc orelse Acc} end, - {ResizeTransfers, Changed} = lists:mapfoldl(F, false, resize_transfers(State, Source)), - {Changed, set_resize_transfers(State, Source, ResizeTransfers)}. - -reschedule_inbound_resize_transfer({{Idx, Target}, _, _}, Target, NewNode) -> + {ResizeTransfers, Changed} = lists:mapfoldl(F, false, + resize_transfers(State, + Source)), + {Changed, + set_resize_transfers(State, Source, ResizeTransfers)}. + +reschedule_inbound_resize_transfer({{Idx, Target}, _, + _}, + Target, NewNode) -> {{{Idx, NewNode}, ordsets:new(), awaiting}, true}; reschedule_inbound_resize_transfer(Transfer, _, _) -> {Transfer, false}. -reschedule_outbound_resize_transfers(State, Idx, Node, NewNode) -> +reschedule_outbound_resize_transfers(State, Idx, Node, + NewNode) -> OldSource = {Idx, Node}, NewSource = {Idx, NewNode}, Transfers = resize_transfers(State, OldSource), - F = fun({I,N}) when N =:= Node -> {I,NewNode}; - (T) -> T + F = fun ({I, N}) when N =:= Node -> {I, NewNode}; + (T) -> T end, - NewTransfers = [{F(Target), ordsets:new(), awaiting} || {Target, _, _} <- Transfers], - set_resize_transfers(clear_resize_transfers(OldSource, State), NewSource, NewTransfers). + NewTransfers = [{F(Target), ordsets:new(), awaiting} + || {Target, _, _} <- Transfers], + set_resize_transfers(clear_resize_transfers(OldSource, + State), + NewSource, NewTransfers). %% @doc returns the first awaiting resize_transfer for a {SourceIdx, SourceNode} %% pair. If all transfers for the pair are complete, undefined is returned --spec awaiting_resize_transfer(chstate(), {integer(), term()}, atom()) -> - {integer(), term()} | undefined. +-spec awaiting_resize_transfer(chstate(), + {integer(), term()}, atom()) -> {integer(), + term()} | + undefined. + awaiting_resize_transfer(State, Source, Mod) -> ResizeTransfers = resize_transfers(State, Source), - Awaiting = [{Target, Mods, Status} || {Target, Mods, Status} <- ResizeTransfers, - Status =/= complete, - not ordsets:is_element(Mod, Mods)], + Awaiting = [{Target, Mods, Status} + || {Target, Mods, Status} <- ResizeTransfers, + Status =/= complete, not ordsets:is_element(Mod, Mods)], case Awaiting of - [] -> undefined; - [{Target, _, _} | _] -> Target + [] -> undefined; + [{Target, _, _} | _] -> Target end. %% @doc return the status of a resize_transfer for `Source' (an index-node pair). undefined %% is returned if no such transfer is scheduled. complete is returned if the transfer %% is marked as such or `Mod' is contained in the completed modules set. awaiting is %% returned otherwise --spec resize_transfer_status(chstate(), {integer(), term()}, {integer(), term()}, atom()) -> - awaiting | complete | undefined. +-spec resize_transfer_status(chstate(), + {integer(), term()}, {integer(), term()}, + atom()) -> awaiting | complete | undefined. + resize_transfer_status(State, Source, Target, Mod) -> ResizeTransfers = resize_transfers(State, Source), - IsComplete = case lists:keyfind(Target, 1, ResizeTransfers) of - false -> undefined; - {Target, _, complete} -> true; - {Target, Mods, awaiting} -> ordsets:is_element(Mod, Mods) + IsComplete = case lists:keyfind(Target, 1, + ResizeTransfers) + of + false -> undefined; + {Target, _, complete} -> true; + {Target, Mods, awaiting} -> + ordsets:is_element(Mod, Mods) end, case IsComplete of - true -> complete; - false -> awaiting; - undefined -> undefined + true -> complete; + false -> awaiting; + undefined -> undefined end. %% @doc mark a resize_transfer from `Source' to `Target' for `Mod' complete. @@ -1028,75 +1080,94 @@ resize_transfer_status(State, Source, Target, Mod) -> %% for `Source' that need to be started to be scheduled before calling %% this fuction -spec resize_transfer_complete(chstate(), - {integer(),term()}, - {integer(),term()}, + {integer(), term()}, {integer(), term()}, atom()) -> chstate(). -resize_transfer_complete(State, {SrcIdx, _}=Source, Target, Mod) -> + +resize_transfer_complete(State, {SrcIdx, _} = Source, + Target, Mod) -> ResizeTransfers = resize_transfers(State, Source), Transfer = lists:keyfind(Target, 1, ResizeTransfers), case Transfer of - {Target, Mods, Status} -> - VNodeMods = - ordsets:from_list([VMod || {_, VMod} <- riak_core:vnode_modules()]), - Mods2 = ordsets:add_element(Mod, Mods), - Status2 = case {Status, Mods2} of - {complete, _} -> complete; - {awaiting, VNodeMods} -> complete; - _ -> awaiting - end, - ResizeTransfers2 = lists:keyreplace(Target, 1, ResizeTransfers, - {Target, Mods2, Status2}), - State1 = set_resize_transfers(State, Source, ResizeTransfers2), - AllComplete = lists:all(fun({_, _, complete}) -> true; - ({_, Ms, awaiting}) -> ordsets:is_element(Mod, Ms) - end, ResizeTransfers2), - case AllComplete of - true -> - transfer_complete(State1, SrcIdx, Mod); - false -> State1 - end; - _ -> State + {Target, Mods, Status} -> + VNodeMods = ordsets:from_list([VMod + || {_, VMod} + <- riak_core:vnode_modules()]), + Mods2 = ordsets:add_element(Mod, Mods), + Status2 = case {Status, Mods2} of + {complete, _} -> complete; + {awaiting, VNodeMods} -> complete; + _ -> awaiting + end, + ResizeTransfers2 = lists:keyreplace(Target, 1, + ResizeTransfers, + {Target, Mods2, Status2}), + State1 = set_resize_transfers(State, Source, + ResizeTransfers2), + AllComplete = lists:all(fun ({_, _, complete}) -> true; + ({_, Ms, awaiting}) -> + ordsets:is_element(Mod, Ms) + end, + ResizeTransfers2), + case AllComplete of + true -> transfer_complete(State1, SrcIdx, Mod); + false -> State1 + end; + _ -> State end. -spec is_resizing(chstate()) -> boolean(). + is_resizing(State) -> case resized_ring(State) of - undefined -> false; - {ok, _} -> true + undefined -> false; + {ok, _} -> true end. -spec is_post_resize(chstate()) -> boolean(). + is_post_resize(State) -> case get_meta('$resized_ring', State) of - {ok, '$cleanup'} -> true; - _ -> false + {ok, '$cleanup'} -> true; + _ -> false end. -spec is_resize_aborted(chstate()) -> boolean(). + is_resize_aborted(State) -> case get_meta('$resized_ring_abort', State) of - {ok, true} -> true; - _ -> false + {ok, true} -> true; + _ -> false end. -spec is_resize_complete(chstate()) -> boolean(). -is_resize_complete(#chstate{next=Next}) -> - not lists:any(fun({_, _, _, _, awaiting}) -> true; - ({_, _, _, _, complete}) -> false - end, - Next). --spec complete_resize_transfers(chstate(), {integer(),term()}, atom()) -> [{integer(),term()}]. +is_resize_complete(#chstate{next = Next}) -> + not + lists:any(fun ({_, _, _, _, awaiting}) -> true; + ({_, _, _, _, complete}) -> false + end, + Next). + +-spec complete_resize_transfers(chstate(), + {integer(), term()}, atom()) -> [{integer(), + term()}]. + complete_resize_transfers(State, Source, Mod) -> - [Target || {Target, Mods, Status} <- resize_transfers(State, Source), - Status =:= complete orelse ordsets:is_element(Mod, Mods)]. + [Target + || {Target, Mods, Status} + <- resize_transfers(State, Source), + Status =:= complete orelse + ordsets:is_element(Mod, Mods)]. + +-spec deletion_complete(chstate(), integer(), + atom()) -> chstate(). --spec deletion_complete(chstate(), integer(), atom()) -> chstate(). deletion_complete(State, Idx, Mod) -> transfer_complete(State, Idx, Mod). --spec resize_transfers(chstate(), {integer(), term()}) -> - [resize_transfer()]. +-spec resize_transfers(chstate(), + {integer(), term()}) -> [resize_transfer()]. + resize_transfers(State, Source) -> {ok, Transfers} = get_meta({resize, Source}, [], State), Transfers. @@ -1104,114 +1175,117 @@ resize_transfers(State, Source) -> -spec set_resize_transfers(chstate(), {integer(), term()}, [resize_transfer()]) -> chstate(). + set_resize_transfers(State, Source, Transfers) -> update_meta({resize, Source}, Transfers, State). clear_all_resize_transfers(State) -> - lists:foldl(fun clear_resize_transfers/2, State, all_owners(State)). + lists:foldl(fun clear_resize_transfers/2, State, + all_owners(State)). clear_resize_transfers(Source, State) -> remove_meta({resize, Source}, State). --spec resized_ring(chstate()) -> {ok, chash:chash()} | undefined. +-spec resized_ring(chstate()) -> {ok, chash:chash()} | + undefined. + resized_ring(State) -> case get_meta('$resized_ring', State) of - {ok, '$cleanup'} -> {ok, State#chstate.chring}; - {ok, CHRing} -> {ok, CHRing}; - _ -> undefined + {ok, '$cleanup'} -> {ok, State#chstate.chring}; + {ok, CHRing} -> {ok, CHRing}; + _ -> undefined end. --spec set_resized_ring(chstate(), chash:chash()) -> chstate(). +-spec set_resized_ring(chstate(), + chash:chash()) -> chstate(). + set_resized_ring(State, FutureCHash) -> update_meta('$resized_ring', FutureCHash, State). cleanup_after_resize(State) -> update_meta('$resized_ring', '$cleanup', State). +-spec vnode_type(chstate(), integer()) -> primary | + {fallback, term()} | future_primary | + resized_primary. --spec vnode_type(chstate(),integer()) -> primary | - {fallback, term()} | - future_primary | - resized_primary. vnode_type(State, Idx) -> vnode_type(State, Idx, node()). vnode_type(State, Idx, Node) -> try index_owner(State, Idx) of - Node -> - primary; - Owner -> - case next_owner(State, Idx) of - {_, Node, _} -> - future_primary; - _ -> - {fallback, Owner} - end + Node -> primary; + Owner -> + case next_owner(State, Idx) of + {_, Node, _} -> future_primary; + _ -> {fallback, Owner} + end catch - error:{badmatch, _} -> - %% idx doesn't exist so must be an index in a resized ring - resized_primary + error:{badmatch, _} -> + %% idx doesn't exist so must be an index in a resized ring + resized_primary end. %% @doc Return details for a pending partition ownership change. --spec next_owner(State :: chstate(), Idx :: integer()) -> pending_change(). +-spec next_owner(State :: chstate(), + Idx :: integer()) -> pending_change(). + next_owner(State, Idx) -> case lists:keyfind(Idx, 1, State#chstate.next) of - false -> - {undefined, undefined, undefined}; - NInfo -> - next_owner(NInfo) + false -> {undefined, undefined, undefined}; + NInfo -> next_owner(NInfo) end. %% @doc Return details for a pending partition ownership change. -spec next_owner(State :: chstate(), Idx :: integer(), Mod :: module()) -> pending_change(). + next_owner(State, Idx, Mod) -> NInfo = lists:keyfind(Idx, 1, State#chstate.next), next_owner_status(NInfo, Mod). next_owner_status(NInfo, Mod) -> case NInfo of - false -> - {undefined, undefined, undefined}; - {_, Owner, NextOwner, _Transfers, complete} -> - {Owner, NextOwner, complete}; - {_, Owner, NextOwner, Transfers, _Status} -> - case ordsets:is_element(Mod, Transfers) of - true -> - {Owner, NextOwner, complete}; - false -> - {Owner, NextOwner, awaiting} - end + false -> {undefined, undefined, undefined}; + {_, Owner, NextOwner, _Transfers, complete} -> + {Owner, NextOwner, complete}; + {_, Owner, NextOwner, Transfers, _Status} -> + case ordsets:is_element(Mod, Transfers) of + true -> {Owner, NextOwner, complete}; + false -> {Owner, NextOwner, awaiting} + end end. %% @private next_owner({_, Owner, NextOwner, _Transfers, Status}) -> {Owner, NextOwner, Status}. -completed_next_owners(Mod, #chstate{next=Next}) -> - [{Idx, O, NO} || NInfo={Idx, _, _, _, _} <- Next, - {O, NO, complete} <- [next_owner_status(NInfo, Mod)]]. +completed_next_owners(Mod, #chstate{next = Next}) -> + [{Idx, O, NO} + || NInfo = {Idx, _, _, _, _} <- Next, + {O, NO, complete} <- [next_owner_status(NInfo, Mod)]]. %% @doc Returns true if all cluster members have seen the current ring. -spec ring_ready(State :: chstate()) -> boolean(). + ring_ready(State0) -> check_tainted(State0, - "Error: riak_core_ring/ring_ready called on tainted ring"), + "Error: riak_core_ring/ring_ready called " + "on tainted ring"), Owner = owner_node(State0), State = update_seen(Owner, State0), Seen = State#chstate.seen, - Members = get_members(State#chstate.members, [valid, leaving, exiting]), + Members = get_members(State#chstate.members, + [valid, leaving, exiting]), VClock = State#chstate.vclock, R = [begin - case orddict:find(Node, Seen) of - error -> - false; - {ok, VC} -> - vclock:equal(VClock, VC) - end - end || Node <- Members], - Ready = lists:all(fun(X) -> X =:= true end, R), + case orddict:find(Node, Seen) of + error -> false; + {ok, VC} -> vclock:equal(VClock, VC) + end + end + || Node <- Members], + Ready = lists:all(fun (X) -> X =:= true end, R), Ready. ring_ready() -> @@ -1222,79 +1296,86 @@ ring_ready_info(State0) -> Owner = owner_node(State0), State = update_seen(Owner, State0), Seen = State#chstate.seen, - Members = get_members(State#chstate.members, [valid, leaving, exiting]), - RecentVC = - orddict:fold(fun(_, VC, Recent) -> - case vclock:descends(VC, Recent) of - true -> - VC; - false -> - Recent - end - end, State#chstate.vclock, Seen), - Outdated = - orddict:filter(fun(Node, VC) -> - (not vclock:equal(VC, RecentVC)) - and lists:member(Node, Members) - end, Seen), + Members = get_members(State#chstate.members, + [valid, leaving, exiting]), + RecentVC = orddict:fold(fun (_, VC, Recent) -> + case vclock:descends(VC, Recent) of + true -> VC; + false -> Recent + end + end, + State#chstate.vclock, Seen), + Outdated = orddict:filter(fun (Node, VC) -> + not vclock:equal(VC, RecentVC) and + lists:member(Node, Members) + end, + Seen), Outdated. %% @doc Marks a pending transfer as completed. --spec handoff_complete(State :: chstate(), Idx :: integer(), - Mod :: module()) -> chstate(). +-spec handoff_complete(State :: chstate(), + Idx :: integer(), Mod :: module()) -> chstate(). + handoff_complete(State, Idx, Mod) -> transfer_complete(State, Idx, Mod). ring_changed(Node, State) -> check_tainted(State, - "Error: riak_core_ring/ring_changed called on tainted ring"), + "Error: riak_core_ring/ring_changed called " + "on tainted ring"), internal_ring_changed(Node, State). %% @doc Return the ring that will exist after all pending ownership transfers %% have completed. -spec future_ring(chstate()) -> chstate(). + future_ring(State) -> future_ring(State, is_resizing(State)). future_ring(State, false) -> - FutureState = change_owners(State, all_next_owners(State)), + FutureState = change_owners(State, + all_next_owners(State)), %% Individual nodes will move themselves from leaving to exiting if they %% have no ring ownership, this is implemented in riak_core_ring_handler. %% Emulate it here to return similar ring. - Leaving = get_members(FutureState#chstate.members, [leaving]), - FutureState2 = - lists:foldl(fun(Node, StateAcc) -> - case indices(StateAcc, Node) of - [] -> - riak_core_ring:exit_member(Node, StateAcc, Node); - _ -> - StateAcc - end - end, FutureState, Leaving), - FutureState2#chstate{next=[]}; -future_ring(State0=#chstate{next=OldNext}, true) -> - case is_post_resize(State0) of - false -> - {ok, FutureCHash} = resized_ring(State0), - State1 = cleanup_after_resize(State0), - State2 = clear_all_resize_transfers(State1), - Resized = State2#chstate{chring=FutureCHash}, - Next = lists:foldl(fun({Idx, Owner, '$resize', _, _}, Acc) -> - DeleteEntry = {Idx, Owner, '$delete', [], awaiting}, - %% catch error when index doesn't exist in new ring - try index_owner(Resized, Idx) of - Owner -> Acc; - _ -> [DeleteEntry | Acc] - catch - error:{badmatch, _} -> [DeleteEntry | Acc] + Leaving = get_members(FutureState#chstate.members, + [leaving]), + FutureState2 = lists:foldl(fun (Node, StateAcc) -> + case indices(StateAcc, Node) of + [] -> + riak_core_ring:exit_member(Node, + StateAcc, + Node); + _ -> StateAcc end end, - [], - OldNext), - Resized#chstate{next=Next}; - true -> - State1 = remove_meta('$resized_ring', State0), - State1#chstate{next=[]} + FutureState, Leaving), + FutureState2#chstate{next = []}; +future_ring(State0 = #chstate{next = OldNext}, true) -> + case is_post_resize(State0) of + false -> + {ok, FutureCHash} = resized_ring(State0), + State1 = cleanup_after_resize(State0), + State2 = clear_all_resize_transfers(State1), + Resized = State2#chstate{chring = FutureCHash}, + Next = lists:foldl(fun ({Idx, Owner, '$resize', _, _}, + Acc) -> + DeleteEntry = {Idx, Owner, '$delete', [], + awaiting}, + %% catch error when index doesn't exist in new ring + try index_owner(Resized, Idx) of + Owner -> Acc; + _ -> [DeleteEntry | Acc] + catch + error:{badmatch, _} -> + [DeleteEntry | Acc] + end + end, + [], OldNext), + Resized#chstate{next = Next}; + true -> + State1 = remove_meta('$resized_ring', State0), + State1#chstate{next = []} end. pretty_print(Ring, Opts) -> @@ -1302,56 +1383,55 @@ pretty_print(Ring, Opts) -> OptLegend = lists:member(legend, Opts), Out = proplists:get_value(out, Opts, standard_io), TargetN = proplists:get_value(target_n, Opts, - application:get_env(riak_core, target_n_val, undefined)), - + application:get_env(riak_core, target_n_val, + undefined)), Owners = riak_core_ring:all_members(Ring), Indices = riak_core_ring:all_owners(Ring), RingSize = length(Indices), - Numeric = OptNumeric orelse (length(Owners) > 26), + Numeric = OptNumeric orelse length(Owners) > 26, case Numeric of - true -> - Ids = [integer_to_list(N) || N <- lists:seq(1, length(Owners))]; - false -> - Ids = [[Letter] || Letter <- lists:seq(97, 96+length(Owners))] + true -> + Ids = [integer_to_list(N) + || N <- lists:seq(1, length(Owners))]; + false -> + Ids = [[Letter] + || Letter <- lists:seq(97, 96 + length(Owners))] end, Names = lists:zip(Owners, Ids), case OptLegend of - true -> - io:format(Out, "~36..=s Nodes ~36..=s~n", ["", ""]), - _ = [begin - NodeIndices = [Idx || {Idx,Owner} <- Indices, - Owner =:= Node], + true -> + io:format(Out, "~36..=s Nodes ~36..=s~n", ["", ""]), + _ = [begin + NodeIndices = [Idx + || {Idx, Owner} <- Indices, Owner =:= Node], RingPercent = length(NodeIndices) * 100 / RingSize, io:format(Out, "Node ~s: ~w (~5.1f%) ~s~n", [Name, length(NodeIndices), RingPercent, Node]) - end || {Node, Name} <- Names], - io:format(Out, "~36..=s Ring ~37..=s~n", ["", ""]); - false -> - ok + end + || {Node, Name} <- Names], + io:format(Out, "~36..=s Ring ~37..=s~n", ["", ""]); + false -> ok end, - case Numeric of - true -> - Ownership = - [orddict:fetch(Owner, Names) || {_Idx, Owner} <- Indices], - io:format(Out, "~p~n", [Ownership]); - false -> - lists:foldl(fun({_, Owner}, N) -> - Name = orddict:fetch(Owner, Names), - case N rem TargetN of - 0 -> - io:format(Out, "~s|", [[Name]]); - _ -> - io:format(Out, "~s", [[Name]]) - end, - N+1 - end, 1, Indices), - io:format(Out, "~n", []) + true -> + Ownership = [orddict:fetch(Owner, Names) + || {_Idx, Owner} <- Indices], + io:format(Out, "~p~n", [Ownership]); + false -> + lists:foldl(fun ({_, Owner}, N) -> + Name = orddict:fetch(Owner, Names), + case N rem TargetN of + 0 -> io:format(Out, "~s|", [[Name]]); + _ -> io:format(Out, "~s", [[Name]]) + end, + N + 1 + end, + 1, Indices), + io:format(Out, "~n", []) end. %% @doc Return a ring with all transfers cancelled - for claim sim -cancel_transfers(Ring) -> - Ring#chstate{next=[]}. +cancel_transfers(Ring) -> Ring#chstate{next = []}. %% ==================================================================== %% Internal functions @@ -1361,23 +1441,26 @@ cancel_transfers(Ring) -> internal_ring_changed(Node, CState0) -> CState = update_seen(Node, CState0), case ring_ready(CState) of - false -> - CState; - true -> - riak_core_claimant:ring_changed(Node, CState) + false -> CState; + true -> riak_core_claimant:ring_changed(Node, CState) end. %% @private -merge_meta({N1,M1}, {N2,M2}) -> - Meta = dict:merge(fun(_,D1,D2) -> pick_val({N1,D1}, {N2,D2}) end, M1, M2), +merge_meta({N1, M1}, {N2, M2}) -> + Meta = dict:merge(fun (_, D1, D2) -> + pick_val({N1, D1}, {N2, D2}) + end, + M1, M2), log_meta_merge(M1, M2, Meta), Meta. %% @private -pick_val({N1,M1}, {N2,M2}) -> - case {M1#meta_entry.lastmod, N1} > {M2#meta_entry.lastmod, N2} of - true -> M1; - false -> M2 +pick_val({N1, M1}, {N2, M2}) -> + case {M1#meta_entry.lastmod, N1} > + {M2#meta_entry.lastmod, N2} + of + true -> M1; + false -> M2 end. %% @private @@ -1391,9 +1474,11 @@ log_meta_merge(M1, M2, Meta) -> %% Log result of a ring reconcile. In the case of ring churn, %% subsequent log messages will allow us to track ring versions. %% Handle legacy rings as well. -log_ring_result(#chstate{vclock=V,members=Members,next=Next}) -> - logger:debug("Updated ring vclock: ~p, Members: ~p, Next: ~p", - [V, Members, Next]). +log_ring_result(#chstate{vclock = V, members = Members, + next = Next}) -> + logger:debug("Updated ring vclock: ~p, Members: ~p, " + "Next: ~p", + [V, Members, Next]). %% @private internal_reconcile(State, OtherState) -> @@ -1401,10 +1486,9 @@ internal_reconcile(State, OtherState) -> State2 = update_seen(VNode, State), OtherState2 = update_seen(VNode, OtherState), Seen = reconcile_seen(State2, OtherState2), - State3 = State2#chstate{seen=Seen}, - OtherState3 = OtherState2#chstate{seen=Seen}, + State3 = State2#chstate{seen = Seen}, + OtherState3 = OtherState2#chstate{seen = Seen}, SeenChanged = not equal_seen(State, State3), - %% Try to reconcile based on vector clock, chosing the most recent state. VC1 = State3#chstate.vclock, VC2 = OtherState3#chstate.vclock, @@ -1413,45 +1497,50 @@ internal_reconcile(State, OtherState) -> %% merge to be deterministic here, hence the additional logic. VMerge1 = vclock:merge([VC1, VC2]), VMerge2 = vclock:merge([VC2, VC1]), - case {vclock:equal(VMerge1, VMerge2), VMerge1 < VMerge2} of - {true, _} -> - VC3 = VMerge1; - {_, true} -> - VC3 = VMerge1; - {_, false} -> - VC3 = VMerge2 + case {vclock:equal(VMerge1, VMerge2), VMerge1 < VMerge2} + of + {true, _} -> VC3 = VMerge1; + {_, true} -> VC3 = VMerge1; + {_, false} -> VC3 = VMerge2 end, - Newer = vclock:descends(VC1, VC2), Older = vclock:descends(VC2, VC1), Equal = equal_cstate(State3, OtherState3), case {Equal, Newer, Older} of - {_, true, false} -> - {SeenChanged, State3#chstate{vclock=VC3}}; - {_, false, true} -> - {true, OtherState3#chstate{nodename=VNode, vclock=VC3}}; - {true, _, _} -> - {SeenChanged, State3#chstate{vclock=VC3}}; - {_, true, true} -> - %% Exceptional condition that should only occur during - %% rolling upgrades and manual setting of the ring. - %% Merge as a divergent case. - State4 = reconcile_divergent(VNode, State3, OtherState3), - {true, State4#chstate{nodename=VNode}}; - {_, false, false} -> - %% Unable to reconcile based on vector clock, merge rings. - State4 = reconcile_divergent(VNode, State3, OtherState3), - {true, State4#chstate{nodename=VNode}} + {_, true, false} -> + {SeenChanged, State3#chstate{vclock = VC3}}; + {_, false, true} -> + {true, + OtherState3#chstate{nodename = VNode, vclock = VC3}}; + {true, _, _} -> + {SeenChanged, State3#chstate{vclock = VC3}}; + {_, true, true} -> + %% Exceptional condition that should only occur during + %% rolling upgrades and manual setting of the ring. + %% Merge as a divergent case. + State4 = reconcile_divergent(VNode, State3, + OtherState3), + {true, State4#chstate{nodename = VNode}}; + {_, false, false} -> + %% Unable to reconcile based on vector clock, merge rings. + State4 = reconcile_divergent(VNode, State3, + OtherState3), + {true, State4#chstate{nodename = VNode}} end. %% @private reconcile_divergent(VNode, StateA, StateB) -> - VClock = vclock:increment(VNode, vclock:merge([StateA#chstate.vclock, - StateB#chstate.vclock])), + VClock = vclock:increment(VNode, + vclock:merge([StateA#chstate.vclock, + StateB#chstate.vclock])), Members = reconcile_members(StateA, StateB), - Meta = merge_meta({StateA#chstate.nodename, StateA#chstate.meta}, {StateB#chstate.nodename, StateB#chstate.meta}), - NewState = reconcile_ring(StateA, StateB, get_members(Members)), - NewState1 = NewState#chstate{vclock=VClock, members=Members, meta=Meta}, + Meta = merge_meta({StateA#chstate.nodename, + StateA#chstate.meta}, + {StateB#chstate.nodename, StateB#chstate.meta}), + NewState = reconcile_ring(StateA, StateB, + get_members(Members)), + NewState1 = NewState#chstate{vclock = VClock, + members = Members, meta = Meta}, log_ring_result(NewState1), NewState1. @@ -1459,50 +1548,50 @@ reconcile_divergent(VNode, StateA, StateB) -> %% @doc Merge two members list using status vector clocks when possible, %% and falling back to manual merge for divergent cases. reconcile_members(StateA, StateB) -> - orddict:merge( - fun(_K, {Valid1, VC1, Meta1}, {Valid2, VC2, Meta2}) -> - New1 = vclock:descends(VC1, VC2), - New2 = vclock:descends(VC2, VC1), - MergeVC = vclock:merge([VC1, VC2]), - case {New1, New2} of - {true, false} -> - MergeMeta = lists:ukeysort(1, Meta1 ++ Meta2), - {Valid1, MergeVC, MergeMeta}; - {false, true} -> - MergeMeta = lists:ukeysort(1, Meta2 ++ Meta1), - {Valid2, MergeVC, MergeMeta}; - {_, _} -> - MergeMeta = lists:ukeysort(1, Meta1 ++ Meta2), - {merge_status(Valid1, Valid2), MergeVC, MergeMeta} - end - end, - StateA#chstate.members, - StateB#chstate.members). + orddict:merge(fun (_K, {Valid1, VC1, Meta1}, + {Valid2, VC2, Meta2}) -> + New1 = vclock:descends(VC1, VC2), + New2 = vclock:descends(VC2, VC1), + MergeVC = vclock:merge([VC1, VC2]), + case {New1, New2} of + {true, false} -> + MergeMeta = lists:ukeysort(1, Meta1 ++ Meta2), + {Valid1, MergeVC, MergeMeta}; + {false, true} -> + MergeMeta = lists:ukeysort(1, Meta2 ++ Meta1), + {Valid2, MergeVC, MergeMeta}; + {_, _} -> + MergeMeta = lists:ukeysort(1, Meta1 ++ Meta2), + {merge_status(Valid1, Valid2), MergeVC, + MergeMeta} + end + end, + StateA#chstate.members, StateB#chstate.members). %% @private reconcile_seen(StateA, StateB) -> - orddict:merge(fun(_, VC1, VC2) -> + orddict:merge(fun (_, VC1, VC2) -> vclock:merge([VC1, VC2]) - end, StateA#chstate.seen, StateB#chstate.seen). + end, + StateA#chstate.seen, StateB#chstate.seen). %% @private -merge_next_status(complete, _) -> - complete; -merge_next_status(_, complete) -> - complete; -merge_next_status(awaiting, awaiting) -> - awaiting. +merge_next_status(complete, _) -> complete; +merge_next_status(_, complete) -> complete; +merge_next_status(awaiting, awaiting) -> awaiting. %% @private %% @doc Merge two next lists that must be of the same size and have %% the same Idx/Owner pair. reconcile_next(Next1, Next2) -> - lists:zipwith(fun({Idx, Owner, Node, Transfers1, Status1}, - {Idx, Owner, Node, Transfers2, Status2}) -> + lists:zipwith(fun ({Idx, Owner, Node, Transfers1, + Status1}, + {Idx, Owner, Node, Transfers2, Status2}) -> {Idx, Owner, Node, ordsets:union(Transfers1, Transfers2), merge_next_status(Status1, Status2)} - end, Next1, Next2). + end, + Next1, Next2). %% @private %% @doc Merge two next lists that may be of different sizes and @@ -1511,177 +1600,175 @@ reconcile_next(Next1, Next2) -> %% the merge is the same as in reconcile_next/2. reconcile_divergent_next(BaseNext, OtherNext) -> MergedNext = substitute(1, BaseNext, OtherNext), - lists:zipwith(fun({Idx, Owner1, Node1, Transfers1, Status1}, - {Idx, Owner2, Node2, Transfers2, Status2}) -> - Same = ({Owner1, Node1} =:= {Owner2, Node2}), + lists:zipwith(fun ({Idx, Owner1, Node1, Transfers1, + Status1}, + {Idx, Owner2, Node2, Transfers2, Status2}) -> + Same = {Owner1, Node1} =:= {Owner2, Node2}, case {Same, Status1, Status2} of - {false, _, _} -> - {Idx, Owner1, Node1, Transfers1, Status1}; - _ -> - {Idx, Owner1, Node1, - ordsets:union(Transfers1, Transfers2), - merge_next_status(Status1, Status2)} + {false, _, _} -> + {Idx, Owner1, Node1, Transfers1, Status1}; + _ -> + {Idx, Owner1, Node1, + ordsets:union(Transfers1, Transfers2), + merge_next_status(Status1, Status2)} end - end, BaseNext, MergedNext). + end, + BaseNext, MergedNext). %% @private substitute(Idx, TL1, TL2) -> - lists:map(fun(T) -> + lists:map(fun (T) -> Key = element(Idx, T), case lists:keyfind(Key, Idx, TL2) of - false -> - T; - T2 -> - T2 + false -> T; + T2 -> T2 end - end, TL1). + end, + TL1). %% @private -reconcile_ring(StateA=#chstate{claimant=Claimant1, rvsn=VC1, next=Next1}, - StateB=#chstate{claimant=Claimant2, rvsn=VC2, next=Next2}, +reconcile_ring(StateA = #chstate{claimant = Claimant1, + rvsn = VC1, next = Next1}, + StateB = #chstate{claimant = Claimant2, rvsn = VC2, + next = Next2}, Members) -> %% Try to reconcile based on the ring version (rvsn) vector clock. V1Newer = vclock:descends(VC1, VC2), V2Newer = vclock:descends(VC2, VC1), - EqualVC = (vclock:equal(VC1, VC2) and (Claimant1 =:= Claimant2)), + EqualVC = vclock:equal(VC1, VC2) and + (Claimant1 =:= Claimant2), case {EqualVC, V1Newer, V2Newer} of - {true, _, _} -> - Next = reconcile_next(Next1, Next2), - StateA#chstate{next=Next}; - {_, true, false} -> - Next = reconcile_divergent_next(Next1, Next2), - StateA#chstate{next=Next}; - {_, false, true} -> - Next = reconcile_divergent_next(Next2, Next1), - StateB#chstate{next=Next}; - {_, _, _} -> - %% Ring versions were divergent, so fall back to reconciling based - %% on claimant. Under normal operation, divergent ring versions - %% should only occur if there are two different claimants, and one - %% claimant is invalid. For example, when a claimant is removed and - %% a new claimant has just taken over. We therefore chose the ring - %% with the valid claimant. - CValid1 = lists:member(Claimant1, Members), - CValid2 = lists:member(Claimant2, Members), - case {CValid1, CValid2} of - {true, false} -> - Next = reconcile_divergent_next(Next1, Next2), - StateA#chstate{next=Next}; - {false, true} -> - Next = reconcile_divergent_next(Next2, Next1), - StateB#chstate{next=Next}; - {false, false} -> - %% This can occur when removed/down nodes are still - %% up and gossip to each other. We need to pick a - %% claimant to handle this case, although the choice - %% is irrelevant as a correct valid claimant will - %% eventually emerge when the ring converges. - case Claimant1 < Claimant2 of - true -> - Next = reconcile_divergent_next(Next1, Next2), - StateA#chstate{next=Next}; - false -> - Next = reconcile_divergent_next(Next2, Next1), - StateB#chstate{next=Next} - end; - {true, true} -> - %% This should never happen in normal practice. - %% But, we need to handle it for exceptional cases. - case Claimant1 < Claimant2 of - true -> - Next = reconcile_divergent_next(Next1, Next2), - StateA#chstate{next=Next}; - false -> - Next = reconcile_divergent_next(Next2, Next1), - StateB#chstate{next=Next} - end - end + {true, _, _} -> + Next = reconcile_next(Next1, Next2), + StateA#chstate{next = Next}; + {_, true, false} -> + Next = reconcile_divergent_next(Next1, Next2), + StateA#chstate{next = Next}; + {_, false, true} -> + Next = reconcile_divergent_next(Next2, Next1), + StateB#chstate{next = Next}; + {_, _, _} -> + %% Ring versions were divergent, so fall back to reconciling based + %% on claimant. Under normal operation, divergent ring versions + %% should only occur if there are two different claimants, and one + %% claimant is invalid. For example, when a claimant is removed and + %% a new claimant has just taken over. We therefore chose the ring + %% with the valid claimant. + CValid1 = lists:member(Claimant1, Members), + CValid2 = lists:member(Claimant2, Members), + case {CValid1, CValid2} of + {true, false} -> + Next = reconcile_divergent_next(Next1, Next2), + StateA#chstate{next = Next}; + {false, true} -> + Next = reconcile_divergent_next(Next2, Next1), + StateB#chstate{next = Next}; + {false, false} -> + %% This can occur when removed/down nodes are still + %% up and gossip to each other. We need to pick a + %% claimant to handle this case, although the choice + %% is irrelevant as a correct valid claimant will + %% eventually emerge when the ring converges. + %TODO False-false and true-true are the same. _-_ maybe better not repitition + case Claimant1 < Claimant2 of + true -> + Next = reconcile_divergent_next(Next1, Next2), + StateA#chstate{next = Next}; + false -> + Next = reconcile_divergent_next(Next2, Next1), + StateB#chstate{next = Next} + end; + {true, true} -> + %% This should never happen in normal practice. + %% But, we need to handle it for exceptional cases. + case Claimant1 < Claimant2 of + true -> + Next = reconcile_divergent_next(Next1, Next2), + StateA#chstate{next = Next}; + false -> + Next = reconcile_divergent_next(Next2, Next1), + StateB#chstate{next = Next} + end + end end. %% @private -merge_status(invalid, _) -> - invalid; -merge_status(_, invalid) -> - invalid; -merge_status(down, _) -> - down; -merge_status(_, down) -> - down; -merge_status(joining, _) -> - joining; -merge_status(_, joining) -> - joining; -merge_status(valid, _) -> - valid; -merge_status(_, valid) -> - valid; -merge_status(exiting, _) -> - exiting; -merge_status(_, exiting) -> - exiting; -merge_status(leaving, _) -> - leaving; -merge_status(_, leaving) -> - leaving; -merge_status(_, _) -> - invalid. +merge_status(invalid, _) -> invalid; +merge_status(_, invalid) -> invalid; +merge_status(down, _) -> down; +merge_status(_, down) -> down; +merge_status(joining, _) -> joining; +merge_status(_, joining) -> joining; +merge_status(valid, _) -> valid; +merge_status(_, valid) -> valid; +merge_status(exiting, _) -> exiting; +merge_status(_, exiting) -> exiting; +merge_status(leaving, _) -> leaving; +merge_status(_, leaving) -> leaving; +merge_status(_, _) -> invalid. %% @private -transfer_complete(CState=#chstate{next=Next, vclock=VClock}, Idx, Mod) -> - {Idx, Owner, NextOwner, Transfers, Status} = lists:keyfind(Idx, 1, Next), +transfer_complete(CState = #chstate{next = Next, + vclock = VClock}, + Idx, Mod) -> + {Idx, Owner, NextOwner, Transfers, Status} = + lists:keyfind(Idx, 1, Next), Transfers2 = ordsets:add_element(Mod, Transfers), - VNodeMods = - ordsets:from_list([VMod || {_, VMod} <- riak_core:vnode_modules()]), + VNodeMods = ordsets:from_list([VMod + || {_, VMod} <- riak_core:vnode_modules()]), Status2 = case {Status, Transfers2} of - {complete, _} -> - complete; - {awaiting, VNodeMods} -> - complete; - _ -> - awaiting + {complete, _} -> complete; + {awaiting, VNodeMods} -> complete; + _ -> awaiting end, Next2 = lists:keyreplace(Idx, 1, Next, {Idx, Owner, NextOwner, Transfers2, Status2}), VClock2 = vclock:increment(Owner, VClock), - CState#chstate{next=Next2, vclock=VClock2}. + CState#chstate{next = Next2, vclock = VClock2}. %% @private get_members(Members) -> - get_members(Members, [joining, valid, leaving, exiting, down]). + get_members(Members, + [joining, valid, leaving, exiting, down]). %% @private get_members(Members, Types) -> - [Node || {Node, {V, _, _}} <- Members, lists:member(V, Types)]. + [Node + || {Node, {V, _, _}} <- Members, + lists:member(V, Types)]. %% @private -update_seen(Node, CState=#chstate{vclock=VClock, seen=Seen}) -> +update_seen(Node, + CState = #chstate{vclock = VClock, seen = Seen}) -> Seen2 = orddict:update(Node, - fun(SeenVC) -> - vclock:merge([SeenVC, VClock]) - end, + fun (SeenVC) -> vclock:merge([SeenVC, VClock]) end, VClock, Seen), - CState#chstate{seen=Seen2}. + CState#chstate{seen = Seen2}. %% @private equal_cstate(StateA, StateB) -> equal_cstate(StateA, StateB, false). equal_cstate(StateA, StateB, false) -> - T1 = equal_members(StateA#chstate.members, StateB#chstate.members), - T2 = vclock:equal(StateA#chstate.rvsn, StateB#chstate.rvsn), + T1 = equal_members(StateA#chstate.members, + StateB#chstate.members), + T2 = vclock:equal(StateA#chstate.rvsn, + StateB#chstate.rvsn), T3 = equal_seen(StateA, StateB), T4 = equal_rings(StateA, StateB), - %% Clear fields checked manually and test remaining through equality. %% Note: We do not consider cluster name in equality. - StateA2=StateA#chstate{nodename=undefined, members=undefined, vclock=undefined, - rvsn=undefined, seen=undefined, chring=undefined, - meta=undefined, clustername=undefined}, - StateB2=StateB#chstate{nodename=undefined, members=undefined, vclock=undefined, - rvsn=undefined, seen=undefined, chring=undefined, - meta=undefined, clustername=undefined}, - T5 = (StateA2 =:= StateB2), - + StateA2 = StateA#chstate{nodename = undefined, + members = undefined, vclock = undefined, + rvsn = undefined, seen = undefined, + chring = undefined, meta = undefined, + clustername = undefined}, + StateB2 = StateB#chstate{nodename = undefined, + members = undefined, vclock = undefined, + rvsn = undefined, seen = undefined, + chring = undefined, meta = undefined, + clustername = undefined}, + T5 = StateA2 =:= StateB2, T1 andalso T2 andalso T3 andalso T4 andalso T5. remaining_fields(#chstate_v2{next = Next, claimant = Claimant}) -> @@ -1689,31 +1776,34 @@ remaining_fields(#chstate_v2{next = Next, claimant = Claimant}) -> %% @private equal_members(M1, M2) -> - L = orddict:merge(fun(_, {Status1, VC1, Meta1}, {Status2, VC2, Meta2}) -> - (Status1 =:= Status2) andalso - vclock:equal(VC1, VC2) andalso - (Meta1 =:= Meta2) - end, M1, M2), + L = orddict:merge(fun (_, {Status1, VC1, Meta1}, + {Status2, VC2, Meta2}) -> + Status1 =:= Status2 andalso + vclock:equal(VC1, VC2) andalso Meta1 =:= Meta2 + end, + M1, M2), {_, R} = lists:unzip(L), - lists:all(fun(X) -> X =:= true end, R). + lists:all(fun (X) -> X =:= true end, R). %% @private equal_seen(StateA, StateB) -> Seen1 = filtered_seen(StateA), Seen2 = filtered_seen(StateB), - L = orddict:merge(fun(_, VC1, VC2) -> + L = orddict:merge(fun (_, VC1, VC2) -> vclock:equal(VC1, VC2) - end, Seen1, Seen2), + end, + Seen1, Seen2), {_, R} = lists:unzip(L), - lists:all(fun(X) -> X =:= true end, R). + lists:all(fun (X) -> X =:= true end, R). %% @private -filtered_seen(State=#chstate{seen=Seen}) -> +filtered_seen(State = #chstate{seen = Seen}) -> case get_members(State#chstate.members) of - [] -> - Seen; - Members -> - orddict:filter(fun(N, _) -> lists:member(N, Members) end, Seen) + [] -> Seen; + Members -> + orddict:filter(fun (N, _) -> lists:member(N, Members) + end, + Seen) end. %% =================================================================== @@ -1724,195 +1814,218 @@ filtered_seen(State=#chstate{seen=Seen}) -> sequence_test() -> I1 = 365375409332725729550921208179070754913983135744, I2 = 730750818665451459101842416358141509827966271488, - A = fresh(4,a), - B1 = A#chstate{nodename=b}, + A = fresh(4, a), + B1 = A#chstate{nodename = b}, B2 = transfer_node(I1, b, B1), - ?assertEqual(B2, transfer_node(I1, b, B2)), - {no_change, A1} = reconcile(B1,A), - C1 = A#chstate{nodename=c}, + ?assertEqual(B2, (transfer_node(I1, b, B2))), + {no_change, A1} = reconcile(B1, A), + C1 = A#chstate{nodename = c}, C2 = transfer_node(I1, c, C1), - {new_ring, A2} = reconcile(C2,A1), - {new_ring, A3} = reconcile(B2,A2), - C3 = transfer_node(I2,c,C2), - {new_ring, C4} = reconcile(A3,C3), - {new_ring, A4} = reconcile(C4,A3), - {new_ring, B3} = reconcile(A4,B2), - ?assertEqual(A4#chstate.chring, B3#chstate.chring), - ?assertEqual(B3#chstate.chring, C4#chstate.chring). + {new_ring, A2} = reconcile(C2, A1), + {new_ring, A3} = reconcile(B2, A2), + C3 = transfer_node(I2, c, C2), + {new_ring, C4} = reconcile(A3, C3), + {new_ring, A4} = reconcile(C4, A3), + {new_ring, B3} = reconcile(A4, B2), + ?assertEqual((A4#chstate.chring), (B3#chstate.chring)), + ?assertEqual((B3#chstate.chring), (C4#chstate.chring)). param_fresh_test() -> - application:set_env(riak_core,ring_creation_size,4), - ?assert(equal_cstate(fresh(), fresh(4, node()))), - ?assertEqual(owner_node(fresh()),node()). + application:set_env(riak_core, ring_creation_size, 4), + ?assert((equal_cstate(fresh(), fresh(4, node())))), + ?assertEqual((owner_node(fresh())), (node())). index_test() -> - Ring0 = fresh(2,node()), - Ring1 = transfer_node(0,x,Ring0), - ?assertEqual(0,random_other_index(Ring0)), - ?assertEqual(0,random_other_index(Ring1)), - ?assertEqual(node(),index_owner(Ring0,0)), - ?assertEqual(x,index_owner(Ring1,0)), - ?assertEqual(lists:sort([x,node()]),lists:sort(diff_nodes(Ring0,Ring1))). + Ring0 = fresh(2, node()), + Ring1 = transfer_node(0, x, Ring0), + ?assertEqual(0, (random_other_index(Ring0))), + ?assertEqual(0, (random_other_index(Ring1))), + ?assertEqual((node()), (index_owner(Ring0, 0))), + ?assertEqual(x, (index_owner(Ring1, 0))), + ?assertEqual((lists:sort([x, node()])), + (lists:sort(diff_nodes(Ring0, Ring1)))). reconcile_test() -> - Ring0 = fresh(2,node()), - Ring1 = transfer_node(0,x,Ring0), + Ring0 = fresh(2, node()), + Ring1 = transfer_node(0, x, Ring0), %% Only members and seen should have changed - {new_ring, Ring2} = reconcile(fresh(2,someone_else),Ring1), - ?assertNot(equal_cstate(Ring1, Ring2, false)), - RingB0 = fresh(2,node()), - RingB1 = transfer_node(0,x,RingB0), - RingB2 = RingB1#chstate{nodename=b}, - ?assertMatch({no_change,_},reconcile(Ring1,RingB2)), - {no_change, RingB3} = reconcile(Ring1,RingB2), - ?assert(equal_cstate(RingB2, RingB3)). + {new_ring, Ring2} = reconcile(fresh(2, someone_else), + Ring1), + ?assertNot((equal_cstate(Ring1, Ring2, false))), + RingB0 = fresh(2, node()), + RingB1 = transfer_node(0, x, RingB0), + RingB2 = RingB1#chstate{nodename = b}, + ?assertMatch({no_change, _}, + (reconcile(Ring1, RingB2))), + {no_change, RingB3} = reconcile(Ring1, RingB2), + ?assert((equal_cstate(RingB2, RingB3))). metadata_inequality_test() -> - Ring0 = fresh(2,node()), - Ring1 = update_meta(key,val,Ring0), - ?assertNot(equal_rings(Ring0,Ring1)), - ?assertEqual(Ring1#chstate.meta, - merge_meta({'node0', Ring0#chstate.meta}, {'node1', Ring1#chstate.meta})), + Ring0 = fresh(2, node()), + Ring1 = update_meta(key, val, Ring0), + ?assertNot((equal_rings(Ring0, Ring1))), + ?assertEqual((Ring1#chstate.meta), + (merge_meta({node0, Ring0#chstate.meta}, + {node1, Ring1#chstate.meta}))), timer:sleep(1001), % ensure that lastmod is at least a second later - Ring2 = update_meta(key,val2,Ring1), - ?assertEqual(get_meta(key,Ring2), - get_meta(key,#chstate{meta= - merge_meta({'node1',Ring1#chstate.meta}, - {'node2',Ring2#chstate.meta})})), - ?assertEqual(get_meta(key,Ring2), - get_meta(key,#chstate{meta= - merge_meta({'node2',Ring2#chstate.meta}, - {'node1',Ring1#chstate.meta})})). + Ring2 = update_meta(key, val2, Ring1), + ?assertEqual((get_meta(key, Ring2)), + (get_meta(key, + #chstate{meta = + merge_meta({node1, Ring1#chstate.meta}, + {node2, + Ring2#chstate.meta})}))), + ?assertEqual((get_meta(key, Ring2)), + (get_meta(key, + #chstate{meta = + merge_meta({node2, Ring2#chstate.meta}, + {node1, + Ring1#chstate.meta})}))). metadata_remove_test() -> Ring0 = fresh(2, node()), - ?assert(equal_rings(Ring0, remove_meta(key, Ring0))), - Ring1 = update_meta(key,val,Ring0), + ?assert((equal_rings(Ring0, remove_meta(key, Ring0)))), + Ring1 = update_meta(key, val, Ring0), timer:sleep(1001), % ensure that lastmod is at least one second later - Ring2 = remove_meta(key,Ring1), - ?assertEqual(undefined, get_meta(key, Ring2)), - ?assertEqual(undefined, get_meta(key, #chstate{meta=merge_meta({'node1',Ring1#chstate.meta}, {'node2',Ring2#chstate.meta})})), - ?assertEqual(undefined, get_meta(key, #chstate{meta=merge_meta({'node2',Ring2#chstate.meta}, {'node1',Ring1#chstate.meta})})). + Ring2 = remove_meta(key, Ring1), + ?assertEqual(undefined, (get_meta(key, Ring2))), + ?assertEqual(undefined, + (get_meta(key, + #chstate{meta = + merge_meta({node1, Ring1#chstate.meta}, + {node2, + Ring2#chstate.meta})}))), + ?assertEqual(undefined, + (get_meta(key, + #chstate{meta = + merge_meta({node2, Ring2#chstate.meta}, + {node1, + Ring1#chstate.meta})}))). rename_test() -> Ring0 = fresh(2, node()), - Ring = rename_node(Ring0, node(), 'new@new'), - ?assertEqual('new@new', owner_node(Ring)), - ?assertEqual(['new@new'], all_members(Ring)). + Ring = rename_node(Ring0, node(), new@new), + ?assertEqual(new@new, (owner_node(Ring))), + ?assertEqual([new@new], (all_members(Ring))). exclusion_test() -> Ring0 = fresh(2, node()), - Ring1 = transfer_node(0,x,Ring0), - ?assertEqual(0, random_other_index(Ring1,[730750818665451459101842416358141509827966271488])), - ?assertEqual(no_indices, random_other_index(Ring1, [0])), - ?assertEqual([{730750818665451459101842416358141509827966271488,node()},{0,x}], - preflist(<<1:160/integer>>, Ring1)). + Ring1 = transfer_node(0, x, Ring0), + ?assertEqual(0, + (random_other_index(Ring1, + [730750818665451459101842416358141509827966271488]))), + ?assertEqual(no_indices, + (random_other_index(Ring1, [0]))), + ?assertEqual([{730750818665451459101842416358141509827966271488, + node()}, + {0, x}], + (preflist(<<1:160/integer>>, Ring1))). random_other_node_test() -> Ring0 = fresh(2, node()), - ?assertEqual(no_node, random_other_node(Ring0)), - Ring1 = add_member(node(), Ring0, 'new@new'), - Ring2 = transfer_node(0, 'new@new', Ring1), - ?assertEqual('new@new', random_other_node(Ring2)). + ?assertEqual(no_node, (random_other_node(Ring0))), + Ring1 = add_member(node(), Ring0, new@new), + Ring2 = transfer_node(0, new@new, Ring1), + ?assertEqual(new@new, (random_other_node(Ring2))). membership_test() -> RingA1 = fresh(nodeA), - ?assertEqual([nodeA], all_members(RingA1)), - + ?assertEqual([nodeA], (all_members(RingA1))), RingA2 = add_member(nodeA, RingA1, nodeB), RingA3 = add_member(nodeA, RingA2, nodeC), - ?assertEqual([nodeA, nodeB, nodeC], all_members(RingA3)), - + ?assertEqual([nodeA, nodeB, nodeC], + (all_members(RingA3))), RingA4 = remove_member(nodeA, RingA3, nodeC), - ?assertEqual([nodeA, nodeB], all_members(RingA4)), - + ?assertEqual([nodeA, nodeB], (all_members(RingA4))), %% Node should stay removed {_, RingA5} = reconcile(RingA3, RingA4), - ?assertEqual([nodeA, nodeB], all_members(RingA5)), - + ?assertEqual([nodeA, nodeB], (all_members(RingA5))), %% Add node in parallel, check node stays removed RingB1 = add_member(nodeB, RingA3, nodeC), {_, RingA6} = reconcile(RingB1, RingA5), - ?assertEqual([nodeA, nodeB], all_members(RingA6)), - + ?assertEqual([nodeA, nodeB], (all_members(RingA6))), %% Add node as parallel descendent, check node is added RingB2 = add_member(nodeB, RingA6, nodeC), {_, RingA7} = reconcile(RingB2, RingA6), - ?assertEqual([nodeA, nodeB, nodeC], all_members(RingA7)), - - Priority = [{invalid,1}, {down,2}, {joining,3}, {valid,4}, {exiting,5}, - {leaving,6}], + ?assertEqual([nodeA, nodeB, nodeC], + (all_members(RingA7))), + Priority = [{invalid, 1}, {down, 2}, {joining, 3}, + {valid, 4}, {exiting, 5}, {leaving, 6}], RingX1 = fresh(nodeA), RingX2 = add_member(nodeA, RingX1, nodeB), RingX3 = add_member(nodeA, RingX2, nodeC), - ?assertEqual(joining, member_status(RingX3, nodeC)), - + ?assertEqual(joining, (member_status(RingX3, nodeC))), %% Parallel/sibling status changes merge based on priority [begin - RingT1 = set_member(nodeA, RingX3, nodeC, StatusA), - ?assertEqual(StatusA, member_status(RingT1, nodeC)), - RingT2 = set_member(nodeB, RingX3, nodeC, StatusB), - ?assertEqual(StatusB, member_status(RingT2, nodeC)), - StatusC = case PriorityA < PriorityB of - true -> StatusA; - false -> StatusB - end, - {_, RingT3} = reconcile(RingT2, RingT1), - ?assertEqual(StatusC, member_status(RingT3, nodeC)) - end || {StatusA, PriorityA} <- Priority, - {StatusB, PriorityB} <- Priority], - + RingT1 = set_member(nodeA, RingX3, nodeC, StatusA), + ?assertEqual(StatusA, (member_status(RingT1, nodeC))), + RingT2 = set_member(nodeB, RingX3, nodeC, StatusB), + ?assertEqual(StatusB, (member_status(RingT2, nodeC))), + StatusC = case PriorityA < PriorityB of + true -> StatusA; + false -> StatusB + end, + {_, RingT3} = reconcile(RingT2, RingT1), + ?assertEqual(StatusC, (member_status(RingT3, nodeC))) + end + || {StatusA, PriorityA} <- Priority, + {StatusB, PriorityB} <- Priority], %% Related status changes merge to descendant [begin - RingT1 = set_member(nodeA, RingX3, nodeC, StatusA), - ?assertEqual(StatusA, member_status(RingT1, nodeC)), - RingT2 = set_member(nodeB, RingT1, nodeC, StatusB), - ?assertEqual(StatusB, member_status(RingT2, nodeC)), - RingT3 = set_member(nodeA, RingT1, nodeA, valid), - {_, RingT4} = reconcile(RingT2, RingT3), - ?assertEqual(StatusB, member_status(RingT4, nodeC)) - end || {StatusA, _} <- Priority, - {StatusB, _} <- Priority], + RingT1 = set_member(nodeA, RingX3, nodeC, StatusA), + ?assertEqual(StatusA, (member_status(RingT1, nodeC))), + RingT2 = set_member(nodeB, RingT1, nodeC, StatusB), + ?assertEqual(StatusB, (member_status(RingT2, nodeC))), + RingT3 = set_member(nodeA, RingT1, nodeA, valid), + {_, RingT4} = reconcile(RingT2, RingT3), + ?assertEqual(StatusB, (member_status(RingT4, nodeC))) + end + || {StatusA, _} <- Priority, {StatusB, _} <- Priority], ok. ring_version_test() -> Ring1 = fresh(nodeA), Ring2 = add_member(node(), Ring1, nodeA), Ring3 = add_member(node(), Ring2, nodeB), - ?assertEqual(nodeA, claimant(Ring3)), - #chstate{rvsn=RVsn, vclock=VClock} = Ring3, - + ?assertEqual(nodeA, (claimant(Ring3))), + #chstate{rvsn = RVsn, vclock = VClock} = Ring3, RingA1 = transfer_node(0, nodeA, Ring3), - RingA2 = RingA1#chstate{vclock=vclock:increment(nodeA, VClock)}, + RingA2 = RingA1#chstate{vclock = + vclock:increment(nodeA, VClock)}, RingB1 = transfer_node(0, nodeB, Ring3), - RingB2 = RingB1#chstate{vclock=vclock:increment(nodeB, VClock)}, - + RingB2 = RingB1#chstate{vclock = + vclock:increment(nodeB, VClock)}, %% RingA1 has most recent ring version - {_, RingT1} = reconcile(RingA2#chstate{rvsn=vclock:increment(nodeA, RVsn)}, + {_, RingT1} = reconcile(RingA2#chstate{rvsn = + vclock:increment(nodeA, RVsn)}, RingB2), - ?assertEqual(nodeA, index_owner(RingT1,0)), - + ?assertEqual(nodeA, (index_owner(RingT1, 0))), %% RingB1 has most recent ring version {_, RingT2} = reconcile(RingA2, - RingB2#chstate{rvsn=vclock:increment(nodeB, RVsn)}), - ?assertEqual(nodeB, index_owner(RingT2,0)), - + RingB2#chstate{rvsn = + vclock:increment(nodeB, RVsn)}), + ?assertEqual(nodeB, (index_owner(RingT2, 0))), %% Divergent ring versions, merge based on claimant - {_, RingT3} = reconcile(RingA2#chstate{rvsn=vclock:increment(nodeA, RVsn)}, - RingB2#chstate{rvsn=vclock:increment(nodeB, RVsn)}), - ?assertEqual(nodeA, index_owner(RingT3,0)), - + {_, RingT3} = reconcile(RingA2#chstate{rvsn = + vclock:increment(nodeA, RVsn)}, + RingB2#chstate{rvsn = + vclock:increment(nodeB, RVsn)}), + ?assertEqual(nodeA, (index_owner(RingT3, 0))), %% Divergent ring versions, one valid claimant. Merge on claimant. - RingA3 = RingA2#chstate{claimant=nodeA}, + RingA3 = RingA2#chstate{claimant = nodeA}, RingA4 = remove_member(nodeA, RingA3, nodeB), - RingB3 = RingB2#chstate{claimant=nodeB}, + RingB3 = RingB2#chstate{claimant = nodeB}, RingB4 = remove_member(nodeB, RingB3, nodeA), - {_, RingT4} = reconcile(RingA4#chstate{rvsn=vclock:increment(nodeA, RVsn)}, - RingB3#chstate{rvsn=vclock:increment(nodeB, RVsn)}), - ?assertEqual(nodeA, index_owner(RingT4,0)), - {_, RingT5} = reconcile(RingA3#chstate{rvsn=vclock:increment(nodeA, RVsn)}, - RingB4#chstate{rvsn=vclock:increment(nodeB, RVsn)}), - ?assertEqual(nodeB, index_owner(RingT5,0)). + {_, RingT4} = reconcile(RingA4#chstate{rvsn = + vclock:increment(nodeA, RVsn)}, + RingB3#chstate{rvsn = + vclock:increment(nodeB, RVsn)}), + ?assertEqual(nodeA, (index_owner(RingT4, 0))), + {_, RingT5} = reconcile(RingA3#chstate{rvsn = + vclock:increment(nodeA, RVsn)}, + RingB4#chstate{rvsn = + vclock:increment(nodeB, RVsn)}), + ?assertEqual(nodeB, (index_owner(RingT5, 0))). reconcile_next_test() -> Next1 = [{0, nodeA, nodeB, [riak_pipe_vnode], awaiting}, @@ -1921,11 +2034,11 @@ reconcile_next_test() -> Next2 = [{0, nodeA, nodeB, [riak_kv_vnode], complete}, {1, nodeA, nodeB, [], awaiting}, {2, nodeA, nodeB, [], awaiting}], - Next3 = [{0, nodeA, nodeB, [riak_kv_vnode, riak_pipe_vnode], complete}, + Next3 = [{0, nodeA, nodeB, + [riak_kv_vnode, riak_pipe_vnode], complete}, {1, nodeA, nodeB, [riak_pipe_vnode], awaiting}, {2, nodeA, nodeB, [riak_pipe_vnode], complete}], - ?assertEqual(Next3, reconcile_next(Next1, Next2)), - + ?assertEqual(Next3, (reconcile_next(Next1, Next2))), Next4 = [{0, nodeA, nodeB, [riak_pipe_vnode], awaiting}, {1, nodeA, nodeB, [], awaiting}, {2, nodeA, nodeB, [riak_pipe_vnode], awaiting}], @@ -1933,28 +2046,33 @@ reconcile_next_test() -> {2, nodeA, nodeB, [riak_kv_vnode], complete}], Next6 = [{0, nodeA, nodeB, [riak_pipe_vnode], awaiting}, {1, nodeA, nodeB, [], awaiting}, - {2, nodeA, nodeB, [riak_kv_vnode, riak_pipe_vnode], complete}], - ?assertEqual(Next6, reconcile_divergent_next(Next4, Next5)). + {2, nodeA, nodeB, [riak_kv_vnode, riak_pipe_vnode], + complete}], + ?assertEqual(Next6, + (reconcile_divergent_next(Next4, Next5))). resize_test() -> Ring0 = fresh(4, a), Ring1 = resize(Ring0, 8), Ring2 = resize(Ring0, 2), - ?assertEqual(8, num_partitions(Ring1)), - ?assertEqual(2, num_partitions(Ring2)), + ?assertEqual(8, (num_partitions(Ring1))), + ?assertEqual(2, (num_partitions(Ring2))), valid_resize(Ring0, Ring1), valid_resize(Ring0, Ring1), - Ring3 = set_pending_resize(Ring2, Ring0), - ?assertEqual(num_partitions(Ring0), num_partitions(Ring3)), - ?assertEqual(num_partitions(Ring2), future_num_partitions(Ring3)), - ?assertEqual(num_partitions(Ring2), num_partitions(future_ring(Ring3))), - + ?assertEqual((num_partitions(Ring0)), + (num_partitions(Ring3))), + ?assertEqual((num_partitions(Ring2)), + (future_num_partitions(Ring3))), + ?assertEqual((num_partitions(Ring2)), + (num_partitions(future_ring(Ring3)))), Key = <<0:160/integer>>, OrigIdx = element(1, hd(preflist(Key, Ring0))), %% for non-resize transitions index should be the same - ?assertEqual(OrigIdx, future_index(Key, OrigIdx, undefined, Ring0)), - ?assertEqual(element(1, hd(preflist(Key, Ring2))), future_index(Key, OrigIdx, undefined, Ring3)). + ?assertEqual(OrigIdx, + (future_index(Key, OrigIdx, undefined, Ring0))), + ?assertEqual((element(1, hd(preflist(Key, Ring2)))), + (future_index(Key, OrigIdx, undefined, Ring3))). lasgasp_test() -> RingA = fresh(4, a), @@ -1969,53 +2087,72 @@ lasgasp_test() -> resize_xfer_test_() -> {setup, - fun() -> + fun () -> meck:unload(), meck:new(riak_core, [passthrough]), meck:expect(riak_core, vnode_modules, - fun() -> [{some_app, fake_vnode}, {other_app, other_vnode}] end) + fun () -> + [{some_app, fake_vnode}, + {other_app, other_vnode}] + end) end, - fun(_) -> meck:unload() end, - fun test_resize_xfers/0}. + fun (_) -> meck:unload() end, fun test_resize_xfers/0}. test_resize_xfers() -> Ring0 = riak_core_ring:fresh(4, a), Ring1 = set_pending_resize(resize(Ring0, 8), Ring0), Source1 = {0, a}, - Target1 = {730750818665451459101842416358141509827966271488, a}, - TargetIdx2 = 365375409332725729550921208179070754913983135744, - Ring2 = schedule_resize_transfer(Ring1, Source1, Target1), - ?assertEqual(Target1, awaiting_resize_transfer(Ring2, Source1, fake_vnode)), - ?assertEqual(awaiting, resize_transfer_status(Ring2, Source1, Target1, fake_vnode)), + Target1 = + {730750818665451459101842416358141509827966271488, a}, + TargetIdx2 = + 365375409332725729550921208179070754913983135744, + Ring2 = schedule_resize_transfer(Ring1, Source1, + Target1), + ?assertEqual(Target1, + (awaiting_resize_transfer(Ring2, Source1, fake_vnode))), + ?assertEqual(awaiting, + (resize_transfer_status(Ring2, Source1, Target1, + fake_vnode))), %% use Target1 since we haven't used it as a source index - ?assertEqual(undefined, awaiting_resize_transfer(Ring2, Target1, fake_vnode)), - ?assertEqual(undefined, resize_transfer_status(Ring2, Target1, Source1, fake_vnode)), - - Ring3 = schedule_resize_transfer(Ring2, Source1, TargetIdx2), - Ring4 = resize_transfer_complete(Ring3, Source1, Target1, fake_vnode), - ?assertEqual({TargetIdx2, a}, awaiting_resize_transfer(Ring4, Source1, fake_vnode)), - ?assertEqual(awaiting, resize_transfer_status(Ring4, Source1, {TargetIdx2, a}, fake_vnode)), - ?assertEqual(complete, resize_transfer_status(Ring4, Source1, Target1, fake_vnode)), - - Ring5 = resize_transfer_complete(Ring4, Source1, {TargetIdx2, a}, fake_vnode), - {_, '$resize', Status1} = next_owner(Ring5, 0, fake_vnode), + ?assertEqual(undefined, + (awaiting_resize_transfer(Ring2, Target1, fake_vnode))), + ?assertEqual(undefined, + (resize_transfer_status(Ring2, Target1, Source1, + fake_vnode))), + Ring3 = schedule_resize_transfer(Ring2, Source1, + TargetIdx2), + Ring4 = resize_transfer_complete(Ring3, Source1, + Target1, fake_vnode), + ?assertEqual({TargetIdx2, a}, + (awaiting_resize_transfer(Ring4, Source1, fake_vnode))), + ?assertEqual(awaiting, + (resize_transfer_status(Ring4, Source1, {TargetIdx2, a}, + fake_vnode))), + ?assertEqual(complete, + (resize_transfer_status(Ring4, Source1, Target1, + fake_vnode))), + Ring5 = resize_transfer_complete(Ring4, Source1, + {TargetIdx2, a}, fake_vnode), + {_, '$resize', Status1} = next_owner(Ring5, 0, + fake_vnode), ?assertEqual(complete, Status1), - - Ring6 = resize_transfer_complete(Ring5, Source1, {TargetIdx2, a}, other_vnode), - Ring7 = resize_transfer_complete(Ring6, Source1, Target1, other_vnode), - {_, '$resize', Status2} = next_owner(Ring7, 0, fake_vnode), + Ring6 = resize_transfer_complete(Ring5, Source1, + {TargetIdx2, a}, other_vnode), + Ring7 = resize_transfer_complete(Ring6, Source1, + Target1, other_vnode), + {_, '$resize', Status2} = next_owner(Ring7, 0, + fake_vnode), ?assertEqual(complete, Status2), - {_, '$resize', Status3} = next_owner(Ring7, 0, other_vnode), + {_, '$resize', Status3} = next_owner(Ring7, 0, + other_vnode), ?assertEqual(complete, Status3), {_, '$resize', complete} = next_owner(Ring7, 0). valid_resize(Ring0, Ring1) -> - lists:foreach(fun({Idx, Owner}) -> + lists:foreach(fun ({Idx, Owner}) -> case lists:keyfind(Idx, 1, all_owners(Ring0)) of - false -> - ?assertEqual('$dummyhost@resized', Owner); - {Idx, OrigOwner} -> - ?assertEqual(OrigOwner, Owner) + false -> ?assertEqual('$dummyhost@resized', Owner); + {Idx, OrigOwner} -> ?assertEqual(OrigOwner, Owner) end end, all_owners(Ring1)). diff --git a/src/riak_core_ring_events.erl b/src/riak_core_ring_events.erl index 72e084cb5..4b7b44d4f 100644 --- a/src/riak_core_ring_events.erl +++ b/src/riak_core_ring_events.erl @@ -24,30 +24,23 @@ -behaviour(gen_event). %% API --export([start_link/0, - add_handler/2, - add_sup_handler/2, - add_guarded_handler/2, - add_callback/1, - add_sup_callback/1, - add_guarded_callback/1, - ring_update/1, - force_update/0, - ring_sync_update/1, +-export([start_link/0, add_handler/2, add_sup_handler/2, + add_guarded_handler/2, add_callback/1, + add_sup_callback/1, add_guarded_callback/1, + ring_update/1, force_update/0, ring_sync_update/1, force_sync_update/0]). %% gen_event callbacks -export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]). --record(state, { callback }). +-record(state, {callback}). %% =================================================================== %% API functions %% =================================================================== -start_link() -> - gen_event:start_link({local, ?MODULE}). +start_link() -> gen_event:start_link({local, ?MODULE}). add_handler(Handler, Args) -> gen_event:add_handler(?MODULE, Handler, Args). @@ -56,16 +49,20 @@ add_sup_handler(Handler, Args) -> gen_event:add_sup_handler(?MODULE, Handler, Args). add_guarded_handler(Handler, Args) -> - riak_core:add_guarded_event_handler(?MODULE, Handler, Args). + riak_core:add_guarded_event_handler(?MODULE, Handler, + Args). add_callback(Fn) when is_function(Fn) -> - gen_event:add_handler(?MODULE, {?MODULE, make_ref()}, [Fn]). + gen_event:add_handler(?MODULE, {?MODULE, make_ref()}, + [Fn]). add_sup_callback(Fn) when is_function(Fn) -> - gen_event:add_sup_handler(?MODULE, {?MODULE, make_ref()}, [Fn]). + gen_event:add_sup_handler(?MODULE, + {?MODULE, make_ref()}, [Fn]). add_guarded_callback(Fn) when is_function(Fn) -> - riak_core:add_guarded_event_handler(?MODULE, {?MODULE, make_ref()}, [Fn]). + riak_core:add_guarded_event_handler(?MODULE, + {?MODULE, make_ref()}, [Fn]). force_update() -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), @@ -88,21 +85,15 @@ ring_sync_update(Ring) -> init([Fn]) -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), Fn(Ring), - {ok, #state { callback = Fn }}. + {ok, #state{callback = Fn}}. handle_event({ring_update, Ring}, State) -> - (State#state.callback)(Ring), - {ok, State}. + (State#state.callback)(Ring), {ok, State}. -handle_call(_Request, State) -> - {ok, ok, State}. +handle_call(_Request, State) -> {ok, ok, State}. -handle_info(_Info, State) -> - {ok, State}. +handle_info(_Info, State) -> {ok, State}. -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. +terminate(_Reason, _State) -> ok. +code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/src/riak_core_ring_handler.erl b/src/riak_core_ring_handler.erl index f675164c5..c61a49359 100644 --- a/src/riak_core_ring_handler.erl +++ b/src/riak_core_ring_handler.erl @@ -15,14 +15,16 @@ %% Copyright (c) 2007-2015 Basho Technologies, Inc. All Rights Reserved. -module(riak_core_ring_handler). + -behaviour(gen_event). %% gen_event callbacks -export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]). + -export([ensure_vnodes_started/1]). --record(state, {}). +-record(state, {}). %% =================================================================== %% gen_event callbacks @@ -34,25 +36,18 @@ init([]) -> ensure_vnodes_started(Ring), {ok, #state{}}. - handle_event({ring_update, Ring}, State) -> maybe_start_vnode_proxies(Ring), maybe_stop_vnode_proxies(Ring), {ok, State}. -handle_call(_Event, State) -> - {ok, ok, State}. - -handle_info(_Info, State) -> - {ok, State}. - -terminate(_Reason, _State) -> - ok. +handle_call(_Event, State) -> {ok, ok, State}. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. +handle_info(_Info, State) -> {ok, State}. +terminate(_Reason, _State) -> ok. +code_change(_OldVsn, State, _Extra) -> {ok, State}. %% =================================================================== %% Internal functions @@ -60,160 +55,152 @@ code_change(_OldVsn, State, _Extra) -> ensure_vnodes_started(Ring) -> case riak_core:vnode_modules() of - [] -> - ok; - AppMods -> - case ensure_vnodes_started(AppMods, Ring, []) of - [] -> - Ready = riak_core_ring:ring_ready(Ring), - FutureIndices = riak_core_ring:future_indices(Ring, node()), - Status = riak_core_ring:member_status(Ring, node()), - case {Ready, FutureIndices, Status} of - {true, [], leaving} -> - case ready_to_exit(AppMods) of - true -> - exit_ring_trans(), - maybe_shutdown(Ring); - false -> - ok - end; - {_, _, invalid} -> - riak_core_ring_manager:refresh_my_ring(); - {_, _, exiting} -> - %% Deliberately do nothing. - ok; - {_, _, _} -> - ok - end; - _ -> ok - end + [] -> ok; + AppMods -> + case ensure_vnodes_started(AppMods, Ring, []) of + [] -> + Ready = riak_core_ring:ring_ready(Ring), + FutureIndices = riak_core_ring:future_indices(Ring, + node()), + Status = riak_core_ring:member_status(Ring, node()), + case {Ready, FutureIndices, Status} of + {true, [], leaving} -> + case ready_to_exit(AppMods) of + true -> exit_ring_trans(), maybe_shutdown(Ring); + false -> ok + end; + {_, _, invalid} -> + riak_core_ring_manager:refresh_my_ring(); + {_, _, exiting} -> + %% Deliberately do nothing. + ok; + {_, _, _} -> ok + end; + _ -> ok + end end. %% Shutdown if we are the only node in the cluster maybe_shutdown(Ring) -> case riak_core_ring:random_other_node(Ring) of - no_node -> - riak_core_ring_manager:refresh_my_ring(); - _ -> - ok + no_node -> riak_core_ring_manager:refresh_my_ring(); + _ -> ok end. exit_ring_trans() -> - riak_core_ring_manager:ring_trans( - fun(Ring2, _) -> - Ring3 = riak_core_ring:exit_member(node(), Ring2, node()), - {new_ring, Ring3} - end, []). - -ready_to_exit([]) -> - true; -ready_to_exit([{_App, Mod} | AppMods]) -> - case erlang:function_exported(Mod, ready_to_exit, 0) andalso - (not Mod:ready_to_exit()) of - true -> - false; - false -> - ready_to_exit(AppMods) + riak_core_ring_manager:ring_trans(fun (Ring2, _) -> + Ring3 = + riak_core_ring:exit_member(node(), + Ring2, + node()), + {new_ring, Ring3} + end, + []). + +ready_to_exit([]) -> true; +ready_to_exit([{_App, Module} | AppMods]) -> + case erlang:function_exported(Module, ready_to_exit, 0) + andalso not Module:ready_to_exit() + of + true -> false; + false -> ready_to_exit(AppMods) end. ensure_vnodes_started([], _Ring, Acc) -> lists:flatten(Acc); -ensure_vnodes_started([{App, Mod}|T], Ring, Acc) -> - ensure_vnodes_started(T, Ring, [ensure_vnodes_started({App,Mod},Ring)|Acc]). +ensure_vnodes_started([{App, Mod} | T], Ring, Acc) -> + ensure_vnodes_started(T, Ring, + [ensure_vnodes_started({App, Mod}, Ring) | Acc]). -ensure_vnodes_started({App,Mod}, Ring) -> - Startable = startable_vnodes(Mod, Ring), +ensure_vnodes_started({App, Module}, Ring) -> + Startable = startable_vnodes(Module, Ring), %% NOTE: This following is a hack. There's a basic %% dependency/race between riak_core (want to start vnodes %% right away to trigger possible handoffs) and riak_kv %% (needed to support those vnodes). The hack does not fix %% that dependency: internal techdebt todo list #A7 does. - spawn_link(fun() -> - %% Use a registered name as a lock to prevent the same - %% vnode module from being started twice. - RegName = list_to_atom( - "riak_core_ring_handler_ensure_" - ++ atom_to_list(Mod)), - try erlang:register(RegName, self()) - catch error:badarg -> - exit(normal) + spawn_link(fun () -> + %% Use a registered name as a lock to prevent the same + %% vnode module from being started twice. + ModList = atom_to_list(Module), + RegName = "riak_core_ring_handler_ensure_" ++ ModList, + try erlang:register(list_to_atom(RegName), self()) catch + error:badarg -> exit(normal) end, - %% Let the app finish starting... ok = riak_core:wait_for_application(App), - %% Start the vnodes. HasStartVnodes = lists:member({start_vnodes, 1}, - Mod:module_info(exports)), + Module:module_info(exports)), case HasStartVnodes of - true -> - Mod:start_vnodes(Startable); - false -> - [Mod:start_vnode(I) || I <- Startable] + true -> Module:start_vnodes(Startable); + false -> [Module:start_vnode(I) || I <- Startable] end, - %% Mark the service as up. SupName = list_to_atom(atom_to_list(App) ++ "_sup"), SupPid = erlang:whereis(SupName), case riak_core:health_check(App) of - undefined -> - riak_core_node_watcher:service_up(App, SupPid); - HealthMFA -> - riak_core_node_watcher:service_up(App, - SupPid, - HealthMFA) + undefined -> + riak_core_node_watcher:service_up(App, SupPid); + HealthMFA -> + riak_core_node_watcher:service_up(App, SupPid, + HealthMFA) end, exit(normal) end), Startable. - startable_vnodes(Mod, Ring) -> AllMembers = riak_core_ring:all_members(Ring), case {length(AllMembers), hd(AllMembers) =:= node()} of - {1, true} -> - riak_core_ring:my_indices(Ring); - _ -> - {ok, ModExcl} = riak_core_handoff_manager:get_exclusions(Mod), - Excl = ModExcl -- riak_core_ring:disowning_indices(Ring, node()), - case riak_core_ring:random_other_index(Ring, Excl) of - no_indices -> - case length(Excl) =:= riak_core_ring:num_partitions(Ring) of - true -> - []; - false -> - riak_core_ring:my_indices(Ring) - end; - RO -> - [RO | riak_core_ring:my_indices(Ring)] - end + {1, true} -> riak_core_ring:my_indices(Ring); + _ -> + {ok, ModExcl} = + riak_core_handoff_manager:get_exclusions(Mod), + Excl = ModExcl -- + riak_core_ring:disowning_indices(Ring, node()), + case riak_core_ring:random_other_index(Ring, Excl) of + no_indices -> + case length(Excl) =:= + riak_core_ring:num_partitions(Ring) + of + true -> []; + false -> riak_core_ring:my_indices(Ring) + end; + RO -> [RO | riak_core_ring:my_indices(Ring)] + end end. maybe_start_vnode_proxies(Ring) -> - Mods = [M || {_,M} <- riak_core:vnode_modules()], + Mods = [M || {_, M} <- riak_core:vnode_modules()], Size = riak_core_ring:num_partitions(Ring), FutureSize = riak_core_ring:future_num_partitions(Ring), Larger = Size < FutureSize, case Larger of - true -> - FutureIdxs = riak_core_ring:all_owners(riak_core_ring:future_ring(Ring)), - _ = [riak_core_vnode_proxy_sup:start_proxy(Mod, Idx) || {Idx, _} <- FutureIdxs, - Mod <- Mods], - ok; - false -> - ok + true -> + FutureIdxs = + riak_core_ring:all_owners(riak_core_ring:future_ring(Ring)), + _ = [riak_core_vnode_proxy_sup:start_proxy(Mod, Idx) + || {Idx, _} <- FutureIdxs, Mod <- Mods], + ok; + false -> ok end. maybe_stop_vnode_proxies(Ring) -> Mods = [M || {_, M} <- riak_core:vnode_modules()], case riak_core_ring:pending_changes(Ring) of - [] -> - Idxs = [{I,M} || {I,_} <- riak_core_ring:all_owners(Ring), M <- Mods], - ProxySpecs = supervisor:which_children(riak_core_vnode_proxy_sup), - Running = [{I,M} || {{M,I},_,_,_} <- ProxySpecs, lists:member(M, Mods)], - ToShutdown = Running -- Idxs, - _ = [riak_core_vnode_proxy_sup:stop_proxy(M,I) || {I, M} <- ToShutdown], - ok; - _ -> - ok + [] -> + Idxs = [{I, M} + || {I, _} <- riak_core_ring:all_owners(Ring), + M <- Mods], + ProxySpecs = + supervisor:which_children(riak_core_vnode_proxy_sup), + Running = [{I, M} + || {{M, I}, _, _, _} <- ProxySpecs, + lists:member(M, Mods)], + ToShutdown = Running -- Idxs, + _ = [riak_core_vnode_proxy_sup:stop_proxy(M, I) + || {I, M} <- ToShutdown], + ok; + _ -> ok end. diff --git a/src/riak_core_ring_manager.erl b/src/riak_core_ring_manager.erl index 737a88499..6149e7f5a 100644 --- a/src/riak_core_ring_manager.erl +++ b/src/riak_core_ring_manager.erl @@ -24,28 +24,23 @@ %% %% Numerous processes concurrently read and access the ring in a %% variety of time sensitive code paths. To make this efficient, -%% `riak_core' uses `mochiglobal' which exploits the Erlang constant -%% pool to provide constant-time access to the ring without needing -%% to copy data into individual process heaps. -%% -%% However, updating a `mochiglobal' value is very slow, and becomes slower -%% the larger the item being stored. With large rings, the delay can -%% become too long during periods of high ring churn, where hundreds of -%% ring events are being triggered a second. +%% `riak_core' uses `persistent_term' to provide constant-time access +%% to the ring without needing to copy data into individual process heaps. +%% See http://erlang.org/doc/man/persistent_term.html %% %% As of Riak 1.4, `riak_core' uses a hybrid approach to solve this %% problem. When a ring is first written, it is written to a shared ETS %% table. If no ring events have occurred for 90 seconds, the ring is -%% then promoted to `mochiglobal'. This provides fast updates during +%% then promoted to `persistent_term'. This provides fast updates during %% periods of ring churn, while eventually providing very fast reads %% after the ring stabilizes. The downside is that reading from the ETS -%% table before promotion is slower than `mochiglobal', and requires +%% table before promotion is slower than `persistent_term', and requires %% copying the ring into individual process heaps. %% %% To alleviate the slow down while in the ETS phase, `riak_core' %% exploits the fact that most time sensitive operations access the ring -%% in order to read only a subset of its data: bucket properties and -%% partition ownership. Therefore, these pieces of information are +%% in order to read only a subset of its data: partition ownership. +%% Therefore, these pieces of information are %% extracted from the ring and stored in the ETS table as well to %% minimize copying overhead. Furthermore, the partition ownership %% information (represented by the {@link chash} structure) is converted @@ -56,38 +51,27 @@ %% structure for normal operations. %% %% As of Riak 1.4, it is therefore recommended that operations that -%% can be performed by directly using the bucket properties API or -%% `chashbin' structure do so using those methods rather than -%% retrieving the ring via `get_my_ring/0' or `get_raw_ring/0'. +%% can be performed by directly using the `chashbin' structure. +%% Do so using that method rather than retrieving the ring via +%% `get_my_ring/0' or `get_raw_ring/0'. -module(riak_core_ring_manager). + -define(RING_KEY, riak_ring). + -behaviour(gen_server). --export([start_link/0, - start_link/1, - get_my_ring/0, - get_raw_ring/0, - get_raw_ring_chashbin/0, - get_chash_bin/0, - get_ring_id/0, - get_bucket_meta/1, - refresh_my_ring/0, - refresh_ring/2, - set_my_ring/1, - write_ringfile/0, - prune_ringfiles/0, - read_ringfile/1, - find_latest_ringfile/0, - force_update/0, - do_write_ringfile/1, - ring_trans/2, - run_fixups/3, - set_cluster_name/1, +-export([start_link/0, start_link/1, get_my_ring/0, + get_raw_ring/0, get_raw_ring_chashbin/0, + get_chash_bin/0, get_ring_id/0, refresh_my_ring/0, + refresh_ring/2, set_my_ring/1, write_ringfile/0, + prune_ringfiles/0, read_ringfile/1, + find_latest_ringfile/0, force_update/0, + do_write_ringfile/1, ring_trans/2, set_cluster_name/1, is_stable_ring/0]). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). -ifdef(TEST). @@ -95,17 +79,18 @@ -endif. +-record(state, + {mode, raw_ring, ring_changed_time, inactivity_timer}). --record(state, { - mode, - raw_ring, - ring_changed_time, - inactivity_timer - }). +-export([setup_ets/1, cleanup_ets/1, set_ring_global/1, + promote_ring/0]). + + %% For EUnit testing --export([setup_ets/1, cleanup_ets/1, set_ring_global/1]). %% For EUnit testing -ifdef(TEST). + -include_lib("eunit/include/eunit.hrl"). + -endif. -define(ETS, ets_riak_core_ring_manager). @@ -117,49 +102,47 @@ %% =================================================================== start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [live], []). - + gen_server:start_link({local, ?MODULE}, ?MODULE, [live], + []). %% Testing entry point start_link(test) -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [test], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, [test], + []). +-spec get_my_ring() -> {ok, + riak_core_ring:riak_core_ring()} | + {error, any()}. -%% @spec get_my_ring() -> {ok, riak_core_ring:riak_core_ring()} | {error, Reason} get_my_ring() -> - Ring = case riak_core_mochiglobal:get(?RING_KEY) of - ets -> - case ets:lookup(?ETS, ring) of - [{_, RingETS}] -> - RingETS; - _ -> - undefined - end; - RingMochi -> - RingMochi + Ring = case persistent_term:get(?RING_KEY, undefined) of + ets -> + case ets:lookup(?ETS, ring) of + [{_, RingETS}] -> RingETS; + _ -> undefined + end; + RingMochi -> RingMochi end, case Ring of - Ring when is_tuple(Ring) -> {ok, Ring}; - undefined -> {error, no_ring} + Ring when is_tuple(Ring) -> {ok, Ring}; + undefined -> {error, no_ring} end. get_raw_ring() -> - try - Ring = ets:lookup_element(?ETS, raw_ring, 2), + try Ring = ets:lookup_element(?ETS, raw_ring, 2), {ok, Ring} catch - _:_ -> - gen_server:call(?MODULE, get_raw_ring, infinity) + _:_ -> gen_server:call(?MODULE, get_raw_ring, infinity) end. get_raw_ring_chashbin() -> - try - Ring = ets:lookup_element(?ETS, raw_ring, 2), + try Ring = ets:lookup_element(?ETS, raw_ring, 2), {ok, CHBin} = get_chash_bin(), {ok, Ring, CHBin} catch - _:_ -> - gen_server:call(?MODULE, get_raw_ring_chashbin, infinity) + _:_ -> + gen_server:call(?MODULE, get_raw_ring_chashbin, + infinity) end. %% @spec refresh_my_ring() -> ok @@ -167,7 +150,8 @@ refresh_my_ring() -> gen_server:call(?MODULE, refresh_my_ring, infinity). refresh_ring(Node, ClusterName) -> - gen_server:cast({?MODULE, Node}, {refresh_my_ring, ClusterName}). + gen_server:cast({?MODULE, Node}, + {refresh_my_ring, ClusterName}). %% @spec set_my_ring(riak_core_ring:riak_core_ring()) -> ok set_my_ring(Ring) -> @@ -175,38 +159,15 @@ set_my_ring(Ring) -> get_ring_id() -> case ets:lookup(?ETS, id) of - [{_, Id}] -> - Id; - _ -> - {0,0} - end. - -%% @doc Return metadata for the given bucket. If a bucket -%% for the non-default type is provided {error, no_type} -%% is returned when the type does not exist -get_bucket_meta({<<"default">>, Name}) -> - get_bucket_meta(Name); -get_bucket_meta({_Type, _Name}=Bucket) -> - %% reads from cluster metadata ets table - %% these aren't stored in ring manager ever - riak_core_bucket:get_bucket(Bucket); -get_bucket_meta(Bucket) -> - case ets:lookup(?ETS, {bucket, Bucket}) of - [] -> - undefined; - [{_, undefined}] -> - undefined; - [{_, Meta}] -> - {ok, Meta} + [{_, Id}] -> Id; + _ -> {0, 0} end. %% @doc Return the {@link chashbin} generated from the current ring get_chash_bin() -> case ets:lookup(?ETS, chashbin) of - [{chashbin, CHBin}] -> - {ok, CHBin}; - _ -> - {error, no_ring} + [{chashbin, CHBin}] -> {ok, CHBin}; + _ -> {error, no_ring} end. %% @spec write_ringfile() -> ok @@ -214,10 +175,12 @@ write_ringfile() -> gen_server:cast(?MODULE, write_ringfile). ring_trans(Fun, Args) -> - gen_server:call(?MODULE, {ring_trans, Fun, Args}, infinity). + gen_server:call(?MODULE, {ring_trans, Fun, Args}, + infinity). set_cluster_name(Name) -> - gen_server:call(?MODULE, {set_cluster_name, Name}, infinity). + gen_server:call(?MODULE, {set_cluster_name, Name}, + infinity). is_stable_ring() -> gen_server:call(?MODULE, is_stable_ring, infinity). @@ -225,119 +188,128 @@ is_stable_ring() -> %% @doc Exposed for support/debug purposes. Forces the node to change its %% ring in a manner that will trigger reconciliation on gossip. force_update() -> - ring_trans( - fun(Ring, _) -> - NewRing = riak_core_ring:update_member_meta(node(), Ring, node(), - unused, erlang:timestamp()), - {new_ring, NewRing} - end, []), + ring_trans(fun (Ring, _) -> + NewRing = riak_core_ring:update_member_meta(node(), + Ring, node(), + unused, + erlang:timestamp()), + {new_ring, NewRing} + end, + []), ok. do_write_ringfile(Ring) -> case ring_dir() of - "" -> nop; - Dir -> - {{Year, Month, Day},{Hour, Minute, Second}} = calendar:universal_time(), - TS = io_lib:format(".~B~2.10.0B~2.10.0B~2.10.0B~2.10.0B~2.10.0B", - [Year, Month, Day, Hour, Minute, Second]), - Cluster = application:get_env(riak_core, cluster_name, undefined), - FN = Dir ++ "/riak_core_ring." ++ Cluster ++ TS, - do_write_ringfile(Ring, FN) + "" -> nop; + Dir -> + {{Year, Month, Day}, {Hour, Minute, Second}} = + calendar:universal_time(), + TS = + io_lib:format(".~B~2.10.0B~2.10.0B~2.10.0B~2.10.0B~2.10.0B", + [Year, Month, Day, Hour, Minute, Second]), + {ok, Cluster} = application:get_env(riak_core, + cluster_name), + FN = Dir ++ "/riak_core_ring." ++ Cluster ++ TS, + do_write_ringfile(Ring, FN) end. do_write_ringfile(Ring, FN) -> ok = filelib:ensure_dir(FN), - try - false = riak_core_ring:check_lastgasp(Ring), - ok = riak_core_util:replace_file(FN, term_to_binary(Ring)) + try ok = riak_core_util:replace_file(FN, + term_to_binary(Ring)) catch - _:Err -> - logger:error("Unable to write ring to \"~s\" - ~p\n", [FN, Err]), - {error,Err} + _:Err -> + logger:error("Unable to write ring to \"~s\" - ~p\n", + [FN, Err]), + {error, Err} end. - %% @spec find_latest_ringfile() -> string() find_latest_ringfile() -> Dir = ring_dir(), case file:list_dir(Dir) of - {ok, Filenames} -> - Cluster = application:get_env(riak_core, cluster_name, undefined), - Timestamps = [list_to_integer(TS) || {"riak_core_ring", C1, TS} <- - [list_to_tuple(string:tokens(FN, ".")) || FN <- Filenames], - C1 =:= Cluster], - SortedTimestamps = lists:reverse(lists:sort(Timestamps)), - case SortedTimestamps of - [Latest | _] -> - {ok, Dir ++ "/riak_core_ring." ++ Cluster ++ "." ++ integer_to_list(Latest)}; - _ -> - {error, not_found} - end; - {error, Reason} -> - {error, Reason} + {ok, Filenames} -> + {ok, Cluster} = application:get_env(riak_core, + cluster_name), + Timestamps = [list_to_integer(TS) + || {"riak_core_ring", C1, TS} + <- [list_to_tuple(string:tokens(FN, ".")) + || FN <- Filenames], + C1 =:= Cluster], + SortedTimestamps = + lists:reverse(lists:sort(Timestamps)), + case SortedTimestamps of + [Latest | _] -> + {ok, + Dir ++ + "/riak_core_ring." ++ + Cluster ++ "." ++ integer_to_list(Latest)}; + _ -> {error, not_found} + end; + {error, Reason} -> {error, Reason} end. %% @spec read_ringfile(string()) -> riak_core_ring:riak_core_ring() | {error, any()} read_ringfile(RingFile) -> case file:read_file(RingFile) of - {ok, Binary} -> - R = binary_to_term(Binary), - false = riak_core_ring:check_lastgasp(R), - R; - {error, Reason} -> - {error, Reason} + {ok, Binary} -> binary_to_term(Binary); + {error, Reason} -> {error, Reason} end. %% @spec prune_ringfiles() -> ok | {error, Reason} prune_ringfiles() -> case ring_dir() of - "" -> ok; - Dir -> - Cluster = application:get_env(riak_core, cluster_name, undefined), - case file:list_dir(Dir) of - {error,enoent} -> ok; - {error, Reason} -> - {error, Reason}; - {ok, []} -> ok; - {ok, Filenames} -> - Timestamps = [TS || {"riak_core_ring", C1, TS} <- - [list_to_tuple(string:tokens(FN, ".")) || FN <- Filenames], - C1 =:= Cluster], - if Timestamps /= [] -> - %% there are existing ring files - TSPat = [io_lib:fread("~4d~2d~2d~2d~2d~2d",TS) || - TS <- Timestamps], - TSL = lists:reverse(lists:sort([TS || - {ok,TS,[]} <- TSPat])), - Keep = prune_list(TSL), - KeepTSs = [lists:flatten( - io_lib:format( - "~B~2.10.0B~2.10.0B~2.10.0B~2.10.0B~2.10.0B",K)) - || K <- Keep], - DelFNs = [Dir ++ "/" ++ FN || FN <- Filenames, - lists:all(fun(TS) -> - string:str(FN,TS)=:=0 - end, KeepTSs)], - _ = [file:delete(DelFN) || DelFN <- DelFNs], - ok; - true -> - %% directory wasn't empty, but there are no ring - %% files in it - ok - end - end + "" -> ok; + Dir -> + Cluster = application:get_env(riak_core, cluster_name, + undefined), + case file:list_dir(Dir) of + {error, enoent} -> ok; + {error, Reason} -> {error, Reason}; + {ok, []} -> ok; + {ok, Filenames} -> + Timestamps = [TS + || {"riak_core_ring", C1, TS} + <- [list_to_tuple(string:tokens(FN, ".")) + || FN <- Filenames], + C1 =:= Cluster], + if Timestamps /= [] -> + %% there are existing ring files + TSPat = [io_lib:fread("~4d~2d~2d~2d~2d~2d", TS) + || TS <- Timestamps], + TSL = lists:reverse(lists:sort([TS + || {ok, TS, []} + <- TSPat])), + Keep = prune_list(TSL), + KeepTSs = + [lists:flatten(io_lib:format("~B~2.10.0B~2.10.0B~2.10.0B~2.10.0B~2.10.0B", + K)) + || K <- Keep], + DelFNs = [Dir ++ "/" ++ FN + || FN <- Filenames, + lists:all(fun (TS) -> + string:str(FN, TS) =:= 0 + end, + KeepTSs)], + _ = [file:delete(DelFN) || DelFN <- DelFNs], + ok; + true -> + %% directory wasn't empty, but there are no ring + %% files in it + ok + end + end end. -ifdef(TEST). + %% @private (only used for test instances) stop() -> - try - gen_server:call(?MODULE, stop) - catch - exit:{noproc, _} -> ok + try gen_server:call(?MODULE, stop) catch + exit:{noproc, _} -> ok end. --endif. +-endif. %% =================================================================== %% gen_server callbacks @@ -350,36 +322,36 @@ init([Mode]) -> riak_core_ring_events:ring_update(Ring), {ok, State}. -reload_ring(test) -> - riak_core_ring:fresh(16,node()); +reload_ring(test) -> riak_core_ring:fresh(16, node()); reload_ring(live) -> case riak_core_ring_manager:find_latest_ringfile() of - {ok, RingFile} -> - case riak_core_ring_manager:read_ringfile(RingFile) of - {error, Reason} -> - logger:critical("Failed to read ring file: ~p", - [riak_core_util:posix_error(Reason)]), - throw({error, Reason}); - Ring -> - Ring - end; - {error, not_found} -> - logger:warning("No ring file available."), - riak_core_ring:fresh(); - {error, Reason} -> - logger:critical("Failed to load ring file: ~p", - [riak_core_util:posix_error(Reason)]), - throw({error, Reason}) + {ok, RingFile} -> + case riak_core_ring_manager:read_ringfile(RingFile) of + {error, Reason} -> + logger:critical("Failed to read ring file: ~p", + [riak_core_util:posix_error(Reason)]), + throw({error, Reason}); + Ring -> Ring + end; + {error, not_found} -> + logger:warning("No ring file available."), + riak_core_ring:fresh(); + {error, Reason} -> + logger:critical("Failed to load ring file: ~p", + [riak_core_util:posix_error(Reason)]), + throw({error, Reason}) end. -handle_call(get_raw_ring, _From, #state{raw_ring=Ring} = State) -> +handle_call(get_raw_ring, _From, + #state{raw_ring = Ring} = State) -> {reply, {ok, Ring}, State}; -handle_call(get_raw_ring_chashbin, _From, #state{raw_ring=Ring} = State) -> +handle_call(get_raw_ring_chashbin, _From, + #state{raw_ring = Ring} = State) -> {ok, CHBin} = get_chash_bin(), {reply, {ok, Ring, CHBin}, State}; handle_call({set_my_ring, Ring}, _From, State) -> State2 = prune_write_notify_ring(Ring, State), - {reply,ok,State2}; + {reply, ok, State2}; handle_call(refresh_my_ring, _From, State) -> %% Pompt the claimant before creating a fresh ring for shutdown, so that %% any final actions can be taken @@ -393,248 +365,174 @@ handle_call(refresh_my_ring, _From, State) -> %% state global ring has the last gasp, but not the persisted ring (so that %% on restart there will be no last gasp indicator. ok = do_write_ringfile(FreshRing), - %% Handoff is complete and fresh ring is written %% so we can safely stop now. riak_core:stop("node removal completed, exiting."), - - {reply,ok,State2}; -handle_call({ring_trans, Fun, Args}, _From, State=#state{raw_ring=Ring}) -> + {reply, ok, State2}; +handle_call({ring_trans, Fun, Args}, _From, + State = #state{raw_ring = Ring}) -> case catch Fun(Ring, Args) of - {new_ring, NewRing} -> - State2 = prune_write_notify_ring(NewRing, State), - riak_core_gossip:random_recursive_gossip(NewRing), - {reply, {ok, NewRing}, State2}; - {set_only, NewRing} -> - State2 = prune_write_ring(NewRing, State), - {reply, {ok, NewRing}, State2}; - {reconciled_ring, NewRing} -> - State2 = prune_write_notify_ring(NewRing, State), - riak_core_gossip:recursive_gossip(NewRing), - {reply, {ok, NewRing}, State2}; - ignore -> - {reply, not_changed, State}; - {ignore, Reason} -> - {reply, {not_changed, Reason}, State}; - Other -> - logger:error("ring_trans: invalid return value: ~p", - [Other]), - {reply, not_changed, State} + {new_ring, NewRing} -> + State2 = prune_write_notify_ring(NewRing, State), + riak_core_gossip:random_recursive_gossip(NewRing), + {reply, {ok, NewRing}, State2}; + {set_only, NewRing} -> + State2 = prune_write_ring(NewRing, State), + {reply, {ok, NewRing}, State2}; + {reconciled_ring, NewRing} -> + State2 = prune_write_notify_ring(NewRing, State), + riak_core_gossip:recursive_gossip(NewRing), + {reply, {ok, NewRing}, State2}; + ignore -> {reply, not_changed, State}; + {ignore, Reason} -> + {reply, {not_changed, Reason}, State}; + Other -> + logger:error("ring_trans: invalid return value: ~p", + [Other]), + {reply, not_changed, State} end; -handle_call({set_cluster_name, Name}, _From, State=#state{raw_ring=Ring}) -> +handle_call({set_cluster_name, Name}, _From, + State = #state{raw_ring = Ring}) -> NewRing = riak_core_ring:set_cluster_name(Ring, Name), State2 = prune_write_notify_ring(NewRing, State), {reply, ok, State2}; handle_call(is_stable_ring, _From, State) -> {IsStable, _DeltaMS} = is_stable_ring(State), {reply, IsStable, State}; - handle_call(stop, _From, State) -> - {stop,normal, ok, State}. + {stop, normal, ok, State}. handle_cast({refresh_my_ring, ClusterName}, State) -> {ok, Ring} = get_my_ring(), case riak_core_ring:cluster_name(Ring) of - ClusterName -> - handle_cast(refresh_my_ring, State); - _ -> - {noreply, State} + ClusterName -> handle_cast(refresh_my_ring, State); + _ -> {noreply, State} end; handle_cast(refresh_my_ring, State) -> - {_, _, State2} = handle_call(refresh_my_ring, undefined, State), + {_, _, State2} = handle_call(refresh_my_ring, undefined, + State), {noreply, State2}; - -handle_cast(write_ringfile, test) -> - {noreply,test}; - -handle_cast(write_ringfile, State=#state{raw_ring=Ring}) -> - ok = do_write_ringfile(Ring), - {noreply,State}. - +handle_cast(write_ringfile, test) -> {noreply, test}; +handle_cast(write_ringfile, + State = #state{raw_ring = Ring}) -> + ok = do_write_ringfile(Ring), {noreply, State}. handle_info(inactivity_timeout, State) -> case is_stable_ring(State) of - {true,DeltaMS} -> - logger:debug("Promoting ring after ~p", [DeltaMS]), - promote_ring(), - State2 = State#state{inactivity_timer=undefined}, - {noreply, State2}; - {false,DeltaMS} -> - Remaining = ?PROMOTE_TIMEOUT - DeltaMS, - State2 = set_timer(Remaining, State), - {noreply, State2} + {true, DeltaMS} -> + logger:debug("Promoting ring after ~p", [DeltaMS]), + promote_ring(), + State2 = State#state{inactivity_timer = undefined}, + {noreply, State2}; + {false, DeltaMS} -> + Remaining = (?PROMOTE_TIMEOUT) - DeltaMS, + State2 = set_timer(Remaining, State), + {noreply, State2} end; -handle_info(_Info, State) -> - {noreply, State}. - +handle_info(_Info, State) -> {noreply, State}. %% @private -terminate(_Reason, _State) -> - ok. - +terminate(_Reason, _State) -> ok. %% @private -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - +code_change(_OldVsn, State, _Extra) -> {ok, State}. %% =================================================================== %% Internal functions %% =================================================================== ring_dir() -> - case application:get_env(riak_core, ring_state_dir, undefined) of - undefined -> - filename:join(application:get_env(riak_core, platform_data_dir, "data"), "ring"); - D -> - D + case application:get_env(riak_core, ring_state_dir, + undefined) + of + undefined -> + filename:join(application:get_env(riak_core, + platform_data_dir, "data"), + "ring"); + D -> D end. -prune_list([X|Rest]) -> - lists:usort(lists:append([[X],back(1,X,Rest),back(2,X,Rest), - back(3,X,Rest),back(4,X,Rest),back(5,X,Rest)])). -back(_N,_X,[]) -> []; -back(N,X,[H|T]) -> - case lists:nth(N,X) =:= lists:nth(N,H) of - true -> back(N,X,T); - false -> [H] - end. +prune_list([X | Rest]) -> + lists:usort(lists:append([[X], back(1, X, Rest), + back(2, X, Rest), back(3, X, Rest), + back(4, X, Rest), back(5, X, Rest)])). -%% @private -run_fixups([], _Bucket, BucketProps) -> - BucketProps; -run_fixups([{App, Fixup}|T], BucketName, BucketProps) -> - BP = try Fixup:fixup(BucketName, BucketProps) of - {ok, NewBucketProps} -> - NewBucketProps; - {error, Reason} -> - logger:error("Error while running bucket fixup module " - "~p from application ~p on bucket ~p: ~p", [Fixup, App, - BucketName, Reason]), - BucketProps - catch - What:Why -> - logger:error("Crash while running bucket fixup module " - "~p from application ~p on bucket ~p : ~p:~p", [Fixup, App, - BucketName, What, Why]), - BucketProps - end, - run_fixups(T, BucketName, BP). +back(_N, _X, []) -> []; +back(N, X, [H | T]) -> + case lists:nth(N, X) =:= lists:nth(N, H) of + true -> back(N, X, T); + false -> [H] + end. set_ring(Ring, State) -> set_ring_global(Ring), Now = os:timestamp(), - State2 = State#state{raw_ring=Ring, ring_changed_time=Now}, + State2 = State#state{raw_ring = Ring, + ring_changed_time = Now}, State3 = maybe_set_timer(?PROMOTE_TIMEOUT, State2), State3. -maybe_set_timer(Duration, State=#state{inactivity_timer=undefined}) -> +maybe_set_timer(Duration, + State = #state{inactivity_timer = undefined}) -> set_timer(Duration, State); -maybe_set_timer(_Duration, State) -> - State. +maybe_set_timer(_Duration, State) -> State. set_timer(Duration, State) -> - Timer = erlang:send_after(Duration, self(), inactivity_timeout), - State#state{inactivity_timer=Timer}. + Timer = erlang:send_after(Duration, self(), + inactivity_timeout), + State#state{inactivity_timer = Timer}. setup_ets(Mode) -> %% Destroy prior version of ETS table. This is necessary for certain %% eunit tests, but is unneeded for normal Riak operation. catch ets:delete(?ETS), Access = case Mode of - live -> protected; - test -> public + live -> protected; + test -> public end, - ?ETS = ets:new(?ETS, [named_table, Access, {read_concurrency, true}]), + (?ETS) = ets:new(?ETS, + [named_table, Access, {read_concurrency, true}]), Id = reset_ring_id(), - ets:insert(?ETS, [{changes, 0}, {promoted, 0}, {id, Id}]), + ets:insert(?ETS, + [{changes, 0}, {promoted, 0}, {id, Id}]), ok. -cleanup_ets(test) -> - ets:delete(?ETS). +cleanup_ets(test) -> ets:delete(?ETS). reset_ring_id() -> - %% Maintain ring id epoch using mochiglobal to ensure ring id remains + %% Maintain ring id epoch using persistent_term to ensure ring id remains %% monotonic even if the riak_core_ring_manager crashes and restarts - Epoch = case riak_core_mochiglobal:get(riak_ring_id_epoch) of - undefined -> - 0; - Value -> - Value + Epoch = case persistent_term:get(riak_ring_id_epoch, + undefined) + of + undefined -> 0; + Value -> Value end, - riak_core_mochiglobal:put(riak_ring_id_epoch, Epoch + 1), + persistent_term:put(riak_ring_id_epoch, Epoch + 1), {Epoch + 1, 0}. -%% Set the ring in mochiglobal/ETS. Exported during unit testing +%% Set the ring in persistent_term/ETS. Exported during unit testing %% to make test setup simpler - no need to spin up a riak_core_ring_manager %% process. set_ring_global(Ring) -> - DefaultProps = case application:get_env(riak_core, default_bucket_props) of - {ok, Val} -> - Val; - _ -> - [] - end, - %% run fixups on the ring before storing it in mochiglobal - FixedRing = case riak_core:bucket_fixups() of - [] -> Ring; - Fixups -> - Buckets = riak_core_ring:get_buckets(Ring), - lists:foldl( - fun(Bucket, AccRing) -> - BucketProps = riak_core_bucket:get_bucket(Bucket, Ring), - %% Merge anything in the default properties but not in - %% the bucket's properties. This is to ensure default - %% properties added after the bucket is created are - %% inherited to the bucket. - MergedProps = riak_core_bucket:merge_props( - BucketProps, DefaultProps), - - %% fixup the ring - NewBucketProps = run_fixups(Fixups, Bucket, MergedProps), - %% update the bucket in the ring - riak_core_ring:update_meta({bucket,Bucket}, - NewBucketProps, - AccRing) - end, Ring, Buckets) - end, %% Mark ring as tainted to check if it is ever leaked over gossip or %% relied upon for any non-local ring operations. - TaintedRing = riak_core_ring:set_tainted(FixedRing), - - %% Extract bucket properties and place into ETS table. We want all bucket - %% additions, modifications, and deletions to appear in a single atomic - %% operation. Since ETS does not provide a means to change + delete - %% multiple values in a single operation, we emulate the deletion by - %% overwriting all deleted buckets with the "undefined" atom that has - %% special meaning in `riak_core_bucket:get_bucket_props/2`. We then - %% cleanup these values in a subsequent `ets:match_delete`. - OldBuckets = ets:select(?ETS, [{{{bucket, '$1'}, '_'}, [], ['$1']}]), - BucketDefaults = [{{bucket, Bucket}, undefined} || Bucket <- OldBuckets], - BucketMeta = - [{{bucket, Bucket}, Meta} - || Bucket <- riak_core_ring:get_buckets(TaintedRing), - {ok,Meta} <- [riak_core_ring:get_meta({bucket, Bucket}, TaintedRing)]], - BucketMeta2 = lists:ukeysort(1, BucketMeta ++ BucketDefaults), - CHBin = chashbin:create(riak_core_ring:chash(TaintedRing)), + TaintedRing = riak_core_ring:set_tainted(Ring), + CHBin = + chashbin:create(riak_core_ring:chash(TaintedRing)), {Epoch, Id} = ets:lookup_element(?ETS, id, 2), - Actions = [{ring, TaintedRing}, - {raw_ring, Ring}, - {id, {Epoch,Id+1}}, - {chashbin, CHBin} | BucketMeta2], + Actions = [{ring, TaintedRing}, {raw_ring, Ring}, + {id, {Epoch, Id + 1}}, {chashbin, CHBin}], ets:insert(?ETS, Actions), - ets:match_delete(?ETS, {{bucket, '_'}, undefined}), - case riak_core_mochiglobal:get(?RING_KEY) of - ets -> - ok; - _ -> - riak_core_mochiglobal:put(?RING_KEY, ets) + case persistent_term:get(?RING_KEY, undefined) of + ets -> ok; + _ -> persistent_term:put(?RING_KEY, ets) end, ok. promote_ring() -> {ok, Ring} = get_my_ring(), - riak_core_mochiglobal:put(?RING_KEY, Ring). + persistent_term:put(?RING_KEY, Ring). %% Persist a new ring file, set the global value and notify any listeners prune_write_notify_ring(Ring, State) -> @@ -643,16 +541,18 @@ prune_write_notify_ring(Ring, State) -> State2. prune_write_ring(Ring, State) -> - riak_core_ring:check_tainted(Ring, "Error: Persisting tainted ring"), + riak_core_ring:check_tainted(Ring, + "Error: Persisting tainted ring"), ok = riak_core_ring_manager:prune_ringfiles(), _ = do_write_ringfile(Ring), State2 = set_ring(Ring, State), State2. -is_stable_ring(#state{ring_changed_time=Then}) -> - DeltaUS = erlang:max(0, timer:now_diff(os:timestamp(), Then)), +is_stable_ring(#state{ring_changed_time = Then}) -> + DeltaUS = erlang:max(0, + timer:now_diff(os:timestamp(), Then)), DeltaMS = DeltaUS div 1000, - IsStable = DeltaMS >= ?PROMOTE_TIMEOUT, + IsStable = DeltaMS >= (?PROMOTE_TIMEOUT), {IsStable, DeltaMS}. %% =================================================================== @@ -661,68 +561,81 @@ is_stable_ring(#state{ring_changed_time=Then}) -> -ifdef(TEST). back_test() -> - X = [1,2,3], - List1 = [[1,2,3],[4,2,3], [7,8,3], [11,12,13], [1,2,3]], - List2 = [[7,8,9], [1,2,3]], - List3 = [[1,2,3]], - ?assertEqual([[4,2,3]], back(1, X, List1)), - ?assertEqual([[7,8,9]], back(1, X, List2)), - ?assertEqual([], back(1, X, List3)), - ?assertEqual([[7,8,3]], back(2, X, List1)), - ?assertEqual([[11,12,13]], back(3, X, List1)). + X = [1, 2, 3], + List1 = [[1, 2, 3], [4, 2, 3], [7, 8, 3], [11, 12, 13], + [1, 2, 3]], + List2 = [[7, 8, 9], [1, 2, 3]], + List3 = [[1, 2, 3]], + ?assertEqual([[4, 2, 3]], (back(1, X, List1))), + ?assertEqual([[7, 8, 9]], (back(1, X, List2))), + ?assertEqual([], (back(1, X, List3))), + ?assertEqual([[7, 8, 3]], (back(2, X, List1))), + ?assertEqual([[11, 12, 13]], (back(3, X, List1))). prune_list_test() -> - TSList1 = [[2011,2,28,16,32,16],[2011,2,28,16,32,36],[2011,2,28,16,30,27],[2011,2,28,16,32,16],[2011,2,28,16,32,36]], - TSList2 = [[2011,2,28,16,32,36],[2011,2,28,16,31,16],[2011,2,28,16,30,27],[2011,2,28,16,32,16],[2011,2,28,16,32,36]], - PrunedList1 = [[2011,2,28,16,30,27],[2011,2,28,16,32,16]], - PrunedList2 = [[2011,2,28,16,31,16],[2011,2,28,16,32,36]], - ?assertEqual(PrunedList1, prune_list(TSList1)), - ?assertEqual(PrunedList2, prune_list(TSList2)). + TSList1 = [[2011, 2, 28, 16, 32, 16], + [2011, 2, 28, 16, 32, 36], [2011, 2, 28, 16, 30, 27], + [2011, 2, 28, 16, 32, 16], [2011, 2, 28, 16, 32, 36]], + TSList2 = [[2011, 2, 28, 16, 32, 36], + [2011, 2, 28, 16, 31, 16], [2011, 2, 28, 16, 30, 27], + [2011, 2, 28, 16, 32, 16], [2011, 2, 28, 16, 32, 36]], + PrunedList1 = [[2011, 2, 28, 16, 30, 27], + [2011, 2, 28, 16, 32, 16]], + PrunedList2 = [[2011, 2, 28, 16, 31, 16], + [2011, 2, 28, 16, 32, 36]], + ?assertEqual(PrunedList1, (prune_list(TSList1))), + ?assertEqual(PrunedList2, (prune_list(TSList2))). set_ring_global_test() -> setup_ets(test), - application:set_env(riak_core,ring_creation_size, 4), + application:set_env(riak_core, ring_creation_size, 4), Ring = riak_core_ring:fresh(), set_ring_global(Ring), promote_ring(), - ?assert(riak_core_ring:nearly_equal(Ring, riak_core_mochiglobal:get(?RING_KEY))), + ?assert((riak_core_ring:nearly_equal(Ring, + persistent_term:get(?RING_KEY, + undefined)))), cleanup_ets(test). set_my_ring_test() -> setup_ets(test), - application:set_env(riak_core,ring_creation_size, 4), + application:set_env(riak_core, ring_creation_size, 4), Ring = riak_core_ring:fresh(), set_ring_global(Ring), {ok, MyRing} = get_my_ring(), - ?assert(riak_core_ring:nearly_equal(Ring, MyRing)), + ?assert((riak_core_ring:nearly_equal(Ring, MyRing))), cleanup_ets(test). refresh_my_ring_test() -> - {spawn, fun() -> - setup_ets(test), - Core_Settings = [{ring_creation_size, 4}, - {ring_state_dir, "_build/test/tmp"}, - {cluster_name, "test"}], - [begin - put({?MODULE,AppKey}, application:get_env(riak_core, AppKey, undefined)), - ok = application:set_env(riak_core, AppKey, Val) - end || {AppKey, Val} <- Core_Settings], - stop_core_processes(), - riak_core_ring_events:start_link(), - riak_core_ring_manager:start_link(test), - riak_core_vnode_sup:start_link(), - riak_core_vnode_master:start_link(riak_core_vnode), - riak_core_test_util:setup_mockring1(), - ?assertEqual(ok, riak_core_ring_manager:refresh_my_ring()), - stop_core_processes(), - %% Cleanup the ring file created for this test - {ok, RingFile} = find_latest_ringfile(), - file:delete(RingFile), - [ok = application:set_env(riak_core, AppKey, get({?MODULE, AppKey})) - || {AppKey, _Val} <- Core_Settings], - ok - end - }. + {spawn, + fun () -> + setup_ets(test), + Core_Settings = [{ring_creation_size, 4}, + {ring_state_dir, "_build/test/tmp"}, + {cluster_name, "test"}], + [begin + put({?MODULE, AppKey}, + application:get_env(riak_core, AppKey, undefined)), + ok = application:set_env(riak_core, AppKey, Val) + end + || {AppKey, Val} <- Core_Settings], + stop_core_processes(), + riak_core_ring_events:start_link(), + riak_core_ring_manager:start_link(test), + riak_core_vnode_sup:start_link(), + riak_core_vnode_master:start_link(riak_core_vnode), + riak_core_test_util:setup_mockring1(), + ?assertEqual(ok, + (riak_core_ring_manager:refresh_my_ring())), + stop_core_processes(), + %% Cleanup the ring file created for this test + {ok, RingFile} = find_latest_ringfile(), + file:delete(RingFile), + [ok = application:set_env(riak_core, AppKey, + get({?MODULE, AppKey})) + || {AppKey, _Val} <- Core_Settings], + ok + end}. stop_core_processes() -> riak_core_test_util:stop_pid(riak_core_ring_events), @@ -731,47 +644,52 @@ stop_core_processes() -> riak_core_test_util:stop_pid(riak_core_vnode_master). -define(TEST_RINGDIR, "_build/test_ring"). --define(TEST_RINGFILE, (?TEST_RINGDIR ++ "/ring")). --define(TMP_RINGFILE, (?TEST_RINGFILE ++ ".tmp")). + +-define(TEST_RINGFILE, (?TEST_RINGDIR) ++ "/ring"). + +-define(TMP_RINGFILE, (?TEST_RINGFILE) ++ ".tmp"). do_write_ringfile_test() -> + application:set_env(riak_core, cluster_name, "test"), %% Make sure no data exists from previous runs file:change_mode(?TMP_RINGFILE, 8#00644), file:delete(?TMP_RINGFILE), - %% Check happy path - GenR = fun(Name) -> riak_core_ring:fresh(64, Name) end, - ?assertEqual(ok, do_write_ringfile(GenR(happy), ?TEST_RINGFILE)), - + GenR = fun (Name) -> riak_core_ring:fresh(64, Name) end, + ?assertEqual(ok, + (do_write_ringfile(GenR(happy), ?TMP_RINGFILE))), %% errors expected error_logger:tty(false), - %% Check write fails (create .tmp file with no write perms) - ok = file:write_file(?TMP_RINGFILE, <<"no write for you">>), + ok = file:write_file(?TMP_RINGFILE, + <<"no write for you">>), ok = file:change_mode(?TMP_RINGFILE, 8#00444), - ?assertMatch({error,_}, do_write_ringfile(GenR(tmp_perms), ?TEST_RINGFILE)), + ?assertMatch({error, _}, + (do_write_ringfile(GenR(tmp_perms), ?TEST_RINGFILE))), ok = file:change_mode(?TMP_RINGFILE, 8#00644), ok = file:delete(?TMP_RINGFILE), - %% Check rename fails ok = file:change_mode(?TEST_RINGDIR, 8#00444), - ?assertMatch({error,_}, do_write_ringfile(GenR(ring_perms), ?TEST_RINGFILE)), + ?assertMatch({error, _}, + (do_write_ringfile(GenR(ring_perms), ?TEST_RINGFILE))), ok = file:change_mode(?TEST_RINGDIR, 8#00755), - error_logger:tty(true), - %% Cleanup the ring file created for this test - {ok, RingFile} = find_latest_ringfile(), - file:delete(RingFile). + file:delete(?TMP_RINGFILE). is_stable_ring_test() -> - {A,B,C} = Now = os:timestamp(), - TimeoutSecs = ?PROMOTE_TIMEOUT div 1000, - Within = {A, B - (TimeoutSecs div 2), C}, + {A, B, C} = Now = os:timestamp(), + TimeoutSecs = (?PROMOTE_TIMEOUT) div 1000, + Within = {A, B - TimeoutSecs div 2, C}, Outside = {A, B - (TimeoutSecs + 1), C}, - ?assertMatch({true,_},is_stable_ring(#state{ring_changed_time={0,0,0}})), - ?assertMatch({true,_},is_stable_ring(#state{ring_changed_time=Outside})), - ?assertMatch({false,_},is_stable_ring(#state{ring_changed_time=Within})), - ?assertMatch({false,_},is_stable_ring(#state{ring_changed_time=Now})). + ?assertMatch({true, _}, + (is_stable_ring(#state{ring_changed_time = + {0, 0, 0}}))), + ?assertMatch({true, _}, + (is_stable_ring(#state{ring_changed_time = Outside}))), + ?assertMatch({false, _}, + (is_stable_ring(#state{ring_changed_time = Within}))), + ?assertMatch({false, _}, + (is_stable_ring(#state{ring_changed_time = Now}))). -endif. diff --git a/src/riak_core_ring_util.erl b/src/riak_core_ring_util.erl index 5b27783e4..28307b9a1 100644 --- a/src/riak_core_ring_util.erl +++ b/src/riak_core_ring_util.erl @@ -21,30 +21,24 @@ %% ------------------------------------------------------------------- -module(riak_core_ring_util). --export([assign/2, - check_ring/0, - check_ring/1, - check_ring/2, - hash_to_partition_id/2, - partition_id_to_hash/2, - hash_is_partition_boundary/2]). +-export([assign/2, check_ring/0, check_ring/1, + check_ring/2, hash_to_partition_id/2, + partition_id_to_hash/2, hash_is_partition_boundary/2]). -ifdef(TEST). --ifdef(EQC). --export([prop_ids_are_boundaries/0, prop_reverse/0, - prop_monotonic/0, prop_only_boundaries/0]). --include_lib("eqc/include/eqc.hrl"). --endif. -include_lib("eunit/include/eunit.hrl"). + -endif. %% @doc Forcibly assign a partition to a specific node assign(Partition, ToNode) -> - F = fun(Ring, _) -> - {new_ring, riak_core_ring:transfer_node(Partition, ToNode, Ring)} + F = fun (Ring, _) -> + {new_ring, + riak_core_ring:transfer_node(Partition, ToNode, Ring)} end, - {ok, _NewRing} = riak_core_ring_manager:ring_trans(F, undefined), + {ok, _NewRing} = riak_core_ring_manager:ring_trans(F, + undefined), ok. %% @doc Check the local ring for any preflists that do not satisfy n_val @@ -53,214 +47,109 @@ check_ring() -> check_ring(R). check_ring(Ring) -> - {ok, Props} = application:get_env(riak_core, default_bucket_props), - {n_val, Nval} = lists:keyfind(n_val, 1, Props), + {ok, Nval} = application:get_env(riak_core, + target_n_val), check_ring(Ring, Nval). %% @doc Check a ring for any preflists that do not satisfy n_val check_ring(Ring, Nval) -> Preflists = riak_core_ring:all_preflists(Ring, Nval), - lists:foldl(fun(PL,Acc) -> - PLNodes = lists:usort([Node || {_,Node} <- PL]), + lists:foldl(fun (PL, Acc) -> + PLNodes = lists:usort([Node || {_, Node} <- PL]), case length(PLNodes) of - Nval -> - Acc; - _ -> - ordsets:add_element(PL, Acc) + Nval -> Acc; + _ -> ordsets:add_element(PL, Acc) end - end, [], Preflists). + end, + [], Preflists). + +-spec hash_to_partition_id(chash:index() | + chash:index_as_int(), + riak_core_ring:ring_size()) -> riak_core_ring:partition_id(). --spec hash_to_partition_id(chash:index() | chash:index_as_int(), - riak_core_ring:ring_size()) -> - riak_core_ring:partition_id(). %% @doc Map a key hash (as binary or integer) to a partition ID [0, ring_size) -hash_to_partition_id(CHashKey, RingSize) when is_binary(CHashKey) -> +hash_to_partition_id(CHashKey, RingSize) + when is_binary(CHashKey) -> <> = CHashKey, hash_to_partition_id(CHashInt, RingSize); hash_to_partition_id(CHashInt, RingSize) -> CHashInt div chash:ring_increment(RingSize). --spec partition_id_to_hash(riak_core_ring:partition_id(), pos_integer()) -> - chash:index_as_int(). +-spec + partition_id_to_hash(riak_core_ring:partition_id(), + pos_integer()) -> chash:index_as_int(). + %% @doc Identify the first key hash (integer form) in a partition ID [0, ring_size) partition_id_to_hash(Id, RingSize) -> Id * chash:ring_increment(RingSize). +-spec hash_is_partition_boundary(chash:index() | + chash:index_as_int(), + pos_integer()) -> boolean(). --spec hash_is_partition_boundary(chash:index() | chash:index_as_int(), - pos_integer()) -> - boolean(). %% @doc For user-facing tools, indicate whether a specified hash value %% is a valid "boundary" value (first hash in some partition) -hash_is_partition_boundary(CHashKey, RingSize) when is_binary(CHashKey) -> +hash_is_partition_boundary(CHashKey, RingSize) + when is_binary(CHashKey) -> <> = CHashKey, hash_is_partition_boundary(CHashInt, RingSize); hash_is_partition_boundary(CHashInt, RingSize) -> CHashInt rem chash:ring_increment(RingSize) =:= 0. - %% =================================================================== %% EUnit tests %% =================================================================== -ifdef(TEST). -%% The EQC properties below are more comprehensive tests for hashes as -%% integers; use pure unit tests to make certain that binary hashes +%% Use pure unit tests to make certain that binary hashes %% are handled. %% Partition boundaries are reversable. reverse_test() -> - IntIndex = riak_core_ring_util:partition_id_to_hash(31, 32), + IntIndex = riak_core_ring_util:partition_id_to_hash(31, + 32), HashIndex = <>, - ?assertEqual(31, riak_core_ring_util:hash_to_partition_id(HashIndex, 32)), - ?assertEqual(0, riak_core_ring_util:hash_to_partition_id(<<0:160>>, 32)). + ?assertEqual(31, + (riak_core_ring_util:hash_to_partition_id(HashIndex, + 32))), + ?assertEqual(0, + (riak_core_ring_util:hash_to_partition_id(<<0:160>>, + 32))). %% Index values somewhere in the middle of a partition can be mapped %% to partition IDs. partition_test() -> - IntIndex = riak_core_ring_util:partition_id_to_hash(20, 32) + - chash:ring_increment(32) div 3, + IntIndex = riak_core_ring_util:partition_id_to_hash(20, + 32) + + chash:ring_increment(32) div 3, HashIndex = <>, - ?assertEqual(20, riak_core_ring_util:hash_to_partition_id(HashIndex, 32)). + ?assertEqual(20, + (riak_core_ring_util:hash_to_partition_id(HashIndex, + 32))). %% Index values divisible by partition size are boundary values, others are not boundary_test() -> - BoundaryIndex = riak_core_ring_util:partition_id_to_hash(15, 32), - ?assert(riak_core_ring_util:hash_is_partition_boundary(<>, 32)), - ?assertNot(riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + 32):160>>, 32)), - ?assertNot(riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex - 32):160>>, 32)), - ?assertNot(riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + 1):160>>, 32)), - ?assertNot(riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex - 1):160>>, 32)), - ?assertNot(riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + 2):160>>, 32)), - ?assertNot(riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + 10):160>>, 32)). - --ifdef(EQC). - --define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> - io:format(user, Str, Args) end, P)). --define(TEST_TIME_SECS, 5). - --define(HASHMAX, 1 bsl 160 - 1). --define(RINGSIZEEXPMAX, 11). --define(RINGSIZE(X), (1 bsl X)). %% We'll generate powers of 2 with choose() and convert that to a ring size with this macro --define(PARTITIONSIZE(X), ((1 bsl 160) div (X))). - -ids_are_boundaries_test_() -> - {timeout, ?TEST_TIME_SECS+5, [?_assert(test_ids_are_boundaries() =:= true)]}. - -test_ids_are_boundaries() -> - test_ids_are_boundaries(?TEST_TIME_SECS). - -test_ids_are_boundaries(TestTimeSecs) -> - eqc:quickcheck(eqc:testing_time(TestTimeSecs, ?QC_OUT(prop_ids_are_boundaries()))). - -reverse_test_() -> - {timeout, ?TEST_TIME_SECS+5, [?_assert(test_reverse() =:= true)]}. - -test_reverse() -> - test_reverse(?TEST_TIME_SECS). - -test_reverse(TestTimeSecs) -> - eqc:quickcheck(eqc:testing_time(TestTimeSecs, ?QC_OUT(prop_reverse()))). - - -monotonic_test_() -> - {timeout, ?TEST_TIME_SECS+5, [?_assert(test_monotonic() =:= true)]}. - -test_monotonic() -> - test_monotonic(?TEST_TIME_SECS). - -test_monotonic(TestTimeSecs) -> - eqc:quickcheck(eqc:testing_time(TestTimeSecs, ?QC_OUT(prop_monotonic()))). - - -%% `prop_only_boundaries' should run a little longer: not quite as -%% fast, need to scan a larger portion of hash space to establish -%% correctness -only_boundaries_test_() -> - {timeout, ?TEST_TIME_SECS+15, [?_assert(test_only_boundaries() =:= true)]}. - -test_only_boundaries() -> - test_only_boundaries(?TEST_TIME_SECS+10). - -test_only_boundaries(TestTimeSecs) -> - eqc:quickcheck(eqc:testing_time(TestTimeSecs, ?QC_OUT(prop_only_boundaries()))). - -%% Partition IDs should map to hash values which are partition boundaries -prop_ids_are_boundaries() -> - ?FORALL(RingPower, choose(2, ?RINGSIZEEXPMAX), - ?FORALL(PartitionId, choose(0, ?RINGSIZE(RingPower) - 1), - begin - RingSize = ?RINGSIZE(RingPower), - BoundaryHash = - riak_core_ring_util:partition_id_to_hash(PartitionId, - RingSize), - equals(true, - riak_core_ring_util:hash_is_partition_boundary(BoundaryHash, - RingSize)) - end - )). - -%% Partition IDs should map to hash values which map back to the same partition IDs -prop_reverse() -> - ?FORALL(RingPower, choose(2, ?RINGSIZEEXPMAX), - ?FORALL(PartitionId, choose(0, ?RINGSIZE(RingPower) - 1), - begin - RingSize = ?RINGSIZE(RingPower), - BoundaryHash = - riak_core_ring_util:partition_id_to_hash(PartitionId, - RingSize), - equals(PartitionId, - riak_core_ring_util:hash_to_partition_id( - BoundaryHash, RingSize)) - end - )). - -%% For any given hash value, any larger hash value maps to a partition -%% ID of greater or equal value. -prop_monotonic() -> - ?FORALL(RingPower, choose(2, ?RINGSIZEEXPMAX), - ?FORALL(HashValue, choose(0, ?HASHMAX - 1), - ?FORALL(GreaterHash, choose(HashValue + 1, ?HASHMAX), - begin - RingSize = ?RINGSIZE(RingPower), - LowerPartition = - riak_core_ring_util:hash_to_partition_id(HashValue, - RingSize), - GreaterPartition = - riak_core_ring_util:hash_to_partition_id(GreaterHash, - RingSize), - LowerPartition =< GreaterPartition - end - ))). - -%% Hash values which are listed in the ring structure are boundary -%% values -ring_to_set({_RingSize, PropList}) -> - ordsets:from_list(lists:map(fun({Hash, dummy}) -> Hash end, PropList)). - -find_near_boundaries(RingSize, PartitionSize) -> - ?LET({Id, Offset}, {choose(1, RingSize-1), choose(-(RingSize*2), (RingSize*2))}, - Id * PartitionSize + Offset). - -prop_only_boundaries() -> - ?FORALL(RingPower, choose(2, ?RINGSIZEEXPMAX), - ?FORALL({HashValue, BoundarySet}, - {frequency([ - {5, choose(0, ?HASHMAX)}, - {2, find_near_boundaries(?RINGSIZE(RingPower), - ?PARTITIONSIZE(?RINGSIZE(RingPower)))}]), - ring_to_set(chash:fresh(?RINGSIZE(RingPower), dummy))}, - begin - RingSize = ?RINGSIZE(RingPower), - HashIsInRing = ordsets:is_element(HashValue, BoundarySet), - HashIsPartitionBoundary = - riak_core_ring_util:hash_is_partition_boundary(HashValue, - RingSize), - equals(HashIsPartitionBoundary, HashIsInRing) - end - )). + BoundaryIndex = + riak_core_ring_util:partition_id_to_hash(15, 32), + ?assert((riak_core_ring_util:hash_is_partition_boundary(<>, + 32))), + ?assertNot((riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + + 32):160>>, + 32))), + ?assertNot((riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + - 32):160>>, + 32))), + ?assertNot((riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + + 1):160>>, + 32))), + ?assertNot((riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + - 1):160>>, + 32))), + ?assertNot((riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + + 2):160>>, + 32))), + ?assertNot((riak_core_ring_util:hash_is_partition_boundary(<<(BoundaryIndex + + 10):160>>, + 32))). --endif. % EQC -endif. % TEST diff --git a/src/riak_core_send_msg.erl b/src/riak_core_send_msg.erl index 80dda126c..41138893a 100644 --- a/src/riak_core_send_msg.erl +++ b/src/riak_core_send_msg.erl @@ -22,19 +22,24 @@ -module(riak_core_send_msg). --export([reply_unreliable/2, - cast_unreliable/2, - send_event_unreliable/2, - bang_unreliable/2]). +-export([reply_unreliable/2, cast_unreliable/2, + send_event_unreliable/2, bang_unreliable/2]). -ifdef(TEST). + -ifdef(PULSE). + -compile(export_all). + -compile({parse_transform, pulse_instrument}). --compile({pulse_replace_module, [{gen_fsm, pulse_gen_fsm}, - {gen_fsm_compat, pulse_gen_fsm}, - {gen_server, pulse_gen_server}]}). + +-compile({pulse_replace_module, + [{gen_fsm, pulse_gen_fsm}, + {gen_fsm_compat, pulse_gen_fsm}, + {gen_server, pulse_gen_server}]}). + -endif. + -endif. %% NOTE: We'ed peeked inside gen_server.erl's guts to see its internals. @@ -45,13 +50,14 @@ cast_unreliable(Dest, Request) -> bang_unreliable(Dest, {'$gen_cast', Request}). %% NOTE: We'ed peeked inside gen_fsm.erl's guts to see its internals. -send_event_unreliable({global, _Name} = GlobalTo, Event) -> +send_event_unreliable({global, _Name} = GlobalTo, + Event) -> erlang:error({unimplemented_send, GlobalTo, Event}); -send_event_unreliable({via, _Mod, _Name} = ViaTo, Event) -> +send_event_unreliable({via, _Module, _Name} = ViaTo, + Event) -> erlang:error({unimplemented_send, ViaTo, Event}); send_event_unreliable(Name, Event) -> - bang_unreliable(Name, {'$gen_event', Event}), - ok. + bang_unreliable(Name, {'$gen_event', Event}), ok. bang_unreliable(Dest, Msg) -> catch erlang:send(Dest, Msg, [noconnect, nosuspend]), diff --git a/src/riak_core_status.erl b/src/riak_core_status.erl index fce67152e..bf8d8e3a2 100644 --- a/src/riak_core_status.erl +++ b/src/riak_core_status.erl @@ -20,62 +20,51 @@ %% %% ------------------------------------------------------------------- -module(riak_core_status). --export([ringready/0, - all_active_transfers/0, - transfers/0, - partitions/2, - ring_status/0]). --spec(ringready() -> {ok, [atom()]} | {error, any()}). +-export([ringready/0, all_active_transfers/0, + transfers/0, partitions/2, ring_status/0]). + +-spec ringready() -> {ok, [atom()]} | {error, any()}. + ringready() -> case get_rings() of - {[], Rings} -> - {N1,R1}=hd(Rings), - case rings_match(hash_ring(R1), tl(Rings)) of - true -> - Nodes = [N || {N,_} <- Rings], - {ok, Nodes}; - - {false, N2} -> - {error, {different_owners, N1, N2}} - end; - - {Down, _Rings} -> - {error, {nodes_down, Down}} + {[], Rings} -> + {N1, R1} = hd(Rings), + case rings_match(hash_ring(R1), tl(Rings)) of + true -> Nodes = [N || {N, _} <- Rings], {ok, Nodes}; + {false, N2} -> {error, {different_owners, N1, N2}} + end; + {Down, _Rings} -> {error, {nodes_down, Down}} end. +-spec transfers() -> {[atom()], + [{waiting_to_handoff, atom(), integer()} | + {stopped, atom(), integer()}]}. --spec(transfers() -> {[atom()], [{waiting_to_handoff, atom(), integer()} | - {stopped, atom(), integer()}]}). transfers() -> {Down, Rings} = get_rings(), - %% Work out which vnodes are running and which partitions they claim - F = fun({N,R}, Acc) -> + F = fun ({N, R}, Acc) -> {_Pri, Sec, Stopped} = partitions(N, R), Acc1 = case Sec of - [] -> - []; - _ -> - [{waiting_to_handoff, N, length(Sec)}] + [] -> []; + _ -> [{waiting_to_handoff, N, length(Sec)}] end, case Stopped of - [] -> - Acc1 ++ Acc; - _ -> - Acc1 ++ [{stopped, N, length(Stopped)} | Acc] + [] -> Acc1 ++ Acc; + _ -> Acc1 ++ [{stopped, N, length(Stopped)} | Acc] end end, {Down, lists:foldl(F, [], Rings)}. %% @doc Produce status for all active transfers in the cluster. --spec all_active_transfers() -> {Xfers::list(), Down::list()}. +-spec all_active_transfers() -> {Xfers :: list(), + Down :: list()}. + all_active_transfers() -> {Xfers, Down} = riak_core_util:rpc_every_member(riak_core_handoff_manager, - status, - [{direction, outbound}], - 5000), + status, [{direction, outbound}], 5000), {Xfers, Down}. ring_status() -> @@ -83,49 +72,53 @@ ring_status() -> %% are running on each node. {ok, Ring} = riak_core_ring_manager:get_raw_ring(), {AllMods, Down} = - riak_core_util:rpc_every_member_ann(riak_core, vnode_modules, [], 1000), - + riak_core_util:rpc_every_member_ann(riak_core, + vnode_modules, [], 1000), %% Check if the claimant is running and if it believes the ring is ready Claimant = riak_core_ring:claimant(Ring), - case riak_core_util:safe_rpc(Claimant, riak_core_ring, ring_ready, [], 5000) of - {badrpc, _} -> - Down2 = lists:usort([Claimant|Down]), - RingReady = undefined; - RingReady -> - Down2 = Down, - RingReady = RingReady + case riak_core_util:safe_rpc(Claimant, riak_core_ring, + ring_ready, [], 5000) + of + {badrpc, _} -> + Down2 = lists:usort([Claimant | Down]), + RingReady = undefined; + RingReady -> Down2 = Down, RingReady = RingReady end, - %% Get the list of pending ownership changes Changes = riak_core_ring:pending_changes(Ring), %% Group pending changes by (Owner, NextOwner) - Merged = lists:foldl( - fun({Idx, Owner, NextOwner, Mods, Status}, Acc) -> - orddict:append({Owner, NextOwner}, - {Idx, Mods, Status}, - Acc) - end, [], Changes), - + Merged = lists:foldl(fun ({Idx, Owner, NextOwner, Mods, + Status}, + Acc) -> + orddict:append({Owner, NextOwner}, + {Idx, Mods, Status}, Acc) + end, + [], Changes), %% For each pending transfer, determine which vnode modules have completed %% handoff and which we are still waiting on. %% Final result is of the form: %% [{Owner, NextOwner}, [{Index, WaitingMods, CompletedMods, Status}]] - TransferStatus = - orddict:map( - fun({Owner, _}, Transfers) -> - case orddict:find(Owner, AllMods) of - error -> - [{Idx, down, Mods, Status} - || {Idx, Mods, Status} <- Transfers]; - {ok, OwnerMods} -> - NodeMods = [Mod || {_App, Mod} <- OwnerMods], - [{Idx, NodeMods -- Mods, Mods, Status} - || {Idx, Mods, Status} <- Transfers] - end - end, Merged), - + TransferStatus = orddict:map(fun ({Owner, _}, + Transfers) -> + case orddict:find(Owner, AllMods) of + error -> + [{Idx, down, Mods, Status} + || {Idx, Mods, Status} + <- Transfers]; + {ok, OwnerMods} -> + NodeMods = [Mod + || {_App, Mod} + <- OwnerMods], + [{Idx, NodeMods -- Mods, Mods, + Status} + || {Idx, Mods, Status} + <- Transfers] + end + end, + Merged), MarkedDown = riak_core_ring:down_members(Ring), - {Claimant, RingReady, Down2, MarkedDown, TransferStatus}. + {Claimant, RingReady, Down2, MarkedDown, + TransferStatus}. %% =================================================================== %% Internal functions @@ -133,10 +126,12 @@ ring_status() -> %% Retrieve the rings for all other nodes by RPC get_rings() -> - {RawRings, Down} = riak_core_util:rpc_every_member( - riak_core_ring_manager, get_my_ring, [], 30000), -%% RawRings2 = [R || {ok, R} <- RawRings], - Rings = orddict:from_list([{riak_core_ring:owner_node(R), R} || R <- RawRings]), + {RawRings, Down} = + riak_core_util:rpc_every_member(riak_core_ring_manager, + get_my_ring, [], 30000), + Rings = + orddict:from_list([{riak_core_ring:owner_node(R), R} + || {ok, R} <- RawRings]), {lists:sort(Down), Rings}. %% Produce a hash of the 'chash' portion of the ring @@ -144,32 +139,35 @@ hash_ring(R) -> erlang:phash2(riak_core_ring:all_owners(R)). %% Check if all rings match given a hash and a list of [{N,P}] to check -rings_match(_, []) -> - true; +rings_match(_, []) -> true; rings_match(R1hash, [{N2, R2} | Rest]) -> case hash_ring(R2) of - R1hash -> - rings_match(R1hash, Rest); - _ -> - {false, N2} + R1hash -> rings_match(R1hash, Rest); + _ -> {false, N2} end. %% Get a list of active partition numbers - regardless of vnode type --spec active_partitions(node()) -> ordsets:ordset(non_neg_integer()). +-spec + active_partitions(node()) -> ordsets:ordset(non_neg_integer()). + active_partitions(Node) -> - case riak_core_util:safe_rpc(Node, riak_core_vnode_manager, all_vnodes, [], 30000) of - {badrpc, _} -> ordsets:new(); - VNodes -> - lists:foldl(fun({_, P, _}, Ps) -> - ordsets:add_element(P, Ps) - end, ordsets:new(), VNodes) + case riak_core_util:safe_rpc(Node, + riak_core_vnode_manager, all_vnodes, [], 30000) + of + {badrpc, _} -> ordsets:new(); + VNodes -> + lists:foldl(fun ({_, P, _}, Ps) -> + ordsets:add_element(P, Ps) + end, + ordsets:new(), VNodes) end. %% Return a list of active primary partitions, active secondary partitions (to be handed off) %% and stopped partitions that should be started partitions(Node, Ring) -> Owners = riak_core_ring:all_owners(Ring), - Owned = ordsets:from_list(owned_partitions(Owners, Node)), + Owned = ordsets:from_list(owned_partitions(Owners, + Node)), Active = active_partitions(Node), Stopped = ordsets:subtract(Owned, Active), Secondary = ordsets:subtract(Active, Owned), @@ -179,3 +177,29 @@ partitions(Node, Ring) -> %% Return the list of partitions owned by a node owned_partitions(Owners, Node) -> [P || {P, Owner} <- Owners, Owner =:= Node]. + +%% =================================================================== +%% Unit tests +%% =================================================================== +-ifdef(TEST). + +-include_lib("eunit/include/eunit.hrl"). + +-define(TEST_RINGDIR, "_build/test_ring"). + +-define(TEST_RINGFILE, (?TEST_RINGDIR) ++ "/ring"). + +-define(TMP_RINGFILE, (?TEST_RINGFILE) ++ ".tmp"). + +set_my_ring_test() -> + riak_core_ring_manager:setup_ets(test), + application:set_env(riak_core, ring_creation_size, 4), + Ring = riak_core_ring:fresh(), + riak_core_ring_manager:set_ring_global(Ring), + {ok, MyRing} = riak_core_ring_manager:get_my_ring(), + ?assert((riak_core_ring:nearly_equal(Ring, MyRing))), + %% this call should not crash + get_rings(), + riak_core_ring_manager:cleanup_ets(test). + +-endif. diff --git a/src/riak_core_sup.erl b/src/riak_core_sup.erl index 5ce5d25ed..5b875eb0f 100644 --- a/src/riak_core_sup.erl +++ b/src/riak_core_sup.erl @@ -31,8 +31,13 @@ -export([init/1]). %% Helper macro for declaring children of supervisor --define(CHILD(I, Type, Timeout, Args), {I, {I, start_link, Args}, permanent, Timeout, Type, [I]}). --define(CHILD(I, Type, Timeout), ?CHILD(I, Type, Timeout, [])). +-define(CHILD(I, Type, Timeout, Args), + {I, {I, start_link, Args}, permanent, Timeout, Type, + [I]}). + +-define(CHILD(I, Type, Timeout), + ?CHILD(I, Type, Timeout, [])). + -define(CHILD(I, Type), ?CHILD(I, Type, 5000)). %% =================================================================== @@ -47,20 +52,16 @@ start_link() -> %% =================================================================== init([]) -> - - Children = lists:flatten( - [ - ?CHILD(riak_core_vnode_sup, supervisor, 305000), - ?CHILD(riak_core_eventhandler_sup, supervisor), - ?CHILD(riak_core_handoff_sup, supervisor), - ?CHILD(riak_core_ring_events, worker), - ?CHILD(riak_core_ring_manager, worker), - ?CHILD(riak_core_vnode_proxy_sup, supervisor), - ?CHILD(riak_core_node_watcher_events, worker), - ?CHILD(riak_core_node_watcher, worker), - ?CHILD(riak_core_vnode_manager, worker), - ?CHILD(riak_core_gossip, worker), - ?CHILD(riak_core_claimant, worker) - ]), - + Children = lists:flatten([?CHILD(riak_core_vnode_sup, + supervisor, 305000), + ?CHILD(riak_core_eventhandler_sup, supervisor), + ?CHILD(riak_core_handoff_sup, supervisor), + ?CHILD(riak_core_ring_events, worker), + ?CHILD(riak_core_ring_manager, worker), + ?CHILD(riak_core_vnode_proxy_sup, supervisor), + ?CHILD(riak_core_node_watcher_events, worker), + ?CHILD(riak_core_node_watcher, worker), + ?CHILD(riak_core_vnode_manager, worker), + ?CHILD(riak_core_gossip, worker), + ?CHILD(riak_core_claimant, worker)]), {ok, {{one_for_one, 10, 10}, Children}}. diff --git a/src/riak_core_test_util.erl b/src/riak_core_test_util.erl index 8646f51ee..fad058bf9 100644 --- a/src/riak_core_test_util.erl +++ b/src/riak_core_test_util.erl @@ -25,25 +25,19 @@ -module(riak_core_test_util). -ifdef(TEST). --export([setup_mockring1/0, - fake_ring/2, - stop_pid/1, - wait_for_pid/1, - stop_pid/2, - unlink_named_process/1]). + +-export([setup_mockring1/0, fake_ring/2, stop_pid/1, + wait_for_pid/1, stop_pid/2, unlink_named_process/1]). + -include_lib("eunit/include/eunit.hrl"). -stop_pid(undefined) -> - ok; +stop_pid(undefined) -> ok; stop_pid(Name) when is_atom(Name) -> stop_pid(whereis(Name)); -stop_pid(Other) when not is_pid(Other) -> - ok; -stop_pid(Pid) -> - stop_pid(Pid, kill). +stop_pid(Other) when not is_pid(Other) -> ok; +stop_pid(Pid) -> stop_pid(Pid, kill). -stop_pid(Other, _ExitType) when not is_pid(Other) -> - ok; +stop_pid(Other, _ExitType) when not is_pid(Other) -> ok; stop_pid(Pid, ExitType) -> unlink(Pid), exit(Pid, ExitType), @@ -52,53 +46,59 @@ stop_pid(Pid, ExitType) -> wait_for_pid(Pid) -> Mref = erlang:monitor(process, Pid), receive - {'DOWN', Mref, process, _, _} -> - ok - after - 5000 -> - {error, didnotexit} + {'DOWN', Mref, process, _, _} -> ok + after 5000 -> {error, didnotexit} end. - unlink_named_process(Name) when is_atom(Name) -> unlink(whereis(Name)). setup_mockring1() -> % requires a running riak_core_ring_manager, in test-mode is ok - Ring0 = riak_core_ring:fresh(16,node()), - Ring1 = riak_core_ring:add_member(node(), Ring0, 'othernode@otherhost'), - Ring2 = riak_core_ring:add_member(node(), Ring1, 'othernode2@otherhost2'), - - Ring3 = lists:foldl(fun(_,R) -> - riak_core_ring:transfer_node( - hd(riak_core_ring:my_indices(R)), - 'othernode@otherhost', R) end, - Ring2,[1,2,3,4,5,6]), - Ring = lists:foldl(fun(_,R) -> - riak_core_ring:transfer_node( - hd(riak_core_ring:my_indices(R)), - 'othernode2@otherhost2', R) end, - Ring3,[1,2,3,4,5,6]), + Ring0 = riak_core_ring:fresh(16, node()), + Ring1 = riak_core_ring:add_member(node(), Ring0, + othernode@otherhost), + Ring2 = riak_core_ring:add_member(node(), Ring1, + othernode2@otherhost2), + Ring3 = lists:foldl(fun (_, R) -> + riak_core_ring:transfer_node(hd(riak_core_ring:my_indices(R)), + othernode@otherhost, + R) + end, + Ring2, [1, 2, 3, 4, 5, 6]), + Ring = lists:foldl(fun (_, R) -> + riak_core_ring:transfer_node(hd(riak_core_ring:my_indices(R)), + othernode2@otherhost2, + R) + end, + Ring3, [1, 2, 3, 4, 5, 6]), riak_core_ring_manager:set_ring_global(Ring). fake_ring(Size, NumNodes) -> - ManyNodes = [list_to_atom("dev" ++ integer_to_list(X) ++ "@127.0.0.1") + ManyNodes = [list_to_atom("dev" ++ + integer_to_list(X) ++ "@127.0.0.1") || _ <- lists:seq(0, Size div NumNodes), X <- lists:seq(1, NumNodes)], Nodes = lists:sublist(ManyNodes, Size), Inc = chash:ring_increment(Size), - Indices = lists:seq(0, (Size-1)*Inc, Inc), + Indices = lists:seq(0, (Size - 1) * Inc, Inc), Owners = lists:zip(Indices, Nodes), - [Node|OtherNodes] = Nodes, + [Node | OtherNodes] = Nodes, Ring = riak_core_ring:fresh(Size, Node), - Ring2 = lists:foldl(fun(OtherNode, RingAcc) -> - RingAcc2 = riak_core_ring:add_member(Node, RingAcc, OtherNode), - riak_core_ring:set_member(Node, RingAcc2, OtherNode, - valid, same_vclock) - end, Ring, OtherNodes), - Ring3 = lists:foldl(fun({Idx, Owner}, RingAcc) -> - riak_core_ring:transfer_node(Idx, Owner, RingAcc) - end, Ring2, Owners), + Ring2 = lists:foldl(fun (OtherNode, RingAcc) -> + RingAcc2 = riak_core_ring:add_member(Node, + RingAcc, + OtherNode), + riak_core_ring:set_member(Node, RingAcc2, + OtherNode, valid, + same_vclock) + end, + Ring, OtherNodes), + Ring3 = lists:foldl(fun ({Idx, Owner}, RingAcc) -> + riak_core_ring:transfer_node(Idx, Owner, + RingAcc) + end, + Ring2, Owners), Ring3. -endif. %TEST. diff --git a/src/riak_core_util.erl b/src/riak_core_util.erl index 8ffed9312..a36dcd622 100644 --- a/src/riak_core_util.erl +++ b/src/riak_core_util.erl @@ -21,83 +21,51 @@ %% @doc Various functions that are useful throughout Riak. -module(riak_core_util). --export([moment/0, - make_tmp_dir/0, - replace_file/2, - compare_dates/2, - reload_all/1, - integer_to_list/2, - unique_id_62/0, - str_to_node/1, - chash_key/1, chash_key/2, - chash_std_keyfun/1, - chash_bucketonly_keyfun/1, - mkclientid/1, - start_app_deps/1, - build_tree/3, - orddict_delta/2, - safe_rpc/4, - safe_rpc/5, - rpc_every_member/4, - rpc_every_member_ann/4, - count/2, - keydelete/2, - multi_keydelete/2, - multi_keydelete/3, - compose/1, - compose/2, - pmap/2, - pmap/3, - multi_rpc/4, - multi_rpc/5, - multi_rpc_ann/4, - multi_rpc_ann/5, - multicall_ann/4, - multicall_ann/5, - shuffle/1, - is_arch/1, - format_ip_and_port/2, - peername/2, - sockname/2, - sha/1, - md5/1, - make_fold_req/1, - make_fold_req/2, - make_fold_req/4, - make_newest_fold_req/1, - proxy_spawn/1, - proxy/2, - enable_job_class/1, - enable_job_class/2, - disable_job_class/1, - disable_job_class/2, - job_class_enabled/1, - job_class_enabled/2, +-export([moment/0, make_tmp_dir/0, replace_file/2, + compare_dates/2, reload_all/1, integer_to_list/2, + unique_id_62/0, str_to_node/1, chash_key/1, chash_key/2, + chash_std_keyfun/1, chash_bucketonly_keyfun/1, + mkclientid/1, start_app_deps/1, build_tree/3, + orddict_delta/2, safe_rpc/4, safe_rpc/5, + rpc_every_member/4, rpc_every_member_ann/4, count/2, + keydelete/2, multi_keydelete/2, multi_keydelete/3, + compose/1, compose/2, pmap/2, pmap/3, multi_rpc/4, + multi_rpc/5, multi_rpc_ann/4, multi_rpc_ann/5, + multicall_ann/4, multicall_ann/5, shuffle/1, is_arch/1, + format_ip_and_port/2, peername/2, sockname/2, sha/1, + md5/1, make_fold_req/1, make_fold_req/2, + make_fold_req/4, make_newest_fold_req/1, proxy_spawn/1, + proxy/2, enable_job_class/1, enable_job_class/2, + disable_job_class/1, disable_job_class/2, + job_class_enabled/1, job_class_enabled/2, job_class_disabled_message/2, - report_job_request_disposition/6, - responsible_preflists/1, - responsible_preflists/2, - get_index_n/1, - preflist_siblings/1, - posix_error/1 - ]). + report_job_request_disposition/6, get_index_n/1, + posix_error/1]). -include("riak_core_vnode.hrl"). -ifdef(TEST). --ifdef(EQC). --include_lib("eqc/include/eqc.hrl"). --endif. %% EQC + +-ifdef(PROPER). + +-include_lib("proper/include/proper.hrl"). + +%-compile(export_all). +-endif. + -include_lib("eunit/include/eunit.hrl"). --export([counter_loop/1,incr_counter/1,decr_counter/1]). --endif. %% TEST --type riak_core_ring() :: riak_core_ring:riak_core_ring(). +-export([counter_loop/1, incr_counter/1, + decr_counter/1]). + +-endif. + -type index() :: non_neg_integer(). + -type index_n() :: {index(), pos_integer()}. %% R14 Compatibility --compile({no_auto_import,[integer_to_list/2]}). +-compile({no_auto_import, [{integer_to_list, 2}]}). %% =================================================================== %% Public API @@ -108,10 +76,11 @@ -define(SEC_TO_EPOCH, 62167219200). posix_error(Error) -> - case erl_posix_msg:message(Error) of - "unknown POSIX error" -> lists:flatten(io_lib:format("~p", [Error])); - Message -> Message - end. + case erl_posix_msg:message(Error) of + "unknown POSIX error" -> + lists:flatten(io_lib:format("~p", [Error])); + Message -> Message + end. %% @spec moment() -> integer() %% @doc Get the current "moment". Current implementation is the @@ -120,12 +89,12 @@ posix_error(Error) -> moment() -> {Mega, Sec, _Micro} = os:timestamp(), - (Mega * 1000000) + Sec + ?SEC_TO_EPOCH. + Mega * 1000000 + Sec + (?SEC_TO_EPOCH). %% @spec compare_dates(string(), string()) -> boolean() %% @doc Compare two RFC1123 date strings or two now() tuples (or one %% of each). Return true if date A is later than date B. -compare_dates(A={_,_,_}, B={_,_,_}) -> +compare_dates(A = {_, _, _}, B = {_, _, _}) -> %% assume 3-tuples are now() times A > B; compare_dates(A, B) when is_list(A) -> @@ -135,9 +104,9 @@ compare_dates(A, B) when is_list(B) -> compare_dates(A, rfc1123_to_now(B)). rfc1123_to_now(String) when is_list(String) -> - GSec = calendar:datetime_to_gregorian_seconds( - httpd_util:convert_request_date(String)), - ESec = GSec-?SEC_TO_EPOCH, + GSec = + calendar:datetime_to_gregorian_seconds(httpd_util:convert_request_date(String)), + ESec = GSec - (?SEC_TO_EPOCH), Sec = ESec rem 1000000, MSec = ESec div 1000000, {MSec, Sec, 0}. @@ -147,37 +116,35 @@ rfc1123_to_now(String) when is_list(String) -> %% to the new directory. make_tmp_dir() -> TmpId = io_lib:format("riptemp.~p", - [erlang:phash2({riak_core_rand:uniform(),self()})]), + [erlang:phash2({rand:uniform(), self()})]), TempDir = filename:join("/tmp", TmpId), case filelib:is_dir(TempDir) of - true -> make_tmp_dir(); - false -> - ok = file:make_dir(TempDir), - TempDir + true -> make_tmp_dir(); + false -> ok = file:make_dir(TempDir), TempDir end. %% @doc Atomically/safely (to some reasonable level of durablity) %% replace file `FN' with `Data'. NOTE: since 2.0.3 semantic changed %% slightly: If `FN' cannot be opened, will not error with a %% `badmatch', as before, but will instead return `{error, Reason}' --spec replace_file(string(), iodata()) -> ok | {error, term()}. +-spec replace_file(string(), iodata()) -> ok | + {error, term()}. + replace_file(FN, Data) -> TmpFN = FN ++ ".tmp", case file:open(TmpFN, [write, raw]) of - {ok, FH} -> - try - ok = file:write(FH, Data), - ok = file:sync(FH), - ok = file:close(FH), - ok = file:rename(TmpFN, FN), - {ok, Contents} = read_file(FN), - true = (Contents == iolist_to_binary(Data)), - ok - catch _:Err -> - {error, Err} - end; - Err -> - Err + {ok, FH} -> + try ok = file:write(FH, Data), + ok = file:sync(FH), + ok = file:close(FH), + ok = file:rename(TmpFN, FN), + {ok, Contents} = read_file(FN), + true = Contents == iolist_to_binary(Data), + ok + catch + _:Err -> {error, Err} + end; + Err -> Err end. %% @doc Similar to {@link file:read_file/1} but uses raw file `I/O' @@ -189,24 +156,20 @@ read_file(FName) -> read_file(FD, Acc) -> case file:read(FD, 4096) of - {ok, Data} -> - read_file(FD, [Data|Acc]); - eof -> - lists:reverse(Acc) + {ok, Data} -> read_file(FD, [Data | Acc]); + eof -> lists:reverse(Acc) end. %% @spec integer_to_list(Integer :: integer(), Base :: integer()) -> %% string() %% @doc Convert an integer to its string representation in the given %% base. Bases 2-62 are supported. -integer_to_list(I, 10) -> - erlang:integer_to_list(I); +integer_to_list(I, 10) -> erlang:integer_to_list(I); integer_to_list(I, Base) - when is_integer(I), is_integer(Base),Base >= 2, Base =< 1+$Z-$A+10+1+$z-$a -> - if I < 0 -> - [$-|integer_to_list(-I, Base, [])]; - true -> - integer_to_list(I, Base, []) + when is_integer(I), is_integer(Base), Base >= 2, + Base =< 1 + $Z - $A + 10 + 1 + $z - $a -> + if I < 0 -> [$- | integer_to_list(-I, Base, [])]; + true -> integer_to_list(I, Base, []) end; integer_to_list(I, Base) -> erlang:error(badarg, [I, Base]). @@ -215,102 +178,96 @@ integer_to_list(I, Base) -> integer_to_list(I0, Base, R0) -> D = I0 rem Base, I1 = I0 div Base, - R1 = if D >= 36 -> - [D-36+$a|R0]; - D >= 10 -> - [D-10+$A|R0]; - true -> - [D+$0|R0] - end, - if I1 =:= 0 -> - R1; - true -> - integer_to_list(I1, Base, R1) + R1 = if D >= 36 -> [D - 36 + $a | R0]; + D >= 10 -> [D - 10 + $A | R0]; + true -> [D + $0 | R0] + end, + if I1 =:= 0 -> R1; + true -> integer_to_list(I1, Base, R1) end. -sha(Bin) -> - crypto:hash(sha, Bin). +sha(Bin) -> crypto:hash(sha, Bin). -md5(Bin) -> - crypto:hash(md5, Bin). +md5(Bin) -> crypto:hash(md5, Bin). -%% @spec unique_id_62() -> string() %% @doc Create a random identifying integer, returning its string %% representation in base 62. +-spec unique_id_62() -> string(). + unique_id_62() -> - Rand = sha(term_to_binary({make_ref(), os:timestamp()})), + Rand = sha(term_to_binary({make_ref(), + os:timestamp()})), <> = Rand, integer_to_list(I, 62). -%% @spec reload_all(Module :: atom()) -> -%% [{purge_response(), load_file_response()}] -%% @type purge_response() = boolean() -%% @type load_file_response() = {module, Module :: atom()}| -%% 2 {error, term()} +%% purge_response() = boolean() +%% load_file_response() = {module, Module :: atom()}| +%% 2 {error, term()} %% @doc Ask each member node of the riak ring to reload the given %% Module. Return is a list of the results of code:purge/1 %% and code:load_file/1 on each node. +-spec reload_all(Module :: atom()) -> [{boolean(), + {module, Module :: atom()} | + {error, term()}}]. + reload_all(Module) -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), [{safe_rpc(Node, code, purge, [Module]), - safe_rpc(Node, code, load_file, [Module])} || - Node <- riak_core_ring:all_members(Ring)]. + safe_rpc(Node, code, load_file, [Module])} + || Node <- riak_core_ring:all_members(Ring)]. %% @spec mkclientid(RemoteNode :: term()) -> ClientID :: list() %% @doc Create a unique-enough id for vclock clients. mkclientid(RemoteNode) -> - {{Y,Mo,D},{H,Mi,S}} = erlang:universaltime(), - {_,_,NowPart} = os:timestamp(), - Id = erlang:phash2([Y,Mo,D,H,Mi,S,node(),RemoteNode,NowPart,self()]), + {{Y, Mo, D}, {H, Mi, S}} = erlang:universaltime(), + {_, _, NowPart} = os:timestamp(), + Id = erlang:phash2([Y, Mo, D, H, Mi, S, node(), + RemoteNode, NowPart, self()]), <>. %% @spec chash_key(BKey :: riak_object:bkey()) -> chash:index() %% @doc Create a binary used for determining replica placement. -chash_key({Bucket,_Key}=BKey) -> - BucketProps = riak_core_bucket:get_bucket(Bucket), - chash_key(BKey, BucketProps). +chash_key(BKey) -> + %% TODO remove + %% BucketProps = riak_core_bucket:get_bucket(Bucket), + chash_key(BKey, undefined). %% @spec chash_key(BKey :: riak_object:bkey(), [{atom(), any()}]) -> %% chash:index() %% @doc Create a binary used for determining replica placement. -chash_key({Bucket,Key}, _BucketProps) -> - %{_, {M, F}} = lists:keyfind(chash_keyfun, 1, BucketProps), - %M:F({Bucket,Key}). - % FIX static keyfun - chash_std_keyfun({Bucket, Key}). +chash_key({Bucket, Key}, _BucketProps) -> + % static keyfun + chash_std_keyfun({Bucket, Key}). %% @spec chash_std_keyfun(BKey :: riak_object:bkey()) -> chash:index() %% @doc Default object/ring hashing fun, direct passthrough of bkey. -chash_std_keyfun({Bucket, Key}) -> chash:key_of({Bucket, Key}). +chash_std_keyfun({Bucket, Key}) -> + chash:key_of({Bucket, Key}). %% @spec chash_bucketonly_keyfun(BKey :: riak_object:bkey()) -> chash:index() %% @doc Object/ring hashing fun that ignores Key, only uses Bucket. -chash_bucketonly_keyfun({Bucket, _Key}) -> chash:key_of(Bucket). +chash_bucketonly_keyfun({Bucket, _Key}) -> + chash:key_of(Bucket). str_to_node(Node) when is_atom(Node) -> str_to_node(atom_to_list(Node)); str_to_node(NodeStr) -> case string:tokens(NodeStr, "@") of - [NodeName] -> - %% Node name only; no host name. If the local node has a hostname, - %% append it - case node_hostname() of - [] -> - list_to_atom(NodeName); - Hostname -> - list_to_atom(NodeName ++ "@" ++ Hostname) - end; - _ -> - list_to_atom(NodeStr) + [NodeName] -> + %% Node name only; no host name. If the local node has a hostname, + %% append it + case node_hostname() of + [] -> list_to_atom(NodeName); + Hostname -> list_to_atom(NodeName ++ "@" ++ Hostname) + end; + _ -> list_to_atom(NodeStr) end. node_hostname() -> NodeStr = atom_to_list(node()), case string:tokens(NodeStr, "@") of - [_NodeName, Hostname] -> - Hostname; - _ -> - [] + [_NodeName, Hostname] -> Hostname; + _ -> [] end. %% @spec start_app_deps(App :: atom()) -> ok @@ -320,25 +277,24 @@ start_app_deps(App) -> _ = [ensure_started(A) || A <- DepApps], ok. - %% @spec ensure_started(Application :: atom()) -> ok %% @doc Start the named application if not already started. ensure_started(App) -> case application:start(App) of - ok -> - ok; - {error, {already_started, App}} -> - ok + ok -> ok; + {error, {already_started, App}} -> ok end. %% @doc Applies `Pred' to each element in `List', and returns a count of how many %% applications returned `true'. --spec count(fun((term()) -> boolean()), [term()]) -> non_neg_integer(). +-spec count(fun((term()) -> boolean()), + [term()]) -> non_neg_integer(). + count(Pred, List) -> - FoldFun = fun(E, A) -> + FoldFun = fun (E, A) -> case Pred(E) of - false -> A; - true -> A + 1 + false -> A; + true -> A + 1 end end, lists:foldl(FoldFun, 0, List). @@ -347,6 +303,7 @@ count(Pred, List) -> %% first element compares equal to `Key' is deleted, if there is such a tuple. %% Equivalent to `lists:keydelete(Key, 1, TupleList)'. -spec keydelete(atom(), [tuple()]) -> [tuple()]. + keydelete(Key, TupleList) -> lists:keydelete(Key, 1, TupleList). @@ -354,162 +311,157 @@ keydelete(Key, TupleList) -> %% first element compares equal to any key in `KeysToDelete' is deleted, if %% there is such a tuple. -spec multi_keydelete([atom()], [tuple()]) -> [tuple()]. + multi_keydelete(KeysToDelete, TupleList) -> multi_keydelete(KeysToDelete, 1, TupleList). %% @doc Returns a copy of `TupleList' where the Nth occurrence of a tuple whose %% first element compares equal to any key in `KeysToDelete' is deleted, if %% there is such a tuple. --spec multi_keydelete([atom()], non_neg_integer(), [tuple()]) -> [tuple()]. +-spec multi_keydelete([atom()], non_neg_integer(), + [tuple()]) -> [tuple()]. + multi_keydelete(KeysToDelete, N, TupleList) -> - lists:foldl( - fun(Key, Acc) -> lists:keydelete(Key, N, Acc) end, - TupleList, - KeysToDelete). + lists:foldl(fun (Key, Acc) -> + lists:keydelete(Key, N, Acc) + end, + TupleList, KeysToDelete). %% @doc Function composition: returns a function that is the composition of %% `F' and `G'. --spec compose(F :: fun((B) -> C), G :: fun((A) -> B)) -> fun((A) -> C). -compose(F, G) when is_function(F, 1), is_function(G, 1) -> - fun(X) -> - F(G(X)) - end. +-spec compose(F :: fun((B) -> C), + G :: fun((A) -> B)) -> fun((A) -> C). + +compose(F, G) + when is_function(F, 1), is_function(G, 1) -> + fun (X) -> F(G(X)) end. %% @doc Function composition: returns a function that is the composition of all %% functions in the `Funs' list. Note that functions are composed from right to %% left, so the final function in the `Funs' will be the first one invoked when %% invoking the composed function. --spec compose([fun((any()) -> any())]) -> fun((any()) -> any()). -compose([Fun]) -> - Fun; +-spec + compose([fun((any()) -> any())]) -> fun((any()) -> any()). + +compose([Fun]) -> Fun; compose(Funs) when is_list(Funs) -> - [Fun|Rest] = lists:reverse(Funs), + [Fun | Rest] = lists:reverse(Funs), lists:foldl(fun compose/2, Fun, Rest). %% @doc Invoke function `F' over each element of list `L' in parallel, %% returning the results in the same order as the input list. --spec pmap(F, L1) -> L2 when - F :: fun((A) -> B), - L1 :: [A], - L2 :: [B]. +-spec pmap(F, L1) -> L2 when F :: fun((A) -> B), + L1 :: [A], L2 :: [B]. + pmap(F, L) -> Parent = self(), - lists:foldl( - fun(X, N) -> - spawn_link(fun() -> - Parent ! {pmap, N, F(X)} - end), - N+1 - end, 0, L), - L2 = [receive {pmap, N, R} -> {N,R} end || _ <- L], + lists:foldl(fun (X, N) -> + spawn_link(fun () -> Parent ! {pmap, N, F(X)} end), + N + 1 + end, + 0, L), + L2 = [receive {pmap, N, R} -> {N, R} end || _ <- L], L3 = lists:keysort(1, L2), - [R || {_,R} <- L3]. - --record(pmap_acc,{ - mapper, - fn, - n_pending=0, - pending=sets:new(), - n_done=0, - done=[], - max_concurrent=1 - }). + [R || {_, R} <- L3]. + +-record(pmap_acc, + {mapper, fn, n_pending = 0, pending = sets:new(), + n_done = 0, done = [], max_concurrent = 1}). %% @doc Parallel map with a cap on the number of concurrent worker processes. %% Note: Worker processes are linked to the parent, so a crash propagates. --spec pmap(Fun::function(), List::list(), MaxP::integer()) -> list(). +-spec pmap(Fun :: function(), List :: list(), + MaxP :: integer()) -> list(). + pmap(Fun, List, MaxP) when MaxP < 1 -> pmap(Fun, List, 1); -pmap(Fun, List, MaxP) when is_function(Fun), is_list(List), is_integer(MaxP) -> +pmap(Fun, List, MaxP) + when is_function(Fun), is_list(List), + is_integer(MaxP) -> Mapper = self(), - #pmap_acc{pending=Pending, done=Done} = - lists:foldl(fun pmap_worker/2, - #pmap_acc{mapper=Mapper, - fn=Fun, - max_concurrent=MaxP}, - List), + #pmap_acc{pending = Pending, done = Done} = + lists:foldl(fun pmap_worker/2, + #pmap_acc{mapper = Mapper, fn = Fun, + max_concurrent = MaxP}, + List), All = pmap_collect_rest(Pending, Done), % Restore input order Sorted = lists:keysort(1, All), - [ R || {_, R} <- Sorted ]. + [R || {_, R} <- Sorted]. %% @doc Fold function for {@link pmap/3} that spawns up to a max number of %% workers to execute the mapping function over the input list. -pmap_worker(X, Acc = #pmap_acc{n_pending=NP, - pending=Pending, - n_done=ND, - max_concurrent=MaxP, - mapper=Mapper, - fn=Fn}) - when NP < MaxP -> - Worker = - spawn_link(fun() -> - R = Fn(X), - Mapper ! {pmap_result, self(), {NP+ND, R}} - end), - Acc#pmap_acc{n_pending=NP+1, pending=sets:add_element(Worker, Pending)}; -pmap_worker(X, Acc = #pmap_acc{n_pending=NP, - pending=Pending, - n_done=ND, - done=Done, - max_concurrent=MaxP}) - when NP == MaxP -> +pmap_worker(X, + Acc = #pmap_acc{n_pending = NP, pending = Pending, + n_done = ND, max_concurrent = MaxP, mapper = Mapper, + fn = Fn}) + when NP < MaxP -> + Worker = spawn_link(fun () -> + R = Fn(X), + Mapper ! {pmap_result, self(), {NP + ND, R}} + end), + Acc#pmap_acc{n_pending = NP + 1, + pending = sets:add_element(Worker, Pending)}; +pmap_worker(X, + Acc = #pmap_acc{n_pending = NP, pending = Pending, + n_done = ND, done = Done, max_concurrent = MaxP}) + when NP == MaxP -> {Result, NewPending} = pmap_collect_one(Pending), - pmap_worker(X, Acc#pmap_acc{n_pending=NP-1, pending=NewPending, - n_done=ND+1, done=[Result|Done]}). + pmap_worker(X, + Acc#pmap_acc{n_pending = NP - 1, pending = NewPending, + n_done = ND + 1, done = [Result | Done]}). %% @doc Waits for one pending pmap task to finish pmap_collect_one(Pending) -> receive - {pmap_result, Pid, Result} -> - Size = sets:size(Pending), - NewPending = sets:del_element(Pid, Pending), - case sets:size(NewPending) of - Size -> - pmap_collect_one(Pending); - _ -> - {Result, NewPending} - end + {pmap_result, Pid, Result} -> + Size = sets:size(Pending), + NewPending = sets:del_element(Pid, Pending), + case sets:size(NewPending) of + Size -> pmap_collect_one(Pending); + _ -> {Result, NewPending} + end end. pmap_collect_rest(Pending, Done) -> case sets:size(Pending) of - 0 -> - Done; - _ -> - {Result, NewPending} = pmap_collect_one(Pending), - pmap_collect_rest(NewPending, [Result | Done]) + 0 -> Done; + _ -> + {Result, NewPending} = pmap_collect_one(Pending), + pmap_collect_rest(NewPending, [Result | Done]) end. - %% @doc Wraps an rpc:call/4 in a try/catch to handle the case where the %% 'rex' process is not running on the remote node. This is safe in %% the sense that it won't crash the calling process if the rex %% process is down. --spec safe_rpc(Node :: node(), Module :: atom(), Function :: atom(), - Args :: [any()]) -> {'badrpc', any()} | any(). +-spec safe_rpc(Node :: node(), Module :: atom(), + Function :: atom(), Args :: [any()]) -> {badrpc, + any()} | + any(). + safe_rpc(Node, Module, Function, Args) -> try rpc:call(Node, Module, Function, Args) of - Result -> - Result + Result -> Result catch - exit:{noproc, _NoProcDetails} -> - {badrpc, rpc_process_down} + exit:{noproc, _NoProcDetails} -> + {badrpc, rpc_process_down} end. %% @doc Wraps an rpc:call/5 in a try/catch to handle the case where the %% 'rex' process is not running on the remote node. This is safe in %% the sense that it won't crash the calling process if the rex %% process is down. --spec safe_rpc(Node :: node(), Module :: atom(), Function :: atom(), - Args :: [any()], Timeout :: timeout()) -> {'badrpc', any()} | any(). +-spec safe_rpc(Node :: node(), Module :: atom(), + Function :: atom(), Args :: [any()], + Timeout :: timeout()) -> {badrpc, any()} | any(). + safe_rpc(Node, Module, Function, Args, Timeout) -> try rpc:call(Node, Module, Function, Args, Timeout) of - Result -> - Result + Result -> Result catch - 'EXIT':{noproc, _NoProcDetails} -> - {badrpc, rpc_process_down} + 'EXIT':{noproc, _NoProcDetails} -> + {badrpc, rpc_process_down} end. %% @spec rpc_every_member(atom(), atom(), [term()], integer()|infinity) @@ -527,36 +479,44 @@ rpc_every_member(Module, Function, Args, Timeout) -> rpc_every_member_ann(Module, Function, Args, Timeout) -> {ok, MyRing} = riak_core_ring_manager:get_my_ring(), Nodes = riak_core_ring:all_members(MyRing), - {Results, Down} = multicall_ann(Nodes, Module, Function, Args, Timeout), + {Results, Down} = multicall_ann(Nodes, Module, Function, + Args, Timeout), {Results, Down}. %% @doc Perform an RPC call to a list of nodes in parallel, returning the %% results in the same order as the input list. --spec multi_rpc([node()], module(), atom(), [any()]) -> [any()]. +-spec multi_rpc([node()], module(), atom(), + [any()]) -> [any()]. + multi_rpc(Nodes, Mod, Fun, Args) -> multi_rpc(Nodes, Mod, Fun, Args, infinity). %% @doc Perform an RPC call to a list of nodes in parallel, returning the %% results in the same order as the input list. --spec multi_rpc([node()], module(), atom(), [any()], timeout()) -> [any()]. +-spec multi_rpc([node()], module(), atom(), [any()], + timeout()) -> [any()]. + multi_rpc(Nodes, Mod, Fun, Args, Timeout) -> - pmap(fun(Node) -> + pmap(fun (Node) -> safe_rpc(Node, Mod, Fun, Args, Timeout) - end, Nodes). + end, + Nodes). %% @doc Perform an RPC call to a list of nodes in parallel, returning the %% results in the same order as the input list. Each result is tagged %% with the corresponding node name. --spec multi_rpc_ann([node()], module(), atom(), [any()]) - -> [{node(), any()}]. +-spec multi_rpc_ann([node()], module(), atom(), + [any()]) -> [{node(), any()}]. + multi_rpc_ann(Nodes, Mod, Fun, Args) -> multi_rpc_ann(Nodes, Mod, Fun, Args, infinity). %% @doc Perform an RPC call to a list of nodes in parallel, returning the %% results in the same order as the input list. Each result is tagged %% with the corresponding node name. --spec multi_rpc_ann([node()], module(), atom(), [any()], timeout()) - -> [{node(), any()}]. +-spec multi_rpc_ann([node()], module(), atom(), [any()], + timeout()) -> [{node(), any()}]. + multi_rpc_ann(Nodes, Mod, Fun, Args, Timeout) -> Results = multi_rpc(Nodes, Mod, Fun, Args, Timeout), lists:zip(Nodes, Results). @@ -566,8 +526,10 @@ multi_rpc_ann(Nodes, Mod, Fun, Args, Timeout) -> %% of nodes that are down/unreachable. The results will be returned in %% the same order as the input list, and each result is tagged with the %% corresponding node name. --spec multicall_ann([node()], module(), atom(), [any()]) - -> {Results :: [{node(), any()}], Down :: [node()]}. +-spec multicall_ann([node()], module(), atom(), + [any()]) -> {Results :: [{node(), any()}], + Down :: [node()]}. + multicall_ann(Nodes, Mod, Fun, Args) -> multicall_ann(Nodes, Mod, Fun, Args, infinity). @@ -576,14 +538,17 @@ multicall_ann(Nodes, Mod, Fun, Args) -> %% of nodes that are down/unreachable. The results will be returned in %% the same order as the input list, and each result is tagged with the %% corresponding node name. --spec multicall_ann([node()], module(), atom(), [any()], timeout()) - -> {Results :: [{node(), any()}], Down :: [node()]}. +-spec multicall_ann([node()], module(), atom(), [any()], + timeout()) -> {Results :: [{node(), any()}], + Down :: [node()]}. + multicall_ann(Nodes, Mod, Fun, Args, Timeout) -> L = multi_rpc_ann(Nodes, Mod, Fun, Args, Timeout), - {Results, DownAnn} = - lists:partition(fun({_, Result}) -> - Result /= {badrpc, nodedown} - end, L), + {Results, DownAnn} = lists:partition(fun ({_, + Result}) -> + Result /= {badrpc, nodedown} + end, + L), {Down, _} = lists:unzip(DownAnn), {Results, Down}. @@ -594,96 +559,98 @@ multicall_ann(Nodes, Mod, Fun, Args, Timeout) -> %% the array is logically wrapped around to ensure leaf nodes also %% have children by giving them backedges to other elements. --spec build_tree(N :: integer(), Nodes :: [term()], Opts :: [term()]) - -> orddict:orddict(). +-spec build_tree(N :: integer(), Nodes :: [term()], + Opts :: [term()]) -> orddict:orddict(). + build_tree(N, Nodes, Opts) -> case lists:member(cycles, Opts) of - true -> - Expand = lists:flatten(lists:duplicate(N+1, Nodes)); - false -> - Expand = Nodes + true -> + Expand = lists:flatten(lists:duplicate(N + 1, Nodes)); + false -> Expand = Nodes end, - {Tree, _} = - lists:foldl(fun(Elm, {Result, Worklist}) -> - Len = erlang:min(N, length(Worklist)), - {Children, Rest} = lists:split(Len, Worklist), - NewResult = [{Elm, Children} | Result], - {NewResult, Rest} - end, {[], tl(Expand)}, Nodes), + {Tree, _} = lists:foldl(fun (Elm, {Result, Worklist}) -> + Len = erlang:min(N, length(Worklist)), + {Children, Rest} = lists:split(Len, + Worklist), + NewResult = [{Elm, Children} | Result], + {NewResult, Rest} + end, + {[], tl(Expand)}, Nodes), orddict:from_list(Tree). orddict_delta(A, B) -> %% Pad both A and B to the same length DummyA = [{Key, '$none'} || {Key, _} <- B], - A2 = orddict:merge(fun(_, Value, _) -> - Value - end, A, DummyA), - + A2 = orddict:merge(fun (_, Value, _) -> Value end, A, + DummyA), DummyB = [{Key, '$none'} || {Key, _} <- A], - B2 = orddict:merge(fun(_, Value, _) -> - Value - end, B, DummyB), - + B2 = orddict:merge(fun (_, Value, _) -> Value end, B, + DummyB), %% Merge and filter out equal values - Merged = orddict:merge(fun(_, AVal, BVal) -> + Merged = orddict:merge(fun (_, AVal, BVal) -> {AVal, BVal} - end, A2, B2), - Diff = orddict:filter(fun(_, {Same, Same}) -> - false; - (_, _) -> - true - end, Merged), + end, + A2, B2), + Diff = orddict:filter(fun (_, {_Same, _Same}) -> false; + (_, _) -> true + end, + Merged), Diff. shuffle(L) -> N = 134217727, %% Largest small integer on 32-bit Erlang - L2 = [{riak_core_rand:uniform(N), E} || E <- L], + L2 = [{rand:uniform(N), E} || E <- L], L3 = [E || {_, E} <- lists:sort(L2)], L3. %% Returns a forced-lowercase architecture for this node --spec get_arch () -> string(). -get_arch () -> string:to_lower(erlang:system_info(system_architecture)). +-spec get_arch() -> string(). + +get_arch() -> + string:to_lower(erlang:system_info(system_architecture)). %% Checks if this node is of a given architecture --spec is_arch (atom()) -> boolean(). -is_arch (linux) -> string:str(get_arch(),"linux") > 0; -is_arch (darwin) -> string:str(get_arch(),"darwin") > 0; -is_arch (sunos) -> string:str(get_arch(),"sunos") > 0; -is_arch (osx) -> is_arch(darwin); -is_arch (solaris) -> is_arch(sunos); -is_arch (Arch) -> throw({unsupported_architecture,Arch}). +-spec is_arch(atom()) -> boolean(). + +is_arch(linux) -> string:str(get_arch(), "linux") > 0; +is_arch(darwin) -> string:str(get_arch(), "darwin") > 0; +is_arch(sunos) -> string:str(get_arch(), "sunos") > 0; +is_arch(osx) -> is_arch(darwin); +is_arch(solaris) -> is_arch(sunos); +is_arch(Arch) -> + throw({unsupported_architecture, Arch}). format_ip_and_port(Ip, Port) when is_list(Ip) -> - lists:flatten(io_lib:format("~s:~p",[Ip,Port])); + lists:flatten(io_lib:format("~s:~p", [Ip, Port])); format_ip_and_port(Ip, Port) when is_tuple(Ip) -> - lists:flatten(io_lib:format("~s:~p",[inet_parse:ntoa(Ip), - Port])). -peername(Socket, Transport) -> - case Transport:peername(Socket) of - {ok, {Ip, Port}} -> - format_ip_and_port(Ip, Port); - {error, Reason} -> - %% just return a string so JSON doesn't blow up - lists:flatten(io_lib:format("error:~p", [Reason])) + lists:flatten(io_lib:format("~s:~p", + [inet_parse:ntoa(Ip), Port])). + +peername(Socket, Module) -> + case Module:peername(Socket) of + {ok, {Ip, Port}} -> format_ip_and_port(Ip, Port); + {error, Reason} -> + %% just return a string so JSON doesn't blow up + lists:flatten(io_lib:format("error:~p", [Reason])) end. -sockname(Socket, Transport) -> - case Transport:sockname(Socket) of - {ok, {Ip, Port}} -> - format_ip_and_port(Ip, Port); - {error, Reason} -> - %% just return a string so JSON doesn't blow up - lists:flatten(io_lib:format("error:~p", [Reason])) +sockname(Socket, Module) -> + case Module:sockname(Socket) of + {ok, {Ip, Port}} -> format_ip_and_port(Ip, Port); + {error, Reason} -> + %% just return a string so JSON doesn't blow up + lists:flatten(io_lib:format("error:~p", [Reason])) end. %% @doc Convert a #riak_core_fold_req_v? record to the cluster's maximum %% supported record version. -make_fold_req(#riak_core_fold_req_v1{foldfun=FoldFun, acc0=Acc0}) -> +make_fold_req(#riak_core_fold_req_v1{foldfun = FoldFun, + acc0 = Acc0}) -> make_fold_req(FoldFun, Acc0, false, []); -make_fold_req(?FOLD_REQ{foldfun=FoldFun, acc0=Acc0, - forwardable=Forwardable, opts=Opts}) -> +make_fold_req(#riak_core_fold_req_v2{foldfun = FoldFun, + acc0 = Acc0, forwardable = Forwardable, + opts = Opts}) -> make_fold_req(FoldFun, Acc0, Forwardable, Opts). make_fold_req(FoldFun, Acc0) -> @@ -695,10 +662,11 @@ make_fold_req(FoldFun, Acc0, Forwardable, Opts) -> %% @doc Force a #riak_core_fold_req_v? record to the latest version, %% regardless of cluster support -make_newest_fold_req(#riak_core_fold_req_v1{foldfun=FoldFun, acc0=Acc0}) -> +make_newest_fold_req(#riak_core_fold_req_v1{foldfun = + FoldFun, + acc0 = Acc0}) -> make_fold_reqv(v2, FoldFun, Acc0, false, []); -make_newest_fold_req(?FOLD_REQ{} = F) -> - F. +make_newest_fold_req(#riak_core_fold_req_v2{} = F) -> F. %% @doc Spawn an intermediate proxy process to handle errors during gen_xxx %% calls. @@ -709,145 +677,160 @@ proxy_spawn(Fun) -> MRef = monitor(process, Pid), Pid ! {proxy, MRef}, receive - {proxy_reply, MRef, Result} -> - demonitor(MRef, [flush]), - Result; - {'DOWN', MRef, _, _, Reason} -> - {error, Reason} + {proxy_reply, MRef, Result} -> + demonitor(MRef, [flush]), Result; + {'DOWN', MRef, _, _, Reason} -> {error, Reason} end. - %% @private -make_fold_reqv(v1, FoldFun, Acc0, _Forwardable, _Opts) - when is_function(FoldFun, 3) -> - #riak_core_fold_req_v1{foldfun=FoldFun, acc0=Acc0}; -make_fold_reqv(v2, FoldFun, Acc0, Forwardable, Opts) - when is_function(FoldFun, 3) - andalso (Forwardable == true orelse Forwardable == false) - andalso is_list(Opts) -> - ?FOLD_REQ{foldfun=FoldFun, acc0=Acc0, - forwardable=Forwardable, opts=Opts}. +make_fold_reqv(_, FoldFun, Acc0, Forwardable, Opts) + when is_function(FoldFun, 3) andalso + (Forwardable == true orelse Forwardable == false) + andalso is_list(Opts) -> + #riak_core_fold_req_v2{foldfun = FoldFun, acc0 = Acc0, + forwardable = Forwardable, opts = Opts}. %% @private - used with proxy_spawn proxy(Parent, Fun) -> _ = monitor(process, Parent), receive - {proxy, MRef} -> - Result = Fun(), - Parent ! {proxy_reply, MRef, Result}; - {'DOWN', _, _, _, _} -> - ok + {proxy, MRef} -> + Result = Fun(), Parent ! {proxy_reply, MRef, Result}; + {'DOWN', _, _, _, _} -> ok end. --spec enable_job_class(atom(), atom()) -> ok | {error, term()}. +-spec enable_job_class(atom(), atom()) -> ok | + {error, term()}. + %% @doc Enables the specified Application/Operation job class. %% This is the public API for use via RPC. %% WARNING: This function is not suitable for parallel execution with itself %% or its complement disable_job_class/2. enable_job_class(Application, Operation) - when erlang:is_atom(Application) andalso erlang:is_atom(Operation) -> + when erlang:is_atom(Application) andalso + erlang:is_atom(Operation) -> enable_job_class({Application, Operation}); enable_job_class(Application, Operation) -> {error, {badarg, {Application, Operation}}}. --spec disable_job_class(atom(), atom()) -> ok | {error, term()}. +-spec disable_job_class(atom(), atom()) -> ok | + {error, term()}. + %% @doc Disables the specified Application/Operation job class. %% This is the public API for use via RPC. %% WARNING: This function is not suitable for parallel execution with itself %% or its complement enable_job_class/2. disable_job_class(Application, Operation) - when erlang:is_atom(Application) andalso erlang:is_atom(Operation) -> + when erlang:is_atom(Application) andalso + erlang:is_atom(Operation) -> disable_job_class({Application, Operation}); disable_job_class(Application, Operation) -> {error, {badarg, {Application, Operation}}}. --spec job_class_enabled(atom(), atom()) -> boolean() | {error, term()}. +-spec job_class_enabled(atom(), atom()) -> boolean() | + {error, term()}. + %% @doc Reports whether the specified Application/Operation job class is enabled. %% This is the public API for use via RPC. job_class_enabled(Application, Operation) - when erlang:is_atom(Application) andalso erlang:is_atom(Operation) -> + when erlang:is_atom(Application) andalso + erlang:is_atom(Operation) -> job_class_enabled({Application, Operation}); job_class_enabled(Application, Operation) -> {error, {badarg, {Application, Operation}}}. --spec enable_job_class(Class :: term()) -> ok | {error, term()}. +-spec enable_job_class(Class :: term()) -> ok | + {error, term()}. + %% @doc Internal API to enable the specified job class. %% WARNING: %% * This function may not remain in this form once the Jobs API is live! %% * Parameter types ARE NOT validated by the same rules as the public API! %% You are STRONGLY advised to use enable_job_class/2. enable_job_class(Class) -> - case application:get_env(riak_core, job_accept_class, undefined) of - [_|_] = EnabledClasses -> - case lists:member(Class, EnabledClasses) of - true -> - ok; - _ -> - application:set_env( - riak_core, job_accept_class, [Class | EnabledClasses]) - end; - _ -> - application:set_env(riak_core, job_accept_class, [Class]) + case application:get_env(riak_core, job_accept_class, + undefined) + of + [_ | _] = EnabledClasses -> + case lists:member(Class, EnabledClasses) of + true -> ok; + _ -> + application:set_env(riak_core, job_accept_class, + [Class | EnabledClasses]) + end; + _ -> + application:set_env(riak_core, job_accept_class, + [Class]) end. --spec disable_job_class(Class :: term()) -> ok | {error, term()}. +-spec disable_job_class(Class :: term()) -> ok | + {error, term()}. + %% @doc Internal API to disable the specified job class. %% WARNING: %% * This function may not remain in this form once the Jobs API is live! %% * Parameter types ARE NOT validated by the same rules as the public API! %% You are STRONGLY advised to use disable_job_class/2. disable_job_class(Class) -> - case application:get_env(riak_core, job_accept_class, undefined) of - [_|_] = EnabledClasses -> - case lists:member(Class, EnabledClasses) of - false -> - ok; - _ -> - application:set_env(riak_core, job_accept_class, - lists:delete(Class, EnabledClasses)) - end; - _ -> - ok + case application:get_env(riak_core, job_accept_class, + undefined) + of + [_ | _] = EnabledClasses -> + case lists:member(Class, EnabledClasses) of + false -> ok; + _ -> + application:set_env(riak_core, job_accept_class, + lists:delete(Class, EnabledClasses)) + end; + _ -> ok end. -spec job_class_enabled(Class :: term()) -> boolean(). + %% @doc Internal API to determine whether to accept/reject a job. %% WARNING: %% * This function may not remain in this form once the Jobs API is live! %% * Parameter types ARE NOT validated by the same rules as the public API! %% You are STRONGLY advised to use job_class_enabled/2. job_class_enabled(Class) -> - case application:get_env(riak_core, job_accept_class, undefined) of - undefined -> - true; - [] -> - false; - [_|_] = EnabledClasses -> - lists:member(Class, EnabledClasses); - Other -> - % Don't crash if it's not a list - that should never be the case, - % but since the value *can* be manipulated externally be more - % accommodating. If someone mucks it up, nothing's going to be - % allowed, but give them a chance to catch on instead of crashing. - _ = logger:error( - "riak_core.job_accept_class is not a list: ~p", [Other]), - false + case application:get_env(riak_core, job_accept_class, + undefined) + of + undefined -> true; + [] -> false; + [_ | _] = EnabledClasses -> + lists:member(Class, EnabledClasses); + Other -> + % Don't crash if it's not a list - that should never be the case, + % but since the value *can* be manipulated externally be more + % accommodating. If someone mucks it up, nothing's going to be + % allowed, but give them a chance to catch on instead of crashing. + _ = logger:error("riak_core.job_accept_class is not a " + "list: ~p", + [Other]), + false end. --spec job_class_disabled_message(ReturnType :: atom(), Class :: term()) - -> binary() | string(). +-spec job_class_disabled_message(ReturnType :: atom(), + Class :: term()) -> binary() | string(). + %% @doc The error message to be returned to a client for a disabled job class. %% WARNING: %% * This function is likely to be extended to accept a Job as well as a Class %% when the Jobs API is live. job_class_disabled_message(binary, Class) -> - erlang:list_to_binary(job_class_disabled_message(text, Class)); + erlang:list_to_binary(job_class_disabled_message(text, + Class)); job_class_disabled_message(text, Class) -> - lists:flatten(io_lib:format("Operation '~p' is not enabled", [Class])). + lists:flatten(io_lib:format("Operation '~p' is not enabled", + [Class])). + +-spec report_job_request_disposition(Accepted :: + boolean(), + Class :: term(), Mod :: module(), + Func :: atom(), Line :: pos_integer(), + Client :: term()) -> ok | {error, term()}. --spec report_job_request_disposition(Accepted :: boolean(), Class :: term(), - Mod :: module(), Func :: atom(), Line :: pos_integer(), Client :: term()) - -> ok | {error, term()}. %% @doc Report/record the disposition of an async job request. %% %% Logs an appropriate message and reports to whoever needs to know. @@ -865,12 +848,18 @@ job_class_disabled_message(text, Class) -> %% available, Client is an atom representing the protocol through which the %% request was received. %% -report_job_request_disposition(true, Class, Mod, Func, Line, Client) -> - logger:debug("Request '~p' accepted from ~p", [Class, Client], - #{pid => erlang:self(), module => Mod, function => Func, line => Line}); -report_job_request_disposition(false, Class, Mod, Func, Line, Client) -> - logger:warning("Request '~p' disabled from ~p", [Class, Client], - #{pid => erlang:self(), module => Mod, function => Func, line => Line}). +report_job_request_disposition(true, Class, Mod, Func, + Line, Client) -> + logger:debug("Request '~p' accepted from ~p", + [Class, Client], + #{pid => erlang:self(), module => Mod, function => Func, + line => Line}); +report_job_request_disposition(false, Class, Mod, Func, + Line, Client) -> + logger:warning("Request '~p' disabled from ~p", + [Class, Client], + #{pid => erlang:self(), module => Mod, function => Func, + line => Line}). %% =================================================================== %% Preflist utility functions @@ -878,81 +867,15 @@ report_job_request_disposition(false, Class, Mod, Func, Line, Client) -> %% @doc Given a bucket/key, determine the associated preflist index_n. -spec get_index_n({binary(), binary()}) -> index_n(). + get_index_n({Bucket, Key}) -> - BucketProps = riak_core_bucket:get_bucket(Bucket), - N = proplists:get_value(n_val, BucketProps), + %% BucketProps = riak_core_bucket:get_bucket(Bucket), + {ok, N} = application:get_env(riak_core, target_n_val), ChashKey = riak_core_util:chash_key({Bucket, Key}), {ok, CHBin} = riak_core_ring_manager:get_chash_bin(), Index = chashbin:responsible_index(ChashKey, CHBin), {Index, N}. -%% @doc Given an index, determine all sibling indices that participate in one -%% or more preflists with the specified index. --spec preflist_siblings(index()) -> [index()]. -preflist_siblings(Index) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - preflist_siblings(Index, Ring). - -%% @doc See {@link preflist_siblings/1}. --spec preflist_siblings(index(), riak_core_ring()) -> [index()]. -preflist_siblings(Index, Ring) -> - MaxN = determine_max_n(Ring), - preflist_siblings(Index, MaxN, Ring). - --spec preflist_siblings(index(), pos_integer(), riak_core_ring()) -> [index()]. -preflist_siblings(Index, N, Ring) -> - IndexBin = <>, - PL = riak_core_ring:preflist(IndexBin, Ring), - Indices = [Idx || {Idx, _} <- PL], - RevIndices = lists:reverse(Indices), - {Succ, _} = lists:split(N-1, Indices), - {Pred, _} = lists:split(N-1, tl(RevIndices)), - lists:reverse(Pred) ++ Succ. - --spec responsible_preflists(index()) -> [index_n()]. -responsible_preflists(Index) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - responsible_preflists(Index, Ring). - --spec responsible_preflists(index(), riak_core_ring()) -> [index_n()]. -responsible_preflists(Index, Ring) -> - AllN = determine_all_n(Ring), - responsible_preflists(Index, AllN, Ring). - --spec responsible_preflists(index(), [pos_integer(),...], riak_core_ring()) - -> [index_n()]. -responsible_preflists(Index, AllN, Ring) -> - IndexBin = <>, - PL = riak_core_ring:preflist(IndexBin, Ring), - Indices = [Idx || {Idx, _} <- PL], - RevIndices = lists:reverse(Indices), - lists:flatmap(fun(N) -> - responsible_preflists_n(RevIndices, N) - end, AllN). - --spec responsible_preflists_n([index()], pos_integer()) -> [index_n()]. -responsible_preflists_n(RevIndices, N) -> - {Pred, _} = lists:split(N, RevIndices), - [{Idx, N} || Idx <- lists:reverse(Pred)]. - - --spec determine_max_n(riak_core_ring()) -> pos_integer(). -determine_max_n(Ring) -> - lists:max(determine_all_n(Ring)). - --spec determine_all_n(riak_core_ring()) -> [pos_integer(),...]. -determine_all_n(Ring) -> - Buckets = riak_core_ring:get_buckets(Ring), - BucketProps = [riak_core_bucket:get_bucket(Bucket, Ring) || Bucket <- Buckets], - Default = application:get_env(riak_core, default_bucket_props, undefined), - DefaultN = proplists:get_value(n_val, Default), - AllN = lists:foldl(fun(Props, AllN) -> - N = proplists:get_value(n_val, Props), - ordsets:add_element(N, AllN) - end, [DefaultN], BucketProps), - AllN. - - %% =================================================================== %% EUnit tests %% =================================================================== @@ -961,130 +884,101 @@ determine_all_n(Ring) -> moment_test() -> M1 = riak_core_util:moment(), M2 = riak_core_util:moment(), - ?assert(M2 >= M1). + ?assert((M2 >= M1)). clientid_uniqueness_test() -> - ClientIds = [mkclientid('somenode@somehost') || _I <- lists:seq(0, 10000)], - length(ClientIds) =:= length(sets:to_list(sets:from_list(ClientIds))). + ClientIds = [mkclientid(somenode@somehost) + || _I <- lists:seq(0, 10000)], + length(ClientIds) =:= + length(sets:to_list(sets:from_list(ClientIds))). build_tree_test() -> - Flat = [1, - 11, 12, - 111, 112, 121, 122, - 1111, 1112, 1121, 1122, 1211, 1212, 1221, 1222], - + Flat = [1, 11, 12, 111, 112, 121, 122, 1111, 1112, 1121, + 1122, 1211, 1212, 1221, 1222], %% 2-ary tree decomposition - ATree = [{1, [ 11, 12]}, - {11, [ 111, 112]}, - {12, [ 121, 122]}, - {111, [1111, 1112]}, - {112, [1121, 1122]}, - {121, [1211, 1212]}, - {122, [1221, 1222]}, - {1111, []}, - {1112, []}, - {1121, []}, - {1122, []}, - {1211, []}, - {1212, []}, - {1221, []}, + ATree = [{1, [11, 12]}, {11, [111, 112]}, + {12, [121, 122]}, {111, [1111, 1112]}, + {112, [1121, 1122]}, {121, [1211, 1212]}, + {122, [1221, 1222]}, {1111, []}, {1112, []}, {1121, []}, + {1122, []}, {1211, []}, {1212, []}, {1221, []}, {1222, []}], - %% 2-ary tree decomposition with cyclic wrap-around - CTree = [{1, [ 11, 12]}, - {11, [ 111, 112]}, - {12, [ 121, 122]}, - {111, [1111, 1112]}, - {112, [1121, 1122]}, - {121, [1211, 1212]}, - {122, [1221, 1222]}, - {1111, [ 1, 11]}, - {1112, [ 12, 111]}, - {1121, [ 112, 121]}, - {1122, [ 122, 1111]}, - {1211, [1112, 1121]}, - {1212, [1122, 1211]}, - {1221, [1212, 1221]}, - {1222, [1222, 1]}], - - ?assertEqual(ATree, build_tree(2, Flat, [])), - ?assertEqual(CTree, build_tree(2, Flat, [cycles])), + CTree = [{1, [11, 12]}, {11, [111, 112]}, + {12, [121, 122]}, {111, [1111, 1112]}, + {112, [1121, 1122]}, {121, [1211, 1212]}, + {122, [1221, 1222]}, {1111, [1, 11]}, {1112, [12, 111]}, + {1121, [112, 121]}, {1122, [122, 1111]}, + {1211, [1112, 1121]}, {1212, [1122, 1211]}, + {1221, [1212, 1221]}, {1222, [1222, 1]}], + ?assertEqual(ATree, (build_tree(2, Flat, []))), + ?assertEqual(CTree, (build_tree(2, Flat, [cycles]))), ok. - counter_loop(N) -> receive - {up, Pid} -> - N2=N+1, - Pid ! {counter_value, N2}, - counter_loop(N2); - down -> - counter_loop(N-1); - exit -> - exit(normal) + {up, Pid} -> + N2 = N + 1, Pid ! {counter_value, N2}, counter_loop(N2); + down -> counter_loop(N - 1); + exit -> exit(normal) end. incr_counter(CounterPid) -> CounterPid ! {up, self()}, receive - {counter_value, N} -> N - after - 3000 -> - ?assert(false) + {counter_value, N} -> N after 3000 -> ?assert(false) end. -decr_counter(CounterPid) -> - CounterPid ! down. +decr_counter(CounterPid) -> CounterPid ! down. multi_keydelete_test_() -> - Languages = [{lisp, 1958}, - {ml, 1973}, - {erlang, 1986}, - {haskell, 1990}, - {ocaml, 1996}, - {clojure, 2007}, + Languages = [{lisp, 1958}, {ml, 1973}, {erlang, 1986}, + {haskell, 1990}, {ocaml, 1996}, {clojure, 2007}, {elixir, 2012}], - ?_assertMatch( - [{lisp, _}, {ml, _}, {erlang, _}, {haskell, _}], - multi_keydelete([ocaml, clojure, elixir], Languages)). + ?_assertMatch([{lisp, _}, {ml, _}, {erlang, _}, + {haskell, _}], + (multi_keydelete([ocaml, clojure, elixir], Languages))). compose_test_() -> Upper = fun string:to_upper/1, Reverse = fun lists:reverse/1, - Strip = fun(S) -> string:strip(S, both, $!) end, + Strip = fun (S) -> string:strip(S, both, $!) end, StripReverseUpper = compose([Upper, Reverse, Strip]), - - Increment = fun(N) when is_integer(N) -> N + 1 end, - Double = fun(N) when is_integer(N) -> N * 2 end, - Square = fun(N) when is_integer(N) -> N * N end, - SquareDoubleIncrement = compose([Increment, Double, Square]), - + Increment = fun (N) when is_integer(N) -> N + 1 end, + Double = fun (N) when is_integer(N) -> N * 2 end, + Square = fun (N) when is_integer(N) -> N * N end, + SquareDoubleIncrement = compose([Increment, Double, + Square]), CompatibleTypes = compose(Increment, - fun(X) when is_list(X) -> list_to_integer(X) end), + fun (X) when is_list(X) -> list_to_integer(X) + end), IncompatibleTypes = compose(Increment, - fun(X) when is_binary(X) -> binary_to_list(X) end), - [?_assertEqual("DLROW OLLEH", StripReverseUpper("Hello world!")), - ?_assertEqual(Increment(Double(Square(3))), SquareDoubleIncrement(3)), - ?_assertMatch(4, CompatibleTypes("3")), - ?_assertError(function_clause, IncompatibleTypes(<<"42">>)), - ?_assertError(function_clause, compose(fun(X, Y) -> {X, Y} end, fun(X) -> X end))]. + fun (X) when is_binary(X) -> binary_to_list(X) + end), + [?_assertEqual("DLROW OLLEH", + (StripReverseUpper("Hello world!"))), + ?_assertEqual((Increment(Double(Square(3)))), + (SquareDoubleIncrement(3))), + ?_assertMatch(4, (CompatibleTypes("3"))), + ?_assertError(function_clause, + (IncompatibleTypes(<<"42">>))), + ?_assertError(function_clause, + (compose(fun (X, Y) -> {X, Y} end, fun (X) -> X end)))]. pmap_test_() -> - Fgood = fun(X) -> 2 * X end, - Fbad = fun(3) -> throw(die_on_3); - (X) -> Fgood(X) + Fgood = fun (X) -> 2 * X end, + Fbad = fun (3) -> throw(die_on_3); + (X) -> Fgood(X) end, - Lin = [1,2,3,4], - Lout = [2,4,6,8], - {setup, - fun() -> error_logger:tty(false) end, - fun(_) -> error_logger:tty(true) end, - [fun() -> + Lin = [1, 2, 3, 4], + Lout = [2, 4, 6, 8], + {setup, fun () -> error_logger:tty(false) end, + fun (_) -> error_logger:tty(true) end, + [fun () -> % Test simple map case - ?assertEqual(Lout, pmap(Fgood, Lin)), + ?assertEqual(Lout, (pmap(Fgood, Lin))), % Verify a crashing process will not stall pmap Parent = self(), - Pid = spawn(fun() -> + Pid = spawn(fun () -> % Caller trapping exits causes stall!! % TODO: Consider pmapping in a spawned proc % process_flag(trap_exit, true), @@ -1094,80 +988,72 @@ pmap_test_() -> end), MonRef = monitor(process, Pid), receive - {'DOWN', MonRef, _, _, _} -> - ok; - no_crash_yo -> - ?assert(pmap_did_not_crash_as_expected) + {'DOWN', MonRef, _, _, _} -> ok; + no_crash_yo -> ?assert(pmap_did_not_crash_as_expected) end - end - ]}. + end]}. bounded_pmap_test_() -> - Fun1 = fun(X) -> X+2 end, - Tests = - fun(CountPid) -> - GFun = fun(Max) -> - fun(X) -> - ?assert(incr_counter(CountPid) =< Max), - timer:sleep(1), - decr_counter(CountPid), - Fun1(X) - end - end, - [ - fun() -> - ?assertEqual(lists:seq(Fun1(1), Fun1(N)), - pmap(GFun(MaxP), - lists:seq(1, N), MaxP)) - end || - MaxP <- lists:seq(1,20), - N <- lists:seq(0,10) - ] - end, + Fun1 = fun (X) -> X + 2 end, + Tests = fun (CountPid) -> + GFun = fun (Max) -> + fun (X) -> + ?assert((incr_counter(CountPid) =< + Max)), + timer:sleep(1), + decr_counter(CountPid), + Fun1(X) + end + end, + [fun () -> + ?assertEqual((lists:seq(Fun1(1), Fun1(N))), + (pmap(GFun(MaxP), lists:seq(1, N), + MaxP))) + end + || MaxP <- lists:seq(1, 20), N <- lists:seq(0, 10)] + end, {setup, - fun() -> - Pid = spawn_link(?MODULE, counter_loop, [0]), - monitor(process, Pid), - Pid - end, - fun(Pid) -> - Pid ! exit, - receive - {'DOWN', _Ref, process, Pid, _Info} -> ok - after - 3000 -> - ?debugMsg("pmap counter process did not go down in time"), - ?assert(false) - end, - ok - end, - Tests - }. + fun () -> + Pid = spawn_link(?MODULE, counter_loop, [0]), + monitor(process, Pid), + Pid + end, + fun (Pid) -> + Pid ! exit, + receive + {'DOWN', _Ref, process, Pid, _Info} -> ok + after 3000 -> + ?debugMsg("pmap counter process did not go down " + "in time"), + ?assert(false) + end, + ok + end, + Tests}. proxy_spawn_test() -> - A = proxy_spawn(fun() -> a end), + A = proxy_spawn(fun () -> a end), ?assertEqual(a, A), - B = proxy_spawn(fun() -> exit(killer_fun) end), + B = proxy_spawn(fun () -> exit(killer_fun) end), ?assertEqual({error, killer_fun}, B), - %% Ensure no errant 'DOWN' messages receive - {'DOWN', _, _, _, _}=Msg -> - throw({error, {badmsg, Msg}}); - _ -> - ok - after 1000 -> - ok + {'DOWN', _, _, _, _} = Msg -> + throw({error, {badmsg, Msg}}); + _ -> ok + after 1000 -> ok end. --ifdef(EQC). +-ifdef(PROPER). count_test() -> - ?assert(eqc:quickcheck(prop_count_correct())). + ?assert((proper:quickcheck(prop_count_correct()))). prop_count_correct() -> - ?FORALL(List, list(bool()), - count(fun(E) -> E end, List) =:= length([E || E <- List, E])). + ?FORALL(List, (list(bool())), + (count(fun (E) -> E end, List) =:= + length([E || E <- List, E]))). -endif. %% EQC + -endif. %% TEST diff --git a/src/riak_core_vnode.erl b/src/riak_core_vnode.erl index f1f2a6dd0..6e29c9a7e 100644 --- a/src/riak_core_vnode.erl +++ b/src/riak_core_vnode.erl @@ -16,125 +16,160 @@ %% under the License. %% %% ------------------------------------------------------------------- --module('riak_core_vnode'). --behaviour(gen_fsm). - --compile({nowarn_deprecated_function, - [{gen_fsm, start_link, 3}, - {gen_fsm, send_event, 2}, - {gen_fsm, send_event_after, 2}, - {gen_fsm, sync_send_event, 3}, - {gen_fsm, send_all_state_event, 2}, - {gen_fsm, sync_send_all_state_event, 2}, - {gen_fsm, cancel_timer, 1}]}). +-module(riak_core_vnode). + +-behaviour(gen_fsm_compat). -include("riak_core_vnode.hrl"). --export([start_link/3, - start_link/4, - wait_for_init/1, - send_command/2, - send_command_after/2]). --export([init/1, - started/2, - started/3, - active/2, - active/3, - handle_event/3, - handle_sync_event/4, - handle_info/3, - terminate/3, - code_change/4]). --export([reply/2, - monitor/1]). --export([get_mod_index/1, - get_modstate/1, - set_forwarding/2, - trigger_handoff/2, - trigger_handoff/3, - trigger_delete/1, - core_status/1, - handoff_error/3]). - --include("stacktrace.hrl"). + +-export([start_link/3, start_link/4, wait_for_init/1, + send_command/2, send_command_after/2]). + +-export([init/1, started/2, started/3, active/2, + active/3, handle_event/3, handle_sync_event/4, + handle_info/3, terminate/3, code_change/4]). + +-export([reply/2, monitor/1]). + +-export([get_mod_index/1, get_modstate/1, + set_forwarding/2, trigger_handoff/2, trigger_handoff/3, + trigger_delete/1, core_status/1, handoff_error/3]). + +-export([cast_finish_handoff/1, send_an_event/2, + send_req/2, send_all_proxy_req/2, cancel_handoff/1, + handoff_complete/1, resize_transfer_complete/2, + handoff_data/3, unregistered/1]). -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). --export([test_link/2, - current_state/1]). +-export([test_link/2, current_state/1]). + -endif. -ifdef(PULSE). + -compile(export_all). + -compile({parse_transform, pulse_instrument}). --compile({pulse_replace_module, [{gen_fsm, pulse_gen_fsm}, - {gen_server, pulse_gen_server}]}). + +-compile({pulse_replace_module, + [{gen_fsm_compat, pulse_gen_fsm}, + {gen_server, pulse_gen_server}]}). + -endif. --define(normal_reason(R), - (R == normal orelse R == shutdown orelse - (is_tuple(R) andalso element(1,R) == shutdown))). +-define(NORMAL_REASON(R), + R == normal orelse + R == shutdown orelse + is_tuple(R) andalso element(1, R) == shutdown). -export_type([vnode_opt/0, pool_opt/0]). -type vnode_opt() :: pool_opt(). --type pool_opt() :: {pool, WorkerModule::module(), PoolSize::pos_integer(), WorkerArgs::[term()]}. - --callback init([partition()]) -> - {ok, ModState::term()} | - {ok, ModState::term(), [vnode_opt()]} | - {error, Reason::term()}. - --callback handle_command(Request::term(), Sender::sender(), ModState::term()) -> - continue | - {reply, Reply::term(), NewModState::term()} | - {noreply, NewModState::term()} | - {async, Work::function(), From::sender(), NewModState::term()} | - {stop, Reason::term(), NewModState::term()}. - --callback handle_coverage(Request::term(), keyspaces(), Sender::sender(), ModState::term()) -> - continue | - {reply, Reply::term(), NewModState::term()} | - {noreply, NewModState::term()} | - {async, Work::function(), From::sender(), NewModState::term()} | - {stop, Reason::term(), NewModState::term()}. - --callback handle_exit(pid(), Reason::term(), ModState::term()) -> - {noreply, NewModState::term()} | - {stop, Reason::term(), NewModState::term()}. - --callback handoff_starting(handoff_dest(), ModState::term()) -> - {boolean(), NewModState::term()}. - --callback handoff_cancelled(ModState::term()) -> - {ok, NewModState::term()}. - --callback handoff_finished(handoff_dest(), ModState::term()) -> - {ok, NewModState::term()}. - --callback handle_handoff_command(Request::term(), Sender::sender(), ModState::term()) -> - {reply, Reply::term(), NewModState::term()} | - {noreply, NewModState::term()} | - {async, Work::function(), From::sender(), NewModState::term()} | - {forward, NewModState::term()} | - {drop, NewModState::term()} | - {stop, Reason::term(), NewModState::term()}. - --callback handle_handoff_data(binary(), ModState::term()) -> - {reply, ok | {error, Reason::term()}, NewModState::term()}. - --callback encode_handoff_item(Key::term(), Value::term()) -> - corrupted | binary(). - --callback is_empty(ModState::term()) -> - {boolean(), NewModState::term()} | - {false, Size::pos_integer(), NewModState::term()}. - --callback terminate(Reason::term(), ModState::term()) -> - ok. --callback delete(ModState::term()) -> {ok, NewModState::term()}. +-type pool_opt() :: {pool, WorkerModule :: module(), + PoolSize :: pos_integer(), WorkerArgs :: [term()]}. + +-callback init([partition()]) -> {ok, + ModState :: term()} | + {ok, ModState :: term(), [vnode_opt()]} | + {error, Reason :: term()}. + +-callback handle_command(Request :: term(), + Sender :: sender(), ModState :: term()) -> continue | + {reply, + Reply :: + term(), + NewModState :: + term()} | + {noreply, + NewModState :: + term()} | + {async, + Work :: + function(), + From :: + sender(), + NewModState :: + term()} | + {stop, + Reason :: + term(), + NewModState :: + term()}. + +-callback handle_coverage(Request :: term(), + keyspaces(), Sender :: sender(), + ModState :: term()) -> continue | + {reply, Reply :: term(), + NewModState :: term()} | + {noreply, + NewModState :: term()} | + {async, Work :: function(), + From :: sender(), + NewModState :: term()} | + {stop, Reason :: term(), + NewModState :: term()}. + +-callback handle_exit(pid(), Reason :: term(), + ModState :: term()) -> {noreply, + NewModState :: term()} | + {stop, Reason :: term(), + NewModState :: term()}. + +-callback handoff_starting(handoff_dest(), + ModState :: term()) -> {boolean(), + NewModState :: term()}. + +-callback handoff_cancelled(ModState :: term()) -> {ok, + NewModState :: term()}. + +-callback handoff_finished(handoff_dest(), + ModState :: term()) -> {ok, NewModState :: term()}. + +-callback handle_handoff_command(Request :: term(), + Sender :: sender(), + ModState :: term()) -> {reply, Reply :: term(), + NewModState :: + term()} | + {noreply, + NewModState :: + term()} | + {async, + Work :: function(), + From :: sender(), + NewModState :: + term()} | + {forward, + NewModState :: + term()} | + {drop, + NewModState :: + term()} | + {stop, Reason :: term(), + NewModState :: term()}. + +-callback handle_handoff_data(binary(), + ModState :: term()) -> {reply, + ok | + {error, Reason :: term()}, + NewModState :: term()}. + +-callback encode_handoff_item(Key :: term(), + Value :: term()) -> corrupted | binary(). + +-callback is_empty(ModState :: term()) -> {boolean(), + NewModState :: term()} | + {false, Size :: pos_integer(), + NewModState :: term()}. + +-callback terminate(Reason :: term(), + ModState :: term()) -> ok. + +-callback delete(ModState :: term()) -> {ok, + NewModState :: term()}. %% This commands are not executed inside the VNode, instead they are %% part of the vnode_proxy contract. @@ -157,12 +192,11 @@ %% BUT DO NOT call expensive functions from them there is a special hell %% for people doing that! (it's called overflowing message queue hell and is %% really nasty!) --callback handle_overload_command(Request::term(), Sender::sender(), - Idx::partition()) -> - ok. +-callback handle_overload_command(Request :: term(), + Sender :: sender(), Idx :: partition()) -> ok. --callback handle_overload_info(Request::term(), Idx::partition()) -> - ok. +-callback handle_overload_info(Request :: term(), + Idx :: partition()) -> ok. %% handle_exit/3 is an optional behaviour callback that can be implemented. %% It will be called in the case that a process that is linked to the vnode @@ -188,125 +222,226 @@ %% -spec handle_info(term(), term()) -> {ok, term()} -define(DEFAULT_TIMEOUT, 60000). + -define(LOCK_RETRY_TIMEOUT, 10000). --record(state, { - index :: partition(), - mod :: module(), - modstate :: term(), - forward :: node() | [{integer(), node()}], - handoff_target=none :: none | {integer(), node()}, - handoff_pid :: pid() | undefined, - handoff_type :: riak_core_handoff_manager:ho_type() | undefined, - pool_pid :: pid() | undefined, - pool_config :: tuple() | undefined, - manager_event_timer :: reference() | undefined, - inactivity_timeout :: non_neg_integer() - }). + +%% ======== +%% API +%% ======== start_link(Mod, Index, Forward) -> start_link(Mod, Index, 0, Forward). -start_link(Mod, Index, InitialInactivityTimeout, Forward) -> - gen_fsm:start_link(?MODULE, - [Mod, Index, InitialInactivityTimeout, Forward], []). +start_link(Mod, Index, InitialInactivityTimeout, + Forward) -> + gen_fsm_compat:start_link(?MODULE, + [Mod, Index, InitialInactivityTimeout, Forward], + []). +%% #1 - State started +wait_for_init(Vnode) -> + gen_fsm_compat:sync_send_event(Vnode, wait_for_init, + infinity). + +%% #2 - %% Send a command message for the vnode module by Pid - %% typically to do some deferred processing after returning yourself send_command(Pid, Request) -> - gen_fsm:send_event(Pid, ?VNODE_REQ{request=Request}). - + gen_fsm_compat:send_event(Pid, + #riak_vnode_req_v1{request = Request}). %% Sends a command to the FSM that called it after Time %% has passed. --spec send_command_after(integer(), term()) -> reference(). -send_command_after(Time, Request) -> - gen_fsm:send_event_after(Time, ?VNODE_REQ{request=Request}). +-spec send_command_after(integer(), + term()) -> reference(). +send_command_after(Time, Request) -> + gen_fsm_compat:send_event_after(Time, + #riak_vnode_req_v1{request = Request}). -init([Mod, Index, InitialInactivityTimeout, Forward]) -> +init([Module, Index, InitialInactivityTimeout, + Forward]) -> process_flag(trap_exit, true), - State = #state{index=Index, mod=Mod, forward=Forward, inactivity_timeout=InitialInactivityTimeout}, + State = #state{index = Index, mod = Module, + forward = Forward, + inactivity_timeout = InitialInactivityTimeout}, {ok, started, State, 0}. -started(timeout, State = - #state{inactivity_timeout=InitialInactivityTimeout}) -> +started(timeout, + State = #state{inactivity_timeout = + InitialInactivityTimeout}) -> case do_init(State) of - {ok, State2} -> - {next_state, active, State2, InitialInactivityTimeout}; - {error, Reason} -> - {stop, Reason} + {ok, State2} -> + {next_state, active, State2, InitialInactivityTimeout}; + {error, Reason} -> {stop, Reason} end. -started(wait_for_init, _From, State = - #state{inactivity_timeout=InitialInactivityTimeout}) -> +started(wait_for_init, _From, + State = #state{inactivity_timeout = + InitialInactivityTimeout}) -> case do_init(State) of - {ok, State2} -> - {reply, ok, active, State2, InitialInactivityTimeout}; - {error, Reason} -> - {stop, Reason} + {ok, State2} -> + {reply, ok, active, State2, InitialInactivityTimeout}; + {error, Reason} -> {stop, Reason} end. -do_init(State = #state{index=Index, mod=Mod, forward=Forward}) -> - {ModState, Props} = case Mod:init([Index]) of - {ok, MS} -> {MS, []}; - {ok, MS, P} -> {MS, P}; - {error, R} -> {error, R} - end, +do_init(State = #state{index = Index, mod = Module, + forward = Forward}) -> + {ModState, Props} = case Module:init([Index]) of + {ok, MS} -> {MS, []}; + {ok, MS, P} -> {MS, P}; + {error, R} -> {error, R} + end, case {ModState, Props} of - {error, Reason} -> - {error, Reason}; - _ -> - case lists:keyfind(pool, 1, Props) of - {pool, WorkerModule, PoolSize, WorkerArgs}=PoolConfig -> - logger:debug("starting worker pool ~p with size of ~p~n", - [WorkerModule, PoolSize]), - {ok, PoolPid} = riak_core_vnode_worker_pool:start_link(WorkerModule, - PoolSize, - Index, - WorkerArgs, - worker_props); - _ -> - PoolPid = PoolConfig = undefined - end, - riak_core_handoff_manager:remove_exclusion(Mod, Index), - Timeout = application:get_env(riak_core, vnode_inactivity_timeout, ?DEFAULT_TIMEOUT), - Timeout2 = Timeout + riak_core_rand:uniform(Timeout), - State2 = State#state{modstate=ModState, inactivity_timeout=Timeout2, - pool_pid=PoolPid, pool_config=PoolConfig}, - logger:debug("vnode :: ~p/~p :: ~p~n", [Mod, Index, Forward]), - State3 = mod_set_forwarding(Forward, State2), - {ok, State3} + {error, Reason} -> {error, Reason}; + _ -> + PoolConfig = case lists:keyfind(pool, 1, Props) of + {pool, WorkerModule, PoolSize, WorkerArgs} = PoolCfg -> + logger:debug("starting worker pool ~p with size of " + "~p~n", + [WorkerModule, PoolSize]), + {ok, PoolPid} = + riak_core_vnode_worker_pool:start_link(WorkerModule, + PoolSize, + Index, + WorkerArgs, + worker_props), + PoolCfg; + _ -> PoolPid = undefined + end, + riak_core_handoff_manager:remove_exclusion(Module, + Index), + Timeout = application:get_env(riak_core, + vnode_inactivity_timeout, + ?DEFAULT_TIMEOUT), + Timeout2 = Timeout + rand:uniform(Timeout), + State2 = State#state{modstate = ModState, + inactivity_timeout = Timeout2, + pool_pid = PoolPid, pool_config = PoolConfig}, + logger:debug("vnode :: ~p/~p :: ~p~n", + [Module, Index, Forward]), + State3 = mod_set_forwarding(Forward, State2), + {ok, State3} end. wait_for_init(Vnode) -> - gen_fsm:sync_send_event(Vnode, wait_for_init, infinity). + gen_fsm_compat:sync_send_event(Vnode, wait_for_init, + infinity). handoff_error(Vnode, Err, Reason) -> - gen_fsm:send_event(Vnode, {handoff_error, Err, Reason}). + gen_fsm_compat:send_event(Vnode, + {handoff_error, Err, Reason}). +%% #4 - get_mod_index(VNode) -> - gen_fsm:sync_send_all_state_event(VNode, get_mod_index). + gen_fsm_compat:sync_send_all_state_event(VNode, + get_mod_index). +%% #5 set_forwarding(VNode, ForwardTo) -> - gen_fsm:send_all_state_event(VNode, {set_forwarding, ForwardTo}). + gen_fsm_compat:send_all_state_event(VNode, + {set_forwarding, ForwardTo}). +%% #6 trigger_handoff(VNode, TargetIdx, TargetNode) -> - gen_fsm:send_all_state_event(VNode, {trigger_handoff, TargetIdx, TargetNode}). + gen_fsm_compat:send_all_state_event(VNode, + {trigger_handoff, TargetIdx, + TargetNode}). +%% #7 trigger_handoff(VNode, TargetNode) -> - gen_fsm:send_all_state_event(VNode, {trigger_handoff, TargetNode}). + gen_fsm_compat:send_all_state_event(VNode, + {trigger_handoff, TargetNode}). +%% #8 trigger_delete(VNode) -> - gen_fsm:send_all_state_event(VNode, trigger_delete). + gen_fsm_compat:send_all_state_event(VNode, + trigger_delete). +%% #9 core_status(VNode) -> - gen_fsm:sync_send_all_state_event(VNode, core_status). + gen_fsm_compat:sync_send_all_state_event(VNode, + core_status). -continue(State) -> - {next_state, active, State, State#state.inactivity_timeout}. +%% #10 +%% Sends a command to the FSM that called it after Time +%% has passed. +-spec send_command_after(integer(), + term()) -> reference(). -continue(State, NewModState) -> - continue(State#state{modstate=NewModState}). +send_command_after(Time, Request) -> + gen_fsm_compat:send_event_after(Time, + #riak_vnode_req_v1{request = Request}). + +%%%%%%% %new APIs +%% #11 - riak_core_vnode_manager - handle_vnode_event +cast_finish_handoff(VNode) -> + gen_fsm_compat:send_all_state_event(VNode, + finish_handoff). + +%% #12 - riak_core_vnode_manager - handle_vnode_event +cancel_handoff(VNode) -> + gen_fsm_compat:send_all_state_event(VNode, + cancel_handoff). + +%% # - riak_core_vnode_master - command2 +%send_req + +%% # - riak_core_vnode_master - handle_cast/handle_call +send_req(VNode, Req) -> + gen_fsm_compat:send_event(VNode, Req). + +%% # - riak_core_vnode_master - handle_call +send_all_proxy_req(VNode, Req) -> + gen_fsm_compat:send_all_state_event(VNode, Req). + +%% #16 - riak:core_handoff_sender - start_fold_ +handoff_complete(VNode) -> + gen_fsm_compat:send_event(VNode, handoff_complete). + +%% #17 - riak:core_handoff_sender - start_fold_ +resize_transfer_complete(VNode, NotSentAcc) -> + gen_fsm_compat:send_event(VNode, + {resize_transfer_complete, NotSentAcc}). + +%% #18 - riak_core_handoff_receiver - process_message +handoff_data(VNode, MsgData, VNodeTimeout) -> + gen_fsm_compat:sync_send_all_state_event(VNode, + {handoff_data, MsgData}, + VNodeTimeout). + +%% #19 - riak_core_vnode_proxy - handle_cast +unregistered(VNode) -> + gen_fsm_compat:send_event(VNode, unregistered). + +%% @doc Send a reply to a vnode request. If +%% the Ref is undefined just send the reply +%% for compatibility with pre-0.12 requestors. +%% If Ref is defined, send it along with the +%% reply. +%% NOTE: We *always* send the reply using unreliable delivery. +%% +-spec reply(sender(), term()) -> any(). + +reply({fsm, undefined, From}, Reply) -> + riak_core_send_msg:send_event_unreliable(From, Reply); +reply({fsm, Ref, From}, Reply) -> + riak_core_send_msg:send_event_unreliable(From, + {Ref, Reply}); +reply({server, undefined, From}, Reply) -> + riak_core_send_msg:reply_unreliable(From, Reply); +reply({server, Ref, From}, Reply) -> + riak_core_send_msg:reply_unreliable(From, {Ref, Reply}); +reply({raw, Ref, From}, Reply) -> + riak_core_send_msg:bang_unreliable(From, {Ref, Reply}); +reply(ignore, _Reply) -> ok. + +%% @doc Set up a monitor for the pid named by a {@type sender()} vnode +%% argument. If `Sender' was the atom `ignore', this function sets up +%% a monitor on `self()' in order to return a valid (if useless) +%% monitor reference. +-spec monitor(Sender :: sender()) -> Monitor :: + reference(). %% Active vnodes operate in three states: normal, handoff, and forwarding. %% @@ -336,243 +471,252 @@ continue(State, NewModState) -> %% transfers with this vnode as the source. During this time requests that can be forwarded %% to a partition for which the transfer has already completed, are forwarded. All other %% requests are passed to handle_handoff_command. -forward_or_vnode_command(Sender, Request, State=#state{forward=Forward, - mod=Mod, - index=Index}) -> +forward_or_vnode_command(Sender, Request, + State = #state{forward = Forward, mod = Module, + index = Index}) -> Resizing = is_list(Forward), RequestHash = case Resizing of - true -> - Mod:request_hash(Request); - false -> - undefined - end, + true -> Module:request_hash(Request); + false -> undefined + end, case {Forward, RequestHash} of - %% typical vnode operation, no forwarding set, handle request locally - {undefined, _} -> vnode_command(Sender, Request, State); - - %% implicit forwarding after ownership transfer/hinted handoff - {F, _} when not is_list(F) -> - vnode_forward(implicit, {Index, Forward}, Sender, Request, State), - continue(State); - - %% during resize we can't forward a request w/o request hash, always handle locally - {_, undefined} -> vnode_command(Sender, Request, State); - - %% possible forwarding during ring resizing - {_, _} -> - {ok, R} = riak_core_ring_manager:get_my_ring(), - FutureIndex = riak_core_ring:future_index(RequestHash, Index, R), - vnode_resize_command(Sender, Request, FutureIndex, State) + %% typical vnode operation, no forwarding set, handle request locally + {undefined, _} -> vnode_command(Sender, Request, State); + %% implicit forwarding after ownership transfer/hinted handoff + {F, _} when not is_list(F) -> + vnode_forward(implicit, {Index, Forward}, Sender, + Request, State), + continue(State); + %% during resize we can't forward a request w/o request hash, always handle locally + {_, undefined} -> vnode_command(Sender, Request, State); + %% possible forwarding during ring resizing + {_, _} -> + {ok, R} = riak_core_ring_manager:get_my_ring(), + FutureIndex = riak_core_ring:future_index(RequestHash, + Index, R), + vnode_resize_command(Sender, Request, FutureIndex, + State) end. -vnode_command(_Sender, _Request, State=#state{modstate={deleted,_}}) -> +vnode_command(_Sender, _Request, + State = #state{modstate = {deleted, _}}) -> continue(State); -vnode_command(Sender, Request, State=#state{mod=Mod, - modstate=ModState, - pool_pid=Pool}) -> - case catch Mod:handle_command(Request, Sender, ModState) of - {'EXIT', ExitReason} -> - reply(Sender, {vnode_error, ExitReason}), - logger:error("~p command failed ~p", [Mod, ExitReason]), - {stop, ExitReason, State#state{modstate=ModState}}; - continue -> - continue(State, ModState); - {reply, Reply, NewModState} -> - reply(Sender, Reply), - continue(State, NewModState); - {noreply, NewModState} -> - continue(State, NewModState); - {async, Work, From, NewModState} -> - %% dispatch some work to the vnode worker pool - %% the result is sent back to 'From' - riak_core_vnode_worker_pool:handle_work(Pool, Work, From), - continue(State, NewModState); - {stop, Reason, NewModState} -> - {stop, Reason, State#state{modstate=NewModState}} +vnode_command(Sender, Request, + State = #state{mod = Module, modstate = ModState, + pool_pid = Pool}) -> + case catch Module:handle_command(Request, Sender, + ModState) + of + {'EXIT', ExitReason} -> + reply(Sender, {vnode_error, ExitReason}), + logger:error("~p command failed ~p", + [Module, ExitReason]), + {stop, ExitReason, State#state{modstate = ModState}}; + continue -> continue(State, ModState); + {reply, Reply, NewModState} -> + reply(Sender, Reply), continue(State, NewModState); + {noreply, NewModState} -> continue(State, NewModState); + {async, Work, From, NewModState} -> + %% dispatch some work to the vnode worker pool + %% the result is sent back to 'From' + riak_core_vnode_worker_pool:handle_work(Pool, Work, + From), + continue(State, NewModState); + {stop, Reason, NewModState} -> + {stop, Reason, State#state{modstate = NewModState}} end. -vnode_coverage(Sender, Request, KeySpaces, State=#state{index=Index, - mod=Mod, - modstate=ModState, - pool_pid=Pool, - forward=Forward}) -> - %% Check if we should forward - case Forward of - undefined -> - Action = Mod:handle_coverage(Request, KeySpaces, Sender, ModState); - %% handle coverage requests locally during ring resize - Forwards when is_list(Forwards) -> - Action = Mod:handle_coverage(Request, KeySpaces, Sender, ModState); - NextOwner -> - logger:debug("Forwarding coverage ~p -> ~p: ~p~n", [node(), NextOwner, Index]), - riak_core_vnode_master:coverage(Request, {Index, NextOwner}, - KeySpaces, Sender, - riak_core_vnode_master:reg_name(Mod)), - Action = continue - end, - case Action of - continue -> - continue(State, ModState); - {reply, Reply, NewModState} -> - reply(Sender, Reply), - continue(State, NewModState); - {noreply, NewModState} -> - continue(State, NewModState); - {async, Work, From, NewModState} -> - %% dispatch some work to the vnode worker pool - %% the result is sent back to 'From' - riak_core_vnode_worker_pool:handle_work(Pool, Work, From), - continue(State, NewModState); - {stop, Reason, NewModState} -> - {stop, Reason, State#state{modstate=NewModState}} - end. +%% ======================== +%% ======== +%% State, Mode, Init, Terminate +%% ======== +%% ======================== +-record(state, + {index :: partition(), mod :: module(), + modstate :: term(), + forward :: node() | [{integer(), node()}], + handoff_target = none :: none | {integer(), node()}, + handoff_pid :: pid() | undefined, + handoff_type :: + riak_core_handoff_manager:ho_type() | undefined, + pool_pid :: pid() | undefined, + pool_config :: tuple() | undefined, + manager_event_timer :: reference() | undefined, + inactivity_timeout :: non_neg_integer()}). + +init([Module, Index, InitialInactivityTimeout, + Forward]) -> + process_flag(trap_exit, true), + State = #state{index = Index, mod = Module, + forward = Forward, + inactivity_timeout = InitialInactivityTimeout}, + {ok, started, State, 0}. -vnode_handoff_command(Sender, Request, ForwardTo, - State=#state{mod=Mod, - modstate=ModState, - handoff_target=HOTarget, - handoff_type=HOType, - pool_pid=Pool}) -> - case Mod:handle_handoff_command(Request, Sender, ModState) of - {reply, Reply, NewModState} -> - reply(Sender, Reply), - continue(State, NewModState); - {noreply, NewModState} -> - continue(State, NewModState); - {async, Work, From, NewModState} -> - %% dispatch some work to the vnode worker pool - %% the result is sent back to 'From' - riak_core_vnode_worker_pool:handle_work(Pool, Work, From), - continue(State, NewModState); - {forward, NewModState} -> - forward_request(HOType, Request, HOTarget, ForwardTo, Sender, State), - continue(State, NewModState); - {forward, NewReq, NewModState} -> - forward_request(HOType, NewReq, HOTarget, ForwardTo, Sender, State), - continue(State, NewModState); - {drop, NewModState} -> - continue(State, NewModState); - {stop, Reason, NewModState} -> - {stop, Reason, State#state{modstate=NewModState}} +terminate(Reason, _StateName, + #state{mod = Module, modstate = ModState, + pool_pid = Pool}) -> + %% Shutdown if the pool is still alive and a normal `Reason' is + %% given - there could be a race on delivery of the unregistered + %% event and successfully shutting down the pool. + try case is_pid(Pool) andalso + is_process_alive(Pool) andalso (?NORMAL_REASON(Reason)) + of + true -> + riak_core_vnode_worker_pool:shutdown_pool(Pool, 60000); + _ -> ok + end + catch + Type:Reason:Stacktrace -> + logger:error("Error while shutting down vnode worker " + "pool ~p:~p trace : ~p", + [Type, Reason, Stacktrace]) + after + case ModState of + %% Handoff completed, Module:delete has been called, now terminate. + {deleted, ModState1} -> + Module:terminate(Reason, ModState1); + _ -> Module:terminate(Reason, ModState) + end end. -%% @private wrap the request for resize forwards, and use the resize -%% target. -forward_request(resize, Request, _HOTarget, ResizeTarget, Sender, State) -> - %% resize op and transfer ongoing - vnode_forward(resize, ResizeTarget, Sender, {resize_forward, Request}, State); -forward_request(undefined, Request, _HOTarget, ResizeTarget, Sender, State) -> - %% resize op ongoing, no resize transfer ongoing, arrive here - %% via forward_or_vnode_command - vnode_forward(resize, ResizeTarget, Sender, {resize_forward, Request}, State); -forward_request(_, Request, HOTarget, _ResizeTarget, Sender, State) -> - %% normal explicit forwarding during owhership transfer - vnode_forward(explicit, HOTarget, Sender, Request, State). - -vnode_forward(Type, ForwardTo, Sender, Request, State) -> - logger:debug("Forwarding (~p) {~p,~p} -> ~p~n", - [Type, State#state.index, node(), ForwardTo]), - riak_core_vnode_master:command_unreliable(ForwardTo, Request, Sender, - riak_core_vnode_master:reg_name(State#state.mod)). +code_change(_OldVsn, StateName, State, _Extra) -> + {ok, StateName, State}. -%% @doc during ring resizing if we have completed a transfer to the index that will -%% handle request in future ring we forward to it. Otherwise we delegate -%% to the local vnode like other requests during handoff -vnode_resize_command(Sender, Request, FutureIndex, - State=#state{forward=Forward}) when is_list(Forward) -> - case lists:keyfind(FutureIndex, 1, Forward) of - false -> vnode_command(Sender, Request, State); - {FutureIndex, FutureOwner} -> vnode_handoff_command(Sender, Request, - {FutureIndex, FutureOwner}, - State) +%% ======================== +%% ======== +%% States +%% ======== +%% ======================== + +%% started +%% ======== +started(timeout, + State = #state{inactivity_timeout = + InitialInactivityTimeout}) -> + case do_init(State) of + {ok, State2} -> + {next_state, active, State2, InitialInactivityTimeout}; + {error, Reason} -> {stop, Reason} end. +started(wait_for_init, _From, + State = #state{inactivity_timeout = + InitialInactivityTimeout}) -> + case do_init(State) of + {ok, State2} -> + {reply, ok, active, State2, InitialInactivityTimeout}; + {error, Reason} -> {stop, Reason} + end. -active(timeout, State=#state{mod=Mod, index=Idx}) -> - riak_core_vnode_manager:vnode_event(Mod, Idx, self(), inactive), +%%active +%%%%%%%%%%%% +active(timeout, + State = #state{mod = Module, index = Idx}) -> + riak_core_vnode_manager:vnode_event(Module, Idx, self(), + inactive), continue(State); -active(#riak_coverage_req_v1{keyspaces=KeySpaces, - request=Request, - sender=Sender}, State) -> +active(#riak_coverage_req_v1{keyspaces = KeySpaces, + request = Request, sender = Sender}, + State) -> %% Coverage request handled in handoff and non-handoff. Will be forwarded if set. vnode_coverage(Sender, Request, KeySpaces, State); -active(#riak_vnode_req_v1{sender=Sender, request={resize_forward, Request}}, State) -> +active(#riak_vnode_req_v1{sender = Sender, + request = {resize_forward, Request}}, + State) -> vnode_command(Sender, Request, State); -active(#riak_vnode_req_v1{sender=Sender, request=Request}, - State=#state{handoff_target=HT}) when HT =:= none -> +active(#riak_vnode_req_v1{sender = Sender, + request = Request}, + State = #state{handoff_target = HT}) + when HT =:= none -> forward_or_vnode_command(Sender, Request, State); -active(#riak_vnode_req_v1{sender=Sender, request=Request}, - State=#state{handoff_type=resize, - handoff_target={HOIdx,HONode}, - index=Index, - forward=Forward, - mod=Mod}) -> - RequestHash = Mod:request_hash(Request), +active(#riak_vnode_req_v1{sender = Sender, + request = Request}, + State = #state{handoff_type = resize, + handoff_target = {HOIdx, HONode}, index = Index, + forward = Forward, mod = Module}) -> + RequestHash = Module:request_hash(Request), case RequestHash of - %% will never have enough information to forward request so only handle locally - undefined -> vnode_command(Sender, Request, State); - _ -> - {ok, R} = riak_core_ring_manager:get_my_ring(), - FutureIndex = riak_core_ring:future_index(RequestHash, Index, R), - case FutureIndex of - %% request for portion of keyspace currently being transferred - HOIdx -> vnode_handoff_command(Sender, Request, - {HOIdx, HONode}, State); - %% some portions of keyspace already transferred - _Other when is_list(Forward) -> - vnode_resize_command(Sender, Request, FutureIndex, State); - %% some portions of keyspace not already transferred - _Other -> vnode_command(Sender, Request, State) - end + %% will never have enough information to forward request so only handle locally + undefined -> vnode_command(Sender, Request, State); + _ -> + {ok, R} = riak_core_ring_manager:get_my_ring(), + FutureIndex = riak_core_ring:future_index(RequestHash, + Index, R), + case FutureIndex of + %% request for portion of keyspace currently being transferred + HOIdx -> + vnode_handoff_command(Sender, Request, {HOIdx, HONode}, + State); + %% some portions of keyspace already transferred + _Other when is_list(Forward) -> + vnode_resize_command(Sender, Request, FutureIndex, + State); + %% some portions of keyspace not already transferred + _Other -> vnode_command(Sender, Request, State) + end end; -active(#riak_vnode_req_v1{sender=Sender, request=Request},State) -> - vnode_handoff_command(Sender, Request, State#state.handoff_target, State); +active(#riak_vnode_req_v1{sender = Sender, + request = Request}, + State) -> + vnode_handoff_command(Sender, Request, + State#state.handoff_target, State); active(handoff_complete, State) -> - State2 = start_manager_event_timer(handoff_complete, State), + State2 = start_manager_event_timer(handoff_complete, + State), continue(State2); -active({resize_transfer_complete, SeenIdxs}, State=#state{mod=Mod, - modstate=ModState, - handoff_target=Target}) -> +active({resize_transfer_complete, SeenIdxs}, + State = #state{mod = Module, modstate = ModState, + handoff_target = Target}) -> case Target of - none -> continue(State); - _ -> - %% TODO: refactor similarties w/ finish_handoff handle_event - {ok, NewModState} = Mod:handoff_finished(Target, ModState), - finish_handoff(SeenIdxs, State#state{modstate=NewModState}) + none -> continue(State); + _ -> + %% TODO: refactor similarties w/ finish_handoff handle_event + {ok, NewModState} = Module:handoff_finished(Target, + ModState), + finish_handoff(SeenIdxs, + State#state{modstate = NewModState}) end; active({handoff_error, _Err, _Reason}, State) -> - State2 = start_manager_event_timer(handoff_error, State), + State2 = start_manager_event_timer(handoff_error, + State), continue(State2); active({send_manager_event, Event}, State) -> State2 = start_manager_event_timer(Event, State), continue(State2); active({trigger_handoff, TargetNode}, State) -> - active({trigger_handoff, State#state.index, TargetNode}, State); -active({trigger_handoff, TargetIdx, TargetNode}, State) -> - maybe_handoff(TargetIdx, TargetNode, State); -active(trigger_delete, State=#state{mod=Mod,modstate=ModState,index=Idx}) -> - case mark_delete_complete(Idx, Mod) of - {ok, _NewRing} -> - {ok, NewModState} = Mod:delete(ModState), - logger:debug("~p ~p vnode deleted", [Idx, Mod]); - _ -> NewModState = ModState + active({trigger_handoff, State#state.index, TargetNode}, + State); +active({trigger_handoff, TargetIdx, TargetNode}, + State) -> + maybe_handoff(TargetIdx, TargetNode, State); +active(trigger_delete, + State = #state{mod = Module, modstate = ModState, + index = Idx}) -> + case mark_delete_complete(Idx, Module) of + {ok, _NewRing} -> + {ok, NewModState} = Module:delete(ModState), + logger:debug("~p ~p vnode deleted", [Idx, Module]); + _ -> NewModState = ModState end, maybe_shutdown_pool(State), - riak_core_vnode_manager:unregister_vnode(Idx, Mod), - continue(State#state{modstate={deleted,NewModState}}); -active(unregistered, State=#state{mod=Mod, index=Index}) -> + riak_core_vnode_manager:unregister_vnode(Idx, Module), + continue(State#state{modstate = + {deleted, NewModState}}); +active(unregistered, + State = #state{mod = Module, index = Index}) -> %% Add exclusion so the ring handler will not try to spin this vnode %% up until it receives traffic. - riak_core_handoff_manager:add_exclusion(Mod, Index), + riak_core_handoff_manager:add_exclusion(Module, Index), logger:debug("~p ~p vnode excluded and unregistered.", - [Index, Mod]), - {stop, normal, State#state{handoff_target=none, - handoff_type=undefined, - pool_pid=undefined}}. + [Index, Module]), + {stop, normal, + State#state{handoff_target = none, + handoff_type = undefined, pool_pid = undefined}}. active(_Event, _From, State) -> Reply = ok, - {reply, Reply, active, State, State#state.inactivity_timeout}. + {reply, Reply, active, State, + State#state.inactivity_timeout}. %% This code lives in riak_core_vnode rather than riak_core_vnode_manager %% because the ring_trans call is a synchronous call to the ring manager, @@ -580,468 +724,878 @@ active(_Event, _From, State) -> %% manager. Blocking the manager can impact all vnodes. This code is safe %% to execute on multiple parallel vnodes because of the synchronization %% afforded by having all ring changes go through the single ring manager. -mark_handoff_complete(SrcIdx, Target, SeenIdxs, Mod, resize) -> +mark_handoff_complete(SrcIdx, Target, SeenIdxs, Mod, + resize) -> Prev = node(), Source = {SrcIdx, Prev}, - Result = riak_core_ring_manager:ring_trans( - fun(Ring, _) -> - Owner = riak_core_ring:index_owner(Ring,SrcIdx), - Status = riak_core_ring:resize_transfer_status(Ring, Source, - Target, Mod), + TransFun = fun (Ring, _) -> + Owner = riak_core_ring:index_owner(Ring, SrcIdx), + Status = riak_core_ring:resize_transfer_status(Ring, + Source, + Target, + Mod), case {Owner, Status} of - {Prev, awaiting} -> - F = fun(SeenIdx, RingAcc) -> - riak_core_ring:schedule_resize_transfer(RingAcc, - Source, - SeenIdx) - end, - Ring2 = lists:foldl(F, Ring, ordsets:to_list(SeenIdxs)), - Ring3 = riak_core_ring:resize_transfer_complete(Ring2, - Source, - Target, - Mod), - %% local ring optimization (see below) - {set_only, Ring3}; - _ -> - ignore + {Prev, awaiting} -> + F = fun (SeenIdx, RingAcc) -> + riak_core_ring:schedule_resize_transfer(RingAcc, + Source, + SeenIdx) + end, + Ring2 = lists:foldl(F, Ring, + ordsets:to_list(SeenIdxs)), + Ring3 = + riak_core_ring:resize_transfer_complete(Ring2, + Source, + Target, + Mod), + %% local ring optimization (see below) + {set_only, Ring3}; + _ -> ignore end - end, []), + end, + Result = riak_core_ring_manager:ring_trans(TransFun, + []), case Result of - {ok, _NewRing} -> resize; - _ -> continue + {ok, _NewRing} -> resize; + _ -> continue end; mark_handoff_complete(Idx, {Idx, New}, [], Mod, _) -> Prev = node(), - Result = riak_core_ring_manager:ring_trans( - fun(Ring, _) -> - Owner = riak_core_ring:index_owner(Ring, Idx), - {_, NextOwner, Status} = riak_core_ring:next_owner(Ring, Idx, Mod), - NewStatus = riak_core_ring:member_status(Ring, New), - - case {Owner, NextOwner, NewStatus, Status} of - {Prev, New, _, awaiting} -> - Ring2 = riak_core_ring:handoff_complete(Ring, Idx, Mod), - %% Optimization. Only alter the local ring without - %% triggering a gossip, thus implicitly coalescing - %% multiple vnode handoff completion events. In the - %% future we should decouple vnode handoff state from - %% the ring structure in order to make gossip independent - %% of ring size. - {set_only, Ring2}; - _ -> - ignore - end - end, []), - + Result = riak_core_ring_manager:ring_trans(fun (Ring, + _) -> + Owner = + riak_core_ring:index_owner(Ring, + Idx), + {_, NextOwner, Status} = + riak_core_ring:next_owner(Ring, + Idx, + Mod), + NewStatus = + riak_core_ring:member_status(Ring, + New), + case {Owner, NextOwner, + NewStatus, Status} + of + {Prev, New, _, + awaiting} -> + Ring2 = + riak_core_ring:handoff_complete(Ring, + Idx, + Mod), + %% Optimization. Only alter the local ring without + %% triggering a gossip, thus implicitly coalescing + %% multiple vnode handoff completion events. In the + %% future we should decouple vnode handoff state from + %% the ring structure in order to make gossip independent + %% of ring size. + {set_only, Ring2}; + _ -> ignore + end + end, + []), case Result of - {ok, NewRing} -> - NewRing = NewRing; - _ -> - {ok, NewRing} = riak_core_ring_manager:get_my_ring() + {ok, NewRing} -> NewRing = NewRing; + _ -> + {ok, NewRing} = riak_core_ring_manager:get_my_ring() end, - Owner = riak_core_ring:index_owner(NewRing, Idx), - {_, NextOwner, Status} = riak_core_ring:next_owner(NewRing, Idx, Mod), + {_, NextOwner, Status} = + riak_core_ring:next_owner(NewRing, Idx, Mod), NewStatus = riak_core_ring:member_status(NewRing, New), - case {Owner, NextOwner, NewStatus, Status} of - {_, _, invalid, _} -> - %% Handing off to invalid node, don't give-up data. - continue; - {Prev, New, _, _} -> - forward; - {Prev, _, _, _} -> - %% Handoff wasn't to node that is scheduled in next, so no change. - continue; - {_, _, _, _} -> - shutdown + {_, _, invalid, _} -> + %% Handing off to invalid node, don't give-up data. + continue; + {Prev, New, _, _} -> forward; + {Prev, _, _, _} -> + %% Handoff wasn't to node that is scheduled in next, so no change. + continue; + {_, _, _, _} -> shutdown end. -finish_handoff(State) -> - finish_handoff([], State). - -finish_handoff(SeenIdxs, State=#state{mod=Mod, - modstate=ModState, - index=Idx, - handoff_target=Target, - handoff_type=HOType}) -> - case mark_handoff_complete(Idx, Target, SeenIdxs, Mod, HOType) of - continue -> - continue(State#state{handoff_target=none,handoff_type=undefined}); - resize -> - CurrentForwarding = resize_forwarding(State), - NewForwarding = [Target | CurrentForwarding], - State2 = mod_set_forwarding(NewForwarding, State), - continue(State2#state{handoff_target=none, - handoff_type=undefined, - forward=NewForwarding}); - Res when Res == forward; Res == shutdown -> - {_, HN} = Target, - %% Have to issue the delete now. Once unregistered the - %% vnode master will spin up a new vnode on demand. - %% Shutdown the async pool beforehand, don't want callbacks - %% running on non-existant data. - maybe_shutdown_pool(State), - {ok, NewModState} = Mod:delete(ModState), - logger:debug("~p ~p vnode finished handoff and deleted.", - [Idx, Mod]), - riak_core_vnode_manager:unregister_vnode(Idx, Mod), - logger:debug("vnode hn/fwd :: ~p/~p :: ~p -> ~p~n", - [State#state.mod, State#state.index, State#state.forward, HN]), - State2 = mod_set_forwarding(HN, State), - continue(State2#state{modstate={deleted,NewModState}, % like to fail if used - handoff_target=none, - handoff_type=undefined, - forward=HN}) +finish_handoff(State) -> finish_handoff([], State). + +finish_handoff(SeenIdxs, + State = #state{mod = Module, modstate = ModState, + index = Idx, handoff_target = Target, + handoff_type = HOType}) -> + case mark_handoff_complete(Idx, Target, SeenIdxs, + Module, HOType) + of + continue -> + continue(State#state{handoff_target = none, + handoff_type = undefined}); + resize -> + CurrentForwarding = resize_forwarding(State), + NewForwarding = [Target | CurrentForwarding], + State2 = mod_set_forwarding(NewForwarding, State), + continue(State2#state{handoff_target = none, + handoff_type = undefined, + forward = NewForwarding}); + Res when Res == forward; Res == shutdown -> + {_, HN} = Target, + %% Have to issue the delete now. Once unregistered the + %% vnode master will spin up a new vnode on demand. + %% Shutdown the async pool beforehand, don't want callbacks + %% running on non-existant data. + maybe_shutdown_pool(State), + {ok, NewModState} = Module:delete(ModState), + logger:debug("~p ~p vnode finished handoff and deleted.", + [Idx, Module]), + riak_core_vnode_manager:unregister_vnode(Idx, Module), + logger:debug("vnode hn/fwd :: ~p/~p :: ~p -> ~p~n", + [State#state.mod, State#state.index, + State#state.forward, HN]), + State2 = mod_set_forwarding(HN, State), + continue(State2#state{modstate = + {deleted, + NewModState}, % like to fail if used + handoff_target = none, handoff_type = undefined, + forward = HN}) end. -maybe_shutdown_pool(#state{pool_pid=Pool}) -> +maybe_shutdown_pool(#state{pool_pid = Pool}) -> case is_pid(Pool) of - true -> - %% state.pool_pid will be cleaned up by handle_info message. - riak_core_vnode_worker_pool:shutdown_pool(Pool, 60000); - _ -> - ok + true -> + %% state.pool_pid will be cleaned up by handle_info message. + riak_core_vnode_worker_pool:shutdown_pool(Pool, 60000); + _ -> ok end. -resize_forwarding(#state{forward=F}) when is_list(F) -> +resize_forwarding(#state{forward = F}) + when is_list(F) -> F; -resize_forwarding(_) -> - []. +resize_forwarding(_) -> []. mark_delete_complete(Idx, Mod) -> - Result = riak_core_ring_manager:ring_trans( - fun(Ring, _) -> - Type = riak_core_ring:vnode_type(Ring, Idx), - {_, Next, Status} = riak_core_ring:next_owner(Ring, Idx), - case {Type, Next, Status} of - {resized_primary, '$delete', awaiting} -> - Ring3 = riak_core_ring:deletion_complete(Ring, Idx, Mod), - %% Use local ring optimization like mark_handoff_complete - {set_only, Ring3}; - {{fallback, _}, '$delete', awaiting} -> - Ring3 = riak_core_ring:deletion_complete(Ring, Idx, Mod), - %% Use local ring optimization like mark_handoff_complete - {set_only, Ring3}; - _ -> - ignore - end - end, - []), + Result = riak_core_ring_manager:ring_trans(fun (Ring, + _) -> + Type = + riak_core_ring:vnode_type(Ring, + Idx), + {_, Next, Status} = + riak_core_ring:next_owner(Ring, + Idx), + case {Type, Next, Status} + of + {resized_primary, + '$delete', + awaiting} -> + Ring3 = + riak_core_ring:deletion_complete(Ring, + Idx, + Mod), + %% Use local ring optimization like mark_handoff_complete + {set_only, Ring3}; + {{fallback, _}, + '$delete', + awaiting} -> + Ring3 = + riak_core_ring:deletion_complete(Ring, + Idx, + Mod), + %% Use local ring optimization like mark_handoff_complete + {set_only, Ring3}; + _ -> ignore + end + end, + []), Result. handle_event({set_forwarding, undefined}, _StateName, - State=#state{modstate={deleted, _ModState}}) -> + State = #state{modstate = {deleted, _ModState}}) -> %% The vnode must forward requests when in the deleted state, therefore %% ignore requests to stop forwarding. continue(State); -handle_event({set_forwarding, ForwardTo}, _StateName, State) -> +handle_event({set_forwarding, ForwardTo}, _StateName, + State) -> logger:debug("vnode fwd :: ~p/~p :: ~p -> ~p~n", - [State#state.mod, State#state.index, State#state.forward, ForwardTo]), + [State#state.mod, State#state.index, + State#state.forward, ForwardTo]), State2 = mod_set_forwarding(ForwardTo, State), - continue(State2#state{forward=ForwardTo}); + continue(State2#state{forward = ForwardTo}); handle_event(finish_handoff, _StateName, - State=#state{modstate={deleted, _ModState}}) -> + State = #state{modstate = {deleted, _ModState}}) -> stop_manager_event_timer(State), - continue(State#state{handoff_target=none}); -handle_event(finish_handoff, _StateName, State=#state{mod=Mod, - modstate=ModState, - handoff_target=Target}) -> + continue(State#state{handoff_target = none}); +handle_event(finish_handoff, _StateName, + State = #state{mod = Module, modstate = ModState, + handoff_target = Target}) -> stop_manager_event_timer(State), case Target of - none -> - continue(State); - _ -> - {ok, NewModState} = Mod:handoff_finished(Target, ModState), - finish_handoff(State#state{modstate=NewModState}) + none -> continue(State); + _ -> + {ok, NewModState} = Module:handoff_finished(Target, + ModState), + finish_handoff(State#state{modstate = NewModState}) end; -handle_event(cancel_handoff, _StateName, State=#state{mod=Mod, - modstate=ModState}) -> +handle_event(cancel_handoff, _StateName, + State = #state{mod = Module, modstate = ModState}) -> %% it would be nice to pass {Err, Reason} to the vnode but the %% API doesn't currently allow for that. stop_manager_event_timer(State), case State#state.handoff_target of - none -> - continue(State); - _ -> - {ok, NewModState} = Mod:handoff_cancelled(ModState), - continue(State#state{handoff_target=none, - handoff_type=undefined, - modstate=NewModState}) + none -> continue(State); + _ -> + {ok, NewModState} = Module:handoff_cancelled(ModState), + continue(State#state{handoff_target = none, + handoff_type = undefined, + modstate = NewModState}) end; -handle_event({trigger_handoff, TargetNode}, StateName, State) -> - handle_event({trigger_handoff, State#state.index, TargetNode}, StateName, State); -handle_event({trigger_handoff, _TargetIdx, _TargetNode}, _StateName, - State=#state{modstate={deleted, _ModState}}) -> +handle_event({trigger_handoff, TargetNode}, StateName, + State) -> + handle_event({trigger_handoff, State#state.index, + TargetNode}, + StateName, State); +handle_event({trigger_handoff, _TargetIdx, _TargetNode}, + _StateName, + State = #state{modstate = {deleted, _ModState}}) -> continue(State); -handle_event(R={trigger_handoff, _TargetIdx, _TargetNode}, _StateName, State) -> +handle_event(R = {trigger_handoff, _TargetIdx, + _TargetNode}, + _StateName, State) -> active(R, State); -handle_event(trigger_delete, _StateName, State=#state{modstate={deleted,_}}) -> +handle_event(trigger_delete, _StateName, + State = #state{modstate = {deleted, _}}) -> continue(State); handle_event(trigger_delete, _StateName, State) -> active(trigger_delete, State); -handle_event(R=#riak_vnode_req_v1{}, _StateName, State) -> +handle_event(R = #riak_vnode_req_v1{}, _StateName, + State) -> active(R, State); -handle_event(R=#riak_coverage_req_v1{}, _StateName, State) -> +handle_event(R = #riak_coverage_req_v1{}, _StateName, + State) -> active(R, State). +%%handle_sync_event +%%%%%%%%%%%%%%%%%%%% -handle_sync_event(current_state, _From, StateName, State) -> +handle_sync_event(current_state, _From, StateName, + State) -> {reply, {StateName, State}, StateName, State}; handle_sync_event(get_mod_index, _From, StateName, - State=#state{index=Idx,mod=Mod}) -> - {reply, {Mod, Idx}, StateName, State, State#state.inactivity_timeout}; -handle_sync_event({handoff_data,_BinObj}, _From, StateName, - State=#state{modstate={deleted, _ModState}}) -> + State = #state{index = Idx, mod = Mod}) -> + {reply, {Mod, Idx}, StateName, State, + State#state.inactivity_timeout}; +handle_sync_event({handoff_data, _BinObj}, _From, + StateName, + State = #state{modstate = {deleted, _ModState}}) -> {reply, {error, vnode_exiting}, StateName, State, State#state.inactivity_timeout}; -handle_sync_event({handoff_data,BinObj}, _From, StateName, - State=#state{mod=Mod, modstate=ModState}) -> - case Mod:handle_handoff_data(BinObj, ModState) of - {reply, ok, NewModState} -> - {reply, ok, StateName, State#state{modstate=NewModState}, - State#state.inactivity_timeout}; - {reply, {error, Err}, NewModState} -> - logger:error("~p failed to store handoff obj: ~p", [Mod, Err]), - {reply, {error, Err}, StateName, State#state{modstate=NewModState}, - State#state.inactivity_timeout} +handle_sync_event({handoff_data, BinObj}, _From, + StateName, + State = #state{mod = Module, modstate = ModState}) -> + case Module:handle_handoff_data(BinObj, ModState) of + {reply, ok, NewModState} -> + {reply, ok, StateName, + State#state{modstate = NewModState}, + State#state.inactivity_timeout}; + {reply, {error, Err}, NewModState} -> + logger:error("~p failed to store handoff obj: ~p", + [Module, Err]), + {reply, {error, Err}, StateName, + State#state{modstate = NewModState}, + State#state.inactivity_timeout} end; -handle_sync_event(core_status, _From, StateName, State=#state{index=Index, - mod=Mod, - modstate=ModState, - handoff_target=HT, - forward=FN}) -> +handle_sync_event(core_status, _From, StateName, + State = #state{index = Index, mod = Module, + modstate = ModState, handoff_target = HT, + forward = FN}) -> Mode = case {FN, HT} of - {undefined, none} -> - active; - {undefined, HT} -> - handoff; - {FN, none} -> - forward; - _ -> - undefined + {undefined, none} -> active; + {undefined, HT} -> handoff; + {FN, none} -> forward; + _ -> undefined end, - Status = [{index, Index}, {mod, Mod}] ++ - case FN of - undefined -> - []; - _ -> - [{forward, FN}] - end++ - case HT of - none -> - []; - _ -> - [{handoff_target, HT}] - end ++ - case ModState of - {deleted, _} -> - [deleted]; - _ -> - [] - end, - {reply, {Mode, Status}, StateName, State, State#state.inactivity_timeout}. - -handle_info({'$vnode_proxy_ping', From, Ref, Msgs}, StateName, State) -> - riak_core_vnode_proxy:cast(From, {vnode_proxy_pong, Ref, Msgs}), - {next_state, StateName, State, State#state.inactivity_timeout}; - -handle_info({'EXIT', Pid, Reason}, - _StateName, - State=#state{mod=Mod, - index=Index, - pool_pid=Pid, - pool_config=PoolConfig}) -> + Status = [{index, Index}, {mod, Module}] ++ + case FN of + undefined -> []; + _ -> [{forward, FN}] + end + ++ + case HT of + none -> []; + _ -> [{handoff_target, HT}] + end + ++ + case ModState of + {deleted, _} -> [deleted]; + _ -> [] + end, + {reply, {Mode, Status}, StateName, State, + State#state.inactivity_timeout}. + +%%handle_info +%%%%%%%%%%%%%% + +handle_info({'$vnode_proxy_ping', From, Ref, Msgs}, + StateName, State) -> + riak_core_vnode_proxy:cast(From, + {vnode_proxy_pong, Ref, Msgs}), + {next_state, StateName, State, + State#state.inactivity_timeout}; +handle_info({'EXIT', Pid, Reason}, _StateName, + State = #state{mod = Module, index = Index, + pool_pid = Pid, pool_config = PoolConfig}) -> case Reason of - Reason when Reason == normal; Reason == shutdown -> - continue(State#state{pool_pid=undefined}); - _ -> - logger:error("~p ~p worker pool crashed ~p\n", [Index, Mod, Reason]), - {pool, WorkerModule, PoolSize, WorkerArgs}=PoolConfig, - logger:debug("starting worker pool ~p with size " - "of ~p for vnode ~p.", - [WorkerModule, PoolSize, Index]), - {ok, NewPoolPid} = - riak_core_vnode_worker_pool:start_link(WorkerModule, - PoolSize, - Index, - WorkerArgs, - worker_props), - continue(State#state{pool_pid=NewPoolPid}) - end; - -handle_info({'DOWN',_Ref,process,_Pid,normal}, _StateName, - State=#state{modstate={deleted, _}}) -> + Reason when Reason == normal; Reason == shutdown -> + continue(State#state{pool_pid = undefined}); + _ -> + logger:error("~p ~p worker pool crashed ~p\n", + [Index, Module, Reason]), + {pool, WorkerModule, PoolSize, WorkerArgs} = PoolConfig, + logger:debug("starting worker pool ~p with size of " + "~p for vnode ~p.", + [WorkerModule, PoolSize, Index]), + {ok, NewPoolPid} = + riak_core_vnode_worker_pool:start_link(WorkerModule, + PoolSize, Index, + WorkerArgs, worker_props), + continue(State#state{pool_pid = NewPoolPid}) + end; +handle_info({'DOWN', _Ref, process, _Pid, normal}, + _StateName, State = #state{modstate = {deleted, _}}) -> %% these messages are produced by riak_kv_vnode's aae tree %% monitors; they are harmless, so don't yell about them. also %% only dustbin them in the deleted modstate, because pipe vnodes %% need them in other states continue(State); handle_info(Info, _StateName, - State=#state{mod=Mod,modstate={deleted, _},index=Index}) -> - logger:info("~p ~p ignored handle_info ~p - vnode unregistering\n", - [Index, Mod, Info]), + State = #state{mod = Module, modstate = {deleted, _}, + index = Index}) -> + logger:info("~p ~p ignored handle_info ~p - vnode " + "unregistering\n", + [Index, Module, Info]), continue(State); -handle_info({'EXIT', Pid, Reason}, StateName, State=#state{mod=Mod,modstate=ModState}) -> +handle_info({'EXIT', Pid, Reason}, StateName, + State = #state{mod = Module, modstate = ModState}) -> %% A linked processes has died so use the %% handle_exit callback to allow the vnode %% process to take appropriate action. %% If the function is not implemented default %% to crashing the process. - try - case Mod:handle_exit(Pid, Reason, ModState) of - {noreply,NewModState} -> - {next_state, StateName, State#state{modstate=NewModState}, - State#state.inactivity_timeout}; - {stop, Reason1, NewModState} -> - {stop, Reason1, State#state{modstate=NewModState}} + try case Module:handle_exit(Pid, Reason, ModState) of + {noreply, NewModState} -> + {next_state, StateName, + State#state{modstate = NewModState}, + State#state.inactivity_timeout}; + {stop, Reason1, NewModState} -> + {stop, Reason1, State#state{modstate = NewModState}} end catch - _ErrorType:undef -> - {stop, linked_process_crash, State} + _ErrorType:undef -> {stop, linked_process_crash, State} end; +handle_info(Info, StateName, + State = #state{mod = Module, modstate = ModState}) -> + case erlang:function_exported(Module, handle_info, 2) of + true -> + {ok, NewModState} = Module:handle_info(Info, ModState), + {next_state, StateName, + State#state{modstate = NewModState}, + State#state.inactivity_timeout}; + false -> + {next_state, StateName, State, + State#state.inactivity_timeout} + end. -handle_info(Info, StateName, State=#state{mod=Mod,modstate=ModState}) -> - case erlang:function_exported(Mod, handle_info, 2) of - true -> - {ok, NewModState} = Mod:handle_info(Info, ModState), - {next_state, StateName, State#state{modstate=NewModState}, - State#state.inactivity_timeout}; - false -> - {next_state, StateName, State, State#state.inactivity_timeout} +%% ======================== +%% ======== +%% Internal Helper Functions +%% ======== +%% ======================== +do_init(State = #state{index = Index, mod = Module, + forward = Forward}) -> + {ModState, Props} = case Module:init([Index]) of + {ok, MS} -> {MS, []}; + {ok, MS, P} -> {MS, P}; + {error, R} -> {error, R} + end, + case {ModState, Props} of + {error, Reason} -> {error, Reason}; + _ -> + PoolConfig = case lists:keyfind(pool, 1, Props) of + {pool, WorkerModule, PoolSize, WorkerArgs} = PoolCfg -> + logger:debug("starting worker pool ~p with size of " + "~p~n", + [WorkerModule, PoolSize]), + {ok, PoolPid} = + riak_core_vnode_worker_pool:start_link(WorkerModule, + PoolSize, + Index, + WorkerArgs, + worker_props), + PoolCfg; + _ -> PoolPid = undefined + end, + riak_core_handoff_manager:remove_exclusion(Module, + Index), + Timeout = application:get_env(riak_core, + vnode_inactivity_timeout, + ?DEFAULT_TIMEOUT), + Timeout2 = Timeout + rand:uniform(Timeout), + State2 = State#state{modstate = ModState, + inactivity_timeout = Timeout2, + pool_pid = PoolPid, pool_config = PoolConfig}, + logger:debug("vnode :: ~p/~p :: ~p~n", + [Module, Index, Forward]), + State3 = mod_set_forwarding(Forward, State2), + {ok, State3} end. -terminate(Reason, _StateName, #state{mod=Mod, modstate=ModState, - pool_pid=Pool}) -> - %% Shutdown if the pool is still alive and a normal `Reason' is - %% given - there could be a race on delivery of the unregistered - %% event and successfully shutting down the pool. - try - case is_pid(Pool) andalso is_process_alive(Pool) andalso ?normal_reason(Reason) of - true -> - riak_core_vnode_worker_pool:shutdown_pool(Pool, 60000); - _ -> - ok - end - catch Type:Reason:Stacktrace -> - logger:error("Error while shutting down vnode worker pool ~p:~p trace : ~p", - [Type, Reason, Stacktrace]) - after - case ModState of - %% Handoff completed, Mod:delete has been called, now terminate. - {deleted, ModState1} -> - Mod:terminate(Reason, ModState1); - _ -> - Mod:terminate(Reason, ModState) - end +continue(State) -> + {next_state, active, State, + State#state.inactivity_timeout}. + +continue(State, NewModState) -> + continue(State#state{modstate = NewModState}). + +%% Active vnodes operate in three states: normal, handoff, and forwarding. +%% +%% In the normal state, vnode commands are passed to handle_command. When +%% a handoff is triggered, handoff_target is set and the vnode +%% is said to be in the handoff state. +%% +%% In the handoff state, vnode commands are passed to handle_handoff_command. +%% However, a vnode may be blocked during handoff (and therefore not servicing +%% commands) if the handoff procedure is blocking (eg. in riak_kv when not +%% using async fold). +%% +%% After handoff, a vnode may move into forwarding state. The forwarding state +%% is a product of the new gossip/membership code and will not occur if the +%% node is running in legacy mode. The forwarding state represents the case +%% where the vnode has already handed its data off to the new owner, but the +%% new owner is not yet listed as the current owner in the ring. This may occur +%% because additional vnodes are still waiting to handoff their data to the +%% new owner, or simply because the ring has yet to converge on the new owner. +%% In the forwarding state, all vnode commands and coverage commands are +%% forwarded to the new owner for processing. +%% +%% The above becomes a bit more complicated when the vnode takes part in resizing +%% the ring, since several transfers with a single vnode as the source are necessary +%% to complete the operation. A vnode will remain in the handoff state, for, potentially, +%% more than one transfer and may be in the handoff state despite there being no active +%% transfers with this vnode as the source. During this time requests that can be forwarded +%% to a partition for which the transfer has already completed, are forwarded. All other +%% requests are passed to handle_handoff_command. +forward_or_vnode_command(Sender, Request, + State = #state{forward = Forward, mod = Module, + index = Index}) -> + Resizing = is_list(Forward), + RequestHash = case Resizing of + true -> Module:request_hash(Request); + false -> undefined + end, + case {Forward, RequestHash} of + %% typical vnode operation, no forwarding set, handle request locally + {undefined, _} -> vnode_command(Sender, Request, State); + %% implicit forwarding after ownership transfer/hinted handoff + {F, _} when not is_list(F) -> + vnode_forward(implicit, {Index, Forward}, Sender, + Request, State), + continue(State); + %% during resize we can't forward a request w/o request hash, always handle locally + {_, undefined} -> vnode_command(Sender, Request, State); + %% possible forwarding during ring resizing + {_, _} -> + {ok, R} = riak_core_ring_manager:get_my_ring(), + FutureIndex = riak_core_ring:future_index(RequestHash, + Index, R), + vnode_resize_command(Sender, Request, FutureIndex, + State) end. -code_change(_OldVsn, StateName, State, _Extra) -> - {ok, StateName, State}. +vnode_command(_Sender, _Request, + State = #state{modstate = {deleted, _}}) -> + continue(State); +vnode_command(Sender, Request, + State = #state{mod = Module, modstate = ModState, + pool_pid = Pool}) -> + case catch Module:handle_command(Request, Sender, + ModState) + of + {'EXIT', ExitReason} -> + reply(Sender, {vnode_error, ExitReason}), + logger:error("~p command failed ~p", + [Module, ExitReason]), + {stop, ExitReason, State#state{modstate = ModState}}; + continue -> continue(State, ModState); + {reply, Reply, NewModState} -> + reply(Sender, Reply), continue(State, NewModState); + {noreply, NewModState} -> continue(State, NewModState); + {async, Work, From, NewModState} -> + %% dispatch some work to the vnode worker pool + %% the result is sent back to 'From' + riak_core_vnode_worker_pool:handle_work(Pool, Work, + From), + continue(State, NewModState); + {stop, Reason, NewModState} -> + {stop, Reason, State#state{modstate = NewModState}} + end. + +vnode_coverage(Sender, Request, KeySpaces, + State = #state{index = Index, mod = Module, + modstate = ModState, pool_pid = Pool, + forward = Forward}) -> + %% Check if we should forward + case Forward of + undefined -> + Action = Module:handle_coverage(Request, KeySpaces, + Sender, ModState); + %% handle coverage requests locally during ring resize + Forwards when is_list(Forwards) -> + Action = Module:handle_coverage(Request, KeySpaces, + Sender, ModState); + NextOwner -> + logger:debug("Forwarding coverage ~p -> ~p: ~p~n", + [node(), NextOwner, Index]), + riak_core_vnode_master:coverage(Request, + {Index, NextOwner}, KeySpaces, Sender, + riak_core_vnode_master:reg_name(Module)), + Action = continue + end, + case Action of + continue -> continue(State, ModState); + {reply, Reply, NewModState} -> + reply(Sender, Reply), continue(State, NewModState); + {noreply, NewModState} -> continue(State, NewModState); + {async, Work, From, NewModState} -> + %% dispatch some work to the vnode worker pool + %% the result is sent back to 'From' + riak_core_vnode_worker_pool:handle_work(Pool, Work, + From), + continue(State, NewModState); + {stop, Reason, NewModState} -> + {stop, Reason, State#state{modstate = NewModState}} + end. + +vnode_handoff_command(Sender, Request, ForwardTo, + State = #state{mod = Module, modstate = ModState, + handoff_target = HOTarget, + handoff_type = HOType, pool_pid = Pool}) -> + case Module:handle_handoff_command(Request, Sender, + ModState) + of + {reply, Reply, NewModState} -> + reply(Sender, Reply), continue(State, NewModState); + {noreply, NewModState} -> continue(State, NewModState); + {async, Work, From, NewModState} -> + %% dispatch some work to the vnode worker pool + %% the result is sent back to 'From' + riak_core_vnode_worker_pool:handle_work(Pool, Work, + From), + continue(State, NewModState); + {forward, NewModState} -> + forward_request(HOType, Request, HOTarget, ForwardTo, + Sender, State), + continue(State, NewModState); + {forward, NewReq, NewModState} -> + forward_request(HOType, NewReq, HOTarget, ForwardTo, + Sender, State), + continue(State, NewModState); + {drop, NewModState} -> continue(State, NewModState); + {stop, Reason, NewModState} -> + {stop, Reason, State#state{modstate = NewModState}} + end. + +%% @private wrap the request for resize forwards, and use the resize +%% target. +forward_request(resize, Request, _HOTarget, + ResizeTarget, Sender, State) -> + %% resize op and transfer ongoing + vnode_forward(resize, ResizeTarget, Sender, + {resize_forward, Request}, State); +forward_request(undefined, Request, _HOTarget, + ResizeTarget, Sender, State) -> + %% resize op ongoing, no resize transfer ongoing, arrive here + %% via forward_or_vnode_command + vnode_forward(resize, ResizeTarget, Sender, + {resize_forward, Request}, State); +forward_request(_, Request, HOTarget, _ResizeTarget, + Sender, State) -> + %% normal explicit forwarding during owhership transfer + vnode_forward(explicit, HOTarget, Sender, Request, + State). + +vnode_forward(Type, ForwardTo, Sender, Request, + State) -> + logger:debug("Forwarding (~p) {~p,~p} -> ~p~n", + [Type, State#state.index, node(), ForwardTo]), + riak_core_vnode_master:command_unreliable(ForwardTo, + Request, Sender, + riak_core_vnode_master:reg_name(State#state.mod)). + +%% @doc during ring resizing if we have completed a transfer to the index that will +%% handle request in future ring we forward to it. Otherwise we delegate +%% to the local vnode like other requests during handoff +vnode_resize_command(Sender, Request, FutureIndex, + State = #state{forward = Forward}) + when is_list(Forward) -> + case lists:keyfind(FutureIndex, 1, Forward) of + false -> vnode_command(Sender, Request, State); + {FutureIndex, FutureOwner} -> + vnode_handoff_command(Sender, Request, + {FutureIndex, FutureOwner}, State) + end. -maybe_handoff(_TargetIdx, _TargetNode, State=#state{modstate={deleted, _}}) -> +%% This code lives in riak_core_vnode rather than riak_core_vnode_manager +%% because the ring_trans call is a synchronous call to the ring manager, +%% and it is better to block an individual vnode rather than the vnode +%% manager. Blocking the manager can impact all vnodes. This code is safe +%% to execute on multiple parallel vnodes because of the synchronization +%% afforded by having all ring changes go through the single ring manager. +mark_handoff_complete(SrcIdx, Target, SeenIdxs, Mod, + resize) -> + Prev = node(), + Source = {SrcIdx, Prev}, + TransFun = fun (Ring, _) -> + Owner = riak_core_ring:index_owner(Ring, SrcIdx), + Status = riak_core_ring:resize_transfer_status(Ring, + Source, + Target, + Mod), + case {Owner, Status} of + {Prev, awaiting} -> + F = fun (SeenIdx, RingAcc) -> + riak_core_ring:schedule_resize_transfer(RingAcc, + Source, + SeenIdx) + end, + Ring2 = lists:foldl(F, Ring, + ordsets:to_list(SeenIdxs)), + Ring3 = + riak_core_ring:resize_transfer_complete(Ring2, + Source, + Target, + Mod), + %% local ring optimization (see below) + {set_only, Ring3}; + _ -> ignore + end + end, + Result = riak_core_ring_manager:ring_trans(TransFun, + []), + case Result of + {ok, _NewRing} -> resize; + _ -> continue + end; +mark_handoff_complete(Idx, {Idx, New}, [], Mod, _) -> + Prev = node(), + Result = riak_core_ring_manager:ring_trans(fun (Ring, + _) -> + Owner = + riak_core_ring:index_owner(Ring, + Idx), + {_, NextOwner, Status} = + riak_core_ring:next_owner(Ring, + Idx, + Mod), + NewStatus = + riak_core_ring:member_status(Ring, + New), + case {Owner, NextOwner, + NewStatus, Status} + of + {Prev, New, _, + awaiting} -> + Ring2 = + riak_core_ring:handoff_complete(Ring, + Idx, + Mod), + %% Optimization. Only alter the local ring without + %% triggering a gossip, thus implicitly coalescing + %% multiple vnode handoff completion events. In the + %% future we should decouple vnode handoff state from + %% the ring structure in order to make gossip independent + %% of ring size. + {set_only, Ring2}; + _ -> ignore + end + end, + []), + case Result of + {ok, NewRing} -> NewRing = NewRing; + _ -> + {ok, NewRing} = riak_core_ring_manager:get_my_ring() + end, + Owner = riak_core_ring:index_owner(NewRing, Idx), + {_, NextOwner, Status} = + riak_core_ring:next_owner(NewRing, Idx, Mod), + NewStatus = riak_core_ring:member_status(NewRing, New), + case {Owner, NextOwner, NewStatus, Status} of + {_, _, invalid, _} -> + %% Handing off to invalid node, don't give-up data. + continue; + {Prev, New, _, _} -> forward; + {Prev, _, _, _} -> + %% Handoff wasn't to node that is scheduled in next, so no change. + continue; + {_, _, _, _} -> shutdown + end. + +finish_handoff(State) -> finish_handoff([], State). + +finish_handoff(SeenIdxs, + State = #state{mod = Module, modstate = ModState, + index = Idx, handoff_target = Target, + handoff_type = HOType}) -> + case mark_handoff_complete(Idx, Target, SeenIdxs, + Module, HOType) + of + continue -> + continue(State#state{handoff_target = none, + handoff_type = undefined}); + resize -> + CurrentForwarding = resize_forwarding(State), + NewForwarding = [Target | CurrentForwarding], + State2 = mod_set_forwarding(NewForwarding, State), + continue(State2#state{handoff_target = none, + handoff_type = undefined, + forward = NewForwarding}); + Res when Res == forward; Res == shutdown -> + {_, HN} = Target, + %% Have to issue the delete now. Once unregistered the + %% vnode master will spin up a new vnode on demand. + %% Shutdown the async pool beforehand, don't want callbacks + %% running on non-existant data. + maybe_shutdown_pool(State), + {ok, NewModState} = Module:delete(ModState), + logger:debug("~p ~p vnode finished handoff and deleted.", + [Idx, Module]), + riak_core_vnode_manager:unregister_vnode(Idx, Module), + logger:debug("vnode hn/fwd :: ~p/~p :: ~p -> ~p~n", + [State#state.mod, State#state.index, + State#state.forward, HN]), + State2 = mod_set_forwarding(HN, State), + continue(State2#state{modstate = + {deleted, + NewModState}, % like to fail if used + handoff_target = none, handoff_type = undefined, + forward = HN}) + end. + +maybe_shutdown_pool(#state{pool_pid = Pool}) -> + case is_pid(Pool) of + true -> + %% state.pool_pid will be cleaned up by handle_info message. + riak_core_vnode_worker_pool:shutdown_pool(Pool, 60000); + _ -> ok + end. + +resize_forwarding(#state{forward = F}) + when is_list(F) -> + F; +resize_forwarding(_) -> []. + +mark_delete_complete(Idx, Mod) -> + Result = riak_core_ring_manager:ring_trans(fun (Ring, + _) -> + Type = + riak_core_ring:vnode_type(Ring, + Idx), + {_, Next, Status} = + riak_core_ring:next_owner(Ring, + Idx), + case {Type, Next, Status} + of + {resized_primary, + '$delete', + awaiting} -> + Ring3 = + riak_core_ring:deletion_complete(Ring, + Idx, + Mod), + %% Use local ring optimization like mark_handoff_complete + {set_only, Ring3}; + {{fallback, _}, + '$delete', + awaiting} -> + Ring3 = + riak_core_ring:deletion_complete(Ring, + Idx, + Mod), + %% Use local ring optimization like mark_handoff_complete + {set_only, Ring3}; + _ -> ignore + end + end, + []), + Result. + +maybe_handoff(_TargetIdx, _TargetNode, + State = #state{modstate = {deleted, _}}) -> %% Modstate has been deleted, waiting for unregistered. No handoff. continue(State); maybe_handoff(TargetIdx, TargetNode, - State=#state{index=Idx, mod=Mod, modstate=ModState, - handoff_target=CurrentTarget, handoff_pid=HPid}) -> + State = #state{index = Idx, mod = Module, + modstate = ModState, + handoff_target = CurrentTarget, + handoff_pid = HPid}) -> Target = {TargetIdx, TargetNode}, - ExistingHO = is_pid(HPid) andalso is_process_alive(HPid), + ExistingHO = is_pid(HPid) andalso + is_process_alive(HPid), ValidHN = case CurrentTarget of - none -> - true; - Target -> - not ExistingHO; - _ -> - logger:info("~s/~b: handoff request to ~p before " - "finishing handoff to ~p", - [Mod, Idx, Target, CurrentTarget]), - not ExistingHO + none -> true; + Target -> not ExistingHO; + _ -> + logger:info("~s/~b: handoff request to ~p before " + "finishing handoff to ~p", + [Module, Idx, Target, CurrentTarget]), + not ExistingHO end, case ValidHN of - true -> - {ok, R} = riak_core_ring_manager:get_my_ring(), - Resizing = riak_core_ring:is_resizing(R), - Primary = riak_core_ring:is_primary(R, {Idx, node()}), - HOType = case {Resizing, Primary} of - {true, _} -> resize; - {_, true} -> ownership; - {_, false} -> hinted - end, - case Mod:handoff_starting({HOType, Target}, ModState) of - {true, NewModState} -> - start_handoff(HOType, TargetIdx, TargetNode,State#state{modstate=NewModState}); - {false, NewModState} -> - continue(State, NewModState) - end; - false -> - continue(State) + true -> + {ok, R} = riak_core_ring_manager:get_my_ring(), + Resizing = riak_core_ring:is_resizing(R), + Primary = riak_core_ring:is_primary(R, {Idx, node()}), + HOType = case {Resizing, Primary} of + {true, _} -> resize; + {_, true} -> ownership; + {_, false} -> hinted + end, + case Module:handoff_starting({HOType, Target}, ModState) + of + {true, NewModState} -> + start_handoff(HOType, TargetIdx, TargetNode, + State#state{modstate = NewModState}); + {false, NewModState} -> continue(State, NewModState) + end; + false -> continue(State) end. start_handoff(HOType, TargetIdx, TargetNode, - State=#state{mod=Mod, modstate=ModState}) -> - case Mod:is_empty(ModState) of - {true, NewModState} -> - finish_handoff(State#state{modstate=NewModState, - handoff_type=HOType, - handoff_target={TargetIdx, TargetNode}}); - {false, Size, NewModState} -> - State2 = State#state{modstate=NewModState}, - NewState = start_outbound(HOType, TargetIdx, TargetNode, [{size, Size}], State2), - continue(NewState); - {false, NewModState} -> - State2 = State#state{modstate=NewModState}, - NewState = start_outbound(HOType, TargetIdx, TargetNode, [], State2), - continue(NewState) + State = #state{mod = Module, modstate = ModState}) -> + case Module:is_empty(ModState) of + {true, NewModState} -> + finish_handoff(State#state{modstate = NewModState, + handoff_type = HOType, + handoff_target = {TargetIdx, TargetNode}}); + {false, Size, NewModState} -> + State2 = State#state{modstate = NewModState}, + NewState = start_outbound(HOType, TargetIdx, TargetNode, + [{size, Size}], State2), + continue(NewState); + {false, NewModState} -> + State2 = State#state{modstate = NewModState}, + NewState = start_outbound(HOType, TargetIdx, TargetNode, + [], State2), + continue(NewState) end. - -start_outbound(HOType, TargetIdx, TargetNode, Opts, State=#state{index=Idx,mod=Mod}) -> - case riak_core_handoff_manager:add_outbound(HOType,Mod,Idx,TargetIdx,TargetNode,self(),Opts) of - {ok, Pid} -> - State#state{handoff_pid=Pid, - handoff_type=HOType, - handoff_target={TargetIdx, TargetNode}}; - {error,_Reason} -> - {ok, NewModState} = Mod:handoff_cancelled(State#state.modstate), - State#state{modstate=NewModState} +start_outbound(HOType, TargetIdx, TargetNode, Opts, + State = #state{index = Idx, mod = Module}) -> + case riak_core_handoff_manager:add_outbound(HOType, + Module, Idx, TargetIdx, + TargetNode, self(), Opts) + of + {ok, Pid} -> + State#state{handoff_pid = Pid, handoff_type = HOType, + handoff_target = {TargetIdx, TargetNode}}; + {error, _Reason} -> + {ok, NewModState} = + Module:handoff_cancelled(State#state.modstate), + State#state{modstate = NewModState} end. -%% @doc Send a reply to a vnode request. If -%% the Ref is undefined just send the reply -%% for compatibility with pre-0.12 requestors. -%% If Ref is defined, send it along with the -%% reply. -%% NOTE: We *always* send the reply using unreliable delivery. -%% --spec reply(sender(), term()) -> any(). -reply({fsm, undefined, From}, Reply) -> - riak_core_send_msg:send_event_unreliable(From, Reply); -reply({fsm, Ref, From}, Reply) -> - riak_core_send_msg:send_event_unreliable(From, {Ref, Reply}); -reply({server, undefined, From}, Reply) -> - riak_core_send_msg:reply_unreliable(From, Reply); -reply({server, Ref, From}, Reply) -> - riak_core_send_msg:reply_unreliable(From, {Ref, Reply}); -reply({raw, Ref, From}, Reply) -> - riak_core_send_msg:bang_unreliable(From, {Ref, Reply}); -reply(ignore, _Reply) -> - ok. - -%% @doc Set up a monitor for the pid named by a {@type sender()} vnode -%% argument. If `Sender' was the atom `ignore', this function sets up -%% a monitor on `self()' in order to return a valid (if useless) -%% monitor reference. --spec monitor(Sender::sender()) -> Monitor::reference(). -monitor({fsm, _, From}) -> - erlang:monitor(process, From); -monitor({server, _, {Pid, _Ref}}) -> - erlang:monitor(process, Pid); -monitor({raw, _, From}) -> - erlang:monitor(process, From); -monitor(ignore) -> - erlang:monitor(process, self()). - %% Individual vnode processes and the vnode manager are tightly coupled. When %% vnode events occur, the vnode must ensure that the events are forwarded to %% the vnode manager, which will make a state change decision and send an @@ -1050,94 +1604,118 @@ monitor(ignore) -> %% messages sent by the vnode. Therefore, the vnode periodically resends event %% messages until an appropriate message is received back from the vnode %% manager. The event timer functions below implement this logic. -start_manager_event_timer(Event, State=#state{mod=Mod, index=Idx}) -> - riak_core_vnode_manager:vnode_event(Mod, Idx, self(), Event), +start_manager_event_timer(Event, + State = #state{mod = Module, index = Idx}) -> + riak_core_vnode_manager:vnode_event(Module, Idx, self(), + Event), stop_manager_event_timer(State), - T2 = gen_fsm:send_event_after(30000, {send_manager_event, Event}), - State#state{manager_event_timer=T2}. + T2 = gen_fsm_compat:send_event_after(30000, + {send_manager_event, Event}), + State#state{manager_event_timer = T2}. -stop_manager_event_timer(#state{manager_event_timer=undefined}) -> +stop_manager_event_timer(#state{manager_event_timer = + undefined}) -> ok; -stop_manager_event_timer(#state{manager_event_timer=T}) -> - _ = gen_fsm:cancel_timer(T), - ok. +stop_manager_event_timer(#state{manager_event_timer = + T}) -> + _ = gen_fsm_compat:cancel_timer(T), ok. -mod_set_forwarding(_Forward, State=#state{modstate={deleted,_}}) -> +mod_set_forwarding(_Forward, + State = #state{modstate = {deleted, _}}) -> State; -mod_set_forwarding(Forward, State=#state{mod=Mod, modstate=ModState}) -> - case lists:member({set_vnode_forwarding, 2}, Mod:module_info(exports)) of - true -> - NewModState = Mod:set_vnode_forwarding(Forward, ModState), - State#state{modstate=NewModState}; - false -> - State +mod_set_forwarding(Forward, + State = #state{mod = Module, modstate = ModState}) -> + case lists:member({set_vnode_forwarding, 2}, + Module:module_info(exports)) + of + true -> + NewModState = Module:set_vnode_forwarding(Forward, + ModState), + State#state{modstate = NewModState}; + false -> State end. %% =================================================================== %% Test API %% =================================================================== +-type state() :: #state{}. + %% @doc Reveal the underlying module state for testing --spec(get_modstate(pid()) -> {atom(), #state{}}). +-spec get_modstate(pid()) -> {atom(), state()}. + get_modstate(Pid) -> - {_StateName, State} = gen_fsm:sync_send_all_state_event(Pid, current_state), + {_StateName, State} = + gen_fsm_compat:sync_send_all_state_event(Pid, + current_state), {State#state.mod, State#state.modstate}. -ifdef(TEST). %% Start the garbage collection server test_link(Mod, Index) -> - gen_fsm:start_link(?MODULE, [Mod, Index, 0, node()], []). + gen_fsm_compat:start_link(?MODULE, + [Mod, Index, 0, node()], []). %% Get the current state of the fsm for testing inspection --spec current_state(pid()) -> {atom(), #state{}} | {error, term()}. +-spec current_state(pid()) -> {atom(), state()} | + {error, term()}. + current_state(Pid) -> - gen_fsm:sync_send_all_state_event(Pid, current_state). + gen_fsm_compat:sync_send_all_state_event(Pid, + current_state). + +wait_for_process_death(Pid) -> + wait_for_process_death(Pid, is_process_alive(Pid)). + +wait_for_process_death(Pid, true) -> + wait_for_process_death(Pid, is_process_alive(Pid)); +wait_for_process_death(_Pid, false) -> ok. + +wait_for_state_update(OriginalStateData, Pid) -> + {_, CurrentStateData} = (?MODULE):current_state(Pid), + wait_for_state_update(OriginalStateData, + CurrentStateData, Pid). + +wait_for_state_update(OriginalStateData, + OriginalStateData, Pid) -> + {_, CurrentStateData} = (?MODULE):current_state(Pid), + wait_for_state_update(OriginalStateData, + CurrentStateData, Pid); +wait_for_state_update(_OriginalState, _StateData, + _Pid) -> + ok. + +%% =================================================================== +%% Test +%% =================================================================== pool_death_test() -> + %% expect error log + error_logger:tty(false), meck:unload(), meck:new(test_vnode, [non_strict, no_link]), - meck:expect(test_vnode, init, fun(_) -> {ok, [], [{pool, test_pool_mod, 1, []}]} end), - meck:expect(test_vnode, terminate, fun(_, _) -> normal end), + meck:expect(test_vnode, init, + fun (_) -> {ok, [], [{pool, test_pool_mod, 1, []}]} + end), + meck:expect(test_vnode, terminate, + fun (_, _) -> normal end), meck:new(test_pool_mod, [non_strict, no_link]), - meck:expect(test_pool_mod, init_worker, fun(_, _, _) -> {ok, []} end), - - %% expect error log - error_logger:tty(false), - - {ok, Pid} = ?MODULE:test_link(test_vnode, 0), - {_, StateData1} = ?MODULE:current_state(Pid), + meck:expect(test_pool_mod, init_worker, + fun (_, _, _) -> {ok, []} end), + {ok, Pid} = riak_core_vnode:test_link(test_vnode, 0), + {_, StateData1} = riak_core_vnode:current_state(Pid), PoolPid1 = StateData1#state.pool_pid, exit(PoolPid1, kill), wait_for_process_death(PoolPid1), - ?assertNot(is_process_alive(PoolPid1)), + ?assertNot((is_process_alive(PoolPid1))), wait_for_state_update(StateData1, Pid), - {_, StateData2} = ?MODULE:current_state(Pid), + {_, StateData2} = riak_core_vnode:current_state(Pid), PoolPid2 = StateData2#state.pool_pid, - ?assertNot(PoolPid2 =:= undefined), + ?assertNot((PoolPid2 =:= undefined)), exit(Pid, normal), wait_for_process_death(Pid), - - error_logger:tty(false), meck:validate(test_pool_mod), meck:validate(test_vnode). -wait_for_process_death(Pid) -> - wait_for_process_death(Pid, is_process_alive(Pid)). - -wait_for_process_death(Pid, true) -> - wait_for_process_death(Pid, is_process_alive(Pid)); -wait_for_process_death(_Pid, false) -> - ok. - -wait_for_state_update(OriginalStateData, Pid) -> - {_, CurrentStateData} = ?MODULE:current_state(Pid), - wait_for_state_update(OriginalStateData, CurrentStateData, Pid). - -wait_for_state_update(OriginalStateData, OriginalStateData, Pid) -> - {_, CurrentStateData} = ?MODULE:current_state(Pid), - wait_for_state_update(OriginalStateData, CurrentStateData, Pid); -wait_for_state_update(_OriginalState, _StateData, _Pid) -> - ok. - -endif. diff --git a/src/riak_core_vnode_manager.erl b/src/riak_core_vnode_manager.erl index 295e4a5c2..d2098a569 100644 --- a/src/riak_core_vnode_manager.erl +++ b/src/riak_core_vnode_manager.erl @@ -33,75 +33,91 @@ -behaviour(gen_server). -export([start_link/0, stop/0]). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). --export([all_vnodes/0, all_vnodes/1, all_vnodes_status/0, - force_handoffs/0, repair/3, all_handoffs/0, repair_status/1, xfer_complete/2, + +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). + +-export([all_vnodes/0, all_vnodes/1, + all_vnodes_status/0, force_handoffs/0, repair/3, + all_handoffs/0, repair_status/1, xfer_complete/2, kill_repairs/1]). --export([all_index_pid/1, get_vnode_pid/2, start_vnode/2, - unregister_vnode/2, unregister_vnode/3, vnode_event/4]). + +-export([all_index_pid/1, get_vnode_pid/2, + start_vnode/2, unregister_vnode/2, unregister_vnode/3, + vnode_event/4]). + %% Field debugging -export([get_tab/0]). -record(idxrec, {key, idx, mod, pid, monref}). + -record(monrec, {monref, key}). --record(xfer_status, { - status :: pending | complete, - mod_src_target :: {module(), index(), index()} - }). +-record(xfer_status, + {status :: pending | complete, + mod_src_target :: {module(), index(), index()}}). + -type xfer_status() :: #xfer_status{}. -record(repair, - { - mod_partition :: mod_partition(), - filter_mod_fun :: {module(), atom()}, - minus_one_xfer :: xfer_status(), - plus_one_xfer :: xfer_status(), - pairs :: [{index(), node()}] - }). + {mod_partition :: mod_partition(), + filter_mod_fun :: {module(), atom()}, + minus_one_xfer :: xfer_status(), + plus_one_xfer :: xfer_status(), + pairs :: [{index(), node()}]}). + -type repair() :: #repair{}. + -type repairs() :: [repair()]. --record(state, {idxtab, - forwarding :: dict:dict(), - handoff :: dict:dict(), - known_modules :: [term()], - never_started :: [{integer(), term()}], - vnode_start_tokens :: integer(), - last_ring_id :: term(), - repairs :: repairs() - }). +-record(state, + {idxtab, forwarding :: dict:dict(), + handoff :: dict:dict(), known_modules :: [term()], + never_started :: [{integer(), term()}], + vnode_start_tokens :: integer(), + last_ring_id :: term(), repairs :: repairs()}). -include("riak_core_handoff.hrl"). + -include("riak_core_vnode.hrl"). --define(XFER_EQ(A, ModSrcTgt), A#xfer_status.mod_src_target == ModSrcTgt). --define(XFER_COMPLETE(X), X#xfer_status.status == complete). + +-define(XFER_EQ(A, ModSrcTgt), + A#xfer_status.mod_src_target == ModSrcTgt). + +-define(XFER_COMPLETE(X), + X#xfer_status.status == complete). + -define(DEFAULT_OWNERSHIP_TRIGGER, 8). + -define(ETS, ets_vnode_mgr). + -define(DEFAULT_VNODE_ROLLING_START, 16). --define(LONG_TIMEOUT, 120*1000). + +-define(LONG_TIMEOUT, 120 * 1000). %% =================================================================== %% Public API %% =================================================================== start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, [], + []). -stop() -> - gen_server:cast(?MODULE, stop). +stop() -> gen_server:cast(?MODULE, stop). all_vnodes_status() -> gen_server:call(?MODULE, all_vnodes_status, infinity). %% @doc Repair the given `ModPartition' pair for `Service' using the %% given `FilterModFun' to filter keys. --spec repair(atom(), {module(), partition()}, {module(), atom()}) -> - {ok, Pairs::[{partition(), node()}]} | - {down, Down::[{partition(), node()}]} | - ownership_change_in_progress. -repair(Service, {_Module, Partition}=ModPartition, FilterModFun) -> +-spec repair(atom(), {module(), partition()}, + {module(), atom()}) -> {ok, + Pairs :: [{partition(), node()}]} | + {down, Down :: [{partition(), node()}]} | + ownership_change_in_progress. + +repair(Service, {_Module, Partition} = ModPartition, + FilterModFun) -> %% Fwd the request to the partition owner to guarantee that there %% is only one request per partition. {ok, Ring} = riak_core_ring_manager:get_my_ring(), @@ -110,14 +126,18 @@ repair(Service, {_Module, Partition}=ModPartition, FilterModFun) -> gen_server:call({?MODULE, Owner}, Msg, ?LONG_TIMEOUT). %% @doc Get the status of the repair process for a given `ModPartition'. --spec repair_status(mod_partition()) -> in_progress | not_found. -repair_status({_Module, Partition}=ModPartition) -> +-spec repair_status(mod_partition()) -> in_progress | + not_found. + +repair_status({_Module, Partition} = ModPartition) -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), Owner = riak_core_ring:index_owner(Ring, Partition), - gen_server:call({?MODULE, Owner}, {repair_status, ModPartition}, ?LONG_TIMEOUT). + gen_server:call({?MODULE, Owner}, + {repair_status, ModPartition}, ?LONG_TIMEOUT). %% @doc Get all handoffs known by this manager. --spec all_handoffs() -> list(known_handoff()). +-spec all_handoffs() -> [known_handoff()]. + all_handoffs() -> gen_server:call(?MODULE, all_handoffs, ?LONG_TIMEOUT). @@ -125,8 +145,10 @@ all_handoffs() -> %% %% TODO: second arg has specific form but maybe make proplist? -spec xfer_complete(node(), tuple()) -> ok. + xfer_complete(Origin, Xfer) -> - gen_server:call({?MODULE, Origin}, {xfer_complete, Xfer}, ?LONG_TIMEOUT). + gen_server:call({?MODULE, Origin}, + {xfer_complete, Xfer}, ?LONG_TIMEOUT). kill_repairs(Reason) -> gen_server:cast(?MODULE, {kill_repairs, Reason}). @@ -141,19 +163,23 @@ unregister_vnode(Index, VNodeMod) -> unregister_vnode(Index, self(), VNodeMod). unregister_vnode(Index, Pid, VNodeMod) -> - gen_server:cast(?MODULE, {unregister, Index, VNodeMod, Pid}). + gen_server:cast(?MODULE, + {unregister, Index, VNodeMod, Pid}). start_vnode(Index, VNodeMod) -> - gen_server:cast(?MODULE, {Index, VNodeMod, start_vnode}). + gen_server:cast(?MODULE, + {Index, VNodeMod, start_vnode}). -vnode_event(Mod, Idx, Pid, Event) -> - gen_server:cast(?MODULE, {vnode_event, Mod, Idx, Pid, Event}). +vnode_event(Module, Idx, Pid, Event) -> + gen_server:cast(?MODULE, + {vnode_event, Module, Idx, Pid, Event}). get_tab() -> gen_server:call(?MODULE, get_tab, infinity). get_vnode_pid(Index, VNodeMod) -> - gen_server:call(?MODULE, {Index, VNodeMod, get_vnode}, infinity). + gen_server:call(?MODULE, {Index, VNodeMod, get_vnode}, + infinity). %% =================================================================== %% ETS-based API: try to determine response by reading protected ETS @@ -163,49 +189,51 @@ get_vnode_pid(Index, VNodeMod) -> all_vnodes() -> case get_all_vnodes() of - [] -> - %% ETS error could produce empty list, call manager to be sure. - gen_server:call(?MODULE, all_vnodes, infinity); - Result -> - Result + [] -> + %% ETS error could produce empty list, call manager to be sure. + gen_server:call(?MODULE, all_vnodes, infinity); + Result -> Result end. -all_vnodes(Mod) -> - case get_all_vnodes(Mod) of - [] -> - %% ETS error could produce empty list, call manager to be sure. - gen_server:call(?MODULE, {all_vnodes, Mod}, infinity); - Result -> - Result +all_vnodes(Module) -> + case get_all_vnodes(Module) of + [] -> + %% ETS error could produce empty list, call manager to be sure. + gen_server:call(?MODULE, {all_vnodes, Module}, + infinity); + Result -> Result end. all_index_pid(VNodeMod) -> case get_all_index_pid(VNodeMod, ets_error) of - ets_error -> - gen_server:call(?MODULE, {all_index_pid, VNodeMod}, infinity); - Result -> - Result + ets_error -> + gen_server:call(?MODULE, {all_index_pid, VNodeMod}, + infinity); + Result -> Result end. %% =================================================================== %% Protected ETS Accessors %% =================================================================== -get_all_index_pid(Mod, Default) -> - try - [list_to_tuple(L) - || L <- ets:match(?ETS, {idxrec, '_', '$1', Mod, '$2', '_'})] +get_all_index_pid(Module, Default) -> + try [list_to_tuple(L) + || L + <- ets:match(?ETS, + {idxrec, '_', '$1', Module, '$2', '_'})] catch - _:_ -> - Default + _:_ -> Default end. get_all_vnodes() -> - Mods = [Mod || {_App, Mod} <- riak_core:vnode_modules()], - get_all_vnodes(Mods). - -get_all_vnodes(Mods) when is_list(Mods) -> - lists:flatmap(fun(Mod) -> get_all_vnodes(Mod) end, Mods); + Modules = [Module + || {_App, Module} <- riak_core:vnode_modules()], + get_all_vnodes(Modules). + +get_all_vnodes(Modules) when is_list(Modules) -> + lists:flatmap(fun (Module) -> get_all_vnodes(Module) + end, + Modules); get_all_vnodes(Mod) -> IdxPids = get_all_index_pid(Mod, []), [{Mod, Idx, Pid} || {Idx, Pid} <- IdxPids]. @@ -216,14 +244,17 @@ get_all_vnodes(Mod) -> %% @private init(_State) -> - {ok, Ring, CHBin} = riak_core_ring_manager:get_raw_ring_chashbin(), + {ok, Ring, CHBin} = + riak_core_ring_manager:get_raw_ring_chashbin(), Mods = [Mod || {_, Mod} <- riak_core:vnode_modules()], - State = #state{forwarding=dict:new(), handoff=dict:new(), - known_modules=[], never_started=[], vnode_start_tokens=0, - repairs=[]}, + State = #state{forwarding = dict:new(), + handoff = dict:new(), known_modules = [], + never_started = [], vnode_start_tokens = 0, + repairs = []}, State2 = find_vnodes(State), AllVNodes = get_all_vnodes(Mods), - State3 = update_forwarding(AllVNodes, Mods, Ring, State2), + State3 = update_forwarding(AllVNodes, Mods, Ring, + State2), State4 = update_handoff(AllVNodes, Ring, CHBin, State3), schedule_management_timer(), {ok, State4}. @@ -233,77 +264,76 @@ find_vnodes(State) -> %% Get the current list of vnodes running in the supervisor. We use this %% to rebuild our ETS table for routing messages to the appropriate %% vnode. - VnodePids = [Pid || {_, Pid, worker, _} - <- supervisor:which_children(riak_core_vnode_sup), - is_pid(Pid) andalso is_process_alive(Pid)], - IdxTable = ets:new(?ETS, [{keypos, 2}, named_table, protected]), - + VnodePids = [Pid + || {_, Pid, worker, _} + <- supervisor:which_children(riak_core_vnode_sup), + is_pid(Pid) andalso is_process_alive(Pid)], + IdxTable = ets:new(?ETS, + [{keypos, 2}, named_table, protected]), %% If the vnode manager is being restarted, scan the existing %% vnode children and work out which module and index they are %% responsible for. During startup it is possible that these %% vnodes may be shutting down as we check them if there are %% several types of vnodes active. - PidIdxs = lists:flatten( - [try - [{Pid, riak_core_vnode:get_mod_index(Pid)}] - catch - _:_Err -> - [] - end || Pid <- VnodePids]), - + PidIdxs = lists:flatten([try [{Pid, + riak_core_vnode:get_mod_index(Pid)}] + catch + _:_Err -> [] + end + || Pid <- VnodePids]), %% Populate the ETS table with processes running this VNodeMod (filtered %% in the list comprehension) - F = fun(Pid, Idx, Mod) -> + F = fun (Pid, Idx, Module) -> Mref = erlang:monitor(process, Pid), - #idxrec { key = {Idx,Mod}, idx = Idx, mod = Mod, pid = Pid, - monref = Mref } + #idxrec{key = {Idx, Module}, idx = Idx, mod = Module, + pid = Pid, monref = Mref} end, - IdxRecs = [F(Pid, Idx, Mod) || {Pid, {Mod, Idx}} <- PidIdxs], - MonRecs = [#monrec{monref=Mref, key=Key} - || #idxrec{key=Key, monref=Mref} <- IdxRecs], + IdxRecs = [F(Pid, Idx, Mod) + || {Pid, {Mod, Idx}} <- PidIdxs], + MonRecs = [#monrec{monref = Mref, key = Key} + || #idxrec{key = Key, monref = Mref} <- IdxRecs], true = ets:insert_new(IdxTable, IdxRecs ++ MonRecs), - State#state{idxtab=IdxTable}. + State#state{idxtab = IdxTable}. %% @private handle_call(all_vnodes_status, _From, State) -> Reply = get_all_vnodes_status(State), {reply, Reply, State}; handle_call(all_vnodes, _From, State) -> - Reply = get_all_vnodes(), - {reply, Reply, State}; + Reply = get_all_vnodes(), {reply, Reply, State}; handle_call({all_vnodes, Mod}, _From, State) -> - Reply = get_all_vnodes(Mod), - {reply, Reply, State}; + Reply = get_all_vnodes(Mod), {reply, Reply, State}; handle_call({all_index_pid, Mod}, _From, State) -> Reply = get_all_index_pid(Mod, []), {reply, Reply, State}; -handle_call({Partition, Mod, get_vnode}, _From, State) -> +handle_call({Partition, Mod, get_vnode}, _From, + State) -> Pid = get_vnode(Partition, Mod, State), {reply, {ok, Pid}, State}; handle_call(get_tab, _From, State) -> {reply, ets:tab2list(State#state.idxtab), State}; - -handle_call({repair, Service, {Mod,Partition}=ModPartition, FilterModFun}, - _From, #state{repairs=Repairs}=State) -> +handle_call({repair, Service, + {Mod, Partition} = ModPartition, FilterModFun}, + _From, #state{repairs = Repairs} = State) -> case get_repair(ModPartition, Repairs) of - none -> - maybe_create_repair(Partition, Service, ModPartition, FilterModFun, Mod, Repairs, State); - Repair -> - Pairs = Repair#repair.pairs, - {reply, {ok, Pairs}, State} + none -> + maybe_create_repair(Partition, Service, ModPartition, + FilterModFun, Mod, Repairs, State); + Repair -> + Pairs = Repair#repair.pairs, {reply, {ok, Pairs}, State} end; - -handle_call(all_handoffs, _From, State=#state{repairs=Repairs, handoff=HO}) -> - Handoffs=dict:to_list(HO) ++ transform_repair_records(Repairs), +handle_call(all_handoffs, _From, + State = #state{repairs = Repairs, handoff = HO}) -> + Handoffs = dict:to_list(HO) ++ + transform_repair_records(Repairs), {reply, Handoffs, State}; - -handle_call({repair_status, ModPartition}, _From, State) -> +handle_call({repair_status, ModPartition}, _From, + State) -> Repairs = State#state.repairs, case get_repair(ModPartition, Repairs) of - none -> {reply, not_found, State}; - #repair{} -> {reply, in_progress, State} + none -> {reply, not_found, State}; + #repair{} -> {reply, in_progress, State} end; - %% NOTE: The `xfer_complete' logic assumes two things: %% %% 1. The `xfer_complete' msg will always be sent to the owner @@ -315,80 +345,90 @@ handle_call({xfer_complete, ModSrcTgt}, _From, State) -> {Mod, _, Partition} = ModSrcTgt, ModPartition = {Mod, Partition}, case get_repair(ModPartition, Repairs) of - none -> - logger:error("Received xfer_complete for non-existing repair: ~p", - [ModPartition]), - {reply, ok, State}; - #repair{minus_one_xfer=MOX, plus_one_xfer=POX}=R -> - R2 = if ?XFER_EQ(MOX, ModSrcTgt) -> - MOX2 = MOX#xfer_status{status=complete}, - R#repair{minus_one_xfer=MOX2}; - ?XFER_EQ(POX, ModSrcTgt) -> - POX2 = POX#xfer_status{status=complete}, - R#repair{plus_one_xfer=POX2}; - true -> - logger:error("Received xfer_complete for " - "non-existing xfer: ~p", [ModSrcTgt]) - end, - - case {?XFER_COMPLETE(R2#repair.minus_one_xfer), - ?XFER_COMPLETE(R2#repair.plus_one_xfer)} of - {true, true} -> - {reply, ok, State#state{repairs=remove_repair(R2, Repairs)}}; - _ -> - {reply, ok, State#state{repairs=replace_repair(R2, Repairs)}} - end + none -> + logger:error("Received xfer_complete for non-existing " + "repair: ~p", + [ModPartition]), + {reply, ok, State}; + #repair{minus_one_xfer = MOX, plus_one_xfer = POX} = + R -> + R2 = if ?XFER_EQ(MOX, ModSrcTgt) -> + MOX2 = MOX#xfer_status{status = complete}, + R#repair{minus_one_xfer = MOX2}; + ?XFER_EQ(POX, ModSrcTgt) -> + POX2 = POX#xfer_status{status = complete}, + R#repair{plus_one_xfer = POX2}; + true -> + logger:error("Received xfer_complete for non-existing " + "xfer: ~p", + [ModSrcTgt]) + end, + case {?XFER_COMPLETE((R2#repair.minus_one_xfer)), + ?XFER_COMPLETE((R2#repair.plus_one_xfer))} + of + {true, true} -> + {reply, ok, + State#state{repairs = remove_repair(R2, Repairs)}}; + _ -> + {reply, ok, + State#state{repairs = replace_repair(R2, Repairs)}} + end end; - -handle_call(_, _From, State) -> - {reply, ok, State}. +handle_call(_, _From, State) -> {reply, ok, State}. transform_repair_records(Repairs) -> %% World's ugliest pattern match, simplest logic: matching %% module/node values in the `pairs' field against %% `minus_one_xfer' and `plus_one_xfer' - lists:flatten(lists:map(fun(#repair{pairs=[{M1SrcIdx, Mnode}, _FixPartition, {P1SrcIdx, Pnode}], - minus_one_xfer=#xfer_status{mod_src_target={M1Mod, M1SrcIdx, _M1DstIdx}}, - plus_one_xfer=#xfer_status{mod_src_target={P1Mod, P1SrcIdx, _P1DstIdx}}}) -> - [{{M1Mod, M1SrcIdx}, {repair, inbound, Mnode}}, - {{P1Mod, P1SrcIdx}, {repair, inbound, Pnode}}] + lists:flatten(lists:map(fun (#repair{pairs = + [{M1SrcIdx, Mnode}, _FixPartition, + {P1SrcIdx, Pnode}], + minus_one_xfer = + #xfer_status{mod_src_target = + {M1Mod, M1SrcIdx, + _M1DstIdx}}, + plus_one_xfer = + #xfer_status{mod_src_target = + {P1Mod, P1SrcIdx, + _P1DstIdx}}}) -> + [{{M1Mod, M1SrcIdx}, + {repair, inbound, Mnode}}, + {{P1Mod, P1SrcIdx}, + {repair, inbound, Pnode}}] end, Repairs)). -maybe_create_repair(Partition, Service, ModPartition, FilterModFun, Mod, Repairs, State) -> +maybe_create_repair(Partition, Service, ModPartition, + FilterModFun, Mod, Repairs, State) -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), case riak_core_ring:pending_changes(Ring) of - [] -> - UpNodes = riak_core_node_watcher:nodes(Service), - Pairs = repair_pairs(Ring, Partition), - case check_up(Pairs, UpNodes) of - true -> - create_repair(Pairs, ModPartition, FilterModFun, Mod, Partition, Repairs, State); - {false, Down} -> - {reply, {down, Down}, State} - end; - _ -> - {reply, ownership_change_in_progress, State} + [] -> + UpNodes = riak_core_node_watcher:nodes(Service), + Pairs = repair_pairs(Ring, Partition), + case check_up(Pairs, UpNodes) of + true -> + create_repair(Pairs, ModPartition, FilterModFun, Mod, + Partition, Repairs, State); + {false, Down} -> {reply, {down, Down}, State} + end; + _ -> {reply, ownership_change_in_progress, State} end. -create_repair(Pairs, ModPartition, FilterModFun, Mod, Partition, Repairs, State) -> +create_repair(Pairs, ModPartition, FilterModFun, Mod, + Partition, Repairs, State) -> {MOP, _} = MinusOne = get_minus_one(Pairs), {POP, _} = PlusOne = get_plus_one(Pairs), - riak_core_handoff_manager:xfer(MinusOne, - ModPartition, + riak_core_handoff_manager:xfer(MinusOne, ModPartition, FilterModFun), - riak_core_handoff_manager:xfer(PlusOne, - ModPartition, + riak_core_handoff_manager:xfer(PlusOne, ModPartition, FilterModFun), MOXStatus = #xfer_status{status = pending, mod_src_target = {Mod, MOP, Partition}}, POXStatus = #xfer_status{status = pending, mod_src_target = {Mod, POP, Partition}}, Repair = #repair{mod_partition = ModPartition, - filter_mod_fun = FilterModFun, - pairs = Pairs, - minus_one_xfer = MOXStatus, - plus_one_xfer = POXStatus}, + filter_mod_fun = FilterModFun, pairs = Pairs, + minus_one_xfer = MOXStatus, plus_one_xfer = POXStatus}, Repairs2 = Repairs ++ [Repair], State2 = State#state{repairs = Repairs2}, logger:debug("add repair ~p", [ModPartition]), @@ -396,168 +436,157 @@ create_repair(Pairs, ModPartition, FilterModFun, Mod, Partition, Repairs, State) %% @private handle_cast({Partition, Mod, start_vnode}, State) -> - _ = get_vnode(Partition, Mod, State), - {noreply, State}; -handle_cast({unregister, Index, Mod, Pid}, #state{idxtab=T} = State) -> + _ = get_vnode(Partition, Mod, State), {noreply, State}; +handle_cast({unregister, Index, Mod, Pid}, + #state{idxtab = T} = State) -> %% Update forwarding state to ensure vnode is not restarted in %% incorrect forwarding state if next request arrives before next %% ring event. {ok, Ring} = riak_core_ring_manager:get_my_ring(), State2 = update_forwarding({Mod, Index}, Ring, State), - ets:match_delete(T, {idxrec, {Index, Mod}, Index, Mod, Pid, '_'}), + ets:match_delete(T, + {idxrec, {Index, Mod}, Index, Mod, Pid, '_'}), _ = unregister_vnode_stats(Mod, Index), riak_core_vnode_proxy:unregister_vnode(Mod, Index, Pid), {noreply, State2}; -handle_cast({vnode_event, Mod, Idx, Pid, Event}, State) -> +handle_cast({vnode_event, Mod, Idx, Pid, Event}, + State) -> handle_vnode_event(Event, Mod, Idx, Pid, State); handle_cast(force_handoffs, State) -> AllVNodes = get_all_vnodes(), - {ok, Ring, CHBin} = riak_core_ring_manager:get_raw_ring_chashbin(), + {ok, Ring, CHBin} = + riak_core_ring_manager:get_raw_ring_chashbin(), State2 = update_handoff(AllVNodes, Ring, CHBin, State), - _ = [maybe_trigger_handoff(Mod, Idx, Pid, State2) || {Mod, Idx, Pid} <- AllVNodes], - {noreply, State2}; - handle_cast(maybe_start_vnodes, State) -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), State2 = maybe_start_vnodes(Ring, State), {noreply, State2}; - handle_cast({kill_repairs, Reason}, State) -> logger:warning("Killing all repairs: ~p", [Reason]), kill_repairs(State#state.repairs, Reason), - {noreply, State#state{repairs=[]}}; - -handle_cast(_, State) -> - {noreply, State}. + {noreply, State#state{repairs = []}}; +handle_cast(_, State) -> {noreply, State}. handle_info(management_tick, State0) -> schedule_management_timer(), RingID = riak_core_ring_manager:get_ring_id(), - {ok, Ring, CHBin} = riak_core_ring_manager:get_raw_ring_chashbin(), + {ok, Ring, CHBin} = + riak_core_ring_manager:get_raw_ring_chashbin(), State = maybe_ring_changed(RingID, Ring, CHBin, State0), Mods = [Mod || {_, Mod} <- riak_core:vnode_modules()], AllVNodes = get_all_vnodes(Mods), State2 = update_handoff(AllVNodes, Ring, CHBin, State), Transfers = riak_core_ring:pending_changes(Ring), - %% Kill/cancel any repairs during ownership changes - State3 = - case Transfers of - [] -> - State2; - _ -> - Repairs = State#state.repairs, - kill_repairs(Repairs, ownership_change), - trigger_ownership_handoff(Transfers, Mods, Ring, State2), - State2#state{repairs=[]} - end, - - State4 = State3#state{vnode_start_tokens = ?DEFAULT_VNODE_ROLLING_START}, + State3 = case Transfers of + [] -> State2; + _ -> + Repairs = State#state.repairs, + kill_repairs(Repairs, ownership_change), + trigger_ownership_handoff(Transfers, Mods, Ring, + State2), + State2#state{repairs = []} + end, + State4 = State3#state{vnode_start_tokens = + ?DEFAULT_VNODE_ROLLING_START}, State5 = maybe_start_vnodes(Ring, State4), - Repairs2 = check_repairs(State4#state.repairs), - {noreply, State5#state{repairs=Repairs2}}; - + {noreply, State5#state{repairs = Repairs2}}; handle_info({'DOWN', MonRef, process, _P, _I}, State) -> - delmon(MonRef, State), - {noreply, State}. + delmon(MonRef, State), {noreply, State}. %% @private handle_vnode_event(inactive, Mod, Idx, Pid, State) -> maybe_trigger_handoff(Mod, Idx, Pid, State), {noreply, State}; -handle_vnode_event(handoff_complete, Mod, Idx, Pid, State) -> +handle_vnode_event(handoff_complete, Mod, Idx, Pid, + State) -> NewHO = dict:erase({Mod, Idx}, State#state.handoff), - gen_fsm:send_all_state_event(Pid, finish_handoff), - {noreply, State#state{handoff=NewHO}}; -handle_vnode_event(handoff_error, Mod, Idx, Pid, State) -> + riak_core_vnode:cast_finish_handoff(Pid), + {noreply, State#state{handoff = NewHO}}; +handle_vnode_event(handoff_error, Mod, Idx, Pid, + State) -> NewHO = dict:erase({Mod, Idx}, State#state.handoff), - gen_fsm:send_all_state_event(Pid, cancel_handoff), - {noreply, State#state{handoff=NewHO}}. + riak_core_vnode:cancel_handoff(Pid), + {noreply, State#state{handoff = NewHO}}. %% @private -terminate(_Reason, _State) -> - ok. +terminate(_Reason, _State) -> ok. %% @private -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - +code_change(_OldVsn, State, _Extra) -> {ok, State}. %% =================================================================== %% Internal functions %% =================================================================== -maybe_ring_changed(RingID, Ring, CHBin, State=#state{last_ring_id=LastID}) -> +maybe_ring_changed(RingID, Ring, CHBin, + State = #state{last_ring_id = LastID}) -> case RingID of - LastID -> - maybe_ensure_vnodes_started(Ring), - State; - _ -> - ensure_vnodes_started(Ring), - State2 = ring_changed(Ring, CHBin, State), - State2#state{last_ring_id=RingID} + LastID -> maybe_ensure_vnodes_started(Ring), State; + _ -> + ensure_vnodes_started(Ring), + State2 = ring_changed(Ring, CHBin, State), + State2#state{last_ring_id = RingID} end. ring_changed(Ring, CHBin, State) -> %% Update vnode forwarding state AllVNodes = get_all_vnodes(), Mods = [Mod || {_, Mod} <- riak_core:vnode_modules()], - State2 = update_forwarding(AllVNodes, Mods, Ring, State), - + State2 = update_forwarding(AllVNodes, Mods, Ring, + State), %% Update handoff state State3 = update_handoff(AllVNodes, Ring, CHBin, State2), - %% Trigger ownership transfers. Transfers = riak_core_ring:pending_changes(Ring), - trigger_ownership_handoff(Transfers, Mods, Ring, State3), + trigger_ownership_handoff(Transfers, Mods, Ring, + State3), State3. maybe_ensure_vnodes_started(Ring) -> ExitingStates = [leaving, exiting, invalid], Status = riak_core_ring:member_status(Ring, node()), case lists:member(Status, ExitingStates) of - true -> - ensure_vnodes_started(Ring), - ok; - _ -> - ok + true -> ensure_vnodes_started(Ring), ok; + _ -> ok end. ensure_vnodes_started(Ring) -> - spawn(fun() -> - try - riak_core_ring_handler:ensure_vnodes_started(Ring) + spawn(fun () -> + try riak_core_ring_handler:ensure_vnodes_started(Ring) catch Type:Reason:Stacktrace -> - logger:error("~p", [{Type, Reason, Stacktrace}]) + logger:error("~p", [{Type, Reason, Stacktrace}]) end end). schedule_management_timer() -> ManagementTick = application:get_env(riak_core, - vnode_management_timer, - 10000), - erlang:send_after(ManagementTick, ?MODULE, management_tick). + vnode_management_timer, 10000), + erlang:send_after(ManagementTick, ?MODULE, + management_tick). -trigger_ownership_handoff(Transfers, Mods, Ring, State) -> +trigger_ownership_handoff(Transfers, Mods, Ring, + State) -> IsResizing = riak_core_ring:is_resizing(Ring), - Throttle = limit_ownership_handoff(Transfers, IsResizing), - Awaiting = [{Mod, Idx} || {Idx, Node, _, CMods, S} <- Throttle, - Mod <- Mods, - S =:= awaiting, - Node =:= node(), - not lists:member(Mod, CMods)], - _ = [maybe_trigger_handoff(Mod, Idx, State) || {Mod, Idx} <- Awaiting], + Throttle = limit_ownership_handoff(Transfers, + IsResizing), + Awaiting = [{Mod, Idx} + || {Idx, Node, _, CMods, S} <- Throttle, Mod <- Mods, + S =:= awaiting, Node =:= node(), + not lists:member(Mod, CMods)], + _ = [maybe_trigger_handoff(Mod, Idx, State) + || {Mod, Idx} <- Awaiting], ok. limit_ownership_handoff(Transfers, IsResizing) -> Limit = application:get_env(riak_core, - forced_ownership_handoff, - ?DEFAULT_OWNERSHIP_TRIGGER), + forced_ownership_handoff, + ?DEFAULT_OWNERSHIP_TRIGGER), limit_ownership_handoff(Limit, Transfers, IsResizing). limit_ownership_handoff(Limit, Transfers, false) -> @@ -566,192 +595,210 @@ limit_ownership_handoff(Limit, Transfers, true) -> %% if we are resizing: filter out completed resize operations, %% since they remain in the list until all are complete. then %% treat transfers as normal - Filtered = [Transfer || {_,_,_,_,Status}=Transfer <- Transfers, - Status =:= awaiting], + Filtered = [Transfer + || {_, _, _, _, Status} = Transfer <- Transfers, + Status =:= awaiting], limit_ownership_handoff(Limit, Filtered, false). %% @private -idx2vnode(Idx, Mod, _State=#state{idxtab=T}) -> +idx2vnode(Idx, Mod, _State = #state{idxtab = T}) -> case ets:lookup(T, {Idx, Mod}) of - [I] -> I#idxrec.pid; - [] -> no_match + [I] -> I#idxrec.pid; + [] -> no_match end. %% @private -delmon(MonRef, _State=#state{idxtab=T}) -> +delmon(MonRef, _State = #state{idxtab = T}) -> case ets:lookup(T, MonRef) of - [#monrec{key= {Index, Mod} = Key}] -> - _ = unregister_vnode_stats(Mod, Index), - ets:match_delete(T, {idxrec, Key, '_', '_', '_', MonRef}), - ets:delete(T, MonRef); - [] -> - ets:match_delete(T, {idxrec, '_', '_', '_', '_', MonRef}) + [#monrec{key = {Index, Mod} = Key}] -> + _ = unregister_vnode_stats(Mod, Index), + ets:match_delete(T, + {idxrec, Key, '_', '_', '_', MonRef}), + ets:delete(T, MonRef); + [] -> + ets:match_delete(T, + {idxrec, '_', '_', '_', '_', MonRef}) end. %% @private -add_vnode_rec(I, _State=#state{idxtab=T}) -> ets:insert(T,I). +add_vnode_rec(I, _State = #state{idxtab = T}) -> + ets:insert(T, I). %% @private -get_vnode(Idx, Mod, State) when not is_list(Idx) -> - [Result] = get_vnode([Idx], Mod, State), - Result; -get_vnode(IdxList, Mod, State) -> - Initial = - [case idx2vnode(Idx, Mod, State) of - no_match -> Idx; - Pid -> {Idx, Pid} - end - || Idx <- IdxList], - {NotStarted, Started} = lists:partition(fun erlang:is_integer/1, Initial), - StartFun = - fun(Idx) -> - ForwardTo = get_forward(Mod, Idx, State), - logger:debug("Will start VNode for partition ~p", [Idx]), - {ok, Pid} = - riak_core_vnode_sup:start_vnode(Mod, Idx, ForwardTo), - register_vnode_stats(Mod, Idx, Pid), - logger:debug("Started VNode, waiting for initialization to complete ~p, ~p ", [Pid, Idx]), - ok = riak_core_vnode:wait_for_init(Pid), - logger:debug("VNode initialization ready ~p, ~p", [Pid, Idx]), - {Idx, Pid} - end, - Pairs = Started ++ riak_core_util:pmap(StartFun, NotStarted, ?DEFAULT_VNODE_ROLLING_START), +get_vnode(Idx, Module, State) when not is_list(Idx) -> + [Result] = get_vnode([Idx], Module, State), Result; +get_vnode(IdxList, Module, State) -> + Initial = [case idx2vnode(Idx, Module, State) of + no_match -> Idx; + Pid -> {Idx, Pid} + end + || Idx <- IdxList], + {NotStarted, Started} = + lists:partition(fun erlang:is_integer/1, Initial), + StartFun = fun (Idx) -> + ForwardTo = get_forward(Module, Idx, State), + logger:debug("Will start VNode for partition ~p", + [Idx]), + {ok, Pid} = riak_core_vnode_sup:start_vnode(Module, Idx, + ForwardTo), + register_vnode_stats(Module, Idx, Pid), + logger:debug("Started VNode, waiting for initialization " + "to\n complete " + "~p, ~p ", + [Pid, Idx]), + ok = riak_core_vnode:wait_for_init(Pid), + logger:debug("VNode initialization ready ~p, ~p", + [Pid, Idx]), + {Idx, Pid} + end, + Pairs = Started ++ + riak_core_util:pmap(StartFun, NotStarted, + ?DEFAULT_VNODE_ROLLING_START), %% Return Pids in same order as input PairsDict = dict:from_list(Pairs), _ = [begin - Pid = dict:fetch(Idx, PairsDict), - MonRef = erlang:monitor(process, Pid), - IdxRec = #idxrec{key={Idx,Mod},idx=Idx,mod=Mod,pid=Pid, - monref=MonRef}, - MonRec = #monrec{monref=MonRef, key={Idx,Mod}}, - add_vnode_rec([IdxRec, MonRec], State) - end || Idx <- NotStarted], - [ dict:fetch(Idx, PairsDict) || Idx <- IdxList]. - + Pid = dict:fetch(Idx, PairsDict), + MonRef = erlang:monitor(process, Pid), + IdxRec = #idxrec{key = {Idx, Module}, idx = Idx, + mod = Module, pid = Pid, monref = MonRef}, + MonRec = #monrec{monref = MonRef, key = {Idx, Module}}, + add_vnode_rec([IdxRec, MonRec], State) + end + || Idx <- NotStarted], + [dict:fetch(Idx, PairsDict) || Idx <- IdxList]. -get_forward(Mod, Idx, #state{forwarding=Fwd}) -> +get_forward(Mod, Idx, #state{forwarding = Fwd}) -> case dict:find({Mod, Idx}, Fwd) of - {ok, ForwardTo} -> - ForwardTo; - _ -> - undefined + {ok, ForwardTo} -> ForwardTo; + _ -> undefined end. check_forward(Ring, Mod, Index) -> Node = node(), case riak_core_ring:next_owner(Ring, Index, Mod) of - {Node, '$resize', _} -> - Complete = riak_core_ring:complete_resize_transfers(Ring, {Index, Node}, Mod), - {{Mod, Index}, Complete}; - {Node, '$delete', _} -> - {{Mod, Index}, undefined}; - {Node, NextOwner, complete} -> - {{Mod, Index}, NextOwner}; - _ -> - {{Mod, Index}, undefined} + {Node, '$resize', _} -> + Complete = + riak_core_ring:complete_resize_transfers(Ring, + {Index, Node}, Mod), + {{Mod, Index}, Complete}; + {Node, '$delete', _} -> {{Mod, Index}, undefined}; + {Node, NextOwner, complete} -> + {{Mod, Index}, NextOwner}; + _ -> {{Mod, Index}, undefined} end. -check_forward_precomputed(Completed, Mod, Index, Node, Ring) -> +check_forward_precomputed(Completed, Mod, Index, Node, + Ring) -> case dict:find({Mod, Index}, Completed) of - {ok, '$resize'} -> - Complete = riak_core_ring:complete_resize_transfers(Ring, {Index, Node}, Mod), - {{Mod, Index}, Complete}; - {ok, '$delete'} -> - {{Mod, Index}, undefined}; - {ok, NextOwner} -> - {{Mod, Index}, NextOwner}; - _ -> - {{Mod, Index}, undefined} + {ok, '$resize'} -> + Complete = + riak_core_ring:complete_resize_transfers(Ring, + {Index, Node}, Mod), + {{Mod, Index}, Complete}; + {ok, '$delete'} -> {{Mod, Index}, undefined}; + {ok, NextOwner} -> {{Mod, Index}, NextOwner}; + _ -> {{Mod, Index}, undefined} end. compute_forwarding(Mods, Ring) -> Node = node(), CL = [{{Mod, Idx}, NextOwner} || Mod <- Mods, - {Idx, Owner, NextOwner} <- riak_core_ring:completed_next_owners(Mod, Ring), + {Idx, Owner, NextOwner} + <- riak_core_ring:completed_next_owners(Mod, Ring), Owner =:= Node], Completed = dict:from_list(CL), - Forwarding = [check_forward_precomputed(Completed, Mod, I, N, Ring) + Forwarding = [check_forward_precomputed(Completed, Mod, + I, N, Ring) || {I, N} <- riak_core_ring:all_owners(Ring), Mod <- Mods], dict:from_list(Forwarding). update_forwarding(AllVNodes, Mods, Ring, - State=#state{forwarding=Forwarding}) -> + State = #state{forwarding = Forwarding}) -> NewForwarding = compute_forwarding(Mods, Ring), - %% Inform vnodes that have changed forwarding status - VNodes = dict:from_list([{{Mod, Idx}, Pid} || {Mod, Idx, Pid} <- AllVNodes]), - Diff = dict:filter(fun(K,V) -> + VNodes = dict:from_list([{{Mod, Idx}, Pid} + || {Mod, Idx, Pid} <- AllVNodes]), + Diff = dict:filter(fun (K, V) -> dict:find(K, Forwarding) /= {ok, V} - end, NewForwarding), - dict:fold(fun({Mod, Idx}, ForwardTo, _) -> - change_forward(VNodes, Mod, Idx, ForwardTo), - ok - end, ok, Diff), - - State#state{forwarding=NewForwarding}. + end, + NewForwarding), + dict:fold(fun ({Mod, Idx}, ForwardTo, _) -> + change_forward(VNodes, Mod, Idx, ForwardTo), ok + end, + ok, Diff), + State#state{forwarding = NewForwarding}. -update_forwarding({Mod, Idx}, Ring, State=#state{forwarding=Forwarding}) -> +update_forwarding({Mod, Idx}, Ring, + State = #state{forwarding = Forwarding}) -> {_, ForwardTo} = check_forward(Ring, Mod, Idx), - NewForwarding = dict:store({Mod, Idx}, ForwardTo, Forwarding), - State#state{forwarding=NewForwarding}. + NewForwarding = dict:store({Mod, Idx}, ForwardTo, + Forwarding), + State#state{forwarding = NewForwarding}. change_forward(VNodes, Mod, Idx, ForwardTo) -> case dict:find({Mod, Idx}, VNodes) of - error -> - ok; - {ok, Pid} -> - riak_core_vnode:set_forwarding(Pid, ForwardTo), - ok + error -> ok; + {ok, Pid} -> + riak_core_vnode:set_forwarding(Pid, ForwardTo), ok end. update_handoff(AllVNodes, Ring, CHBin, State) -> case riak_core_ring:ring_ready(Ring) of - false -> - State; - true -> - NewHO = lists:flatten([case should_handoff(Ring, CHBin, Mod, Idx) of - false -> - []; - {true, primary, TargetNode} -> - [{{Mod, Idx}, {ownership, outbound, TargetNode}}]; - {true, {fallback, _Node}, TargetNode} -> - [{{Mod, Idx}, {hinted, outbound, TargetNode}}]; - {true, '$resize'=Action} -> - [{{Mod, Idx}, {resize, outbound, Action}}]; - {true, '$delete'=Action} -> - [{{Mod, Idx}, {delete, local, Action}}] - end || {Mod, Idx, _Pid} <- AllVNodes]), - State#state{handoff=dict:from_list(NewHO)} + false -> State; + true -> + NewHO = lists:flatten([case should_handoff(Ring, CHBin, + Mod, Idx) + of + false -> []; + {true, primary, TargetNode} -> + [{{Mod, Idx}, + {ownership, outbound, TargetNode}}]; + {true, {fallback, _Node}, TargetNode} -> + [{{Mod, Idx}, + {hinted, outbound, TargetNode}}]; + {true, '$resize' = Action} -> + [{{Mod, Idx}, + {resize, outbound, Action}}]; + {true, '$delete' = Action} -> + [{{Mod, Idx}, {delete, local, Action}}] + end + || {Mod, Idx, _Pid} <- AllVNodes]), + State#state{handoff = dict:from_list(NewHO)} end. should_handoff(Ring, _CHBin, Mod, Idx) -> - {_, NextOwner, _} = riak_core_ring:next_owner(Ring, Idx), + {_, NextOwner, _} = riak_core_ring:next_owner(Ring, + Idx), Type = riak_core_ring:vnode_type(Ring, Idx), Ready = riak_core_ring:ring_ready(Ring), IsResizing = riak_core_ring:is_resizing(Ring), - case determine_handoff_target(Type, NextOwner, Ready, IsResizing) of - undefined -> - false; - Action when Action =:= '$resize' - orelse Action =:= '$delete' -> - {true, Action}; - TargetNode -> - case app_for_vnode_module(Mod) of - undefined -> false; - {ok, App} -> - case lists:member(TargetNode, - riak_core_node_watcher:nodes(App)) of - false -> false; - true -> {true, Type, TargetNode} - end - end + case determine_handoff_target(Type, NextOwner, Ready, + IsResizing) + of + undefined -> false; + Action + when Action =:= '$resize' orelse Action =:= '$delete' -> + {true, Action}; + TargetNode -> + case app_for_vnode_module(Mod) of + undefined -> false; + {ok, App} -> + case lists:member(TargetNode, + riak_core_node_watcher:nodes(App)) + of + false -> false; + true -> {true, Type, TargetNode} + end + end end. -determine_handoff_target(Type, NextOwner, RingReady, IsResize) -> +determine_handoff_target(Type, NextOwner, RingReady, + IsResize) -> Me = node(), - determine_handoff_target(Type, NextOwner, RingReady, IsResize, NextOwner =:= Me). + determine_handoff_target(Type, NextOwner, RingReady, + IsResize, NextOwner =:= Me). determine_handoff_target(primary, _, _, _, true) -> %% Never hand off to myself as a primary @@ -759,126 +806,134 @@ determine_handoff_target(primary, _, _, _, true) -> determine_handoff_target(primary, undefined, _, _, _) -> %% No ring change indicated for this partition undefined; -determine_handoff_target(primary, NextOwner, true, _, _) -> +determine_handoff_target(primary, NextOwner, true, _, + _) -> %% Primary, ring is ready, go. This may be a node or a `$resize' %% action NextOwner; determine_handoff_target(primary, _, false, _, _) -> %% Ring isn't ready, no matter what, don't do a primary handoff undefined; -determine_handoff_target({fallback, _Target}, '$delete'=Action, _, _, _) -> +determine_handoff_target({fallback, _Target}, + '$delete' = Action, _, _, _) -> %% partitions moved during resize and scheduled for deletion, indexes %% that exist in both the original and resized ring that were moved appear %% as fallbacks. Action; -determine_handoff_target(resized_primary, '$delete'=Action, _, _, _) -> +determine_handoff_target(resized_primary, + '$delete' = Action, _, _, _) -> %% partitions that no longer exist after the ring has been resized (shrunk) %% scheduled for deletion Action; -determine_handoff_target(resized_primary, _, _, false, _) -> +determine_handoff_target(resized_primary, _, _, false, + _) -> %% partitions that would have existed in a ring whose expansion was aborted %% and are still running need to be cleaned up after and shutdown '$delete'; -determine_handoff_target({fallback, For}, undefined, _, _, _) -> +determine_handoff_target({fallback, For}, undefined, _, + _, _) -> %% Fallback vnode target is primary (hinted handoff). `For' can %% technically be a `$resize' action but unclear it ever would be For; -determine_handoff_target(_, _, _, _, _) -> - undefined. - +determine_handoff_target(_, _, _, _, _) -> undefined. app_for_vnode_module(Mod) when is_atom(Mod) -> case application:get_env(riak_core, vnode_modules) of - {ok, Mods} -> - case lists:keysearch(Mod, 2, Mods) of - {value, {App, Mod}} -> - {ok, App}; - false -> - undefined - end; - undefined -> undefined + {ok, Mods} -> + case lists:keysearch(Mod, 2, Mods) of + {value, {App, Mod}} -> {ok, App}; + false -> undefined + end; + undefined -> undefined end. maybe_trigger_handoff(Mod, Idx, State) -> Pid = get_vnode(Idx, Mod, State), maybe_trigger_handoff(Mod, Idx, Pid, State). -maybe_trigger_handoff(Mod, Idx, Pid, _State=#state{handoff=HO}) -> +maybe_trigger_handoff(Mod, Idx, Pid, + _State = #state{handoff = HO}) -> case dict:find({Mod, Idx}, HO) of - {ok, {resize, _Direction, '$resize'}} -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - case riak_core_ring:awaiting_resize_transfer(Ring, {Idx, node()}, Mod) of - undefined -> ok; - {TargetIdx, TargetNode} -> - riak_core_vnode:trigger_handoff(Pid, TargetIdx, TargetNode) - end; - {ok, {delete, local, '$delete'}} -> - riak_core_vnode:trigger_delete(Pid); - {ok, {_Type, _Direction, TargetNode}} -> - riak_core_vnode:trigger_handoff(Pid, TargetNode), - ok; - error -> - ok + {ok, {resize, _Direction, '$resize'}} -> + {ok, Ring} = riak_core_ring_manager:get_my_ring(), + case riak_core_ring:awaiting_resize_transfer(Ring, + {Idx, node()}, Mod) + of + undefined -> ok; + {TargetIdx, TargetNode} -> + riak_core_vnode:trigger_handoff(Pid, TargetIdx, + TargetNode) + end; + {ok, {delete, local, '$delete'}} -> + riak_core_vnode:trigger_delete(Pid); + {ok, {_Type, _Direction, TargetNode}} -> + riak_core_vnode:trigger_handoff(Pid, TargetNode), ok; + error -> ok end. -get_all_vnodes_status(#state{forwarding=Forwarding, handoff=HO}) -> +get_all_vnodes_status(#state{forwarding = Forwarding, + handoff = HO}) -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), Owners = riak_core_ring:all_owners(Ring), VNodes = get_all_vnodes(), - Mods = [Mod || {_App, Mod} <- riak_core:vnode_modules()], - + Mods = [Mod + || {_App, Mod} <- riak_core:vnode_modules()], ThisNode = node(), Types = [case Owner of - ThisNode -> - {{Mod, Idx}, {type, primary}}; - _ -> - {{Mod, Idx}, {type, secondary}} - end || {Idx, Owner} <- Owners, - Mod <- Mods], + ThisNode -> {{Mod, Idx}, {type, primary}}; + _ -> {{Mod, Idx}, {type, secondary}} + end + || {Idx, Owner} <- Owners, Mod <- Mods], Types2 = lists:keysort(1, Types), - Pids = [{{Mod, Idx}, {pid, Pid}} || {Mod, Idx, Pid} <- VNodes], + Pids = [{{Mod, Idx}, {pid, Pid}} + || {Mod, Idx, Pid} <- VNodes], Pids2 = lists:keysort(1, Pids), Forwarding1 = lists:sort(dict:to_list(Forwarding)), - Forwarding2 = [{MI, {forwarding, Node}} || {MI,Node} <- Forwarding1, - Node /= undefined], + Forwarding2 = [{MI, {forwarding, Node}} + || {MI, Node} <- Forwarding1, Node /= undefined], Handoff1 = lists:sort(dict:to_list(HO)), - Handoff2 = [{MI, {should_handoff, Node}} || - {MI,{_Type, _Direction, Node}} <- Handoff1], - - MergeFn = fun(_, V1, V2) when is_list(V1) and is_list(V2) -> + Handoff2 = [{MI, {should_handoff, Node}} + || {MI, {_Type, _Direction, Node}} <- Handoff1], + MergeFn = fun (_, V1, V2) + when is_list(V1) and is_list(V2) -> V1 ++ V2; - (_, V1, V2) when is_list(V1) -> - V1 ++ [V2]; - (_, V1, V2) -> - [V1, V2] + (_, V1, V2) when is_list(V1) -> V1 ++ [V2]; + (_, V1, V2) -> [V1, V2] end, - Status = lists:foldl(fun(B, A) -> + Status = lists:foldl(fun (B, A) -> orddict:merge(MergeFn, A, B) - end, Types2, [Pids2, Forwarding2, Handoff2]), + end, + Types2, [Pids2, Forwarding2, Handoff2]), Status. -update_never_started(Ring, State=#state{known_modules=KnownMods}) -> - UnknownMods = [Mod || {_App, Mod} <- riak_core:vnode_modules(), - not lists:member(Mod, KnownMods)], +update_never_started(Ring, + State = #state{known_modules = KnownMods}) -> + UnknownMods = [Mod + || {_App, Mod} <- riak_core:vnode_modules(), + not lists:member(Mod, KnownMods)], case UnknownMods of - [] -> - State; - _ -> - Indices = [Idx || {Idx, _} <- riak_core_ring:all_owners(Ring)], - lists:foldl(fun(Mod, StateAcc) -> - update_never_started(Mod, Indices, StateAcc) - end, State, UnknownMods) + [] -> State; + _ -> + Indices = [Idx + || {Idx, _} <- riak_core_ring:all_owners(Ring)], + lists:foldl(fun (Mod, StateAcc) -> + update_never_started(Mod, Indices, StateAcc) + end, + State, UnknownMods) end. update_never_started(Mod, Indices, State) -> IdxPids = get_all_index_pid(Mod, []), AlreadyStarted = [Idx || {Idx, _Pid} <- IdxPids], - NeverStarted = ordsets:subtract(ordsets:from_list(Indices), - ordsets:from_list(AlreadyStarted)), + NeverStarted = + ordsets:subtract(ordsets:from_list(Indices), + ordsets:from_list(AlreadyStarted)), NeverStarted2 = [{Idx, Mod} || Idx <- NeverStarted], - NeverStarted3 = NeverStarted2 ++ State#state.never_started, + NeverStarted3 = NeverStarted2 ++ + State#state.never_started, KnownModules = [Mod | State#state.known_modules], - State#state{known_modules=KnownModules, never_started=NeverStarted3}. + State#state{known_modules = KnownModules, + never_started = NeverStarted3}. maybe_start_vnodes(Ring, State) -> case riak_core_ring:check_lastgasp(Ring) of @@ -890,127 +945,147 @@ maybe_start_vnodes(Ring, State) -> State3 end. -maybe_start_vnodes(State=#state{vnode_start_tokens=Tokens, - never_started=NeverStarted}) -> +maybe_start_vnodes(State = #state{vnode_start_tokens = + Tokens, + never_started = NeverStarted}) -> case {Tokens, NeverStarted} of - {0, _} -> - State; - {_, []} -> - State; - {_, [{Idx, Mod} | NeverStarted2]} -> - _ = get_vnode(Idx, Mod, State), - gen_server:cast(?MODULE, maybe_start_vnodes), - State#state{vnode_start_tokens=Tokens-1, - never_started=NeverStarted2} + {0, _} -> State; + {_, []} -> State; + {_, [{Idx, Mod} | NeverStarted2]} -> + _ = get_vnode(Idx, Mod, State), + gen_server:cast(?MODULE, maybe_start_vnodes), + State#state{vnode_start_tokens = Tokens - 1, + never_started = NeverStarted2} end. --spec check_repairs(repairs()) -> Repairs2::repairs(). +-spec check_repairs(repairs()) -> Repairs2 :: repairs(). + check_repairs(Repairs) -> - Check = - fun(R=#repair{minus_one_xfer=MOX, plus_one_xfer=POX}, Repairs2) -> - Pairs = R#repair.pairs, - MO = get_minus_one(Pairs), - PO = get_plus_one(Pairs), - MOX2 = maybe_retry(R, MO, MOX), - POX2 = maybe_retry(R, PO, POX), - - if ?XFER_COMPLETE(MOX2) andalso ?XFER_COMPLETE(POX2) -> - Repairs2; - true -> - R2 = R#repair{minus_one_xfer=MOX2, plus_one_xfer=POX2}, - [R2|Repairs2] - end - end, + Check = fun (R = #repair{minus_one_xfer = MOX, + plus_one_xfer = POX}, + Repairs2) -> + Pairs = R#repair.pairs, + MO = get_minus_one(Pairs), + PO = get_plus_one(Pairs), + MOX2 = maybe_retry(R, MO, MOX), + POX2 = maybe_retry(R, PO, POX), + if (?XFER_COMPLETE(MOX2)) andalso + (?XFER_COMPLETE(POX2)) -> + Repairs2; + true -> + R2 = R#repair{minus_one_xfer = MOX2, + plus_one_xfer = POX2}, + [R2 | Repairs2] + end + end, lists:reverse(lists:foldl(Check, [], Repairs)). %% TODO: get all this repair, xfer status and Src business figured out. --spec maybe_retry(repair(), tuple(), xfer_status()) -> Xfer2::xfer_status(). -maybe_retry(R, {SrcPartition, _}=Src, Xfer) -> +-spec maybe_retry(repair(), tuple(), + xfer_status()) -> Xfer2 :: xfer_status(). + +maybe_retry(R, {SrcPartition, _} = Src, Xfer) -> case Xfer#xfer_status.status of - complete -> - Xfer; - pending -> - {Mod, _, Partition} = Xfer#xfer_status.mod_src_target, - FilterModFun = R#repair.filter_mod_fun, - - riak_core_handoff_manager:xfer(Src, {Mod, Partition}, FilterModFun), - #xfer_status{status=pending, - mod_src_target={Mod, SrcPartition, Partition}} + complete -> Xfer; + pending -> + {Mod, _, Partition} = Xfer#xfer_status.mod_src_target, + FilterModFun = R#repair.filter_mod_fun, + riak_core_handoff_manager:xfer(Src, {Mod, Partition}, + FilterModFun), + #xfer_status{status = pending, + mod_src_target = {Mod, SrcPartition, Partition}} end. %% @private %% %% @doc Verify that all nodes are up involved in the repair. --spec check_up([{non_neg_integer(), node()}], [node()]) -> - true | {false, Down::[{non_neg_integer(), node()}]}. +-spec check_up([{non_neg_integer(), node()}], + [node()]) -> true | + {false, Down :: [{non_neg_integer(), node()}]}. + check_up(Pairs, UpNodes) -> - Down = [Pair || {_Partition, Owner}=Pair <- Pairs, - not lists:member(Owner, UpNodes)], + Down = [Pair + || {_Partition, Owner} = Pair <- Pairs, + not lists:member(Owner, UpNodes)], case Down of - [] -> true; - _ -> {false, Down} + [] -> true; + _ -> {false, Down} end. %% @private %% %% @doc Get the three `{Partition, Owner}' pairs involved in a repair %% operation for the given `Ring' and `Partition'. --spec repair_pairs(riak_core_ring:riak_core_ring(), non_neg_integer()) -> - [{Partition::non_neg_integer(), Owner::node()}]. +-spec repair_pairs(riak_core_ring:riak_core_ring(), + non_neg_integer()) -> [{Partition :: non_neg_integer(), + Owner :: node()}]. + repair_pairs(Ring, Partition) -> Owner = riak_core_ring:index_owner(Ring, Partition), CH = riak_core_ring:chash(Ring), - [_, Before] = chash:predecessors(<>, CH, 2), - [After] = chash:successors(<>, CH, 1), + [_, Before] = + chash:predecessors(<>, CH, 2), + [After] = chash:successors(<>, + CH, 1), [Before, {Partition, Owner}, After]. %% @private %% %% @doc Get the corresponding repair entry in `Repairs', if one %% exists, for the given `ModPartition'. --spec get_repair(mod_partition(), repairs()) -> repair() | none. +-spec get_repair(mod_partition(), + repairs()) -> repair() | none. + get_repair(ModPartition, Repairs) -> - case lists:keyfind(ModPartition, #repair.mod_partition, Repairs) of - false -> none; - Val -> Val + case lists:keyfind(ModPartition, #repair.mod_partition, + Repairs) + of + false -> none; + Val -> Val end. %% @private %% %% @doc Remove the repair entry. -spec remove_repair(repair(), repairs()) -> repairs(). + remove_repair(Repair, Repairs) -> - lists:keydelete(Repair#repair.mod_partition, #repair.mod_partition, Repairs). + lists:keydelete(Repair#repair.mod_partition, + #repair.mod_partition, Repairs). %% @private %% %% @doc Replace the matching repair entry with `Repair'. -spec replace_repair(repair(), repairs()) -> repairs(). + replace_repair(Repair, Repairs) -> - lists:keyreplace(Repair#repair.mod_partition, #repair.mod_partition, - Repairs, Repair). + lists:keyreplace(Repair#repair.mod_partition, + #repair.mod_partition, Repairs, Repair). %% @private %% %% @doc Get the `{Partition, Owner}' pair that comes before the %% partition under repair. --spec get_minus_one([{index(), node()}]) -> {index(), node()}. -get_minus_one([MinusOne, _, _]) -> - MinusOne. +-spec get_minus_one([{index(), node()}]) -> {index(), + node()}. + +get_minus_one([MinusOne, _, _]) -> MinusOne. %% @private %% %% @doc Get the `{Partition, Owner}' pair that comes after the %% partition under repair. --spec get_plus_one([{index(), node()}]) -> {index(), node()}. -get_plus_one([_, _, PlusOne]) -> - PlusOne. +-spec get_plus_one([{index(), node()}]) -> {index(), + node()}. + +get_plus_one([_, _, PlusOne]) -> PlusOne. %% @private %% %% @doc Kill all outbound and inbound xfers related to `Repairs' %% targeting this node with `Reason'. -spec kill_repairs([repair()], term()) -> ok. + kill_repairs(Repairs, Reason) -> _ = [kill_repair(Repair, Reason) || Repair <- Repairs], ok. @@ -1018,30 +1093,27 @@ kill_repairs(Repairs, Reason) -> kill_repair(Repair, Reason) -> {Mod, Partition} = Repair#repair.mod_partition, Pairs = Repair#repair.pairs, - {_,MOOwner} = get_minus_one(Pairs), - {_,POOwner} = get_minus_one(Pairs), + {_, MOOwner} = get_minus_one(Pairs), + {_, POOwner} = get_minus_one(Pairs), MOX = Repair#repair.minus_one_xfer, POX = Repair#repair.plus_one_xfer, MOModSrcTarget = MOX#xfer_status.mod_src_target, POModSrcTarget = POX#xfer_status.mod_src_target, %% Kill the remote senders riak_core_handoff_manager:kill_xfer(MOOwner, - MOModSrcTarget, - Reason), + MOModSrcTarget, Reason), riak_core_handoff_manager:kill_xfer(POOwner, - POModSrcTarget, - Reason), + POModSrcTarget, Reason), %% Kill the local receivers riak_core_handoff_manager:kill_xfer(node(), - {Mod, undefined, Partition}, - Reason). + {Mod, undefined, Partition}, Reason). register_vnode_stats(_Mod, _Index, _Pid) -> - %% STATS + %% STATS %riak_core_stat:register_vnode_stats(Mod, Index, Pid). - ok. + ok. unregister_vnode_stats(_Mod, _Index) -> - %% STATS + %% STATS %riak_core_stat:unregister_vnode_stats(Mod, Index). - ok. + ok. diff --git a/src/riak_core_vnode_master.erl b/src/riak_core_vnode_master.erl index 352d02886..ea307c34c 100644 --- a/src/riak_core_vnode_master.erl +++ b/src/riak_core_vnode_master.erl @@ -23,46 +23,43 @@ %% @doc dispatch to vnodes -module(riak_core_vnode_master). + -include("riak_core_vnode.hrl"). + -behaviour(gen_server). --compile({nowarn_deprecated_function, - [{gen_fsm, send_event, 2}, - {gen_fsm, send_all_state_event, 2}]}). - --export([start_link/1, start_link/2, start_link/3, get_vnode_pid/2, - start_vnode/2, - command/3, command/4, - command_unreliable/3, command_unreliable/4, - sync_command/3, sync_command/4, - coverage/5, - command_return_vnode/4, +-export([start_link/1, get_vnode_pid/2, start_vnode/2, + command/3, command/4, command_unreliable/3, + command_unreliable/4, sync_command/3, sync_command/4, + coverage/5, command_return_vnode/4, sync_spawn_command/3, make_request/3, make_coverage_request/4, all_nodes/1, reg_name/1]). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). --record(state, {idxtab, sup_name, vnode_mod, legacy}). --define(LONG_TIMEOUT, 120*1000). +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). + +-record(state, {idxtab, sup_name, vnode_mod}). + +-define(LONG_TIMEOUT, 120 * 1000). + +-type riak_vnode_req_v1() :: #riak_vnode_req_v1{}. + +-type riak_coverage_req_v1() :: #riak_coverage_req_v1{}. + +make_name(VNodeMod, Suffix) -> + list_to_atom(atom_to_list(VNodeMod) ++ Suffix). -make_name(VNodeMod,Suffix) -> list_to_atom(atom_to_list(VNodeMod)++Suffix). -reg_name(VNodeMod) -> make_name(VNodeMod, "_master"). +reg_name(VNodeMod) -> make_name(VNodeMod, "_master"). %% Given atom 'riak_kv_vnode_master', return 'riak_kv_vnode'. vmaster_to_vmod(VMaster) -> L = atom_to_list(VMaster), - list_to_atom(lists:sublist(L,length(L)-7)). + list_to_atom(lists:sublist(L, length(L) - 7)). start_link(VNodeMod) -> - start_link(VNodeMod, undefined). - -start_link(VNodeMod, LegacyMod) -> - start_link(VNodeMod, LegacyMod, undefined). - -start_link(VNodeMod, LegacyMod, Service) -> RegName = reg_name(VNodeMod), gen_server:start_link({local, RegName}, ?MODULE, - [Service,VNodeMod,LegacyMod,RegName], []). + [VNodeMod, RegName], []). start_vnode(Index, VNodeMod) -> riak_core_vnode_manager:start_vnode(Index, VNodeMod). @@ -79,95 +76,109 @@ command_unreliable(Preflist, Msg, VMaster) -> command(PrefListOrCmd, Msg, Sender, VMaster) -> command2(PrefListOrCmd, Msg, Sender, VMaster, normal). -command_unreliable(PrefListOrCmd, Msg, Sender, VMaster) -> - command2(PrefListOrCmd, Msg, Sender, VMaster, unreliable). +command_unreliable(PrefListOrCmd, Msg, Sender, + VMaster) -> + command2(PrefListOrCmd, Msg, Sender, VMaster, + unreliable). %% Send the command to the preflist given with responses going to Sender -command2([], _Msg, _Sender, _VMaster, _How) -> - ok; - -command2([{Index, Pid}|Rest], Msg, Sender, VMaster, How=normal) - when is_pid(Pid) -> - gen_fsm:send_event(Pid, make_request(Msg, Sender, Index)), +command2([], _Msg, _Sender, _VMaster, _How) -> ok; +command2([{Index, Pid} | Rest], Msg, Sender, VMaster, + How = normal) + when is_pid(Pid) -> + Request = make_request(Msg, Sender, Index), + riak_core_vnode:send_req(Pid, Request), command2(Rest, Msg, Sender, VMaster, How); - -command2([{Index, Pid}|Rest], Msg, Sender, VMaster, How=unreliable) - when is_pid(Pid) -> - riak_core_send_msg:send_event_unreliable(Pid, make_request(Msg, Sender, - Index)), +command2([{Index, Pid} | Rest], Msg, Sender, VMaster, + How = unreliable) + when is_pid(Pid) -> + riak_core_send_msg:send_event_unreliable(Pid, + make_request(Msg, Sender, Index)), command2(Rest, Msg, Sender, VMaster, How); -command2([{Index,Node}|Rest], Msg, Sender, VMaster, How) -> - proxy_cast({VMaster, Node}, make_request(Msg, Sender, Index), How), +command2([{Index, Node} | Rest], Msg, Sender, VMaster, + How) -> + proxy_cast({VMaster, Node}, + make_request(Msg, Sender, Index), How), command2(Rest, Msg, Sender, VMaster, How); - -command2(DestTuple, Msg, Sender, VMaster, How) when is_tuple(DestTuple) -> +command2(DestTuple, Msg, Sender, VMaster, How) + when is_tuple(DestTuple) -> %% Final case, tuple = single destination ... so make a list and %% resubmit to this function. command2([DestTuple], Msg, Sender, VMaster, How). %% Send a command to a covering set of vnodes -coverage(Msg, CoverageVNodes, Keyspaces, {Type, Ref, From}, VMaster) - when is_list(CoverageVNodes) -> +coverage(Msg, CoverageVNodes, Keyspaces, + {Type, Ref, From}, VMaster) + when is_list(CoverageVNodes) -> [proxy_cast({VMaster, Node}, - make_coverage_request(Msg, - Keyspaces, + make_coverage_request(Msg, Keyspaces, {Type, {Ref, {Index, Node}}, From}, - Index)) || - {Index, Node} <- CoverageVNodes]; -coverage(Msg, {Index, Node}, Keyspaces, Sender, VMaster) -> + Index)) + || {Index, Node} <- CoverageVNodes]; +coverage(Msg, {Index, Node}, Keyspaces, Sender, + VMaster) -> proxy_cast({VMaster, Node}, make_coverage_request(Msg, Keyspaces, Sender, Index)). - + %% Send the command to an individual Index/Node combination, but also %% return the pid for the vnode handling the request, as `{ok, VnodePid}'. -command_return_vnode({Index,Node}, Msg, Sender, VMaster) -> +command_return_vnode({Index, Node}, Msg, Sender, + VMaster) -> Req = make_request(Msg, Sender, Index), Mod = vmaster_to_vmod(VMaster), - riak_core_vnode_proxy:command_return_vnode({Mod,Index,Node}, Req). + riak_core_vnode_proxy:command_return_vnode({Mod, Index, + Node}, + Req). %% Send a synchronous command to an individual Index/Node combination. %% Will not return until the vnode has returned sync_command(IndexNode, Msg, VMaster) -> sync_command(IndexNode, Msg, VMaster, ?LONG_TIMEOUT). -sync_command({Index,Node}, Msg, VMaster, Timeout) -> +sync_command({Index, Node}, Msg, VMaster, Timeout) -> %% Issue the call to the master, it will update the Sender with %% the From for handle_call so that the {reply} return gets %% sent here. - Request = make_request(Msg, {server, undefined, undefined}, Index), - case gen_server:call({VMaster, Node}, Request, Timeout) of - {vnode_error, {Error, _Args}} -> error(Error); - {vnode_error, Error} -> error(Error); - Else -> Else + Request = make_request(Msg, + {server, undefined, undefined}, Index), + case gen_server:call({VMaster, Node}, Request, Timeout) + of + {vnode_error, {Error, _Args}} -> error(Error); + {vnode_error, Error} -> error(Error); + Else -> Else end. %% Send a synchronous spawned command to an individual Index/Node combination. %% Will not return until the vnode has returned, but the vnode_master will %% continue to handle requests. -sync_spawn_command({Index,Node}, Msg, VMaster) -> - Request = make_request(Msg, {server, undefined, undefined}, Index), - case gen_server:call({VMaster, Node}, {spawn, Request}, infinity) of - {vnode_error, {Error, _Args}} -> error(Error); - {vnode_error, Error} -> error(Error); - Else -> Else +sync_spawn_command({Index, Node}, Msg, VMaster) -> + Request = make_request(Msg, + {server, undefined, undefined}, Index), + case gen_server:call({VMaster, Node}, {spawn, Request}, + infinity) + of + {vnode_error, {Error, _Args}} -> error(Error); + {vnode_error, Error} -> error(Error); + Else -> Else end. - %% Make a request record - exported for use by legacy modules --spec make_request(vnode_req(), sender(), partition()) -> #riak_vnode_req_v1{}. +-spec make_request(vnode_req(), sender(), + partition()) -> riak_vnode_req_v1(). + make_request(Request, Sender, Index) -> - #riak_vnode_req_v1{ - index=Index, - sender=Sender, - request=Request}. + #riak_vnode_req_v1{index = Index, sender = Sender, + request = Request}. %% Make a request record - exported for use by legacy modules --spec make_coverage_request(vnode_req(), keyspaces(), sender(), partition()) -> #riak_coverage_req_v1{}. -make_coverage_request(Request, KeySpaces, Sender, Index) -> - #riak_coverage_req_v1{index=Index, - keyspaces=KeySpaces, - sender=Sender, - request=Request}. +-spec make_coverage_request(vnode_req(), keyspaces(), + sender(), partition()) -> riak_coverage_req_v1(). + +make_coverage_request(Request, KeySpaces, Sender, + Index) -> + #riak_coverage_req_v1{index = Index, + keyspaces = KeySpaces, sender = Sender, + request = Request}. %% Request a list of Pids for all vnodes %% @deprecated @@ -179,91 +190,86 @@ all_nodes(VNodeMod) -> [Pid || {_Mod, _Idx, Pid} <- VNodes]. %% @private -init([Service, VNodeMod, LegacyMod, _RegName]) -> - gen_server:cast(self(), {wait_for_service, Service}), - {ok, #state{idxtab=undefined, - vnode_mod=VNodeMod, - legacy=LegacyMod}}. +init([VNodeMod, _RegName]) -> + {ok, #state{idxtab = undefined, vnode_mod = VNodeMod}}. -proxy_cast(Who, Req) -> - proxy_cast(Who, Req, normal). +proxy_cast(Who, Req) -> proxy_cast(Who, Req, normal). proxy_cast({VMaster, Node}, Req, How) -> do_proxy_cast({VMaster, Node}, Req, How). -do_proxy_cast({VMaster, Node}, Req=?VNODE_REQ{index=Idx}, How) -> +do_proxy_cast({VMaster, Node}, + Req = #riak_vnode_req_v1{index = Idx}, How) -> Mod = vmaster_to_vmod(VMaster), Proxy = riak_core_vnode_proxy:reg_name(Mod, Idx, Node), send_an_event(Proxy, Req, How), ok; -do_proxy_cast({VMaster, Node}, Req=?COVERAGE_REQ{index=Idx}, How) -> +do_proxy_cast({VMaster, Node}, + Req = #riak_coverage_req_v1{index = Idx}, How) -> Mod = vmaster_to_vmod(VMaster), Proxy = riak_core_vnode_proxy:reg_name(Mod, Idx, Node), send_an_event(Proxy, Req, How), ok. send_an_event(Dest, Event, normal) -> - gen_fsm:send_event(Dest, Event); + riak_core_vnode:send_req(Dest, Event); send_an_event(Dest, Event, unreliable) -> riak_core_send_msg:send_event_unreliable(Dest, Event). handle_cast({wait_for_service, Service}, State) -> case Service of - undefined -> - ok; - _ -> - logger:debug("Waiting for service: ~p", [Service]), - riak_core:wait_for_service(Service) + undefined -> ok; + _ -> + logger:debug("Waiting for service: ~p", [Service]), + riak_core:wait_for_service(Service) end, {noreply, State}; -handle_cast(Req=?VNODE_REQ{index=Idx}, State=#state{vnode_mod=Mod}) -> +handle_cast(Req = #riak_vnode_req_v1{index = Idx}, + State = #state{vnode_mod = Mod}) -> Proxy = riak_core_vnode_proxy:reg_name(Mod, Idx), - gen_fsm:send_event(Proxy, Req), + riak_core_vnode:send_req(Proxy, Req), {noreply, State}; -handle_cast(Req=?COVERAGE_REQ{index=Idx}, State=#state{vnode_mod=Mod}) -> +handle_cast(Req = #riak_coverage_req_v1{index = Idx}, + State = #state{vnode_mod = Mod}) -> Proxy = riak_core_vnode_proxy:reg_name(Mod, Idx), - gen_fsm:send_event(Proxy, Req), - {noreply, State}; -handle_cast(Other, State=#state{legacy=Legacy}) when Legacy =/= undefined -> - case catch Legacy:rewrite_cast(Other) of - {ok, ?VNODE_REQ{}=Req} -> - handle_cast(Req, State); - _ -> - {noreply, State} - end. + riak_core_vnode:send_req(Proxy, Req), + {noreply, State}. -handle_call({return_vnode, Req=?VNODE_REQ{index=Idx}}, _From, - State=#state{vnode_mod=Mod}) -> +handle_call({return_vnode, + Req = #riak_vnode_req_v1{index = Idx}}, + _From, State = #state{vnode_mod = Mod}) -> {ok, Pid} = - riak_core_vnode_proxy:command_return_vnode({Mod,Idx,node()}, Req), + riak_core_vnode_proxy:command_return_vnode({Mod, Idx, + node()}, + Req), {reply, {ok, Pid}, State}; -handle_call(Req=?VNODE_REQ{index=Idx, sender={server, undefined, undefined}}, - From, State=#state{vnode_mod=Mod}) -> +handle_call(Req = #riak_vnode_req_v1{index = Idx, + sender = {server, undefined, undefined}}, + From, State = #state{vnode_mod = Mod}) -> Proxy = riak_core_vnode_proxy:reg_name(Mod, Idx), - gen_fsm:send_event(Proxy, Req?VNODE_REQ{sender={server, undefined, From}}), + riak_core_vnode:send_req(Proxy, + Req#riak_vnode_req_v1{sender = + {server, undefined, + From}}), {noreply, State}; handle_call({spawn, - Req=?VNODE_REQ{index=Idx, sender={server, undefined, undefined}}}, - From, State=#state{vnode_mod=Mod}) -> + Req = #riak_vnode_req_v1{index = Idx, + sender = {server, undefined, undefined}}}, + From, State = #state{vnode_mod = Mod}) -> Proxy = riak_core_vnode_proxy:reg_name(Mod, Idx), Sender = {server, undefined, From}, - spawn_link( - fun() -> gen_fsm:send_all_state_event(Proxy, Req?VNODE_REQ{sender=Sender}) end), - {noreply, State}; -handle_call(Other, From, State=#state{legacy=Legacy}) when Legacy =/= undefined -> - case catch Legacy:rewrite_call(Other, From) of - {ok, ?VNODE_REQ{}=Req} -> - handle_call(Req, From, State); - _ -> - {noreply, State} - end. - -handle_info(_Info, State) -> + spawn_link(fun () -> + riak_core_vnode:send_all_proxy_req(Proxy, + Req#riak_vnode_req_v1{sender + = + Sender}) + end), {noreply, State}. +handle_info(_Info, State) -> {noreply, State}. + %% @private -terminate(_Reason, _State) -> - ok. +terminate(_Reason, _State) -> ok. %% @private -code_change(_OldVsn, State, _Extra) -> {ok, State}. +code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/src/riak_core_vnode_proxy.erl b/src/riak_core_vnode_proxy.erl index 571707b95..76dc8b7e6 100644 --- a/src/riak_core_vnode_proxy.erl +++ b/src/riak_core_vnode_proxy.erl @@ -17,9 +17,13 @@ %% %% ------------------------------------------------------------------- -module(riak_core_vnode_proxy). --export([start_link/2, init/1, reg_name/2, reg_name/3, call/2, call/3, cast/2, - unregister_vnode/3, command_return_vnode/2, overloaded/1]). --export([system_continue/3, system_terminate/4, system_code_change/4]). + +-export([start_link/2, init/1, reg_name/2, reg_name/3, + call/2, call/3, cast/2, unregister_vnode/3, + command_return_vnode/2, overloaded/1]). + +-export([system_continue/3, system_terminate/4, + system_code_change/4]). -include("riak_core_vnode.hrl"). @@ -27,28 +31,31 @@ [{gen_fsm, send_event, 2}]}). -ifdef(TEST). + -include_lib("eunit/include/eunit.hrl"). + -endif. --record(state, {mod :: atom(), - index :: partition(), - vnode_pid :: pid() | undefined, - vnode_mref :: reference() | undefined, - check_mailbox :: non_neg_integer(), - check_threshold :: pos_integer() | undefined, - check_counter :: non_neg_integer(), - check_interval :: pos_integer(), - check_request_interval :: non_neg_integer(), - check_request :: undefined | sent | ignore - }). +-record(state, + {mod :: atom(), index :: partition(), + vnode_pid :: pid() | undefined, + vnode_mref :: reference() | undefined, + check_mailbox :: non_neg_integer(), + check_threshold :: pos_integer() | undefined, + check_counter :: non_neg_integer(), + check_interval :: pos_integer(), + check_request_interval :: non_neg_integer(), + check_request :: undefined | sent | ignore}). -define(DEFAULT_CHECK_INTERVAL, 5000). + -define(DEFAULT_OVERLOAD_THRESHOLD, 10000). -reg_name(Mod, Index) -> - ModBin = atom_to_binary(Mod, latin1), +reg_name(Module, Index) -> + ModBin = atom_to_binary(Module, latin1), IdxBin = list_to_binary(integer_to_list(Index)), - AllBin = <<$p,$r,$o,$x,$y,$_, ModBin/binary, $_, IdxBin/binary>>, + AllBin = <<$p, $r, $o, $x, $y, $_, ModBin/binary, $_, + IdxBin/binary>>, binary_to_atom(AllBin, latin1). reg_name(Mod, Index, Node) -> @@ -56,79 +63,78 @@ reg_name(Mod, Index, Node) -> start_link(Mod, Index) -> RegName = reg_name(Mod, Index), - proc_lib:start_link(?MODULE, init, [[self(), RegName, Mod, Index]]). + proc_lib:start_link(?MODULE, init, + [[self(), RegName, Mod, Index]]). -init([Parent, RegName, Mod, Index]) -> +init([Parent, RegName, Module, Index]) -> erlang:register(RegName, self()), proc_lib:init_ack(Parent, {ok, self()}), - Interval = application:get_env(riak_core, - vnode_check_interval, - ?DEFAULT_CHECK_INTERVAL), + vnode_check_interval, + ?DEFAULT_CHECK_INTERVAL), RequestInterval = application:get_env(riak_core, - vnode_check_request_interval, - Interval div 2), + vnode_check_request_interval, + Interval div 2), Threshold = application:get_env(riak_core, - vnode_overload_threshold, - ?DEFAULT_OVERLOAD_THRESHOLD), - - SafeInterval = - case (Threshold == undefined) orelse (Interval < Threshold) of - true -> - Interval; - false -> - logger:warning("Setting riak_core/vnode_check_interval to ~b", - [Threshold div 2]), - Threshold div 2 - end, - SafeRequestInterval = - case RequestInterval < SafeInterval of - true -> - RequestInterval; - false -> - logger:warning("Setting riak_core/vnode_check_request_interval " - "to ~b", [SafeInterval div 2]), - SafeInterval div 2 - end, - - State = #state{mod=Mod, - index=Index, - check_mailbox=0, - check_counter=0, - check_threshold=Threshold, - check_interval=SafeInterval, - check_request_interval=SafeRequestInterval}, + vnode_overload_threshold, + ?DEFAULT_OVERLOAD_THRESHOLD), + SafeInterval = case Threshold == undefined orelse + Interval < Threshold + of + true -> Interval; + false -> + logger:warning("Setting riak_core/vnode_check_interval " + "to ~b", + [Threshold div 2]), + Threshold div 2 + end, + SafeRequestInterval = case RequestInterval < + SafeInterval + of + true -> RequestInterval; + false -> + logger:warning("Setting riak_core/vnode_check_request_interva" + "l to ~b", + [SafeInterval div 2]), + SafeInterval div 2 + end, + State = #state{mod = Module, index = Index, + check_mailbox = 0, check_counter = 0, + check_threshold = Threshold, + check_interval = SafeInterval, + check_request_interval = SafeRequestInterval}, loop(Parent, State). unregister_vnode(Mod, Index, Pid) -> cast(reg_name(Mod, Index), {unregister_vnode, Pid}). --spec command_return_vnode({atom(), non_neg_integer(), atom()}, term()) -> - {ok, pid()} | {error, term()}. -command_return_vnode({Mod,Index,Node}, Req) -> +-spec command_return_vnode({atom(), non_neg_integer(), + atom()}, + term()) -> {ok, pid()} | {error, term()}. + +command_return_vnode({Mod, Index, Node}, Req) -> call(reg_name(Mod, Index, Node), {return_vnode, Req}). %% Return true if the next proxied message will return overload overloaded({Mod, Index, Node}) -> call(reg_name(Mod, Index, Node), overloaded); -overloaded(Pid) -> - call(Pid, overloaded). +overloaded(Pid) -> call(Pid, overloaded). call(Name, Msg) -> - call_reply(catch gen:call(Name, '$vnode_proxy_call', Msg)). + call_reply(catch gen:call(Name, '$vnode_proxy_call', + Msg)). call(Name, Msg, Timeout) -> - call_reply(catch gen:call(Name, '$vnode_proxy_call', Msg, Timeout)). + call_reply(catch gen:call(Name, '$vnode_proxy_call', + Msg, Timeout)). -spec call_reply({atom(), term()}) -> term(). -call_reply({ok, Res}) -> - Res; -call_reply({'EXIT', Reason}) -> - {error, Reason}. + +call_reply({ok, Res}) -> Res; +call_reply({'EXIT', Reason}) -> {error, Reason}. cast(Name, Msg) -> - catch erlang:send(Name, {'$vnode_proxy_cast', Msg}), - ok. + catch erlang:send(Name, {'$vnode_proxy_cast', Msg}), ok. system_continue(Parent, _, State) -> loop(Parent, State). @@ -136,75 +142,72 @@ system_continue(Parent, _, State) -> system_terminate(Reason, _Parent, _, _State) -> exit(Reason). -system_code_change(State, _, _, _) -> - {ok, State}. +system_code_change(State, _, _, _) -> {ok, State}. %% @private loop(Parent, State) -> receive - {'$vnode_proxy_call', From, Msg} -> - {reply, Reply, NewState} = handle_call(Msg, From, State), - {_, Reply} = gen:reply(From, Reply), - loop(Parent, NewState); - {'$vnode_proxy_cast', Msg} -> - {noreply, NewState} = handle_cast(Msg, State), - loop(Parent, NewState); - {'DOWN', _Mref, process, _Pid, _} -> - NewState = forget_vnode(State), - loop(Parent, NewState); - {system, From, Msg} -> - sys:handle_system_msg(Msg, From, Parent, ?MODULE, [], State); - Msg -> - {noreply, NewState} = handle_proxy(Msg, State), - loop(Parent, NewState) + {'$vnode_proxy_call', From, Msg} -> + {reply, Reply, NewState} = handle_call(Msg, From, + State), + {_, Reply} = gen:reply(From, Reply), + loop(Parent, NewState); + {'$vnode_proxy_cast', Msg} -> + {noreply, NewState} = handle_cast(Msg, State), + loop(Parent, NewState); + {'DOWN', _Mref, process, _Pid, _} -> + NewState = forget_vnode(State), loop(Parent, NewState); + {system, From, Msg} -> + sys:handle_system_msg(Msg, From, Parent, ?MODULE, [], + State); + Msg -> + {noreply, NewState} = handle_proxy(Msg, State), + loop(Parent, NewState) end. %% @private handle_call({return_vnode, Req}, _From, State) -> {Pid, NewState} = get_vnode_pid(State), - gen_fsm:send_event(Pid, Req), + riak_core_vnode:send_req(Pid, Req), {reply, {ok, Pid}, NewState}; -handle_call(overloaded, _From, State=#state{check_mailbox=Mailbox, - check_threshold=Threshold}) -> - Result = (Mailbox > Threshold), - {reply, Result, State}; -handle_call(_Msg, _From, State) -> - {reply, ok, State}. +handle_call(overloaded, _From, + State = #state{check_mailbox = Mailbox, + check_threshold = Threshold}) -> + Result = Mailbox > Threshold, {reply, Result, State}; +handle_call(_Msg, _From, State) -> {reply, ok, State}. %% @private handle_cast({unregister_vnode, Pid}, State) -> %% The pid may not match the vnode_pid in the state, but we must send the %% unregister event anyway -- the vnode manager requires it. - gen_fsm:send_event(Pid, unregistered), + riak_core_vnode:unregistered(Pid), catch demonitor(State#state.vnode_mref, [flush]), NewState = forget_vnode(State), {noreply, NewState}; -handle_cast({vnode_proxy_pong, Ref, Msgs}, State=#state{check_request=RequestState, - check_mailbox=Mailbox}) -> +handle_cast({vnode_proxy_pong, Ref, Msgs}, + State = #state{check_request = RequestState, + check_mailbox = Mailbox}) -> NewState = case Ref of - RequestState -> - State#state{check_mailbox=Mailbox - Msgs, - check_request=undefined, - check_counter=0}; - _ -> - State + RequestState -> + State#state{check_mailbox = Mailbox - Msgs, + check_request = undefined, check_counter = 0}; + _ -> State end, {noreply, NewState}; - -handle_cast(_Msg, State) -> - {noreply, State}. +handle_cast(_Msg, State) -> {noreply, State}. %% @private -handle_proxy(Msg, State=#state{check_threshold=undefined}) -> +handle_proxy(Msg, + State = #state{check_threshold = undefined}) -> {Pid, NewState} = get_vnode_pid(State), Pid ! Msg, {noreply, NewState}; -handle_proxy(Msg, State=#state{check_counter=Counter, - check_mailbox=Mailbox, - check_interval=Interval, - check_request_interval=RequestInterval, - check_request=RequestState, - check_threshold=Threshold}) -> +handle_proxy(Msg, + State = #state{check_counter = Counter, + check_mailbox = Mailbox, check_interval = Interval, + check_request_interval = RequestInterval, + check_request = RequestState, + check_threshold = Threshold}) -> %% %% NOTE: This function is intentionally written as it is for performance %% reasons -- the vnode proxy is on the critical path of Riak and @@ -222,225 +225,214 @@ handle_proxy(Msg, State=#state{check_counter=Counter, %% ensure unnecessary work is not being performed needlessly. %% case State#state.vnode_pid of - undefined -> - {Pid, State2} = get_vnode_pid(State); - KnownPid -> - Pid = KnownPid, - State2 = State + undefined -> {Pid, State2} = get_vnode_pid(State); + KnownPid -> Pid = KnownPid, State2 = State end, - Mailbox2 = case Mailbox =< Threshold of - true -> - Pid ! Msg, - Mailbox + 1; - false -> - handle_overload(Msg, State), - Mailbox + true -> Pid ! Msg, Mailbox + 1; + false -> handle_overload(Msg, State), Mailbox end, - Counter2 = Counter + 1, case Counter2 of - RequestInterval -> - %% Ping the vnode in hopes that we get a pong back before hitting - %% the hard query interval and triggering an expensive process_info - %% call. A successful pong from the vnode means that all messages - %% sent before the ping have already been handled and therefore - %% we can adjust our mailbox estimate accordingly. - case RequestState of - undefined -> - RequestState2 = send_proxy_ping(Pid, Mailbox2); - _ -> - RequestState2 = RequestState - end, - Mailbox3 = Mailbox2, - Counter3 = Counter2; - Interval -> - %% Time to directly check the mailbox size. This operation may - %% be extremely expensive. If the vnode is currently active, - %% the proxy will be descheduled until the vnode finishes - %% execution and becomes descheduled itself. - {_, L} = - erlang:process_info(Pid, message_queue_len), - Counter3 = 0, - Mailbox3 = L + 1, - %% Send a new proxy ping so that if the new length is above the - %% threshold then the proxy will detect the work is completed, - %% rather than being stuck in overload state until the interval - %% counts are reached. - RequestState2 = send_proxy_ping(Pid, Mailbox3); - _ -> - Mailbox3 = Mailbox2, - Counter3 = Counter2, - RequestState2 = RequestState + RequestInterval -> + %% Ping the vnode in hopes that we get a pong back before hitting + %% the hard query interval and triggering an expensive process_info + %% call. A successful pong from the vnode means that all messages + %% sent before the ping have already been handled and therefore + %% we can adjust our mailbox estimate accordingly. + case RequestState of + undefined -> + RequestState2 = send_proxy_ping(Pid, Mailbox2); + _ -> RequestState2 = RequestState + end, + Mailbox3 = Mailbox2, + Counter3 = Counter2; + Interval -> + %% Time to directly check the mailbox size. This operation may + %% be extremely expensive. If the vnode is currently active, + %% the proxy will be descheduled until the vnode finishes + %% execution and becomes descheduled itself. + {_, L} = erlang:process_info(Pid, message_queue_len), + Counter3 = 0, + Mailbox3 = L + 1, + %% Send a new proxy ping so that if the new length is above the + %% threshold then the proxy will detect the work is completed, + %% rather than being stuck in overload state until the interval + %% counts are reached. + RequestState2 = send_proxy_ping(Pid, Mailbox3); + _ -> + Mailbox3 = Mailbox2, + Counter3 = Counter2, + RequestState2 = RequestState end, - {noreply, State2#state{check_counter=Counter3, - check_mailbox=Mailbox3, - check_request=RequestState2}}. + {noreply, + State2#state{check_counter = Counter3, + check_mailbox = Mailbox3, + check_request = RequestState2}}. -handle_overload(Msg, #state{mod=Mod, index=Index}) -> +handle_overload(Msg, + #state{mod = Module, index = Index}) -> %% STATS %riak_core_stat:update(dropped_vnode_requests), case Msg of - {'$gen_event', ?VNODE_REQ{sender=Sender, request=Request}} -> - catch(Mod:handle_overload_command(Request, Sender, Index)); - {'$gen_all_state_event', ?VNODE_REQ{sender=Sender, request=Request}} -> - catch(Mod:handle_overload_command(Request, Sender, Index)); - {'$gen_event', ?COVERAGE_REQ{sender=Sender, request=Request}} -> - catch(Mod:handle_overload_command(Request, Sender, Index)); - _ -> - catch(Mod:handle_overload_info(Msg, Index)) + {'$gen_event', + #riak_vnode_req_v1{sender = Sender, + request = Request}} -> + catch Module:handle_overload_command(Request, Sender, + Index); + {'$gen_all_state_event', + #riak_vnode_req_v1{sender = Sender, + request = Request}} -> + catch Module:handle_overload_command(Request, Sender, + Index); + {'$gen_event', + #riak_coverage_req_v1{sender = Sender, + request = Request}} -> + catch Module:handle_overload_command(Request, Sender, + Index); + _ -> catch Module:handle_overload_info(Msg, Index) end. %% @private forget_vnode(State) -> - State#state{vnode_pid=undefined, - vnode_mref=undefined, - check_mailbox=0, - check_counter=0, - check_request=undefined}. + State#state{vnode_pid = undefined, + vnode_mref = undefined, check_mailbox = 0, + check_counter = 0, check_request = undefined}. %% @private -get_vnode_pid(State=#state{mod=Mod, index=Index, vnode_pid=undefined}) -> - {ok, Pid} = riak_core_vnode_manager:get_vnode_pid(Index, Mod), +get_vnode_pid(State = #state{mod = Module, + index = Index, vnode_pid = undefined}) -> + {ok, Pid} = riak_core_vnode_manager:get_vnode_pid(Index, + Module), Mref = erlang:monitor(process, Pid), - NewState = State#state{vnode_pid=Pid, vnode_mref=Mref}, + NewState = State#state{vnode_pid = Pid, + vnode_mref = Mref}, {Pid, NewState}; -get_vnode_pid(State=#state{vnode_pid=Pid}) -> +get_vnode_pid(State = #state{vnode_pid = Pid}) -> {Pid, State}. %% @private send_proxy_ping(Pid, MailboxSizeAfterPing) -> Ref = make_ref(), - Pid ! {'$vnode_proxy_ping', self(), Ref, MailboxSizeAfterPing}, + Pid ! + {'$vnode_proxy_ping', self(), Ref, + MailboxSizeAfterPing}, Ref. -ifdef(TEST). update_msg_counter() -> Count = case erlang:get(count) of - undefined -> 0; - Val -> Val - end, - put(count, Count+1). + undefined -> 0; + Val -> Val + end, + put(count, Count + 1). fake_loop() -> receive - block -> - fake_loop_block(); - slow -> - fake_loop_slow(); - {get_count, Pid} -> - Pid ! {count, erlang:get(count)}, - fake_loop(); - %% Original tests do not expect replies - the - %% results below expect the pings to be counted - %% towards messages received. If you ever wanted - %% to re-instance, uncomment below. - %% {'$vnode_proxy_ping', ReplyTo, Ref, Msgs} -> - %% ReplyTo ! {Ref, Msgs}, - %% fake_loop(); - _Msg -> - update_msg_counter(), - fake_loop() + block -> fake_loop_block(); + slow -> fake_loop_slow(); + {get_count, Pid} -> + Pid ! {count, erlang:get(count)}, fake_loop(); + %% Original tests do not expect replies - the + %% results below expect the pings to be counted + %% towards messages received. If you ever wanted + %% to re-instance, uncomment below. + %% {'$vnode_proxy_ping', ReplyTo, Ref, Msgs} -> + %% ReplyTo ! {Ref, Msgs}, + %% fake_loop(); + _Msg -> update_msg_counter(), fake_loop() end. fake_loop_slow() -> timer:sleep(100), receive - _Msg -> - update_msg_counter(), - fake_loop_slow() + _Msg -> update_msg_counter(), fake_loop_slow() end. -fake_loop_block() -> - receive - unblock -> - fake_loop() - end. +fake_loop_block() -> receive unblock -> fake_loop() end. overload_test_() -> - {timeout, 900, {foreach, - fun() -> - VnodePid = spawn(fun fake_loop/0), - meck:unload(), - meck:new(riak_core_vnode_manager, [passthrough]), - meck:expect(riak_core_vnode_manager, get_vnode_pid, - fun(_Index, fakemod) -> {ok, VnodePid}; - (Index, Mod) -> meck:passthrough([Index, Mod]) - end), - meck:new(fakemod, [non_strict]), - meck:expect(fakemod, handle_overload_info, fun(hello, _Idx) -> - ok - end), - - {ok, ProxyPid} = riak_core_vnode_proxy:start_link(fakemod, 0), - unlink(ProxyPid), - {VnodePid, ProxyPid} - end, - fun({VnodePid, ProxyPid}) -> - unlink(VnodePid), - unlink(ProxyPid), - exit(VnodePid, kill), - exit(ProxyPid, kill) - end, - [ - fun({_VnodePid, ProxyPid}) -> - {"should not discard in normal operation", timeout, 60, - fun() -> - ToSend = ?DEFAULT_OVERLOAD_THRESHOLD, - [ProxyPid ! hello || _ <- lists:seq(1, ToSend)], - - %% synchronize on the proxy and the mailbox - {ok, ok} = gen:call(ProxyPid, '$vnode_proxy_call', sync, infinity), - ProxyPid ! {get_count, self()}, - receive - {count, Count} -> - %% First will hit the request check interval, - %% then will check message queue every interval - %% (no new ping will be resubmitted after the first - %% as the request will already have a reference) - PingReqs = 1 + % for first request intarval - ToSend div ?DEFAULT_CHECK_INTERVAL, - ?assertEqual(ToSend+PingReqs, Count) - end - end - } + {timeout, 900, + {foreach, + fun () -> + VnodePid = spawn(fun fake_loop/0), + meck:unload(), + meck:new(riak_core_vnode_manager, [passthrough]), + meck:expect(riak_core_vnode_manager, get_vnode_pid, + fun (_Index, fakemod) -> {ok, VnodePid}; + (Index, Mod) -> meck:passthrough([Index, Mod]) + end), + meck:new(fakemod, [non_strict]), + meck:expect(fakemod, handle_overload_info, + fun (hello, _Idx) -> ok end), + {ok, ProxyPid} = + riak_core_vnode_proxy:start_link(fakemod, 0), + unlink(ProxyPid), + {VnodePid, ProxyPid} end, - fun({VnodePid, ProxyPid}) -> - {"should discard during overflow", timeout, 60, - fun() -> - VnodePid ! block, - [ProxyPid ! hello || _ <- lists:seq(1, 50000)], - %% synchronize on the mailbox - no-op that hits msg catchall - Reply = gen:call(ProxyPid, '$vnode_proxy_call', sync, infinity), - ?assertEqual({ok, ok}, Reply), - VnodePid ! unblock, - VnodePid ! {get_count, self()}, - receive - {count, Count} -> - %% Threshold + 10 unanswered vnode_proxy_ping - ?assertEqual(?DEFAULT_OVERLOAD_THRESHOLD + 10, Count) - end - end - } + fun ({VnodePid, ProxyPid}) -> + unlink(VnodePid), + unlink(ProxyPid), + exit(VnodePid, kill), + exit(ProxyPid, kill) end, - fun({VnodePid, ProxyPid}) -> - {"should tolerate slow vnodes", timeout, 60, - fun() -> - VnodePid ! slow, - [ProxyPid ! hello || _ <- lists:seq(1, 50000)], - %% synchronize on the mailbox - no-op that hits msg catchall - Reply = gen:call(ProxyPid, '$vnode_proxy_call', sync, infinity), - ?assertEqual({ok, ok}, Reply), - %% check that the outstanding message count is - %% reasonable - {message_queue_len, L} = - erlang:process_info(VnodePid, message_queue_len), - %% Threshold + 2 unanswered vnode_proxy_ping (one - %% for first ping, second after process_info check) - ?assert(L =< (?DEFAULT_OVERLOAD_THRESHOLD + 2)) - end - } - end - ]}}. + [fun ({_VnodePid, ProxyPid}) -> + {"should not discard in normal operation", timeout, 60, + fun () -> + ToSend = (?DEFAULT_OVERLOAD_THRESHOLD), + [ProxyPid ! hello || _ <- lists:seq(1, ToSend)], + %% synchronize on the proxy and the mailbox + {ok, ok} = gen:call(ProxyPid, '$vnode_proxy_call', sync, + infinity), + ProxyPid ! {get_count, self()}, + receive + {count, Count} -> + %% First will hit the request check interval, + %% then will check message queue every interval + %% (no new ping will be resubmitted after the first + %% as the request will already have a reference) + PingReqs = 1 + + % for first request intarval + ToSend div (?DEFAULT_CHECK_INTERVAL), + ?assertEqual((ToSend + PingReqs), Count) + end + end} + end, + fun ({VnodePid, ProxyPid}) -> + {"should discard during overflow", timeout, 60, + fun () -> + VnodePid ! block, + [ProxyPid ! hello || _ <- lists:seq(1, 50000)], + %% synchronize on the mailbox - no-op that hits msg catchall + Reply = gen:call(ProxyPid, '$vnode_proxy_call', sync, + infinity), + ?assertEqual({ok, ok}, Reply), + VnodePid ! unblock, + VnodePid ! {get_count, self()}, + receive + {count, Count} -> + %% Threshold + 10 unanswered vnode_proxy_ping + ?assertEqual(((?DEFAULT_OVERLOAD_THRESHOLD) + 10), + Count) + end + end} + end, + fun ({VnodePid, ProxyPid}) -> + {"should tolerate slow vnodes", timeout, 60, + fun () -> + VnodePid ! slow, + [ProxyPid ! hello || _ <- lists:seq(1, 50000)], + %% synchronize on the mailbox - no-op that hits msg catchall + Reply = gen:call(ProxyPid, '$vnode_proxy_call', sync, + infinity), + ?assertEqual({ok, ok}, Reply), + %% check that the outstanding message count is reasonable + {message_queue_len, L} = erlang:process_info(VnodePid, + message_queue_len), + %% Threshold + (at most) 10 unanswered vnode_proxy_ping + ?assert((L =< (?DEFAULT_OVERLOAD_THRESHOLD) + 10)) + end} + end]}}. + -endif. diff --git a/src/riak_core_vnode_proxy_sup.erl b/src/riak_core_vnode_proxy_sup.erl index ab842eb22..2478769a6 100644 --- a/src/riak_core_vnode_proxy_sup.erl +++ b/src/riak_core_vnode_proxy_sup.erl @@ -17,8 +17,11 @@ %% %% ------------------------------------------------------------------- -module(riak_core_vnode_proxy_sup). + -behaviour(supervisor). + -export([start_link/0, init/1]). + -export([start_proxy/2, stop_proxy/2, start_proxies/1]). start_link() -> @@ -29,15 +32,15 @@ init([]) -> %% modules. Ensures restart of proxies after a crash of this supervisor. Indices = get_indices(), VMods = riak_core:vnode_modules(), - Proxies = [proxy_ref(Mod, Index) || {_, Mod} <- VMods, - Index <- Indices], + Proxies = [proxy_ref(Mod, Index) + || {_, Mod} <- VMods, Index <- Indices], {ok, {{one_for_one, 5, 10}, Proxies}}. start_proxy(Mod, Index) -> Ref = proxy_ref(Mod, Index), Pid = case supervisor:start_child(?MODULE, Ref) of - {ok, Child} -> Child; - {error, {already_started, Child}} -> Child + {ok, Child} -> Child; + {error, {already_started, Child}} -> Child end, Pid. @@ -54,7 +57,8 @@ start_proxies(Mod) -> %% @private proxy_ref(Mod, Index) -> - {{Mod, Index}, {riak_core_vnode_proxy, start_link, [Mod, Index]}, + {{Mod, Index}, + {riak_core_vnode_proxy, start_link, [Mod, Index]}, permanent, 5000, worker, [riak_core_vnode_proxy]}. %% @private diff --git a/src/riak_core_vnode_sup.erl b/src/riak_core_vnode_sup.erl index 661a930f8..29637df14 100644 --- a/src/riak_core_vnode_sup.erl +++ b/src/riak_core_vnode_sup.erl @@ -23,12 +23,17 @@ %% @doc supervise riak_vnode processes -module(riak_core_vnode_sup). + -behaviour(supervisor). + -export([start_link/0, init/1]). + -export([start_vnode/3]). -start_vnode(Mod, Index, ForwardTo) when is_integer(Index) -> - supervisor:start_child(?MODULE, [Mod, Index, ForwardTo]). +start_vnode(Mod, Index, ForwardTo) + when is_integer(Index) -> + supervisor:start_child(?MODULE, + [Mod, Index, ForwardTo]). start_link() -> %% This simple_one_for_one supervisor can do a controlled shutdown. @@ -39,8 +44,7 @@ start_link() -> %% @private init([]) -> - {ok, - {{simple_one_for_one, 10, 10}, - [{undefined, - {riak_core_vnode, start_link, []}, - temporary, 300000, worker, dynamic}]}}. + {ok, + {{simple_one_for_one, 10, 10}, + [{undefined, {riak_core_vnode, start_link, []}, + temporary, 300000, worker, dynamic}]}}. diff --git a/src/riak_core_vnode_worker.erl b/src/riak_core_vnode_worker.erl index de3cf4221..293a40605 100644 --- a/src/riak_core_vnode_worker.erl +++ b/src/riak_core_vnode_worker.erl @@ -23,65 +23,71 @@ -include("riak_core_vnode.hrl"). % gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). % API -export([start_link/1, handle_work/3, handle_work/4]). -type mod_state() :: term(). --record(state, { - module :: atom(), - modstate :: mod_state() -}). +-record(state, + {module :: atom(), modstate :: mod_state()}). --callback init_worker(partition(), Args :: term(), Props :: [{atom(), term()}]) -> {ok, mod_state()}. --callback handle_work(Work :: term(), sender(), mod_state()) -> - {reply, Reply :: term(), mod_state()} | - {noreply, mod_state()}. +-callback init_worker(partition(), Args :: term(), + Props :: [{atom(), term()}]) -> {ok, mod_state()}. -start_link(Args) -> - WorkerMod = proplists:get_value(worker_callback_mod, Args), - [VNodeIndex, WorkerArgs, WorkerProps, Caller] = proplists:get_value(worker_args, Args), - gen_server:start_link(?MODULE, [WorkerMod, VNodeIndex, WorkerArgs, WorkerProps, Caller], []). +-callback handle_work(Work :: term(), sender(), + mod_state()) -> {reply, Reply :: term(), mod_state()} | + {noreply, mod_state()}. +start_link(Args) -> + WorkerMod = proplists:get_value(worker_callback_mod, + Args), + [VNodeIndex, WorkerArgs, WorkerProps, Caller] = + proplists:get_value(worker_args, Args), + gen_server:start_link(?MODULE, + [WorkerMod, VNodeIndex, WorkerArgs, WorkerProps, + Caller], + []). handle_work(Worker, Work, From) -> handle_work(Worker, Work, From, self()). - handle_work(Worker, Work, From, Caller) -> gen_server:cast(Worker, {work, Work, From, Caller}). - -init([Module, VNodeIndex, WorkerArgs, WorkerProps, Caller]) -> - {ok, WorkerState} = Module:init_worker(VNodeIndex, WorkerArgs, WorkerProps), +init([Module, VNodeIndex, WorkerArgs, WorkerProps, + Caller]) -> + {ok, WorkerState} = Module:init_worker(VNodeIndex, + WorkerArgs, WorkerProps), %% let the pool queue manager know there might be a worker to checkout riak_core_vnode_worker_pool:worker_started(Caller), {ok, #state{module = Module, modstate = WorkerState}}. - handle_call(Event, _From, State) -> - logger:debug("Vnode worker received synchronous event: ~p.", [Event]), + logger:debug("Vnode worker received synchronous event: " + "~p.", + [Event]), {reply, ok, State}. - handle_cast({work, Work, WorkFrom, Caller}, - #state{module = Mod, modstate = ModState} = State) -> - NewModState = case Mod:handle_work(Work, WorkFrom, ModState) of - {reply, Reply, NS} -> - riak_core_vnode:reply(WorkFrom, Reply), - NS; - {noreply, NS} -> - NS + #state{module = Module, modstate = ModState} = State) -> + NewModState = case Module:handle_work(Work, WorkFrom, + ModState) + of + {reply, Reply, NS} -> + riak_core_vnode:reply(WorkFrom, Reply), NS; + {noreply, NS} -> NS end, %% check the worker back into the pool - riak_core_vnode_worker_pool:checkin_worker(Caller, self()), + riak_core_vnode_worker_pool:checkin_worker(Caller, + self()), {noreply, State#state{modstate = NewModState}}; - handle_cast(_Event, State) -> {noreply, State}. - handle_info(_Info, State) -> {noreply, State}. + terminate(_Reason, _State) -> ok. + code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/src/riak_core_vnode_worker_pool.erl b/src/riak_core_vnode_worker_pool.erl index 7b8134f86..b750c929f 100644 --- a/src/riak_core_vnode_worker_pool.erl +++ b/src/riak_core_vnode_worker_pool.erl @@ -39,259 +39,323 @@ %% confuse (or cause a race) with this module's checkout management. -module(riak_core_vnode_worker_pool). --behaviour(gen_fsm_compat). - -%% gen_fsm_compat callbacks --export([init/1, handle_event/3, handle_sync_event/4, handle_info/3, - terminate/3, code_change/4]). - -%% gen_fsm_compat states --export([ready/2, queueing/2, ready/3, queueing/3, shutdown/2, shutdown/3]). +-behaviour(gen_statem). %% API --export([start_link/6, start_link/5, stop/2, shutdown_pool/2, handle_work/3, worker_started/1, checkin_worker/2]). - --ifdef(PULSE). --compile(export_all). --compile({parse_transform, pulse_instrument}). --compile({pulse_replace_module, [{gen_fsm_compat, pulse_gen_fsm}]}). --endif. - --record(state, { - queue :: queue:queue() | list(), - pool :: pid(), - monitors = [] :: list(), - queue_strategy = fifo :: fifo | filo, - shutdown :: undefined | {pid(), reference()} - }). +-export([start_link/5, start_link/6, stop/2, + shutdown_pool/2, handle_work/3, worker_started/1, + checkin_worker/2]). --type pool_opt() :: - {strategy, fifo | filo}. +%% gen_statem callbacks +-export([init/1, terminate/3, code_change/4, + callback_mode/0]). +%% gen_statem states +-export([ready/3, queue/3, shutdown/3]). -start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps) -> - start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps, []). +%% ======== +%% API +%% ======== --spec start_link(atom(), pos_integer(), pos_integer(), term(), term(), - [pool_opt()]) -> - {ok, pid()}. +start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, + WorkerProps) -> + start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, + WorkerProps, []). -start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps, Opts) -> - gen_fsm_compat:start_link(?MODULE, [WorkerMod, PoolSize, VNodeIndex, WorkerArgs, - WorkerProps, Opts], []). +start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, + WorkerProps, Opts) -> + gen_statem:start_link(?MODULE, + [WorkerMod, PoolSize, VNodeIndex, WorkerArgs, + WorkerProps, Opts], + []). +% #1 cast handle_work(Pid, Work, From) -> - gen_fsm_compat:send_event(Pid, {work, Work, From}). - -stop(Pid, Reason) -> - gen_fsm_compat:sync_send_all_state_event(Pid, {stop, Reason}). + gen_statem:cast(Pid, {work, Work, From}). +% #2 cast worker_started(Pid) -> - gen_fsm_compat:send_all_state_event(Pid, worker_start). + gen_statem:cast(Pid, worker_start). +% #3 cast checkin_worker(Pid, WorkerPid) -> - gen_fsm_compat:send_all_state_event(Pid, {checkin, WorkerPid}). + gen_statem:cast(Pid, {checkin, WorkerPid}). + +% #4 call +stop(Pid, Reason) -> + gen_statem:stop(Pid, Reason, infinity). +% #5 call %% wait for all the workers to finish any current work +-spec shutdown_pool(pid(), integer()) -> ok | + {error, vnode_shutdown}. + shutdown_pool(Pid, Wait) -> - gen_fsm_compat:sync_send_all_state_event(Pid, {shutdown, Wait}, infinity). - -init([WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps, Opts]) -> - {ok, Pid} = poolboy:start_link([{worker_module, riak_core_vnode_worker}, - {worker_args, [VNodeIndex, WorkerArgs, WorkerProps, self()]}, - {worker_callback_mod, WorkerMod}, - {size, PoolSize}, {max_overflow, 0}]), - DfltStrategy = application:get_env(riak_core, queue_worker_strategy, fifo), - State = case proplists:get_value(strategy, Opts, DfltStrategy) of - fifo -> - #state{ - pool = Pid, - queue = queue:new(), - queue_strategy = fifo - }; - filo -> - #state{ - pool = Pid, - queue = [], - queue_strategy = filo - } - end, + gen_statem:call(Pid, {shutdown, Wait}, infinity). + +%% ======================== +%% ======== +%% State, Mode, Init, Terminate +%% ======== +%% ======================== + +-record(state, + {queue :: queue:queue() | list(), pool :: pid(), + monitors = [] :: list(), + queue_strategy = fifo :: fifo | filo, + shutdown :: undefined | {pid(), reference()}}). + +callback_mode() -> [state_functions, state_enter]. + +init([WorkerMod, PoolSize, VNodeIndex, WorkerArgs, + WorkerProps, Opts]) -> + {ok, Pid} = poolboy:start_link([{worker_module, + riak_core_vnode_worker}, + {worker_args, + [VNodeIndex, WorkerArgs, WorkerProps, + self()]}, + {worker_callback_mod, WorkerMod}, + {size, PoolSize}, {max_overflow, 0}]), + DefaultStrategy = application:get_env(riak_core, + queue_worker_strategy, fifo), + State = case proplists:get_value(strategy, Opts, + DefaultStrategy) + of + fifo -> + #state{pool = Pid, queue = queue:new(), + queue_strategy = fifo}; + filo -> + #state{pool = Pid, queue = [], queue_strategy = filo} + end, {ok, ready, State}. -ready(_Event, _From, State) -> - {reply, ok, ready, State}. - -ready({work, Work, From} = Msg, #state{pool=Pool, monitors=Monitors} = State) -> - case poolboy:checkout(Pool, false) of - full -> - {next_state, queueing, in(Msg, State)}; - Pid when is_pid(Pid) -> - NewMonitors = monitor_worker(Pid, From, Work, Monitors), - riak_core_vnode_worker:handle_work(Pid, Work, From), - {next_state, ready, State#state{monitors=NewMonitors}} - end; -ready(_Event, State) -> - {next_state, ready, State}. - -queueing(_Event, _From, State) -> - {reply, ok, queueing, State}. +% #4 call +terminate(_Reason, _StateName, #state{pool = Pool}) -> + %% stop poolboy + poolboy:stop(Pool), + ok. -queueing({work, _Work, _From} = Msg, State) -> - {next_state, queueing, in(Msg, State)}; -queueing(_Event, State) -> - {next_state, queueing, State}. +code_change(_OldVsn, StateName, State, _Extra) -> + {ok, StateName, State}. -shutdown(_Event, _From, State) -> - {reply, ok, shutdown, State}. +%% ======================== +%% ======== +%% States +%% ======== +%% ======================== -shutdown({work, _Work, From}, State) -> - %% tell the process requesting work that we're shutting down - riak_core_vnode:reply(From, {error, vnode_shutdown}), - {next_state, shutdown, State}; -shutdown(_Event, State) -> - {next_state, shutdown, State}. +%% ready +%% ======== -handle_event({checkin, Pid}, shutdown, #state{pool=Pool, monitors=Monitors0} = State) -> - Monitors = demonitor_worker(Pid, Monitors0), - poolboy:checkin(Pool, Pid), - case Monitors of - [] -> %% work all done, time to exit! - {stop, shutdown, State}; - _ -> - {next_state, shutdown, State#state{monitors=Monitors}} - end; -handle_event({checkin, Worker}, _, #state{pool = Pool, monitors=Monitors} = State) -> - case out(State) of - {{value, {work, Work, From}}, Rem} -> - %% there is outstanding work to do - instead of checking - %% the worker back in, just hand it more work to do - NewMonitors = monitor_worker(Worker, From, Work, Monitors), - riak_core_vnode_worker:handle_work(Worker, Work, From), - {next_state, queueing, State#state{queue=Rem, - monitors=NewMonitors}}; - {empty, Empty} -> - NewMonitors = demonitor_worker(Worker, Monitors), - poolboy:checkin(Pool, Worker), - {next_state, ready, State#state{queue=Empty, monitors=NewMonitors}} - end; -handle_event(worker_start, StateName, #state{pool=Pool, monitors=Monitors}=State) -> - %% a new worker just started - if we have work pending, try to do it - case out(State) of - {{value, {work, Work, From}}, Rem} -> - case poolboy:checkout(Pool, false) of - full -> - {next_state, queueing, State}; - Pid when is_pid(Pid) -> - NewMonitors = monitor_worker(Pid, From, Work, Monitors), - riak_core_vnode_worker:handle_work(Pid, Work, From), - {next_state, queueing, State#state{queue=Rem, monitors=NewMonitors}} - end; - {empty, _} -> - %% StateName might be either 'ready' or 'shutdown' - {next_state, StateName, State} +%% enter +ready(enter, _, State) -> {keep_state, State}; +%% #1 +ready(cast, {work, Work, From} = Msg, + #state{pool = Pool, monitors = Monitors} = State) -> + case poolboy:checkout(Pool, false) of + full -> {next_state, queue, in(Msg, State)}; + Pid when is_pid(Pid) -> + NewMonitors = monitor_worker(Pid, From, Work, Monitors), + riak_core_vnode_worker:handle_work(Pid, Work, From), + {next_state, ready, State#state{monitors = NewMonitors}} end; -handle_event(_Event, StateName, State) -> - {next_state, StateName, State}. - -handle_sync_event({stop, Reason}, _From, _StateName, State) -> - {stop, Reason, ok, State}; - -handle_sync_event({shutdown, Time}, From, _StateName, - #state{monitors=Monitors} = State) -> +%% #2 +ready(cast, worker_start, State) -> + worker_started(State, ready); +%% #3 +ready(cast, {checkin, WorkerPid}, State) -> + checkin(State, WorkerPid); +%% #5 +ready({call, From}, {shutdown, Wait}, State) -> + %% change to shutdown state with a state_timeout of 'Wait' ms, force after timeout expires + {next_state, shutdown, State#state{shutdown = From}, + [{state_timeout, Wait, force_shutdown}]}; +%% info EXIT signal of erlang:monitor(process, Worker) +ready(info, {'DOWN', _Ref, _Type, Pid, Info}, State) -> + {ok, NewState} = exit_worker(State, Pid, Info), + {keep_state, NewState}. + +%% queueing +%% ======== + +%% enter +queue(enter, _, State) -> {keep_state, State}; +queue(cast, {work, _Work, _From} = Msg, State) -> + {next_state, queue, in(Msg, State)}; +%% #2 +queue(cast, worker_start, State) -> + worker_started(State, queue); +%% #3 +queue(cast, {checkin, WorkerPid}, State) -> + checkin(State, WorkerPid); +%% #5 +queue({call, From}, {shutdown, Wait}, State) -> + %% change to shutdown state with a state_timeout of 'Wait' ms, force after timeout expires + {next_state, shutdown, State#state{shutdown = From}, + [{state_timeout, Wait, force_shutdown}]}; +%% info EXIT signal of erlang:monitor(process, Worker) +queue(info, {'DOWN', _Ref, _Type, Pid, Info}, State) -> + {ok, NewState} = exit_worker(State, Pid, Info), + {keep_state, NewState}. + +%% shutdown +%% ======== + +%% enter +shutdown(enter, _, + #state{monitors = Monitors, shutdown = From} = State) -> discard_queued_work(State), case Monitors of - [] -> - {stop, shutdown, ok, State}; - _ -> - case Time of - infinity -> - ok; - _ when is_integer(Time) -> - erlang:send_after(Time, self(), shutdown), - ok - end, - {next_state, shutdown, State#state{shutdown=From, queue=new(State)}} - end; -handle_sync_event(_Event, _From, StateName, State) -> - {reply, {error, unknown_message}, StateName, State}. - -handle_info({'DOWN', _Ref, _, Pid, Info}, StateName, #state{monitors=Monitors} = State) -> - %% remove the listing for the dead worker - case lists:keyfind(Pid, 1, Monitors) of - {Pid, _, From, Work} -> - riak_core_vnode:reply(From, {error, {worker_crash, Info, Work}}), - NewMonitors = lists:keydelete(Pid, 1, Monitors), - %% trigger to do more work will be 'worker_start' message - %% when poolboy replaces this worker (if not a 'checkin' - %% or 'handle_work') - {next_state, StateName, State#state{monitors=NewMonitors}}; - false -> - {next_state, StateName, State} + [] -> {stop_and_reply, shutdown, [{reply, From, ok}]}; + _ -> {keep_state, State#state{queue = new(State)}} end; -handle_info(shutdown, shutdown, #state{monitors=Monitors} = State) -> +%% force shutdown timeout +shutdown(state_timeout, _, + #state{monitors = Monitors, shutdown = FromOrigin}) -> %% we've waited too long to shutdown, time to force the issue. - _ = [riak_core_vnode:reply(From, {error, vnode_shutdown}) || - {_, _, From, _} <- Monitors], - {stop, shutdown, State}; -handle_info(_Info, StateName, State) -> - {next_state, StateName, State}. - -terminate(_Reason, _StateName, #state{pool=Pool}) -> - %% stop poolboy - poolboy:stop(Pool), - ok. - -code_change(_OldVsn, StateName, State, _Extra) -> - {ok, StateName, State}. + _ = [riak_core_vnode:reply(From, + {error, vnode_shutdown}) + || {_, _, From, _} <- Monitors], + {stop_and_reply, shutdown, + [{reply, FromOrigin, {error, vnode_shutdown}}]}; +%% #1 +shutdown(cast, {work, _Work, From}, State) -> + riak_core_vnode:reply(From, {error, vnode_shutdown}), + {keep_state, State}; +%% #2 +shutdown(cast, worker_start, State) -> + worker_started(State, shutdown); +%% #3 +shutdown(cast, {checkin, Pid}, + #state{pool = Pool, monitors = Monitors0, + shutdown = From} = + State) -> + Monitors = demonitor_worker(Pid, Monitors0), + poolboy:checkin(Pool, Pid), + case Monitors of + [] -> %% work all done, time to exit! + {stop_and_reply, shutdown, [{reply, From, ok}]}; + _ -> {keep_state, State#state{monitors = Monitors}} + end; +%% #5 +shutdown({call, From}, {shutdown, _Wait}, State) -> + %% duplicate shutdown call + {keep_state, State, + [{reply, From, {error, vnode_shutdown}}]}; +%% info EXIT signal of erlang:monitor(process, Worker) +shutdown(info, {'DOWN', _Ref, _, Pid, Info}, State) -> + {ok, NewState} = exit_worker(State, Pid, Info), + {keep_state, NewState}. + +%% ======================== +%% ======== +%% Internal Helper Functions +%% ======== +%% ======================== %% Keep track of which worker we pair with what work/from and monitor the %% worker. Only active workers are tracked monitor_worker(Worker, From, Work, Monitors) -> case lists:keyfind(Worker, 1, Monitors) of - {Worker, Ref, _OldFrom, _OldWork} -> - %% reuse old monitor and just update the from & work - lists:keyreplace(Worker, 1, Monitors, {Worker, Ref, From, Work}); - false -> - Ref = erlang:monitor(process, Worker), - [{Worker, Ref, From, Work} | Monitors] + {Worker, Ref, _OldFrom, _OldWork} -> + %% reuse old monitor and just update the from & work + lists:keyreplace(Worker, 1, Monitors, + {Worker, Ref, From, Work}); + false -> + Ref = erlang:monitor(process, Worker), + [{Worker, Ref, From, Work} | Monitors] end. demonitor_worker(Worker, Monitors) -> case lists:keyfind(Worker, 1, Monitors) of - {Worker, Ref, _From, _Work} -> - erlang:demonitor(Ref), - lists:keydelete(Worker, 1, Monitors); - false -> - %% not monitored? - Monitors + {Worker, Ref, _From, _Work} -> + erlang:demonitor(Ref), + lists:keydelete(Worker, 1, Monitors); + false -> + %% not monitored? + Monitors end. discard_queued_work(State) -> case out(State) of - {{value, {work, _Work, From}}, Rem} -> - riak_core_vnode:reply(From, {error, vnode_shutdown}), - discard_queued_work(State#state{queue = Rem}); - {empty, _Empty} -> - ok + {{value, {work, _Work, From}}, Rem} -> + riak_core_vnode:reply(From, {error, vnode_shutdown}), + discard_queued_work(State#state{queue = Rem}); + {empty, _Empty} -> ok end. - -in(Msg, State = #state{queue_strategy = fifo, queue = Q}) -> - State#state{queue=queue:in(Msg, Q)}; - -in(Msg, State = #state{queue_strategy = filo, queue = Q}) -> - State#state{queue=[Msg | Q]}. +in(Msg, + State = #state{queue_strategy = fifo, queue = Q}) -> + State#state{queue = queue:in(Msg, Q)}; +in(Msg, + State = #state{queue_strategy = filo, queue = Q}) -> + State#state{queue = [Msg | Q]}. out(#state{queue_strategy = fifo, queue = Q}) -> queue:out(Q); - out(#state{queue_strategy = filo, queue = []}) -> {empty, []}; out(#state{queue_strategy = filo, queue = [Msg | Q]}) -> {{value, Msg}, Q}. -new(#state{queue_strategy = fifo}) -> - queue:new(); -new(#state{queue_strategy = filo}) -> - []. +new(#state{queue_strategy = fifo}) -> queue:new(); +new(#state{queue_strategy = filo}) -> []. +worker_started(#state{pool = Pool, + monitors = Monitors} = + State, + StateName) -> + %% a new worker just started - if we have work pending, try to do it + case out(State) of + {{value, {work, Work, From}}, Rem} -> + case poolboy:checkout(Pool, false) of + full -> {next_state, queue, State}; + Pid when is_pid(Pid) -> + NewMonitors = monitor_worker(Pid, From, Work, Monitors), + riak_core_vnode_worker:handle_work(Pid, Work, From), + {next_state, queue, + State#state{queue = Rem, monitors = NewMonitors}} + end; + {empty, _} -> + {next_state, + %% If we are in state queueing with nothing in the queue, + %% move to the ready state so that the next incoming job + %% checks out the new worker from poolboy. + if StateName == queue -> ready; + true -> StateName + end, + State} + end. + +checkin(#state{pool = Pool, monitors = Monitors} = + State, + Worker) -> + case out(State) of + {{value, {work, Work, From}}, Rem} -> + %% there is outstanding work to do - instead of checking + %% the worker back in, just hand it more work to do + NewMonitors = monitor_worker(Worker, From, Work, + Monitors), + riak_core_vnode_worker:handle_work(Worker, Work, From), + {next_state, queue, + State#state{queue = Rem, monitors = NewMonitors}}; + {empty, Empty} -> + NewMonitors = demonitor_worker(Worker, Monitors), + poolboy:checkin(Pool, Worker), + {next_state, ready, + State#state{queue = Empty, monitors = NewMonitors}} + end. + +exit_worker(#state{monitors = Monitors} = State, Pid, + Info) -> + %% remove the listing for the dead worker + case lists:keyfind(Pid, 1, Monitors) of + {Pid, _, From, Work} -> + riak_core_vnode:reply(From, + {error, {worker_crash, Info, Work}}), + NewMonitors = lists:keydelete(Pid, 1, Monitors), + %% trigger to do more work will be 'worker_start' message + %% when poolboy replaces this worker (if not a 'checkin' or 'handle_work') + {ok, State#state{monitors = NewMonitors}}; + false -> {ok, State} + end. diff --git a/src/vclock.erl b/src/vclock.erl index ab329c546..75a3a6ee1 100644 --- a/src/vclock.erl +++ b/src/vclock.erl @@ -31,62 +31,59 @@ -module(vclock). --export([fresh/0, - fresh/2, - descends/2, - dominates/2, - descends_dot/2, - pure_dot/1, - merge/1, - get_counter/2, - get_timestamp/2, - get_dot/2, - valid_dot/1, - increment/2, - increment/3, - all_nodes/1, - equal/2, - prune/3, - timestamp/0, - last_modified/1]). +-export([fresh/0, fresh/2, descends/2, dominates/2, + descends_dot/2, pure_dot/1, merge/1, get_counter/2, + get_timestamp/2, get_dot/2, valid_dot/1, increment/2, + increment/3, all_nodes/1, equal/2, prune/3, + timestamp/0]). -ifdef(TEST). + -include_lib("eunit/include/eunit.hrl"). + -endif. --export_type([vclock/0, timestamp/0, vclock_node/0, dot/0, pure_dot/0]). +-export_type([vclock/0, timestamp/0, vclock_node/0, + dot/0, pure_dot/0]). -type vclock() :: [dot()]. --type dot() :: {vclock_node(), {counter(), timestamp()}}. + +-type dot() :: {vclock_node(), + {counter(), timestamp()}}. + -type pure_dot() :: {vclock_node(), counter()}. % Nodes can have any term() as a name, but they must differ from each other. --type vclock_node() :: term(). --type counter() :: integer(). --type timestamp() :: integer(). +-type vclock_node() :: term(). + +-type counter() :: integer(). + +-type timestamp() :: integer(). % @doc Create a brand new vclock. -spec fresh() -> vclock(). -fresh() -> - []. + +fresh() -> []. -spec fresh(vclock_node(), counter()) -> vclock(). -fresh(Node, Count) -> - [{Node, {Count, timestamp()}}]. -% @doc Return true if Va is a direct descendant of Vb, else false -- remember, a vclock is its own descendant! --spec descends(Va :: vclock(), Vb :: vclock()) -> boolean(). +fresh(Node, Count) -> [{Node, {Count, timestamp()}}]. + +%% @doc Return true if Va is a direct descendant of Vb, +%% else false -- remember, a vclock is its own descendant! +-spec descends(Va :: vclock(), + Vb :: vclock()) -> boolean(). + descends(_, []) -> % all vclocks descend from the empty vclock true; descends(Va, Vb) -> - [{NodeB, {CtrB, _T}}|RestB] = Vb, + [{NodeB, {CtrB, _T}} | RestB] = Vb, case lists:keyfind(NodeB, 1, Va) of - false -> - false; - {_, {CtrA, _TSA}} -> - (CtrA >= CtrB) andalso descends(Va,RestB) - end. + false -> false; + {_, {CtrA, _TSA}} -> + CtrA >= CtrB andalso descends(Va, RestB) + end. %% @doc does the given `vclock()' descend from the given `dot()'. The %% `dot()' can be any vclock entry returned from @@ -99,13 +96,13 @@ descends(Va, Vb) -> %% @see get_entry/3 %% @see dominates/2 -spec descends_dot(vclock(), dot()) -> boolean(). -descends_dot(Vclock, Dot) -> - descends(Vclock, [Dot]). + +descends_dot(Vclock, Dot) -> descends(Vclock, [Dot]). %% @doc in some cases the dot without timestamp data is needed. -spec pure_dot(dot()) -> pure_dot(). -pure_dot({N, {C, _TS}}) -> - {N, C}. + +pure_dot({N, {C, _TS}}) -> {N, C}. %% @doc true if `A' strictly dominates `B'. Note: ignores %% timestamps. In Riak it is possible to have vclocks that are @@ -116,6 +113,7 @@ pure_dot({N, {C, _TS}}) -> %% not go there.) %% -spec dominates(vclock(), vclock()) -> boolean(). + dominates(A, B) -> %% In a sane world if two vclocks descend each other they MUST be %% equal. In riak they can descend each other and have different @@ -130,45 +128,53 @@ dominates(A, B) -> % @doc Combine all VClocks in the input list into their least possible % common descendant. -spec merge(VClocks :: [vclock()]) -> vclock(). -merge([]) -> []; + +merge([]) -> []; merge([SingleVclock]) -> SingleVclock; -merge([First|Rest]) -> merge(Rest, lists:keysort(1, First)). +merge([First | Rest]) -> + merge(Rest, lists:keysort(1, First)). merge([], NClock) -> NClock; -merge([AClock|VClocks],NClock) -> - merge(VClocks, merge(lists:keysort(1, AClock), NClock, [])). +merge([AClock | VClocks], NClock) -> + merge(VClocks, + merge(lists:keysort(1, AClock), NClock, [])). merge([], [], AccClock) -> lists:reverse(AccClock); -merge([], Left, AccClock) -> lists:reverse(AccClock, Left); -merge(Left, [], AccClock) -> lists:reverse(AccClock, Left); -merge(V=[{Node1,{Ctr1,TS1}=CT1}=NCT1|VClock], - N=[{Node2,{Ctr2,TS2}=CT2}=NCT2|NClock], AccClock) -> - if Node1 < Node2 -> - merge(VClock, N, [NCT1|AccClock]); - Node1 > Node2 -> - merge(V, NClock, [NCT2|AccClock]); +merge([], Left, AccClock) -> + lists:reverse(AccClock, Left); +merge(Left, [], AccClock) -> + lists:reverse(AccClock, Left); +merge(V = [{Node1, {Ctr1, TS1} = CT1} = NCT1 | VClock], + N = [{Node2, {Ctr2, TS2} = CT2} = NCT2 | NClock], + AccClock) -> + if Node1 < Node2 -> merge(VClock, N, [NCT1 | AccClock]); + Node1 > Node2 -> merge(V, NClock, [NCT2 | AccClock]); true -> - ({_Ctr,_TS} = CT) = if Ctr1 > Ctr2 -> CT1; + ({_Ctr, _TS} = CT) = if Ctr1 > Ctr2 -> CT1; Ctr1 < Ctr2 -> CT2; - true -> {Ctr1, erlang:max(TS1,TS2)} + true -> {Ctr1, erlang:max(TS1, TS2)} end, - merge(VClock, NClock, [{Node1,CT}|AccClock]) + merge(VClock, NClock, [{Node1, CT} | AccClock]) end. % @doc Get the counter value in VClock set from Node. --spec get_counter(Node :: vclock_node(), VClock :: vclock()) -> counter(). +-spec get_counter(Node :: vclock_node(), + VClock :: vclock()) -> counter(). + get_counter(Node, VClock) -> case lists:keyfind(Node, 1, VClock) of - {_, {Ctr, _TS}} -> Ctr; - false -> 0 + {_, {Ctr, _TS}} -> Ctr; + false -> 0 end. % @doc Get the timestamp value in a VClock set from Node. --spec get_timestamp(Node :: vclock_node(), VClock :: vclock()) -> timestamp() | undefined. +-spec get_timestamp(Node :: vclock_node(), + VClock :: vclock()) -> timestamp() | undefined. + get_timestamp(Node, VClock) -> case lists:keyfind(Node, 1, VClock) of - {_, {_Ctr, TS}} -> TS; - false -> undefined + {_, {_Ctr, TS}} -> TS; + false -> undefined end. % @doc Get the last timestamp from a clock in a friendly format @@ -180,95 +186,113 @@ last_modified(VClock) -> calendar:gregorian_seconds_to_datetime(lists:last(lists:sort(TSL))). % @doc Get the entry `dot()' for `vclock_node()' from `vclock()'. --spec get_dot(Node :: vclock_node(), VClock :: vclock()) -> {ok, dot()} | undefined. +-spec get_dot(Node :: vclock_node(), + VClock :: vclock()) -> {ok, dot()} | undefined. + get_dot(Node, VClock) -> case lists:keyfind(Node, 1, VClock) of - false -> undefined; - Entry -> {ok, Entry} + false -> undefined; + Entry -> {ok, Entry} end. %% @doc is the given argument a valid dot, or entry? -spec valid_dot(dot()) -> boolean(). -valid_dot({_, {Cnt, TS}}) when is_integer(Cnt), is_integer(TS) -> + +valid_dot({_, {Cnt, TS}}) + when is_integer(Cnt), is_integer(TS) -> true; -valid_dot(_) -> - false. +valid_dot(_) -> false. % @doc Increment VClock at Node. --spec increment(Node :: vclock_node(), VClock :: vclock()) -> vclock(). +-spec increment(Node :: vclock_node(), + VClock :: vclock()) -> vclock(). + increment(Node, VClock) -> increment(Node, timestamp(), VClock). % @doc Increment VClock at Node. --spec increment(Node :: vclock_node(), IncTs :: timestamp(), - VClock :: vclock()) -> vclock(). -increment(Node, IncTs, VClock) -> - {{_Ctr, _TS}=C1,NewV} = case lists:keytake(Node, 1, VClock) of - false -> - {{1, IncTs}, VClock}; - {value, {_N, {C, _T}}, ModV} -> - {{C + 1, IncTs}, ModV} - end, - [{Node,C1}|NewV]. +-spec increment(Node :: vclock_node(), + IncTs :: timestamp(), VClock :: vclock()) -> vclock(). +increment(Node, IncTs, VClock) -> + {{_Ctr, _TS} = C1, NewV} = case lists:keytake(Node, 1, + VClock) + of + false -> {{1, IncTs}, VClock}; + {value, {_N, {C, _T}}, ModV} -> + {{C + 1, IncTs}, ModV} + end, + [{Node, C1} | NewV]. % @doc Return the list of all nodes that have ever incremented VClock. -spec all_nodes(VClock :: vclock()) -> [vclock_node()]. -all_nodes(VClock) -> - [X || {X,{_,_}} <- VClock]. --define(DAYS_FROM_GREGORIAN_BASE_TO_EPOCH, (1970*365+478)). +all_nodes(VClock) -> [X || {X, {_, _}} <- VClock]. + +-define(DAYS_FROM_GREGORIAN_BASE_TO_EPOCH, + 1970 * 365 + 478). + -define(SECONDS_FROM_GREGORIAN_BASE_TO_EPOCH, - (?DAYS_FROM_GREGORIAN_BASE_TO_EPOCH * 24*60*60) - %% == calendar:datetime_to_gregorian_seconds({{1970,1,1},{0,0,0}}) - ). + (?DAYS_FROM_GREGORIAN_BASE_TO_EPOCH) * 24 * 60 * + 60). %% == calendar:datetime_to_gregorian_seconds({{1970,1,1},{0,0,0}}) % @doc Return a timestamp for a vector clock -spec timestamp() -> timestamp(). + timestamp() -> %% Same as calendar:datetime_to_gregorian_seconds(erlang:universaltime()), %% but significantly faster. {MegaSeconds, Seconds, _} = os:timestamp(), - ?SECONDS_FROM_GREGORIAN_BASE_TO_EPOCH + MegaSeconds*1000000 + Seconds. + (?SECONDS_FROM_GREGORIAN_BASE_TO_EPOCH) + + MegaSeconds * 1000000 + + Seconds. % @doc Compares two VClocks for equality. --spec equal(VClockA :: vclock(), VClockB :: vclock()) -> boolean(). -equal(VA,VB) -> - lists:sort(VA) =:= lists:sort(VB). +-spec equal(VClockA :: vclock(), + VClockB :: vclock()) -> boolean(). + +equal(VA, VB) -> lists:sort(VA) =:= lists:sort(VB). % @doc Possibly shrink the size of a vclock, depending on current age and size. --spec prune(V::vclock(), Now::integer(), BucketProps::term()) -> vclock(). -prune(V,Now,BucketProps) -> +-spec prune(V :: vclock(), Now :: integer(), + BucketProps :: term()) -> vclock(). + +prune(V, Now, BucketProps) -> %% This sort need to be deterministic, to avoid spurious merge conflicts later. %% We achieve this by using the node ID as secondary key. - SortV = lists:sort(fun({N1,{_,T1}},{N2,{_,T2}}) -> {T1,N1} < {T2,N2} end, V), - prune_vclock1(SortV,Now,BucketProps). + SortV = lists:sort(fun ({N1, {_, T1}}, {N2, {_, T2}}) -> + {T1, N1} < {T2, N2} + end, + V), + prune_vclock1(SortV, Now, BucketProps). + % @private -prune_vclock1(V,Now,BProps) -> +prune_vclock1(V, Now, BProps) -> case length(V) =< get_property(small_vclock, BProps) of - true -> V; - false -> - {_,{_,HeadTime}} = hd(V), - case (Now - HeadTime) < get_property(young_vclock,BProps) of - true -> V; - false -> prune_vclock1(V,Now,BProps,HeadTime) - end + true -> V; + false -> + {_, {_, HeadTime}} = hd(V), + case Now - HeadTime < get_property(young_vclock, BProps) + of + true -> V; + false -> prune_vclock1(V, Now, BProps, HeadTime) + end end. + % @private -prune_vclock1(V,Now,BProps,HeadTime) -> +prune_vclock1(V, Now, BProps, HeadTime) -> % has a precondition that V is longer than small and older than young - case (length(V) > get_property(big_vclock,BProps)) orelse - ((Now - HeadTime) > get_property(old_vclock,BProps)) of - true -> prune_vclock1(tl(V),Now,BProps); - false -> V + case length(V) > get_property(big_vclock, BProps) orelse + Now - HeadTime > get_property(old_vclock, BProps) + of + true -> prune_vclock1(tl(V), Now, BProps); + false -> V end. get_property(Key, PairList) -> case lists:keyfind(Key, 1, PairList) of - {_Key, Value} -> - Value; - false -> - undefined + {_Key, Value} -> Value; + false -> undefined end. %% =================================================================== @@ -282,9 +306,9 @@ example_test() -> B = vclock:fresh(), A1 = vclock:increment(a, A), B1 = vclock:increment(b, B), - true = vclock:descends(A1,A), - true = vclock:descends(B1,B), - false = vclock:descends(A1,B1), + true = vclock:descends(A1, A), + true = vclock:descends(B1, B), + false = vclock:descends(A1, B1), A2 = vclock:increment(a, A1), C = vclock:merge([A2, B1]), C1 = vclock:increment(c, C), @@ -299,68 +323,66 @@ prune_small_test() -> Now = riak_core_util:moment(), OldTime = Now - 32000000, SmallVC = [{<<"1">>, {1, OldTime}}, - {<<"2">>, {2, OldTime}}, - {<<"3">>, {3, OldTime}}], - Props = [{small_vclock,4}], - ?assertEqual(lists:sort(SmallVC), lists:sort(prune(SmallVC, Now, Props))). + {<<"2">>, {2, OldTime}}, {<<"3">>, {3, OldTime}}], + Props = [{small_vclock, 4}], + ?assertEqual((lists:sort(SmallVC)), + (lists:sort(prune(SmallVC, Now, Props)))). prune_young_test() -> % vclock with all entries younger than young_vclock will be untouched Now = riak_core_util:moment(), NewTime = Now - 1, - VC = [{<<"1">>, {1, NewTime}}, - {<<"2">>, {2, NewTime}}, + VC = [{<<"1">>, {1, NewTime}}, {<<"2">>, {2, NewTime}}, {<<"3">>, {3, NewTime}}], - Props = [{small_vclock,1},{young_vclock,1000}], - ?assertEqual(lists:sort(VC), lists:sort(prune(VC, Now, Props))). + Props = [{small_vclock, 1}, {young_vclock, 1000}], + ?assertEqual((lists:sort(VC)), + (lists:sort(prune(VC, Now, Props)))). prune_big_test() -> % vclock not preserved by small or young will be pruned down to % no larger than big_vclock entries Now = riak_core_util:moment(), NewTime = Now - 1000, - VC = [{<<"1">>, {1, NewTime}}, - {<<"2">>, {2, NewTime}}, + VC = [{<<"1">>, {1, NewTime}}, {<<"2">>, {2, NewTime}}, {<<"3">>, {3, NewTime}}], - Props = [{small_vclock,1},{young_vclock,1}, - {big_vclock,2},{old_vclock,100000}], - ?assert(length(prune(VC, Now, Props)) =:= 2). + Props = [{small_vclock, 1}, {young_vclock, 1}, + {big_vclock, 2}, {old_vclock, 100000}], + ?assert((length(prune(VC, Now, Props)) =:= 2)). prune_old_test() -> % vclock not preserved by small or young will be pruned down to % no larger than big_vclock and no entries more than old_vclock ago Now = riak_core_util:moment(), NewTime = Now - 1000, - OldTime = Now - 100000, - VC = [{<<"1">>, {1, NewTime}}, - {<<"2">>, {2, OldTime}}, + OldTime = Now - 100000, + VC = [{<<"1">>, {1, NewTime}}, {<<"2">>, {2, OldTime}}, {<<"3">>, {3, OldTime}}], - Props = [{small_vclock,1},{young_vclock,1}, - {big_vclock,2},{old_vclock,10000}], - ?assert(length(prune(VC, Now, Props)) =:= 1). + Props = [{small_vclock, 1}, {young_vclock, 1}, + {big_vclock, 2}, {old_vclock, 10000}], + ?assert((length(prune(VC, Now, Props)) =:= 1)). prune_order_test() -> % vclock with two nodes of the same timestamp will be pruned down % to the same node Now = riak_core_util:moment(), - OldTime = Now - 100000, + OldTime = Now - 100000, VC1 = [{<<"1">>, {1, OldTime}}, {<<"2">>, {2, OldTime}}], VC2 = lists:reverse(VC1), - Props = [{small_vclock,1},{young_vclock,1}, - {big_vclock,2},{old_vclock,10000}], - ?assertEqual(prune(VC1, Now, Props), prune(VC2, Now, Props)). + Props = [{small_vclock, 1}, {young_vclock, 1}, + {big_vclock, 2}, {old_vclock, 10000}], + ?assertEqual((prune(VC1, Now, Props)), + (prune(VC2, Now, Props))). accessor_test() -> - VC = [{<<"1">>, {1, 1}}, - {<<"2">>, {2, 2}}], - ?assertEqual(1, get_counter(<<"1">>, VC)), - ?assertEqual(1, get_timestamp(<<"1">>, VC)), - ?assertEqual(2, get_counter(<<"2">>, VC)), - ?assertEqual(2, get_timestamp(<<"2">>, VC)), - ?assertEqual(0, get_counter(<<"3">>, VC)), - ?assertEqual(undefined, get_timestamp(<<"3">>, VC)), - ?assertEqual([<<"1">>, <<"2">>], all_nodes(VC)). + VC = [{<<"1">>, {1, 1}}, {<<"2">>, {2, 2}}], + ?assertEqual(1, (get_counter(<<"1">>, VC))), + ?assertEqual(1, (get_timestamp(<<"1">>, VC))), + ?assertEqual(2, (get_counter(<<"2">>, VC))), + ?assertEqual(2, (get_timestamp(<<"2">>, VC))), + ?assertEqual(0, (get_counter(<<"3">>, VC))), + ?assertEqual(undefined, (get_timestamp(<<"3">>, VC))), + ?assertEqual([<<"1">>, <<"2">>], (all_nodes(VC))). last_modified_test() -> DT1 = {{1972, 5, 6}, {16, 13, 0}}, @@ -373,50 +395,53 @@ last_modified_test() -> ?assertMatch(DT2, last_modified(VC1)). merge_test() -> - VC1 = [{<<"1">>, {1, 1}}, - {<<"2">>, {2, 2}}, + VC1 = [{<<"1">>, {1, 1}}, {<<"2">>, {2, 2}}, {<<"4">>, {4, 4}}], - VC2 = [{<<"3">>, {3, 3}}, - {<<"4">>, {3, 3}}], - ?assertEqual([], merge(vclock:fresh())), - ?assertEqual([{<<"1">>,{1,1}},{<<"2">>,{2,2}},{<<"3">>,{3,3}},{<<"4">>,{4,4}}], - merge([VC1, VC2])). + VC2 = [{<<"3">>, {3, 3}}, {<<"4">>, {3, 3}}], + ?assertEqual([], (merge(vclock:fresh()))), + ?assertEqual([{<<"1">>, {1, 1}}, {<<"2">>, {2, 2}}, + {<<"3">>, {3, 3}}, {<<"4">>, {4, 4}}], + (merge([VC1, VC2]))). merge_less_left_test() -> VC1 = [{<<"5">>, {5, 5}}], VC2 = [{<<"6">>, {6, 6}}, {<<"7">>, {7, 7}}], - ?assertEqual([{<<"5">>, {5, 5}},{<<"6">>, {6, 6}}, {<<"7">>, {7, 7}}], - vclock:merge([VC1, VC2])). + ?assertEqual([{<<"5">>, {5, 5}}, {<<"6">>, {6, 6}}, + {<<"7">>, {7, 7}}], + (vclock:merge([VC1, VC2]))). merge_less_right_test() -> VC1 = [{<<"6">>, {6, 6}}, {<<"7">>, {7, 7}}], VC2 = [{<<"5">>, {5, 5}}], - ?assertEqual([{<<"5">>, {5, 5}},{<<"6">>, {6, 6}}, {<<"7">>, {7, 7}}], - vclock:merge([VC1, VC2])). + ?assertEqual([{<<"5">>, {5, 5}}, {<<"6">>, {6, 6}}, + {<<"7">>, {7, 7}}], + (vclock:merge([VC1, VC2]))). merge_same_id_test() -> - VC1 = [{<<"1">>, {1, 2}},{<<"2">>,{1,4}}], - VC2 = [{<<"1">>, {1, 3}},{<<"3">>,{1,5}}], - ?assertEqual([{<<"1">>, {1, 3}},{<<"2">>,{1,4}},{<<"3">>,{1,5}}], - vclock:merge([VC1, VC2])). + VC1 = [{<<"1">>, {1, 2}}, {<<"2">>, {1, 4}}], + VC2 = [{<<"1">>, {1, 3}}, {<<"3">>, {1, 5}}], + ?assertEqual([{<<"1">>, {1, 3}}, {<<"2">>, {1, 4}}, + {<<"3">>, {1, 5}}], + (vclock:merge([VC1, VC2]))). get_entry_test() -> VC = vclock:fresh(), - VC1 = increment(a, increment(c, increment(b, increment(a, VC)))), - ?assertMatch({ok, {a, {2, _}}}, get_dot(a, VC1)), - ?assertMatch({ok, {b, {1, _}}}, get_dot(b, VC1)), - ?assertMatch({ok, {c, {1, _}}}, get_dot(c, VC1)), - ?assertEqual(undefined, get_dot(d, VC1)). + VC1 = increment(a, + increment(c, increment(b, increment(a, VC)))), + ?assertMatch({ok, {a, {2, _}}}, (get_dot(a, VC1))), + ?assertMatch({ok, {b, {1, _}}}, (get_dot(b, VC1))), + ?assertMatch({ok, {c, {1, _}}}, (get_dot(c, VC1))), + ?assertEqual(undefined, (get_dot(d, VC1))). valid_entry_test() -> VC = vclock:fresh(), VC1 = increment(c, increment(b, increment(a, VC))), [begin - {ok, E} = get_dot(Actor, VC1), - ?assert(valid_dot(E)) - end || Actor <- [a, b, c]], - ?assertNot(valid_dot(undefined)), - ?assertNot(valid_dot("huffle-puff")), - ?assertNot(valid_dot([])). + {ok, E} = get_dot(Actor, VC1), ?assert((valid_dot(E))) + end + || Actor <- [a, b, c]], + ?assertNot((valid_dot(undefined))), + ?assertNot((valid_dot("huffle-puff"))), + ?assertNot((valid_dot([]))). -endif. diff --git a/test/eqc/13node_12node_ring.eqc b/test/eqc/13node_12node_ring.eqc deleted file mode 100644 index b5bd40061d7b647a3dd99cfc589096e17b6f5a21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6804 zcmeI%Ele9>9DwobC#8H9=m-LVKp88nGzbLA5C{YU zfj}S-2n2#92n0(I2n1OWEI}X;2$moa2*j>8^0w=H}k@dinSGp3yYT zQ~K3mcy-NhX3awBPAFdxxq_LUHG;Ypur>-Q5x1?b1+(*dDiKQykI|rO;iO^jP80{^ zE*q9I&(!b=Pd1>v|M}xrbK2UlOL6OtRzb2+YZc1Pk0OMk5k&+=6h$YBE)?A;dQkMD z=tB`hF^FOa#W0FEiV+l}D8^8XqnJQ3iDC-HGzuMsfg*!q0Yw4DB8nvx%P3Y*tfE*$ zv5sN`#U_d^6x%3vQ0$`EL$QzI0L3ASBNWFdPEeepI74xc;sV7biYpY?C~i>PqPRnG zkKzHvBZ?;}(nh^C+~{VqAT$xNenMhg#EeL~>SlNx{#G%^_+~UM@OwrJUj4D|`M#!= zNylf6OGS|}b!AWG3?z4kXXo>Ib0Ja8XN5PNmJ62Pd4j6m{%@jES5f&`X~SBRFQ2mK zI$u%bthvo^y&6f8$>>@~&J^Dg$@yF=k<18lE@2OIbJheXbUjg;^hyscUxNO(k*{Jz z?Ue7A;dLHgyHIqa=t0qoq7Ow3#UP3y6vHUuC`M3>q8LLlj$#7EB#J2%(Py}-r7gLfzpM%e{-WcO8RQ= zevnh&HeQGPeW_*n^riJ62+AIrKh~guv%_(Q+7VOzQ||apmv*T>DJko z=KEtZ+^B||UlHz?;U+cQ@``ZzBxC)9p!)l2>, <<1>>, <<2>>, <<3>>]). --define(BPROP_KEYS, [foo, bar, tapas]). --define(DEFAULT_BPROPS, [{n_val, 3}]). - -%% -%% The state_m "Model". This invariant represents what properties -%% should be in which buckets between state transitions. -%% --record(state, { - buckets = orddict:new() :: orddict() -}). - -%% -%% eqc_statem initial model -%% - --spec initial_state() -> eqc_statem:symbolic_state(). -initial_state() -> - #state{}. - -%% -%% set_bucket command -%% - -set_bucket_args(_S) -> - [bucket_name(), bucket_props()]. - -set_bucket(Bucket, BProps) -> - riak_core_bucket:set_bucket(Bucket, BProps). - -set_bucket_post(#state{buckets=Buckets}, [Bucket, _BProps], Res) -> - case {Res, orddict:find(Bucket, Buckets)} of - %% first time bucket has been set - {ok, error} -> - true; - %% bucket has been set before - {ok, {ok, _OldBProps}} -> - true; - %% anything other than ok is a failure - %% TODO revisit, e.g., generate invalid inputs to force an error - _ -> - false - end. - -set_bucket_next(#state{buckets=Buckets} = S, _Res, [Bucket, BProps]) -> - %% - %% Get any previously defined properties from the model - %% - OldBProps = - case orddict:find(Bucket, Buckets) of - {ok, Props} -> Props; - error -> orddict:from_list(?DEFAULT_BPROPS) - end, - S#state{ - buckets = orddict:store( - Bucket, - %% add defaults and the bucket name; remove any duplicates - %% bprops takes precedence over defaults, and name is always set - %% to bucket - expected_properties( - Bucket, OldBProps, BProps - ), - Buckets - ) - }. - --spec expected_properties(bucket_name(), orddict(), orddict()) -> orddict(). -expected_properties(Bucket, OldProps, NewProps) -> - Props = riak_core_bucket_props:merge(NewProps, OldProps), - orddict:store(name, Bucket, Props). - -%% -%% get_bucket command -%% - -get_bucket_args(_S) -> - [bucket_name()]. - -get_bucket(Bucket) -> - riak_core_bucket:get_bucket(Bucket). - -get_bucket_post(#state{buckets=Buckets}, [Bucket], Res) -> - BPropsFind = orddict:find(Bucket, Buckets), - case {Res, BPropsFind} of - {error, _} -> - eq(Res, error); - {_, {ok, BProps}} -> - eq( - orddict:from_list(Res), - orddict:from_list(BProps) - ); - {_, error} -> - eq( - orddict:from_list(Res), - orddict:from_list(?DEFAULT_BPROPS ++ [{name, Bucket}]) - ) - end. - -%% -%% all_n command -%% - -all_n_args(_) -> []. - -all_n() -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - riak_core_bucket:all_n(Ring). - -all_n_post(#state{buckets=Buckets}, [], Res) -> - AllNVals = orddict:fold( - fun(_Bucket, BProps, Accum) -> - {ok, NVal} = orddict:find(n_val, BProps), - [NVal | Accum] - end, - [], - Buckets - ) ++ [proplists:get_value(n_val, ?DEFAULT_BPROPS)], - eq(ordsets:from_list(Res), ordsets:from_list(AllNVals)). - - -%% TODO Add more commands here - -%% -%% generators -%% - -bucket_name() -> - eqc_gen:elements(?NAMES). - -bucket_props() -> - eqc_gen:list(bucket_prop()). - -bucket_prop() -> - eqc_gen:oneof( - [ - {n_val, pos_integer()}, - {bucket_prop_name(), bucket_prop_value()} - ] - ). - -pos_integer() -> - ?LET(N, eqc_gen:nat(), N + 1). - -bucket_prop_name() -> - eqc_gen:elements(?BPROP_KEYS). - -bucket_prop_value() -> - eqc_gen:bool(). - - -%% -%% eqc properties -%% - -prop_buckets() -> - ?SETUP( - fun setup_cleanup/0, - ?FORALL(Cmds, eqc_statem:commands(?MODULE), - aggregate(eqc_statem:command_names(Cmds), - ?TRAPEXIT( - try - %% - %% setup - %% - os:cmd("rm -rf ./riak_core_bucket_eqc_meta"), - application:set_env(riak_core, claimant_tick, 4294967295), - application:set_env(riak_core, broadcast_lazy_timer, 4294967295), - application:set_env(riak_core, broadcast_exchange_timer, 4294967295), - application:set_env(riak_core, metadata_hashtree_timer, 4294967295), - application:set_env(riak_core, default_bucket_props, ?DEFAULT_BPROPS), - application:set_env(riak_core, cluster_name, "riak_core_bucket_eqc"), - stop_pid(riak_core_ring_events, whereis(riak_core_ring_events)), - stop_pid(riak_core_ring_manager, whereis(riak_core_ring_manager)), - {ok, RingEvents} = riak_core_ring_events:start_link(), - {ok, _RingMgr} = riak_core_ring_manager:start_link(test), - {ok, Claimant} = riak_core_claimant:start_link(), - {ok, MetaMgr} = riak_core_metadata_manager:start_link([{data_dir, "./riak_core_bucket_eqc_meta"}]), - {ok, Hashtree} = riak_core_metadata_hashtree:start_link("./riak_core_bucket_eqc_meta/trees"), - {ok, Broadcast} = riak_core_broadcast:start_link(), - - {H, S, Res} = eqc_statem:run_commands(?MODULE, Cmds), - - %% - %% shut down - %% - stop_pid(riak_core_broadcast, Broadcast), - stop_pid(riak_core_metadata_hashtree, Hashtree), - stop_pid(riak_core_metadata_manager, MetaMgr), - stop_pid(riak_core_claimant, Claimant), - riak_core_ring_manager:stop(), - stop_pid(riak_core_ring_events2, RingEvents), - - eqc_statem:pretty_commands( - ?MODULE, Cmds, - {H, S, Res}, - eqc:aggregate( - eqc_statem:command_names(Cmds), - Res == ok - ) - ) - after - os:cmd("rm -rf ./riak_core_bucket_eqc_meta") - end - ) - ) - ) - ). - -setup_cleanup() -> - error_logger:tty(false), - meck:new(riak_core_capability, []), - meck:expect( - riak_core_capability, get, - fun({riak_core, bucket_types}) -> true; - (X) -> meck:passthrough([X]) - end - ), - fun() -> - error_logger:tty(true), - meck:unload(riak_core_capability) - end. - -%% -%% internal helper functions -%% - -stop_pid(_Tag, Other) when not is_pid(Other) -> - ok; -stop_pid(Tag, Pid) -> - unlink(Pid), - exit(Pid, shutdown), - ok = wait_for_pid(Tag, Pid). - -wait_for_pid(Tag, Pid) -> - Mref = erlang:monitor(process, Pid), - receive - {'DOWN', Mref, process, _, _} -> - ok - after - 5000 -> - demonitor(Mref, [flush]), - exit(Pid, kill), - wait_for_pid(Tag, Pid) - - end. - --endif. diff --git a/test/eqc/bucket_eqc_utils.erl b/test/eqc/bucket_eqc_utils.erl deleted file mode 100644 index 3a3d6459c..000000000 --- a/test/eqc/bucket_eqc_utils.erl +++ /dev/null @@ -1,49 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2007-2016 Basho Technologies, Inc. -%% -%% This file is provided to you under the Apache License, -%% Version 2.0 (the "License"); you may not use this file -%% except in compliance with the License. You may obtain -%% a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, -%% software distributed under the License is distributed on an -%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -%% KIND, either express or implied. See the License for the -%% specific language governing permissions and limitations -%% under the License. -%% -%% ------------------------------------------------------------------- - --module(bucket_eqc_utils). - -%% API --export([per_test_setup/2]). - - -per_test_setup(DefaultBucketProps, TestFun) -> - try - os:cmd("rm -rf ./meta_temp"), - riak_core_test_util:stop_pid(whereis(riak_core_ring_events)), - riak_core_test_util:stop_pid(whereis(riak_core_ring_manager)), - application:set_env(riak_core, claimant_tick, 4294967295), - application:set_env(riak_core, cluster_name, "eqc_test"), - application:set_env(riak_core, default_bucket_props, DefaultBucketProps), - {ok, RingEvents} = riak_core_ring_events:start_link(), - {ok, RingMgr} = riak_core_ring_manager:start_link(test), - {ok, Claimant} = riak_core_claimant:start_link(), - - Results = TestFun(), - - riak_core_test_util:stop_pid(Claimant), - unlink(RingMgr), - riak_core_ring_manager:stop(), - riak_core_test_util:stop_pid(RingEvents), - Results - after - os:cmd("rm -rf ./meta_temp"), - meck:unload() - end. diff --git a/test/eqc/claim-statem-leaving-nodes-still-claim.eqc b/test/eqc/claim-statem-leaving-nodes-still-claim.eqc deleted file mode 100644 index bcb0ca8946e25812cc4e0356d075fb97aae2423d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6370 zcmeI%FH9Rz0LSsy|D`R^C1gP$5D1bX3WJR$hzbM(fk3c@q&#{JceheV+cXFS$q)zx z0)apvSb{(x5C{YUfk2Q9!4k3{5C{YUfk5nfBae>P>yNw; z!dHEJXZj5hv6t^hu zP~4+pzzRGysF&OSH7b1+wa2neXH0=o&h2%9 ziYz+4E$Ez$tjy;P@xExu@0sjeF_+2ar8S#z%iOHf0HtAMs!gwYXmtvD-zr~CMQvBt z%kBvHp;$(-f?^fL8j5uk8z?qWY@ygjv4dh4#U6@%6bC2{Q5>N-Msb4T z6vY{ea}*aSE>T>exJGe<;uggnihC3fC?1t~t9-SU&+onR^;I9_{p*c-l?-^#{it&N zdT!8rZokS6=(!>9xdSRUsON^g=YCSTAw4(ZJ@>Q94ePm4@4162H=^e@HIf^0XBuis z!&XMR2bQj_bkAuLyqr`X= mU9M(5tF@7=SUx8!IelLFe8HSQ2wu)tlZ_ -%%% @copyright (C) 2017, Russell Brown -%%% @doc -%%% -%%% @end -%%% Created : 5 Jun 2017 by Russell Brown - --module(riak_core_claim_statem). - --ifdef(EQC). --include_lib("eqc/include/eqc.hrl"). -%%-include_lib("eqc/include/eqc_statem.hrl"). - -include_lib("eqc/include/eqc_fsm.hrl"). --include_lib("eunit/include/eunit.hrl"). - --define(CLAIMANT, node_0). - --compile(export_all). - - -%% -- State ------------------------------------------------------------------ --record(state, - { - ring_size, - nodes=[?CLAIMANT] :: [atom()], %% nodes that have been added - node_counter=1 :: non_neg_integer(), %% to aid with naming nodes - ring = undefined, - committed_nodes = [] - }). - -%% @doc run the statem with a ring of size `math:pow(`N', 2)'. --spec with_ring_size(pos_integer()) -> eqc_statem:symbolic_state(). -with_ring_size(N) -> - RingSize = trunc(math:pow(2, N)), - #state{ring_size=RingSize, ring=riak_core_ring:fresh(RingSize, ?CLAIMANT)}. - -%% @doc Returns the state in which each test case starts. (Unless a different -%% initial state is supplied explicitly to, e.g. commands/2.) --spec initial_state_data() -> eqc_statem:symbolic_state(). -initial_state_data() -> - #state{}. - -initial_state(_S) -> - starting. - -starting() -> - [{planning, add_node}]. - -planning() -> - [{planning, add_node}, - {planning, leave_node}, - {claiming, claim}]. - -claiming() -> - [{planning, add_node}, - {planning, leave_node}]. - -%% -- Operations ------------------------------------------------------------- - -%% --- Operation: add_node --- -%% @doc add_node_pre/1 - Precondition for generation -add_node_pre(_From, _To, S=#state{nodes=Nodes}) when - (S#state.ring_size div length(Nodes)) =< 3 -> - false; -add_node_pre(_From, _To, _) -> - true. - -%% @doc add_node_args - Argument generator --spec add_node_args(From, To, S) -> eqc_gen:gen([term()]) - when From :: eqc_fsm:state_name(), - To :: eqc_fsm:state_name(), - S :: eqc_statem:symbolic_state(). -add_node_args(_From, _To, #state{node_counter=NC, ring=Ring}) -> - %% TODO consider re-adding removed nodes - [list_to_atom("node_" ++ integer_to_list(NC)), - Ring]. - -%% @doc add_node - The actual operation -add_node(NodeName, Ring) -> - R = riak_core_ring:add_member(?CLAIMANT, Ring, NodeName), - R. - -%% @doc add_node_next - Next state function --spec add_node_next(_From, _To, S, Var, Args) -> NewS - when S :: eqc_statem:symbolic_state() | eqc_state:dynamic_state(), - Var :: eqc_statem:var() | term(), - Args :: [term()], - NewS :: eqc_statem:symbolic_state() | eqc_state:dynamic_state(). -add_node_next(_From, _To, S=#state{node_counter=NC, nodes=Nodes}, Ring, [Node, _RingIn]) -> - S#state{ring=Ring, node_counter=NC+1, nodes=[Node | Nodes]}. - -%% @doc add_node_post - Postcondition for add_node --spec add_node_post(_From, _To, S, Args, Res) -> true | term() - when S :: eqc_state:dynamic_state(), - Args :: [term()], - Res :: term(). -add_node_post(_Frim, _To, _S, [NodeName, _Ring], NextRing) -> - lists:member(NodeName, riak_core_ring:members(NextRing, [joining])). - -%% --- Operation: leave_node --- -%% @doc leave_node_pre/1 - Precondition for generation -leave_node_pre(_From, _To, #state{nodes=Nodes}) when length(Nodes) < 5 -> - false; -leave_node_pre(_From, _To, _) -> - true. - -%% @doc leave_node_args - Argument generator --spec leave_node_args(From, To, S) -> eqc_gen:gen([term()]) - when From :: eqc_fsm:state_name(), - To :: eqc_fsm:state_name(), - S :: eqc_statem:symbolic_state(). -leave_node_args(_From, _To, #state{nodes=Nodes, ring=Ring}) -> - %% TODO consider re-leaveing leaved nodes - [elements(Nodes), - Ring]. - -leave_node_pre(_From, _To, #state{nodes=Nodes}, [Node, _Ring]) -> - lists:member(Node, Nodes); -leave_node_pre(_, _, _, _) -> - false. - -%% @doc leave_node - The actual operation -leave_node(NodeName, Ring) -> - R = riak_core_ring:leave_member(?CLAIMANT, Ring, NodeName), - R. - -%% @doc leave_node_next - Next state function --spec leave_node_next(_From, _To, S, Var, Args) -> NewS - when S :: eqc_statem:symbolic_state() | eqc_state:dynamic_state(), - Var :: eqc_statem:var() | term(), - Args :: [term()], - NewS :: eqc_statem:symbolic_state() | eqc_state:dynamic_state(). -leave_node_next(_From, _To, S=#state{committed_nodes=Committed, nodes=Nodes}, Ring, [Node, _RingIn]) -> - S#state{ring=Ring, committed_nodes=lists:delete(Node , Committed), nodes=lists:delete(Node, Nodes)}. - -%% @doc leave_node_post - Postcondition for leave_node --spec leave_node_post(_From, _To, S, Args, Res) -> true | term() - when S :: eqc_state:dynamic_state(), - Args :: [term()], - Res :: term(). -leave_node_post(_Frim, _To, _S, [NodeName, _Ring], NextRing) -> - lists:member(NodeName, riak_core_ring:members(NextRing, [leaving])). - -%% --- Operation: claim --- - -%% @doc claim_pre/3 - Precondition for generation --spec claim_pre(_From, _To, S :: eqc_statem:symbolic_state()) -> boolean(). -claim_pre(_From, _To, #state{ring=undefined}) -> - false; -claim_pre(_From, _To, _S) -> - true. - -%% @doc claim_args - Argument generator --spec claim_args(_From, _To, S :: eqc_statem:symbolic_state()) -> eqc_gen:gen([term()]). -claim_args(_From, _To, #state{ring=Ring}) -> - [Ring]. - -%% @doc claim - The actual operation -claim(Ring) -> - R =riak_core_claim:claim(Ring, {riak_core_claim, wants_claim_v2}, {riak_core_claim, choose_claim_v2}), - R. - -%% @doc claim_next - Next state function --spec claim_next(_From, _To, S, Var, Args) -> NewS - when S :: eqc_statem:symbolic_state() | eqc_state:dynamic_state(), - Var :: eqc_statem:var() | term(), - Args :: [term()], - NewS :: eqc_statem:symbolic_state() | eqc_state:dynamic_state(). -claim_next(_From, _To, S=#state{nodes=Nodes}, NewRing, [_OldRing]) -> - S#state{ring=NewRing, committed_nodes=Nodes}. - -%% @doc claim_post - Postcondition for claim --spec claim_post(_From, _To, S, Args, Res) -> true | term() - when S :: eqc_state:dynamic_state(), - Args :: [term()], - Res :: term(). -claim_post(_From, _To, #state{nodes=Nodes}, [_Ring], _NewRing) when length(Nodes) < 4 -> - true; -claim_post(_From, _To, _S, [_Ring], NewRing) -> - Nval = 3, - TNval = 4, - Preflists = riak_core_ring:all_preflists(NewRing, Nval), - ImperfectPLs = orddict:to_list( - lists:foldl(fun(PL,Acc) -> - PLNodes = lists:usort([N || {_,N} <- PL]), - case length(PLNodes) of - Nval -> - Acc; - _ -> - ordsets:add_element(PL, Acc) - end - end, [], Preflists)), - - case {riak_core_claim:meets_target_n(NewRing, TNval), - ImperfectPLs, - riak_core_claim:balanced_ring(ring_size(NewRing), - node_count(NewRing), NewRing)} of - {{true, []}, [], true} -> - true; - {X, Y, Z} -> - {ring_size(NewRing), node_count(NewRing), - {{meets_target_n, X}, - {perfect_pls, Y}, - {balanced_ring, Z}}} - end. - -%% -- Property --------------------------------------------------------------- -%% @doc Optional callback, Invariant, checked for each visited state -%% during test execution. -%% -spec invariant(S :: eqc_statem:dynamic_state()) -> boolean(). -%% invariant(_S) -> -%% true. - -%% @doc Default generated property --spec prop_claim(eqc_statem:symbolic_state()) -> eqc:property(). -prop_claim(InitialState) -> - ?FORALL(Cmds, commands(?MODULE, {starting, InitialState}), - begin - {H, {_FinalStateName, S}, Res} = run_commands(?MODULE, Cmds), - Ring = S#state.ring, - pretty_commands(?MODULE, Cmds, {H, S, Res}, - aggregate(command_names(Cmds), - measure(ring_size, ring_size(Ring), - measure(node_count, node_count(Ring), - Res == ok)))) - end). - -ring_size(undefined) -> - 0; -ring_size(Ring) -> - riak_core_ring:num_partitions(Ring). - -node_count(undefined) -> - 0; -node_count(Ring) -> - length(riak_core_ring:members(Ring, [joining, valid])). - -weight(_From, _To, add_node, _Args) -> - 5; -weight(_, _, _, _) -> - 1. - -%% eunit stuff --define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). - -claim_test() -> - eqc:quickcheck(?QC_OUT(prop_claim(with_ring_size(5)))). - -eqc_check(File, Prop) -> - {ok, Bytes} = file:read_file(File), - CE = binary_to_term(Bytes), - eqc:check(Prop, CE). - -%% Helpers -transfer_ring(Ring) -> - Owners = riak_core_ring:all_owners(Ring), - RFinal = lists:foldl(fun({Idx, Owner}, Racc) -> - riak_core_ring:transfer_node(Idx, Owner, Racc) end, - Ring, Owners), - RFinal. - - - --endif. diff --git a/eqc/chash_eqc.erl b/test/pqc/chash_eqc.erl similarity index 90% rename from eqc/chash_eqc.erl rename to test/pqc/chash_eqc.erl index 58e884988..da9f4e034 100644 --- a/eqc/chash_eqc.erl +++ b/test/pqc/chash_eqc.erl @@ -24,20 +24,19 @@ -module(chash_eqc). --ifdef(EQC). --include_lib("eqc/include/eqc.hrl"). +-ifdef(PROPER). +-include_lib("proper/include/proper.hrl"). -include_lib("eunit/include/eunit.hrl"). -define(NOTEST, true). -define(NOASSERT, true). --define(TEST_ITERATIONS, 50). +-define(TEST_ITERATIONS, 5000). -define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). + proper:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). -define(RINGTOP, trunc(math:pow(2,160)-1)). % SHA-1 space --export([check/0, - test/0, +-export([test/0, test/1]). %%==================================================================== @@ -55,8 +54,7 @@ eqc_test_() -> {timeout, 60000, % timeout is in msec %% Indicate the number of test iterations for each property here ?_assertEqual(true, - quickcheck(numtests(?TEST_ITERATIONS, - ?QC_OUT(prop_chash_next_index())))) + proper:quickcheck(?QC_OUT(prop_chash_next_index()),[{numtests,?TEST_ITERATIONS}])) } ] } @@ -139,9 +137,9 @@ test() -> test(100). test(N) -> - quickcheck(numtests(N, prop_chash_next_index())). + proper:quickcheck(numtests(N, prop_chash_next_index())). -check() -> - check(prop_chash_next_index(), current_counterexample()). +% check() -> +% check(prop_chash_next_index(), current_counterexample()). -endif. % EQC diff --git a/eqc/core_vnode_eqc.erl b/test/pqc/core_vnode_eqc.erl similarity index 83% rename from eqc/core_vnode_eqc.erl rename to test/pqc/core_vnode_eqc.erl index 24292759b..e5d87c590 100644 --- a/eqc/core_vnode_eqc.erl +++ b/test/pqc/core_vnode_eqc.erl @@ -23,12 +23,12 @@ %% @doc QuickCheck tests for riak_core_vnode code -module(core_vnode_eqc). --ifdef(EQC). --include_lib("eqc/include/eqc.hrl"). --include_lib("eqc/include/eqc_fsm.hrl"). +-ifdef(TEST). +-ifdef(PORPER). +-include_lib("proper/include/proper.hrl"). -include_lib("eunit/include/eunit.hrl"). --include("include/riak_core_vnode.hrl"). --compile([export_all, nowarn_export_all]). +-include_lib("riak_core/include/riak_core_vnode.hrl"). +-compile([export_all]). -define(POST_COND(PC, ErrTuple), case PC of @@ -37,7 +37,7 @@ end). -define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). + proper:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). -record(qcst, {started, counters, % Dict of counters for each index @@ -48,10 +48,27 @@ async_size = 0, async_work=[]}). % {Index, AsyncRef} async work submitted to each vnode +simple_test_() -> + {setup, + fun setup_simple/0, + fun(OldVars) -> + riak_core_test_util:unlink_named_process(riak_core_ring_manager), + riak_core_ring_manager:stop(), + riak_core_test_util:stop_pid(riak_core_ring_events), + application:stop(goldrush), + [ok = application:set_env(riak_core, K, V) || {K,V} <- OldVars], + ok + end, + {timeout, 600, + ?_assertEqual(true, proper:quickcheck(?QC_OUT(numtests(100, prop_simple()))))}}. + setup_simple() -> - error_logger:tty(false), - application:set_env(sasl, sasl_error_logger, {file, "core_vnode_eqc_sasl.log"}), - error_logger:logfile({open, "core_vnode_eqc.log"}), + %% call `meck:unload' here because there are other tests that have + %% meck'ed things we use, and they an break us if eunit doesn't tear + %% them down fast enough. + meck:unload(), + %error_logger:tty(false), + %error_logger:logfile({open, "core_vnode_eqc.log"}), Vars = [{ring_creation_size, 8}, {ring_state_dir, ""}, @@ -60,29 +77,34 @@ setup_simple() -> %% race condition with `all_nodes'. {vnode_rolling_start, 0}], OldVars = [begin - Old = app_helper:get_env(riak_core, AppKey), + Old = application:get_env(riak_core, AppKey, undefined), ok = application:set_env(riak_core, AppKey, Val), {AppKey, Old} end || {AppKey, Val} <- Vars], - exometer:start(), riak_core_ring_events:start_link(), riak_core_ring_manager:start_link(test), riak_core_vnode_proxy_sup:start_link(), riak_core:register([{vnode_module, mock_vnode}]), + OldVars. + +test(N) -> + proper:quickcheck(numtests(N, prop_simple())). + +eqc_setup() -> + OldVars = setup_simple(), fun() -> riak_core_ring_manager:stop(), - application:stop(exometer), application:stop(goldrush), [ok = application:set_env(riak_core, K, V) || {K,V} <- OldVars], ok end. prop_simple() -> - ?SETUP(fun setup_simple/0, - ?FORALL(Cmds, commands(?MODULE, {setup, initial_state_data()}), + ?SETUP(fun eqc_setup/0, + ?FORALL(Cmds, proper_fsm:commands(?MODULE, {setup, initial_state_data()}), aggregate(command_names(Cmds), begin - {H,{_SN,S},Res} = run_commands(?MODULE, Cmds), + {H,{_SN,S},Res} = proper_fsm:run_commands(?MODULE, Cmds), timer:sleep(500), %% Adjust this to make shutdown sensitive stuff pass/fail %% Do a sync operation on all the started vnodes %% to ensure any of the noreply commands have executed before @@ -101,8 +123,7 @@ prop_simple() -> equals(lists:sort(async_work(S#qcst.asyncdone_pid)), lists:sort(filter_work(S#qcst.async_work, S#qcst.asyncdone_pid)))}])) - end)) - ). + end))). active_index(#qcst{started=Started}) -> elements(Started). @@ -181,21 +202,23 @@ next_state_data(_From,_To,S=#qcst{counters=Counters, when Func =:= asyncnoreply; Func =:= asyncreply; Func =:= asynccrash -> NewWork = [{Idx, R} || {Idx, _N} <- Preflist], S2=S#qcst{async_work=Work ++ NewWork, - counters=lists:foldl(fun({I, _N}, C) -> - orddict:update_counter(I, 1, C) - end, Counters, Preflist)}, + counters=lists:foldl(fun({I, _N}, C) -> + orddict:update_counter(I, 1, C) + end, Counters, Preflist)}, %% io:format(user, "S2=~p\n", [S2]), S2; next_state_data(_From,_To,S,_R,_C) -> S. -% + % setup(S) -> [{setup, {call,?MODULE,enable_async,[gen_async_pool()]}}, - {stopped, {call,?MODULE,prepare,[S#qcst.async_size]}}]. + {stopped, {call,?MODULE,prepare,[S#qcst.async_size]}} + ]. stopped(S) -> - [{running, {call,?MODULE,start_vnode,[index(S)]}}]. + [{running, {call,?MODULE,start_vnode,[index(S)]}} + ]. running(S) -> [ @@ -344,9 +367,9 @@ start_servers() -> stop_servers() -> %% Make sure VMaster is killed before sup as start_vnode is a cast %% and there may be a pending request to start the vnode. - stop_pid(whereis(mock_vnode_master)), - stop_pid(whereis(riak_core_vnode_manager)), - stop_pid(whereis(riak_core_vnode_sup)). + riak_core_test_util:stop_pid(mock_vnode_master), + riak_core_test_util:stop_pid(riak_core_vnode_manager), + riak_core_test_util:stop_pid(riak_core_vnode_sup). restart_master() -> %% Call get status to make sure the riak_core_vnode_master @@ -354,26 +377,9 @@ restart_master() -> %% commands like neverreply are not cast on to the vnode and the %% counters are not updated correctly. sys:get_status(mock_vnode_master), - stop_pid(whereis(mock_vnode_master)), + riak_core_test_util:stop_pid(mock_vnode_master), {ok, _VMaster} = riak_core_vnode_master:start_link(mock_vnode). -stop_pid(undefined) -> - ok; -stop_pid(Pid) -> - unlink(Pid), - exit(Pid, kill), %% Don't wait for graceful shutdown - ok = wait_for_pid(Pid). - -wait_for_pid(Pid) -> - Mref = erlang:monitor(process, Pid), - receive - {'DOWN',Mref,process,_,_} -> - ok - after - 5000 -> - {error, didnotexit} - end. - %% Async work collector process - collect all messages until work requested async_work_proc(AsyncWork, Crashes) -> receive @@ -394,10 +400,10 @@ async_work_proc(AsyncWork, Crashes) -> %% Request async work completed async_work(undefined) -> -%% io:format(user, "Did not get as far as setting up async worker\n", []), + %% io:format(user, "Did not get as far as setting up async worker\n", []), []; async_work(Pid) -> -%% io:format(user, "Getting async work from ~p\n", [Pid]), + %% io:format(user, "Getting async work from ~p\n", [Pid]), Pid ! {get, self()}, receive {work, Work} -> @@ -409,10 +415,10 @@ async_work(Pid) -> %% Request async work crashes async_crashes(undefined) -> -%% io:format(user, "Did not get as far as setting up async worker\n", []), + %% io:format(user, "Did not get as far as setting up async worker\n", []), []; async_crashes(Pid) -> -%% io:format(user, "Getting async crashes from ~p\n", [Pid]), + %% io:format(user, "Getting async crashes from ~p\n", [Pid]), Pid ! {crashes, self()}, receive {crashes, Crashes} -> @@ -434,15 +440,16 @@ filter_work(Work, Pid) -> exit(Pid, kill) end, lists:filter(fun({_Index, {_Reply, Tag}}=WorkItem) -> - case lists:member(Tag, CrashRefs) of - true -> - %% this isn't quite straightforward as a request can - %% apparently go to multiple vnodes. We have to make - %% sure we're only removing crashes from vnodes that - %% didn't reply - lists:member(WorkItem, CompletedWork); - _ -> true - end - end, Work). + case lists:member(Tag, CrashRefs) of + true -> + %% this isn't quite straightforward as a request can + %% apparently go to multiple vnodes. We have to make + %% sure we're only removing crashes from vnodes that + %% didn't reply + lists:member(WorkItem, CompletedWork); + _ -> true + end + end, Work). -endif. +-endif. \ No newline at end of file diff --git a/eqc/new_cluster_membership_model_eqc.erl b/test/pqc/new_cluster_membership_model_eqc.erl similarity index 98% rename from eqc/new_cluster_membership_model_eqc.erl rename to test/pqc/new_cluster_membership_model_eqc.erl index 5655a7ef4..f48cc7585 100644 --- a/eqc/new_cluster_membership_model_eqc.erl +++ b/test/pqc/new_cluster_membership_model_eqc.erl @@ -1,15 +1,14 @@ -module(new_cluster_membership_model_eqc). -ifdef(MODEL). --ifdef(EQC). --include_lib("eqc/include/eqc.hrl"). --include_lib("eqc/include/eqc_statem.hrl"). +-ifdef(PROPER). +-include_lib("proper/include/proper.hrl"). -include_lib("eunit/include/eunit.hrl"). -compile(export_all). -define(TEST_ITERATIONS, 3000). -define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). + proper:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). -define(OUT(S,A),ok). %%-define(OUT(S,A),io:format(S,A)). @@ -27,7 +26,7 @@ vclock :: vclock:vclock(), % for this chstate object, entries are % {Node, Ctr} chring :: chash:chash(), % chash ring of {IndexAsInt, Node} mappings - meta :: dict(), % dict of cluster-wide other data (primarily + meta :: dict:dict(), % dict of cluster-wide other data (primarily % bucket N-value, etc) clustername :: {node(), term()}, @@ -50,7 +49,7 @@ %% Global test state -record(state, { - nstates :: dict(), + nstates :: dict:dict(), ring_size :: integer(), members :: [{node(), {member_status(), vclock:vclock()}}], primary :: [integer()], @@ -63,7 +62,7 @@ active_handoffs :: [{integer(), integer(), integer()}], seed :: {integer(), integer(), integer()}, old_seed :: {integer(), integer(), integer()}, - split :: dict() + split :: dict:dict() }). eqc_test_() -> @@ -74,8 +73,8 @@ eqc_test_() -> [{inorder, [manual_test_list(), %% Run the quickcheck tests - {timeout, 60000, % timeout is in msec - ?_assertEqual(true, catch quickcheck(numtests(?TEST_ITERATIONS, ?QC_OUT(prop_join()))))} + {timeout, 60000000, % timeout is in msec + ?_assertEqual(true, catch proper:quickcheck(numtests(?TEST_ITERATIONS, ?QC_OUT(prop_join()))))} ]} ] } @@ -83,7 +82,7 @@ eqc_test_() -> }. eqc() -> - quickcheck(numtests(?TEST_ITERATIONS, ?QC_OUT(prop_join()))), + proper:quickcheck(numtests(?TEST_ITERATIONS, ?QC_OUT(prop_join()))), ok. setup() -> @@ -93,7 +92,7 @@ cleanup(_) -> ok. prop_join() -> - ?FORALL(Cmds, more_commands(100, commands(?MODULE)), + ?FORALL(Cmds, commands(?MODULE), ?TRAPEXIT( ( begin @@ -276,7 +275,8 @@ initial_state() -> g_initial_nodes() -> Nodes = lists:seq(0, ?MAX_NODES-1), - ?LET(L, shuffle(Nodes), lists:split(?INITIAL_CLUSTER_SIZE, L)). + ?LET(L, Nodes, %shuffle(Nodes) + lists:split(?INITIAL_CLUSTER_SIZE, L)). g_idx(State) -> Indices = [Idx || {Idx, _} <- chash:nodes(chash:fresh(State#state.ring_size, undefined))], @@ -287,7 +287,7 @@ g_gossip(State, Gossip) -> [{Node, get_nstate(State, Node)}, OtherNode, OtherCS]. g_random_ring(State) -> - shuffle(lists:seq(0, State#state.ring_size-1)). + lists:seq(0, State#state.ring_size-1).%shuffle( g_posint() -> ?SUCHTHAT(X, largeint(), X > 0). @@ -1386,19 +1386,19 @@ ring_ready(CState0) -> end. seed_random(State) -> - OldSeed = random:seed(State#state.seed), + OldSeed = rand:seed(State#state.seed), State#state{old_seed=OldSeed}. save_random(State=#state{old_seed=undefined}) -> - Seed = random:seed(), + Seed = rand:seed(), State#state{seed=Seed}; save_random(State=#state{old_seed=OldSeed}) -> - Seed = random:seed(OldSeed), + Seed = rand:seed(OldSeed), State#state{seed=Seed}. save_random() -> - Seed = random:seed(), - random:seed(Seed), + Seed = rand:seed(), + rand:seed(Seed), Seed. ring_changed(State, _RRing, {Node, _NState}, CState0) -> @@ -1620,7 +1620,7 @@ handle_down_nodes(CState, Next) -> case (OwnerLeaving and NextDown) of true -> Active = riak_core_ring:active_members(CState) -- [O], - RNode = lists:nth(random:uniform(length(Active)), + RNode = lists:nth(rand:uniform(length(Active)), Active), {Idx, O, RNode, Mods, Status}; _ -> @@ -1743,7 +1743,7 @@ attempt_simple_transfer(Ring, [{P, Exit}|Rest], TargetN, Exit, Idx, Last) -> target_n_fail; Qualifiers -> %% these nodes don't violate target_n forward - Chosen = lists:nth(random:uniform(length(Qualifiers)), + Chosen = lists:nth(rand:uniform(length(Qualifiers)), Qualifiers), %% choose one, and do the rest of the ring attempt_simple_transfer( diff --git a/test/eqc/node_watcher_qc.erl b/test/pqc/node_watcher_qc.erl similarity index 98% rename from test/eqc/node_watcher_qc.erl rename to test/pqc/node_watcher_qc.erl index 69fd4952f..3de840947 100644 --- a/test/eqc/node_watcher_qc.erl +++ b/test/pqc/node_watcher_qc.erl @@ -21,10 +21,9 @@ %% ------------------------------------------------------------------- -module(node_watcher_qc). --ifdef(EQC). +-ifdef(PROPER). --include_lib("eqc/include/eqc.hrl"). --include_lib("eqc/include/eqc_statem.hrl"). +-include_lib("proper/include/proper.hrl"). -include_lib("eunit/include/eunit.hrl"). -compile(export_all). @@ -36,12 +35,15 @@ peers = []}). -define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). + proper:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). -define(ORDSET(L), ordsets:from_list(L)). +%TODO +% qc_test_() -> +% {timeout, 1500, +% ?_assert(proper:quickcheck(?QC_OUT(prop_main()),[{numtests, 5000}])) +% }. -qc_test_() -> - {timeout, 120, fun() -> ?assert(eqc:quickcheck(?QC_OUT(prop_main()))) end}. prop_main() -> ?SETUP( @@ -102,7 +104,7 @@ ensure_started(Mod) -> %% ==================================================================== -%% eqc_statem callbacks +%%proper_statem callbacks %% ==================================================================== initial_state() -> @@ -114,8 +116,8 @@ command(S) -> {call, ?MODULE, local_service_up, [g_service()]}, {call, ?MODULE, local_service_down, [g_service()]}, {call, ?MODULE, local_service_kill, [g_service(), S]}, - {call, ?MODULE, local_node_up, []}, - {call, ?MODULE, local_node_down, []}, + %{call, ?MODULE, local_node_up, []}, + %{call, ?MODULE, local_node_down, []}, {call, ?MODULE, remote_service_up, [g_node(), g_services()]}, {call, ?MODULE, remote_service_down, [g_node()]}, {call, ?MODULE, remote_service_down_disterl, [g_node()]}, diff --git a/test/pqc/riak_core_claim_qc.erl b/test/pqc/riak_core_claim_qc.erl new file mode 100644 index 000000000..ccd39794b --- /dev/null +++ b/test/pqc/riak_core_claim_qc.erl @@ -0,0 +1,323 @@ +-module(riak_core_claim_qc). +-ifdef(TEST). +-ifdef(PROPER). + +-compile(export_all). +-export([prop_claim_ensures_unique_nodes/1, prop_wants/0, prop_wants_counts/0, eqc_check/2]). +-include_lib("proper/include/proper.hrl"). +-include_lib("eunit/include/eunit.hrl"). + +-define(QC_OUT(P), + proper:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). + +-define(POW_2(N), trunc(math:pow(2, N))). + +eqc_check(File, Prop) -> + {ok, Bytes} = file:read_file(File), + CE = binary_to_term(Bytes), + proper:check(Prop, CE). + +test_nodes(Count) -> + [node() | [list_to_atom(lists:concat(["n_", N])) || N <- lists:seq(1, Count-1)]]. + +test_nodes(Count, StartNode) -> + [list_to_atom(lists:concat(["n_", N])) || N <- lists:seq(StartNode, StartNode + Count)]. + +property_claim_ensures_unique_nodes_v2_test_() -> + Prop = ?QC_OUT(prop_claim_ensures_unique_nodes(choose_claim_v2)), + {timeout, 120, fun() -> ?_assert(proper:quickcheck(Prop, [{numtests, 5000}])) end}. + +property_claim_ensures_unique_nodes_adding_groups_v2_test_() -> + Prop = ?QC_OUT(prop_claim_ensures_unique_nodes_adding_groups(choose_claim_v2)), + {timeout, 120, fun() -> ?_assert(proper:quickcheck(Prop, [{numtests, 5000}])) end}. + +property_claim_ensures_unique_nodes_adding_singly_v2_test_() -> + Prop = ?QC_OUT(prop_claim_ensures_unique_nodes_adding_singly(choose_claim_v2)), + {timeout, 120, fun() -> ?_assert(proper:quickcheck(Prop, [{numtests, 5000}])) end}. + +prop_claim_ensures_unique_nodes(ChooseFun) -> + %% NOTE: We know that this doesn't work for the case of {_, 3}. + %% NOTE2: uses undocumented "double_shrink", is expensive, but should get + %% around those case where we shrink to a non-minimal case because + %% some intermediate combinations of ring_size/node have no violations + ?FORALL({PartsPow, NodeCount}, {choose(4, 9), choose(4, 15)}, + begin + Nval = 3, + TNval = Nval + 1, + _Params = [{target_n_val, TNval}], + + Partitions = ?POW_2(PartsPow), + [Node0 | RestNodes] = test_nodes(NodeCount), + + R0 = riak_core_ring:fresh(Partitions, Node0), + RAdded = lists:foldl(fun(Node, Racc) -> + riak_core_ring:add_member(Node0, Racc, Node) + end, R0, RestNodes), + + Rfinal = riak_core_claim:claim(RAdded, {?MODULE, wants_claim_v2}, {?MODULE, ChooseFun}), + + Preflists = riak_core_ring:all_preflists(Rfinal, Nval), + ImperfectPLs = orddict:to_list( + lists:foldl(fun(PL, Acc) -> + PLNodes = lists:usort([N || {_, N} <- PL]), + case length(PLNodes) of + Nval -> + Acc; + _ -> + ordsets:add_element(PL, Acc) + end + end, [], Preflists)), + + ?WHENFAIL( + begin + io:format(user, "{Partitions, Nodes} {~p, ~p}~n", + [Partitions, NodeCount]), + io:format(user, "Owners: ~p~n", + [riak_core_ring:all_owners(Rfinal)]) + end, + conjunction([{meets_target_n, + equals({true, []}, + riak_core_claim:meets_target_n(Rfinal, TNval))}, + {perfect_preflists, equals([], ImperfectPLs)}, + {balanced_ring, balanced_ring(Partitions, NodeCount, Rfinal)}])) + end). + + +prop_claim_ensures_unique_nodes_adding_groups(ChooseFun) -> + %% NOTE: We know that this doesn't work for the case of {_, 3}. + %% NOTE2: uses undocumented "double_shrink", is expensive, but should get + %% around those case where we shrink to a non-minimal case because + %% some intermediate combinations of ring_size/node have no violations + ?FORALL({PartsPow, BaseNodes, AddedNodes}, + {choose(4, 9), choose(2, 10), choose(2, 5)}, + begin + Nval = 3, + TNval = Nval + 1, + _Params = [{target_n_val, TNval}], + + Partitions = ?POW_2(PartsPow), + [Node0 | RestNodes] = test_nodes(BaseNodes), + AddNodes = test_nodes(AddedNodes-1, BaseNodes), + NodeCount = BaseNodes + AddedNodes, + %% io:format("Base: ~p~n",[[Node0 | RestNodes]]), + %% io:format("Added: ~p~n",[AddNodes]), + + R0 = riak_core_ring:fresh(Partitions, Node0), + RBase = lists:foldl(fun(Node, Racc) -> + riak_core_ring:add_member(Node0, Racc, Node) + end, R0, RestNodes), + + Rinterim = riak_core_claim:claim(RBase, {?MODULE, wants_claim_v2}, {?MODULE, ChooseFun}), + RAdded = lists:foldl(fun(Node, Racc) -> + riak_core_ring:add_member(Node0, Racc, Node) + end, Rinterim, AddNodes), + + Rfinal = riak_core_claim:claim(RAdded, {?MODULE, wants_claim_v2}, {?MODULE, ChooseFun}), + + Preflists = riak_core_ring:all_preflists(Rfinal, Nval), + ImperfectPLs = orddict:to_list( + lists:foldl(fun(PL, Acc) -> + PLNodes = lists:usort([N || {_, N} <- PL]), + case length(PLNodes) of + Nval -> + Acc; + _ -> + ordsets:add_element(PL, Acc) + end + end, [], Preflists)), + + ?WHENFAIL( + begin + io:format(user, "{Partitions, Nodes} {~p, ~p}~n", + [Partitions, NodeCount]), + io:format(user, "Owners: ~p~n", + [riak_core_ring:all_owners(Rfinal)]) + end, + conjunction([{meets_target_n, + equals({true, []}, + riak_core_claim:meets_target_n(Rfinal, TNval))}, + {perfect_preflists, equals([], ImperfectPLs)}, + {balanced_ring, balanced_ring(Partitions, NodeCount, Rfinal)}])) + end). + + +prop_claim_ensures_unique_nodes_adding_singly(ChooseFun) -> + %% NOTE: We know that this doesn't work for the case of {_, 3}. + %% NOTE2: uses undocumented "double_shrink", is expensive, but should get + %% around those case where we shrink to a non-minimal case because + %% some intermediate combinations of ring_size/node have no violations + ?FORALL({PartsPow, NodeCount}, {choose(4, 9), choose(4, 15)}, + begin + Nval = 3, + TNval = Nval + 1, + Params = [{target_n_val, TNval}], + + Partitions = ?POW_2(PartsPow), + [Node0 | RestNodes] = test_nodes(NodeCount), + + R0 = riak_core_ring:fresh(Partitions, Node0), + Rfinal = lists:foldl(fun(Node, Racc) -> + Racc0 = riak_core_ring:add_member(Node0, Racc, Node), + %% TODO which is it? Claim or ChooseFun?? + %%claim(Racc0, {?MODULE, wants_claim_v2}, + %% {?MODULE, ChooseFun}) + ?MODULE:ChooseFun(Racc0, Node, Params) + end, R0, RestNodes), + Preflists = riak_core_ring:all_preflists(Rfinal, Nval), + ImperfectPLs = orddict:to_list( + lists:foldl(fun(PL, Acc) -> + PLNodes = lists:usort([N || {_, N} <- PL]), + case length(PLNodes) of + Nval -> + Acc; + _ -> + ordsets:add_element(PL, Acc) + end + end, [], Preflists)), + + ?WHENFAIL( + begin + io:format(user, "{Partitions, Nodes} {~p, ~p}~n", + [Partitions, NodeCount]), + io:format(user, "Owners: ~p~n", + [riak_core_ring:all_owners(Rfinal)]) + end, + conjunction([{meets_target_n, + equals({true, []}, + riak_core_claim:meets_target_n(Rfinal, TNval))}, + {perfect_preflists, equals([], ImperfectPLs)}, + {balanced_ring, balanced_ring(Partitions, NodeCount, Rfinal)}])) + end). + + + +%% @private check that no node claims more than it should +-spec balanced_ring(RingSize::integer(), NodeCount::integer(), + riak_core_ring:riak_core_ring()) -> + boolean(). +balanced_ring(RingSize, NodeCount, Ring) -> + TargetClaim = riak_core_claim:ceiling(RingSize / NodeCount), + MinClaim = RingSize div NodeCount, + AllOwners0 = riak_core_ring:all_owners(Ring), + AllOwners = lists:keysort(2, AllOwners0), + {BalancedMax, AccFinal} = lists:foldl(fun({_Part, Node}, {_Balanced, [{Node, Cnt} | Acc]}) + when Cnt >= TargetClaim -> + {false, [{Node, Cnt+1} | Acc]}; + ({_Part, Node}, {Balanced, [{Node, Cnt} | Acc]}) -> + {Balanced, [{Node, Cnt+1} | Acc]}; + ({_Part, NewNode}, {Balanced, Acc}) -> + {Balanced, [{NewNode, 1} | Acc]} + end, + {true, []}, + AllOwners), + BalancedMin = lists:all(fun({_Node, Cnt}) -> Cnt >= MinClaim end, AccFinal), + case BalancedMax andalso BalancedMin of + true -> + true; + false -> + {TargetClaim, MinClaim, lists:sort(AccFinal)} + end. + + +wants_counts_test() -> + {timeout, 120, + ?assert(proper:quickcheck(?QC_OUT((prop_wants_counts())), [{numtests, 5000}]))}. + +prop_wants_counts() -> + ?FORALL({S, Q}, {large_pos(100), large_pos(100000)}, + begin + Wants = riak_core_claim:wants_counts(S, Q), + conjunction([{len, S == length(Wants)}, + {sum, Q == lists:sum(Wants)}]) + end). + +wants_test() -> + {timeout, 120, + ?_assert(proper:quickcheck(?QC_OUT(prop_wants()), [{numtests, 5000}]))}. + +prop_wants() -> + ?FORALL({NodeStatus, Q}, + {?SUCHTHAT(L, non_empty(list(elements([leaving, joining]))), + lists:member(joining, L)), + ?LET(X, choose(1, 16), trunc(math:pow(2, X)))}, + begin + R0 = riak_core_ring:fresh(Q, tnode(1)), + {_, R2, Active} = + lists:foldl( + fun(S, {I, R1, A1}) -> + N = tnode(I), + case S of + joining -> + {I+1, riak_core_ring:add_member(N, R1, N), [N|A1]}; + _ -> + {I+1, riak_core_ring:leave_member(N, R1, N), A1} + end + end, {1, R0, []}, NodeStatus), + Wants = riak_core_claim:wants(R2), + + %% Check any non-claiming nodes are set to 0 + %% Check all nodes are present + {ActiveWants, InactiveWants} = + lists:partition(fun({N, _W}) -> lists:member(N, Active) end, Wants), + + ActiveSum = lists:sum([W || {_, W} <- ActiveWants]), + InactiveSum = lists:sum([W || {_, W} <- InactiveWants]), + ?WHENFAIL( + begin + io:format(user, "NodeStatus: ~p\n", [NodeStatus]), + io:format(user, "Active: ~p\n", [Active]), + io:format(user, "Q: ~p\n", [Q]), + io:format(user, "Wants: ~p\n", [Wants]), + io:format(user, "ActiveWants: ~p\n", [ActiveWants]), + io:format(user, "InactiveWants: ~p\n", [InactiveWants]) + end, + conjunction([{wants, length(Wants) == length(NodeStatus)}, + {active, Q == ActiveSum}, + {inactive, 0 == InactiveSum}])) + end). + +%% Large positive integer between 1 and Max +large_pos(Max) -> + ?LET(X, largeint(), 1 + (abs(X) rem Max)). + + +tnode(I) -> + list_to_atom("n" ++ integer_to_list(I)). + +%% Check that no node gained more than it wanted to take +%% Check that none of the nodes took more partitions than allowed +%% Check that no nodes violate target N +check_deltas(Exchanges, Before, After, Q, TN) -> + conjunction( + lists:flatten( + [begin + Gave = length(OIdxs1 -- OIdxs2), % in original and not new + Took = length(OIdxs2 -- OIdxs1), + V1 = count_violations(OIdxs1, Q, TN), + V2 = count_violations(OIdxs2, Q, TN), + [{{give, Node, Gave, Give}, Gave =< Give}, + {{take, Node, Took, Take}, Took =< Take}, + {{valid, Node, V1, V2}, + V2 == 0 orelse + V1 > 0 orelse % check no violations if there were not before + OIdxs1 == []}] % or the node held no indices so violation was impossible + end || {{Node, Give, Take, _CIdxs}, {Node, _Want1, OIdxs1}, {Node, _Want2, OIdxs2}} <- + lists:zip3(lists:sort(Exchanges), lists:sort(Before), lists:sort(After))])). + +count_violations([], _Q, _TN) -> + 0; +count_violations(Idxs, Q, TN) -> + SOIdxs = lists:sort(Idxs), + {_, Violations} = lists:foldl( + fun(This, {Last, Vs}) -> + case Last - This >= TN of + true -> + {This, Vs}; + _ -> + {This, Vs + 1} + end + end, {Q + hd(SOIdxs), 0}, lists:reverse(SOIdxs)), + Violations. + +-endif. % EQC +-endif. % TEST diff --git a/test/pqc/riak_core_claim_statem.erl b/test/pqc/riak_core_claim_statem.erl new file mode 100644 index 000000000..38d84ffa7 --- /dev/null +++ b/test/pqc/riak_core_claim_statem.erl @@ -0,0 +1,270 @@ +%%% @author Russell Brown +%%% @copyright (C) 2017, Russell Brown +%%% @doc +%%% +%%% @end +%%% Created : 5 Jun 2017 by Russell Brown + +-module(riak_core_claim_statem). + +-ifdef(PROPER). +-include_lib("proper/include/proper.hrl"). +-include_lib("eunit/include/eunit.hrl"). + +-define(CLAIMANT, node_0). + +-compile(export_all). + +%Entry Eunit +claim_test_()-> + {timeout, 120, + ?_assert(proper:quickcheck(prop_claim(with_ring_size(5)),[{numtests, 5000}] ))}. + +%% -- State ------------------------------------------------------------------ +-record(state, + { + ring_size, + nodes=[?CLAIMANT] :: [atom()], %% nodes that have been added + node_counter=1 :: non_neg_integer(), %% to aid with naming nodes + ring = undefined, + committed_nodes = [] + }). + +%% @doc run the statem with a ring of size `math:pow(`N', 2)'. +-spec with_ring_size(pos_integer()) -> proper_statem:symbolic_state(). +with_ring_size(N) -> + RingSize = trunc(math:pow(2, N)), + #state{ring_size=RingSize, ring=riak_core_ring:fresh(RingSize, ?CLAIMANT)}. + +%% @doc Returns the state in which each test case starts. (Unless a different +%% initial state is supplied explicitly to, e.g. commands/2.) +-spec initial_state_data() -> proper_statem:symbolic_state(). +initial_state_data() -> + #state{}. + +initial_state(_S) -> + starting. + +starting(S) -> + [{planning, {call, ?MODULE, add_node, add_node_args(S)}}]. + +planning(S) -> + [{planning, {call, ?MODULE, add_node, add_node_args(S)}}, + {planning, {call, ?MODULE, leave_node, leave_node_args(S)}}%, + %{claiming, {call, ?MODULE, claim, claim_args(S)}} %TODO + ]. + +claiming(S) -> + [{planning, {call, ?MODULE, add_node, add_node_args(S)}}, + {planning, {call, ?MODULE, leave_node, leave_node_args(S)}}]. + +%% -- Operations ------------------------------------------------------------- + +%% --- Operation: preconditions --- +%% @doc add_node_pre/1 - Precondition for generation +%add_node_pre(_From, _To, S=#state{nodes=Nodes}) +precondition(_F,_T,S=#state{nodes=Nodes}, {call, _, add_node, _}) when + (S#state.ring_size div length(Nodes)) =< 3 -> + false; +%add_node_pre(_From, _To, _) -> +precondition(_F,_T,_S, {call, _, add_node, _}) -> + true; +%% @doc leave_node_pre/1 - Precondition for generation +%leave_node_pre(_From, _To, #state{nodes=Nodes}) when length(Nodes) < 5 -> +precondition(_F,_T,#state{nodes=Nodes},{call,_,leave_node,_}) when length(Nodes) < 5 -> + false; +%leave_node_pre(_From, _To, _) -> +precondition(_F,_T,_S, {call,_,leave_node,_})-> + true; +%leave_node_pre(_From, _To, #state{nodes=Nodes}, [Node, _Ring]) -> +precondition(_F,_T,#state{nodes=Nodes},{call,_,leave_node,[Node, _Ring]}) -> + lists:member(Node, Nodes); +precondition(_F,_T,_S,{call,_,leave_node,_}) -> + false; +% @doc claim_pre/3 - Precondition for generation +%-spec claim_pre(_From, _To, S :: proper:symbolic_state()) -> boolean(). +%claim_pre(_From, _To, #state{ring=undefined}) -> +precondition(_F,_T,#state{ring=undefined},{call, _, claim,_}) -> + false; +%claim_pre(_From, _To, _S) -> +precondition(_F,_T,_S,{call,_ , claim, _}) -> + true. + +%% --- Operation: Next state --- +%% @doc add_node_next - Next state function +% -spec add_node_next(_From, _To, S, Var, Args) -> NewS +% when S :: proper:symbolic_state() | proper:dynamic_state(), +% Var :: proper:var() | term(), +% Args :: [term()], +% NewS :: proper:symbolic_state() | proper:dynamic_state(). +%add_node_next(_From, _To, S=#state{node_counter=NC, nodes=Nodes}, Ring, [Node, _RingIn]) -> +next_state_data(_F,_T,S=#state{node_counter=NC, nodes=Nodes}, Ring, + {call,_, add_node, [Node, _RingIn]}) -> + S#state{ring=Ring, node_counter=NC+1, nodes=[Node | Nodes]}; + +%% @doc leave_node_next - Next state function +% -spec leave_node_next(_From, _To, S, Var, Args) -> NewS +% when S :: proper:symbolic_state() | proper:dynamic_state(), +% Var :: proper:var() | term(), +% Args :: [term()], +% NewS :: proper:symbolic_state() | proper:dynamic_state(). +next_state_data(_F,_T,S=#state{committed_nodes=Committed, nodes=Nodes},Ring,{call, _, leave_node, [Node, _RingIn]}) -> + S#state{ring=Ring, committed_nodes=lists:delete(Node , Committed), nodes=lists:delete(Node, Nodes)}; + +%% @doc claim_next - Next state function +% -spec claim_next(_From, _To, S, Var, Args) -> NewS +% when S :: proper:symbolic_state() | proper:dynamic_state(), +% Var :: proper:var() | term(), +% Args :: [term()], +% NewS :: proper:symbolic_state() | proper:dynamic_state(). +%claim_next(_From, _To, S=#state{nodes=Nodes}, NewRing, [_OldRing]) -> +next_state_data(_F,_T,S=#state{nodes=Nodes}, NewRing, {call, _, claim, [_OldRing]}) -> + S#state{ring=NewRing, committed_nodes=Nodes}. + +%% --- Operation: postconditions --- +%% @doc add_node_post - Postcondition for add_node +% -spec add_node_post(_From, _To, S, Args, Res) -> true | term() +% when S :: proper:dynamic_state(), +% Args :: [term()], +% Res :: term(). +%add_node_post(_Frim, _To, _S, [NodeName, _Ring], NextRing) -> +postcondition(_F,_T,_S,{call,_, add_node, [NodeName, _Ring]}, NextRing) -> + lists:member(NodeName, riak_core_ring:members(NextRing, [joining])); + +%% @doc leave_node_post - Postcondition for leave_node +% -spec leave_node_post(_From, _To, S, Args, Res) -> true | term() +% when S :: proper:dynamic_state(), +% Args :: [term()], +% Res :: term(). +postcondition(_F,_T,_S,{call,_,leave_node,[NodeName, _Ring]}, NextRing) -> + lists:member(NodeName, riak_core_ring:members(NextRing, [leaving])); + +%% @doc claim_post - Postcondition for claim +% -spec claim_post(_From, _To, S, Args, Res) -> true | term() +% when S :: proper:dynamic_state(), +% Args :: [term()], +% Res :: term(). +%claim_post(_From, _To, #state{nodes=Nodes}, [_Ring], _NewRing) when length(Nodes) < 4 -> +postcondition(_F,_T,#state{nodes=Nodes}, {call, _, claim, [_Ring]}, _NewRing) when length(Nodes) < 4 -> + true; +%claim_post(_From, _To, _S, [_Ring], NewRing) -> +postcondition(_F,_T,_S, {call, _, claim, [_Ring]}, NewRing)-> + Nval = 3, + TNval = 4, + Preflists = riak_core_ring:all_preflists(NewRing, Nval), + ImperfectPLs = orddict:to_list( + lists:foldl(fun(PL,Acc) -> + PLNodes = lists:usort([N || {_,N} <- PL]), + case length(PLNodes) of + Nval -> + Acc; + _ -> + ordsets:add_element(PL, Acc) + end + end, [], Preflists)), + + case {riak_core_claim:meets_target_n(NewRing, TNval), + ImperfectPLs, + riak_core_claim:balanced_ring(ring_size(NewRing), + node_count(NewRing), NewRing)} of + {{true, []}, [], true} -> + true; + {X, Y, Z} -> + {ring_size(NewRing), node_count(NewRing), + {{meets_target_n, X}, + {perfect_pls, Y}, + {balanced_ring, Z}}} + end. + +%% --- Operation: main functions --- +%% @doc add_node_args - Argument generator +% -spec add_node_args(From, To, S) -> proper:gen([term()]) +% when From :: proper:state_name(), +% To :: proper:state_name(), +% S :: proper:symbolic_state(). +add_node_args(#state{node_counter=NC, ring=Ring}) -> + %% TODO consider re-adding removed nodes + %io:fwrite("~n", NC), + [list_to_atom("node_" ++ integer_to_list(NC)), Ring]. + +%% @doc add_node - The actual operation +add_node(NodeName, Ring) -> + R = riak_core_ring:add_member(?CLAIMANT, Ring, NodeName), + R. + +%% --- Operation: leave_node --- +%% @doc leave_node_args - Argument generator +% -spec leave_node_args(From, To, S) -> proper:gen([term()]) +% when From :: proper:state_name(), +% To :: proper:state_name(), +% S :: proper:symbolic_state(). +leave_node_args(#state{nodes=Nodes, ring=Ring}) -> + %% TODO consider re-leaveing leaved nodes + [elements(Nodes), Ring]. +%% @doc leave_node - The actual operation +leave_node(NodeName, Ring) -> + R = riak_core_ring:leave_member(?CLAIMANT, Ring, NodeName), + R. +%% --- Operation: claim --- +%% @doc claim_args - Argument generator +%-spec claim_args(S :: proper:symbolic_state()) -> proper:gen([term()]). +%claim_args(_From, _To, #state{ring=Ring}) -> +claim_args(#state{ring=Ring}) -> + [Ring]. +%% @doc claim - The actual operation +claim(Ring) -> + R =riak_core_claim:claim(Ring, {riak_core_claim, wants_claim_v2}, {riak_core_claim, choose_claim_v2}), + R. + +%% -- Property --------------------------------------------------------------- +%% @doc Optional callback, Invariant, checked for each visited state +%% during test execution. + +%% @doc Default generated property +-spec prop_claim(proper_statem:symbolic_state()) -> proper:property(). +prop_claim(InitialState) -> + ?FORALL(Cmds, proper_fsm:commands(?MODULE, {starting, InitialState}), + begin + {_H, {_FinalStateName, S}, Res} = proper_fsm:run_commands(?MODULE, Cmds), + Ring = S#state.ring, + aggregate(command_names(Cmds), + measure(ring_size, ring_size(Ring), + measure(node_count, node_count(Ring), + Res == ok))) + end). + +ring_size(undefined) -> + 0; +ring_size(Ring) -> + riak_core_ring:num_partitions(Ring). + +node_count(undefined) -> + 0; +node_count(Ring) -> + length(riak_core_ring:members(Ring, [joining, valid])). + +weight(_From, _To, add_node, _Args) -> + 5; +weight(_, _, _, _) -> + 1. + +%% eunit stuff +-define(QC_OUT(P), + proper:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). + +eqc_check(File, Prop) -> + {ok, Bytes} = file:read_file(File), + CE = binary_to_term(Bytes), + proper:check(Prop, CE). + +%% Helpers +transfer_ring(Ring) -> + Owners = riak_core_ring:all_owners(Ring), + RFinal = lists:foldl(fun({Idx, Owner}, Racc) -> + riak_core_ring:transfer_node(Idx, Owner, Racc) end, + Ring, Owners), + RFinal. + + + +-endif. diff --git a/test/pqc/riak_core_claim_util_qc.erl b/test/pqc/riak_core_claim_util_qc.erl new file mode 100644 index 000000000..d58c495bc --- /dev/null +++ b/test/pqc/riak_core_claim_util_qc.erl @@ -0,0 +1,50 @@ +-module(riak_core_claim_util_qc). +-ifdef(TEST). +-ifdef(PROPER). +-include_lib("proper/include/proper.hrl"). +-include_lib("eunit/include/eunit.hrl"). +%-compile(export_all). + +property_adjacency_summary_test_() -> + {timeout, 120, + ?_test(proper:quickcheck(prop_adjacency_summary(), [{numtest, 5000}]))}. + +longer_list(K, G) -> + ?SIZED(Size, proper_types:resize(trunc(K*Size), list(proper_types:resize(Size, G)))). + +%% Compare directly constructing the adjacency matrix against +%% one using prepend/fixup. +prop_adjacency_summary() -> + ?FORALL({OwnersSeed, S}, + {non_empty(longer_list(40, proper_types:largeint())), + ?LET(X, proper_types:int(), 1 + abs(X))}, + begin + Owners = [list_to_atom("n" ++ integer_to_list(1 + (abs(I) rem S))) + || I <- OwnersSeed], + AM = riak_core_claim_util:adjacency_matrix(Owners), + AS = riak_core_claim_util:summarize_am(AM), + + {Owners2, _DAM2, FixDAM2} = build(Owners), + AS2 = riak_core_claim_util:summarize_am(dict:to_list(FixDAM2)), + ?WHENFAIL( + begin + io:format(user, "S=~p\nOwners =~p\n", [S, Owners]), + io:format(user, "=== AM ===\n~p\n", [AM]), + io:format(user, "=== FixAM2 ===\n~p\n", [dict:to_list(FixDAM2)]), + io:format(user, "=== AS2 ===\n~p\n", [AS2]) + end, + proper:conjunction([{owners, Owners == Owners2}, + {am2, lists:sort(AS)== lists:sort(AS2)}])) + end). + +build(Owners) -> + build(lists:usort(Owners), lists:reverse(Owners), [], dict:new()). + +build(_M, [], Owners, DAM) -> + {Owners, DAM, riak_core_claim_util:fixup_dam(Owners, DAM)}; +build(M, [N|Rest], Owners, DAM) -> + {Owners1, DAM1} = riak_core_claim_util:prepend(M, N, Owners, DAM), + build(M, Rest, Owners1, DAM1). + +-endif. +-endif. diff --git a/eqc/riak_core_ring_eqc.erl b/test/pqc/riak_core_ring_eqc.erl similarity index 95% rename from eqc/riak_core_ring_eqc.erl rename to test/pqc/riak_core_ring_eqc.erl index bf45d96d2..1187e9d8e 100644 --- a/eqc/riak_core_ring_eqc.erl +++ b/test/pqc/riak_core_ring_eqc.erl @@ -21,15 +21,15 @@ -module(riak_core_ring_eqc). --ifdef(EQC). +-ifdef(PROPER). -export([prop_future_index/0]). --include_lib("eqc/include/eqc.hrl"). +-include_lib("proper/include/proper.hrl"). -include_lib("eunit/include/eunit.hrl"). -define(TEST_ITERATIONS, 10000). -define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). + proper:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). eqc_test_() -> @@ -43,7 +43,7 @@ eqc_test_() -> {timeout, 60000, % timeout is in msec %% Indicate the number of test iterations for each property here ?_assertEqual(true, - quickcheck(numtests(?TEST_ITERATIONS, + proper:quickcheck(numtests(?TEST_ITERATIONS, ?QC_OUT(prop_future_index())))) }]}]}]}. diff --git a/test/pqc/riak_core_ring_util_qc.erl b/test/pqc/riak_core_ring_util_qc.erl new file mode 100644 index 000000000..0a7f48220 --- /dev/null +++ b/test/pqc/riak_core_ring_util_qc.erl @@ -0,0 +1,141 @@ +-module(riak_core_ring_util_qc). +-ifdef(TEST). +-ifdef(PROPER). + +-compile(export_all). +-export([prop_ids_are_boundaries/0, + prop_reverse/0, + prop_monotonic/0, + prop_only_boundaries/0]). +-include_lib("proper/include/proper.hrl"). +-include_lib("eunit/include/eunit.hrl"). + +-define(QC_OUT(P), + proper:on_output(fun(Str, Args) -> + io:format(user, Str, Args) end, P)). +-define(TEST_TIME_SECS, 5). + +-define(HASHMAX, 1 bsl 160 - 1). +-define(RINGSIZEEXPMAX, 11). +-define(RINGSIZE(X), (1 bsl X)).%% We'll generate powers of 2 with choose() + %% and convert that to a ring size with this macro +-define(PARTITIONSIZE(X), ((1 bsl 160) div (X))). + +ids_are_boundaries_test_() -> + {timeout, ?TEST_TIME_SECS+5, [?_assert(test_ids_are_boundaries() =:= true)]}. + +test_ids_are_boundaries() -> + test_ids_are_boundaries(?TEST_TIME_SECS). +%TODO check time sec +test_ids_are_boundaries(_TestTimeSecs) -> + proper:quickcheck(?QC_OUT(prop_ids_are_boundaries()), [{numtests, 5000}]). + +reverse_test_() -> + {timeout, ?TEST_TIME_SECS+5, [?_assert(test_reverse() =:= true)]}. + +test_reverse() -> + test_reverse(?TEST_TIME_SECS). +%TODO check time sec +test_reverse(_TestTimeSecs) -> + proper:quickcheck(prop_reverse(), [{numtests, 5000}]). + + +monotonic_test_() -> + {timeout, ?TEST_TIME_SECS+5, [?_assert(test_monotonic() =:= true)]}. + +test_monotonic() -> + test_monotonic(?TEST_TIME_SECS). + +test_monotonic(_TestTimeSecs) -> + proper:quickcheck(?QC_OUT(prop_monotonic()), [{numtests, 5000}]). + + +%% `prop_only_boundaries' should run a little longer: not quite as +%% fast, need to scan a larger portion of hash space to establish +%% correctness +only_boundaries_test_() -> + {timeout, ?TEST_TIME_SECS+15, [?_assert(test_only_boundaries() =:= true)]}. + +test_only_boundaries() -> + test_only_boundaries(?TEST_TIME_SECS+10). + +test_only_boundaries(_TestTimeSecs) -> + proper:quickcheck(prop_only_boundaries(), [{numtests, 5000}]). + +%% Partition IDs should map to hash values which are partition boundaries +prop_ids_are_boundaries() -> + ?FORALL(RingPower, choose(2, ?RINGSIZEEXPMAX), + ?FORALL(PartitionId, choose(0, ?RINGSIZE(RingPower) - 1), + begin + RingSize = ?RINGSIZE(RingPower), + BoundaryHash = + riak_core_ring_util:partition_id_to_hash(PartitionId, + RingSize), + equals(true, + riak_core_ring_util:hash_is_partition_boundary(BoundaryHash, + RingSize)) + end + )). + +%% Partition IDs should map to hash values which map back to the same partition IDs +prop_reverse() -> + ?FORALL(RingPower, choose(2, ?RINGSIZEEXPMAX), + ?FORALL(PartitionId, choose(0, ?RINGSIZE(RingPower) - 1), + begin + RingSize = ?RINGSIZE(RingPower), + BoundaryHash = + riak_core_ring_util:partition_id_to_hash(PartitionId, + RingSize), + equals(PartitionId, + riak_core_ring_util:hash_to_partition_id( + BoundaryHash, RingSize)) + end + )). + +%% For any given hash value, any larger hash value maps to a partition +%% ID of greater or equal value. +prop_monotonic() -> + ?FORALL(RingPower, choose(2, ?RINGSIZEEXPMAX), + ?FORALL(HashValue, choose(0, ?HASHMAX - 1), + ?FORALL(GreaterHash, choose(HashValue + 1, ?HASHMAX), + begin + RingSize = ?RINGSIZE(RingPower), + LowerPartition = + riak_core_ring_util:hash_to_partition_id(HashValue, + RingSize), + GreaterPartition = + riak_core_ring_util:hash_to_partition_id(GreaterHash, + RingSize), + LowerPartition =< GreaterPartition + end + ))). + +%% Hash values which are listed in the ring structure are boundary +%% values +ring_to_set({_RingSize, PropList}) -> + ordsets:from_list(lists:map(fun({Hash, dummy}) -> Hash end, PropList)). + +find_near_boundaries(RingSize, PartitionSize) -> + ?LET({Id, Offset}, {choose(1, RingSize-1), choose(-(RingSize*2), (RingSize*2))}, + Id * PartitionSize + Offset). + +prop_only_boundaries() -> + ?FORALL(RingPower, choose(2, ?RINGSIZEEXPMAX), + ?FORALL({HashValue, BoundarySet}, + {frequency([ + {5, choose(0, ?HASHMAX)}, + {2, find_near_boundaries(?RINGSIZE(RingPower), + ?PARTITIONSIZE(?RINGSIZE(RingPower)))}]), + ring_to_set(chash:fresh(?RINGSIZE(RingPower), dummy))}, + begin + RingSize = ?RINGSIZE(RingPower), + HashIsInRing = ordsets:is_element(HashValue, BoundarySet), + HashIsPartitionBoundary = + riak_core_ring_util:hash_is_partition_boundary(HashValue, + RingSize), + equals(HashIsPartitionBoundary, HashIsInRing) + end + )). + +-endif. +-endif. \ No newline at end of file diff --git a/test/eqc/vclock_qc.erl b/test/pqc/vclock_qc.erl similarity index 90% rename from test/eqc/vclock_qc.erl rename to test/pqc/vclock_qc.erl index 0d31b0460..7a6918803 100644 --- a/test/eqc/vclock_qc.erl +++ b/test/pqc/vclock_qc.erl @@ -1,30 +1,25 @@ -module(vclock_qc). --ifdef(EQC). - --include_lib("eqc/include/eqc.hrl"). --include_lib("eqc/include/eqc_statem.hrl"). +-ifdef(PROPER). +-include_lib("proper/include/proper.hrl"). -include_lib("eunit/include/eunit.hrl"). -compile(export_all). -define(ACTOR_IDS, [a,b,c,d,e]). -define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). + proper:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). -record(state, {vclocks = []}). -define(TEST_TIME, 20). -eqc_test_() -> +proper_test_() -> {timeout, - 60, - ?_assert(quickcheck(eqc:testing_time(?TEST_TIME, more_commands(10,?QC_OUT(prop_vclock())))))}. - + 120, + ?_assert(proper:quickcheck(prop_vclock(), [{numtests, 5000}]))}. test() -> - quickcheck(eqc:testing_time(?TEST_TIME, more_commands(10, prop_vclock()))). + proper:quickcheck(more_commands(10, prop_vclock())). -test(Time) -> - quickcheck(eqc:testing_time(Time, more_commands(10, prop_vclock()))). %% Initialize the state @@ -100,11 +95,12 @@ prop_vclock() -> ?FORALL(Cmds,commands(?MODULE), begin put(timestamp, 1), - {H,S,Res} = run_commands(?MODULE,Cmds), - aggregate([ length(V) || {_,V} <- S#state.vclocks ], + {_H,S,Res} = run_commands(?MODULE, Cmds), + aggregate([ length(V) || {_,V} <- S#state.vclocks], aggregate(command_names(Cmds), collect({num_vclocks_div_10, length(S#state.vclocks) div 10}, - pretty_commands(?MODULE,Cmds, {H,S,Res}, Res == ok)))) + Res == ok + ))) end). gen_actor_id() -> diff --git a/test/eqc/worker_pool_pulse.erl b/test/pqc/worker_pool_pulse.erl similarity index 100% rename from test/eqc/worker_pool_pulse.erl rename to test/pqc/worker_pool_pulse.erl diff --git a/test/riak_core_base64url_tests.erl b/test/riak_core_base64url_tests.erl deleted file mode 100644 index b4ec62522..000000000 --- a/test/riak_core_base64url_tests.erl +++ /dev/null @@ -1,42 +0,0 @@ -%% ------------------------------------------------------------------- -%% Copyright (c) 2016 Basho Technologies, Inc. All Rights Reserved. -%% -%% This file is provided to you under the Apache License, -%% Version 2.0 (the "License"); you may not use this file -%% except in compliance with the License. You may obtain -%% a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, -%% software distributed under the License is distributed on an -%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -%% KIND, either express or implied. See the License for the -%% specific language governing permissions and limitations -%% under the License. -%% ------------------------------------------------------------------- --module(riak_core_base64url_tests). - --include_lib("eunit/include/eunit.hrl"). - --define(URL, "http://example.com/foo?query=thing"). - -string_to_string_test() -> - Encoded = riak_core_base64url:encode_to_string(?URL), - Decoded = riak_core_base64url:decode_to_string(Encoded), - ?assertEqual(?URL, Decoded). - -string_to_binary_test() -> - Encoded = riak_core_base64url:encode(?URL), - Decoded = riak_core_base64url:decode(Encoded), - ?assertEqual(<>, Decoded). - -binary_to_binary_test() -> - Encoded = riak_core_base64url:encode(<>), - Decoded = riak_core_base64url:decode(Encoded), - ?assertEqual(<>, Decoded). - -binary_to_string_test() -> - Encoded = riak_core_base64url:encode_to_string(<>), - Decoded = riak_core_base64url:decode_to_string(Encoded), - ?assertEqual(?URL, Decoded). diff --git a/test/sync_command_test.erl b/test/sync_command_test.erl index 82d503856..f8be289aa 100644 --- a/test/sync_command_test.erl +++ b/test/sync_command_test.erl @@ -93,5 +93,4 @@ stop_servers(_Pid) -> riak_core_test_util:stop_pid(riak_core_vnode_manager), riak_core_test_util:stop_pid(riak_core_ring_events), riak_core_test_util:stop_pid(riak_core_vnode_sup), - riak_core_test_util:stop_pid(riak_core_ring_manager), - application:stop(goldrush). + riak_core_test_util:stop_pid(riak_core_ring_manager). diff --git a/test/worker_pool_test.erl b/test/worker_pool_test.erl index c85202aaa..eafa37182 100644 --- a/test/worker_pool_test.erl +++ b/test/worker_pool_test.erl @@ -20,23 +20,23 @@ -module(worker_pool_test). -behaviour(riak_core_vnode_worker). --include_lib("eunit/include/eunit.hrl"). -export([init_worker/3, handle_work/3]). -init_worker(_VnodeIndex, Noreply, _WorkerProps) -> - {ok, Noreply}. +init_worker(_VnodeIndex, DoReply, _WorkerProps) -> + {ok, DoReply}. -handle_work(Work, From, true = State) -> +handle_work(Work, _From, false = DoReply) -> Work(), - riak_core_vnode:reply(From, ok), - {noreply, State}; -handle_work(Work, _From, false = State) -> + {noreply, DoReply}; +handle_work(Work, _From, true = DoReply) -> Work(), - {reply, ok, State}. + {reply, ok, DoReply}. -ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + receive_result(N) -> receive {N, ok} when N rem 2 /= 0 -> @@ -48,38 +48,130 @@ receive_result(N) -> timeout end. -simple_worker_pool() -> - {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 3, 10, false, []), + +deadlock_test() -> + {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 1, 10, true, []), + + CoordinatorLoop = spawn_link(fun () -> + Worker1 = receive {worker_init, W} -> W end, + Root = receive {wait_for_worker, W2} -> W2 end, + Root ! continue, + + Root = receive {die_in_the_pool, W3} -> W3 end, + Worker1 ! continue, + receive {ready_to_crash} -> ok end, + + % let the worker actually crash + timer:sleep(50), + Root ! continue, + + receive finish_test -> ok end, + Root ! finish_test + end), + + riak_core_vnode_worker_pool:handle_work(Pool, + fun() -> + CoordinatorLoop ! {worker_init, self()}, + receive continue -> ok end + end, + {raw, 1, self()}), + + CoordinatorLoop ! {wait_for_worker, self()}, + receive continue -> ok end, + + riak_core_vnode_worker_pool:handle_work(Pool, + fun() -> CoordinatorLoop ! {ready_to_crash}, erlang:error(-1) end, + {raw, 1, self()}), + + % now we have to wait a bit + % because handle_work is a cast and there is no way to check when it's in the queue + timer:sleep(50), + + CoordinatorLoop ! {die_in_the_pool, self()}, + receive continue -> ok end, + + % this should not cause a deadlock + riak_core_vnode_worker_pool:handle_work(Pool, fun() -> CoordinatorLoop ! finish_test end, {raw, 1, self()}), + receive finish_test -> ok end, + + unlink(Pool), + ok = riak_core_vnode_worker_pool:stop(Pool, normal), + ok = wait_for_process_death(Pool). + + +simple_reply_worker_pool() -> + {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 3, 10, true, []), [ riak_core_vnode_worker_pool:handle_work(Pool, fun() -> - timer:sleep(100), + timer:sleep(10), 1/(N rem 2) end, {raw, N, self()}) || N <- lists:seq(1, 10)], - timer:sleep(1200), + timer:sleep(200), - %% make sure we got all the expected responses + %% make sure we got all replies [ ?assertEqual(true, receive_result(N)) || N <- lists:seq(1, 10)], unlink(Pool), - riak_core_vnode_worker_pool:stop(Pool, normal). + ok = riak_core_vnode_worker_pool:stop(Pool, normal), + ok = wait_for_process_death(Pool). simple_noreply_worker_pool() -> - {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 3, 10, true, []), + {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 3, 10, false, []), [ riak_core_vnode_worker_pool:handle_work(Pool, fun() -> - timer:sleep(100), + timer:sleep(10), 1/(N rem 2) end, {raw, N, self()}) || N <- lists:seq(1, 10)], - timer:sleep(1200), + timer:sleep(200), - %% make sure we got all the expected responses + %% make sure that the non-crashing work calls receive timeouts + [ ?assertEqual(timeout, receive_result(N)) || N <- lists:seq(1, 10), N rem 2 == 1], + [ ?assertEqual(true, receive_result(N)) || N <- lists:seq(1, 10), N rem 2 == 0], - [ ?assertEqual(true, receive_result(N)) || N <- lists:seq(1, 10)], unlink(Pool), - riak_core_vnode_worker_pool:stop(Pool, normal). + ok = riak_core_vnode_worker_pool:stop(Pool, normal), + ok = wait_for_process_death(Pool). + +shutdown_pool_empty_success() -> + {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 3, 10, false, []), + unlink(Pool), + ok = riak_core_vnode_worker_pool:shutdown_pool(Pool, 100), + ok = wait_for_process_death(Pool), + ok. + +shutdown_pool_worker_finish_success() -> + {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 3, 10, false, []), + riak_core_vnode_worker_pool:handle_work(Pool, fun() -> timer:sleep(50) end, {raw, 1, self()}), + unlink(Pool), + ok = riak_core_vnode_worker_pool:shutdown_pool(Pool, 100), + ok = wait_for_process_death(Pool), + ok. + +shutdown_pool_force_timeout() -> + {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 3, 10, false, []), + riak_core_vnode_worker_pool:handle_work(Pool, fun() -> timer:sleep(100) end, {raw, 1, self()}), + unlink(Pool), + {error, vnode_shutdown} = riak_core_vnode_worker_pool:shutdown_pool(Pool, 50), + ok = wait_for_process_death(Pool), + ok. + +shutdown_pool_duplicate_calls() -> + {ok, Pool} = riak_core_vnode_worker_pool:start_link(?MODULE, 3, 10, false, []), + riak_core_vnode_worker_pool:handle_work(Pool, fun() -> timer:sleep(100) end, {raw, 1, self()}), + unlink(Pool), + + %% request shutdown a bit later a second time + spawn_link(fun() -> + timer:sleep(30), + {error, vnode_shutdown} = riak_core_vnode_worker_pool:shutdown_pool(Pool, 50) + end), + + {error, vnode_shutdown} = riak_core_vnode_worker_pool:shutdown_pool(Pool, 50), + ok = wait_for_process_death(Pool), + ok. pool_test_() -> @@ -87,9 +179,22 @@ pool_test_() -> fun() -> error_logger:tty(false) end, fun(_) -> error_logger:tty(true) end, [ - fun simple_worker_pool/0, - fun simple_noreply_worker_pool/0 - ] + fun simple_reply_worker_pool/0, + fun simple_noreply_worker_pool/0, + fun shutdown_pool_empty_success/0, + fun shutdown_pool_worker_finish_success/0, + fun shutdown_pool_force_timeout/0, + fun shutdown_pool_duplicate_calls/0, + fun deadlock_test/0 + ] }. +wait_for_process_death(Pid) -> + wait_for_process_death(Pid, is_process_alive(Pid)). + +wait_for_process_death(Pid, true) -> + wait_for_process_death(Pid, is_process_alive(Pid)); +wait_for_process_death(_Pid, false) -> + ok. + -endif. diff --git a/tools.mk b/tools.mk deleted file mode 100644 index 72638c65d..000000000 --- a/tools.mk +++ /dev/null @@ -1,16 +0,0 @@ -REBAR ?= ./rebar3 - -.PHONY: test docs xref dialyzer \ - cleanplt - -test: compile - ${REBAR} eunit - -docs: - ${REBAR} doc - -xref: compile - ${REBAR} xref - -dialyzer: - ${REBAR} dialyzer