From 278a84e048f43543c6d7f7f664be5bb303c2fe99 Mon Sep 17 00:00:00 2001 From: Albert Schimpf <38429047+albsch@users.noreply.github.com> Date: Tue, 13 Jul 2021 16:11:59 +0000 Subject: [PATCH] Reducing riak_core (#94) * Updated gitignore. Removed old mercurial config. Removed travis for fork. Updated rebar3 version * Merged fork Kyorai/riak_core. Compile and test ok * Replaced calls to lager with logger * Missing occurences * Removed stuff on riak_ensemble * Removed rebar_erl_vsn plugin - Cleaned up usage of get_stacktrace - Removed different versions for hash and random numbers * Ported files from other fork * Fixed race condition in riak core security tests (#32) * Removed cuttlefish and placed default config in app.src * Updated maintainer * Removed riak_core_security * Added syntax_tools and compiler needed for mochiglobal. Refactor formatting. * Removed bg_manager, only used for AAE * Removed deprecated copy of old supervisor * Removed riak_kv code from riak_core * unused module * Moved eqc to own folder * Replaced bucket type calls to return only default bucket type. Tests pass, ready to remove sub-system * Removed bucket_type completely * Removed detached metadata subsystem * Purged eleveldb * Purged eleveldb config * Removed metadata supervisor * Fixed chash keyfun usage * Removed metadata exchange broadcast server * Added function clause for broadcast * Removed unused broadcast module * Removed unused dtrace module * Removed unused tracer module * Removed unused new_claim module * Removed net_ticktime capability * Removed unused module repair * Removed unused coverage_fsm for now * Removed new_claim test part from simulation * Moved claim sim test util to test folder * Removed coverage plan module for new (see coverage_fsm) * Removed unused tcp_mon module * Removed handoff status since clique was also removed * Removed calls to outside cluster_info modules, not part of riak_core * Replaced deprecated function call * Removed capabilities sub-system * removed delayed start * Removed riak_core_format * Removed unused throttle module * Removed unused riak_core_console_table module * Removed ssl and encryption library. Removed unused perftool and table owner module * Removed dead code including bucket types * Removed dead code in eqc * Removed unused claim_v1 and buggy claim_v3 * Minor refactoring * Removed sequential start of vnodes * Fixed bug for handoff refactoring * Removed unused env and removed resize conditions for riak_kv * Removed unused include files and riak_kv dialyzer special case * Cleaned up test setup files and logs. eunit now clean * Removed macros, towards statem refactor * Replaced module internal calls with api calls Co-authored-by: bieniusa --- .gitignore | 21 +- .hgignore | 5 - .hgtags | 9 - Makefile | 45 +- README.md | 11 +- docs/hashtree.md | 64 - docs/hashtree.png | Bin 17872 -> 0 bytes docs/node_worker_pool.md | 116 -- docs/partitioning.md | 138 ++ eqc/bg_manager_eqc.erl | 946 --------- eqc/btypes_eqc.erl | 395 ---- eqc/bucket_eqc_utils.erl | 47 + eqc/chash_eqc.erl | 2 - eqc/hashtree_eqc.erl | 644 ------- {src => eqc}/mock_vnode.erl | 0 eqc/new_cluster_membership_model_eqc.erl | 46 +- include/riak_core.hrl | 7 - include/riak_core_bg_manager.hrl | 50 - include/riak_core_dtrace.hrl | 15 - include/riak_core_handoff.hrl | 18 +- include/riak_core_metadata.hrl | 17 - include/riak_core_ring.hrl | 2 - include/riak_core_vnode.hrl | 19 +- priv/riak_core.schema | 272 --- rebar.config | 67 +- rebar.lock | 14 + rebar3 | Bin 944741 -> 985460 bytes src/app_helper.erl | 151 -- src/bloom.erl | 235 --- src/chash.erl | 272 --- src/chashbin.erl | 274 --- src/dvvset.erl | 460 ----- src/gen_nb_server.erl | 4 +- src/hashtree.erl | 1694 ----------------- src/hashtree_tree.erl | 571 ------ src/process_proxy.erl | 40 - src/riak_core.app.src | 119 +- src/riak_core.erl | 99 +- src/riak_core_apl.erl | 18 +- src/riak_core_app.erl | 85 +- src/riak_core_base64url.erl | 95 + src/riak_core_bg_manager.erl | 949 --------- src/riak_core_broadcast.erl | 624 ------ src/riak_core_broadcast_handler.erl | 43 - src/riak_core_bucket.erl | 76 +- src/riak_core_bucket_props.erl | 22 +- src/riak_core_bucket_type.erl | 316 --- src/riak_core_capability.erl | 670 ------- src/riak_core_cinfo_core.erl | 77 - src/riak_core_claim.erl | 867 +-------- src/riak_core_claim_util.erl | 9 +- src/riak_core_claimant.erl | 473 +---- src/riak_core_cli_registry.erl | 54 - src/riak_core_cluster_cli.erl | 331 ---- src/riak_core_console.erl | 1564 --------------- src/riak_core_console_table.erl | 165 -- src/riak_core_coverage_fsm.erl | 341 ---- src/riak_core_coverage_plan.erl | 873 --------- src/riak_core_dist_mon.erl | 106 -- src/riak_core_dtrace.erl | 260 --- src/riak_core_exo_monitor.erl | 82 - src/riak_core_format.erl | 108 -- src/riak_core_gen_server.erl | 4 +- src/riak_core_gossip.erl | 159 +- src/riak_core_handoff_cli.erl | 208 -- src/riak_core_handoff_listener.erl | 31 +- src/riak_core_handoff_manager.erl | 46 +- src/riak_core_handoff_receiver.erl | 93 +- src/riak_core_handoff_receiver_sup.erl | 11 +- src/riak_core_handoff_sender.erl | 482 ++--- src/riak_core_handoff_status.erl | 411 ---- src/riak_core_metadata.erl | 389 ---- src/riak_core_metadata_exchange_fsm.erl | 307 --- src/riak_core_metadata_hashtree.erl | 369 ---- src/riak_core_metadata_manager.erl | 687 ------- src/riak_core_metadata_object.erl | 149 -- src/riak_core_net_ticktime.erl | 156 -- src/riak_core_new_claim.erl | 39 - src/riak_core_node_watcher.erl | 42 +- src/riak_core_node_worker_pool.erl | 118 -- src/riak_core_node_worker_pool_sup.erl | 60 - src/riak_core_nodeid.erl | 31 - src/riak_core_pw_auth.erl | 50 - src/riak_core_rand.erl | 65 + src/riak_core_repair.erl | 150 -- src/riak_core_ring.erl | 525 ++--- src/riak_core_ring_handler.erl | 2 +- src/riak_core_ring_manager.erl | 158 +- src/riak_core_ring_util.erl | 41 + src/riak_core_security.erl | 1328 ------------- src/riak_core_send_msg.erl | 5 +- src/riak_core_ssl_util.erl | 366 ---- src/riak_core_stat.erl | 352 ---- src/riak_core_stat_cache.erl | 84 - src/riak_core_stat_calc_proc.erl | 182 -- src/riak_core_stat_calc_sup.erl | 51 - src/riak_core_stat_q.erl | 93 - src/riak_core_stat_sup.erl | 53 - src/riak_core_stat_xform.erl | 41 - src/riak_core_stats_sup.erl | 50 - src/riak_core_status.erl | 4 +- src/riak_core_sup.erl | 29 +- src/riak_core_sysmon_handler.erl | 246 --- src/riak_core_sysmon_minder.erl | 163 -- src/riak_core_table_owner.erl | 128 -- src/riak_core_tcp_mon.erl | 520 ----- src/riak_core_test_util.erl | 18 +- src/riak_core_throttle.erl | 400 ---- src/riak_core_tracer.erl | 217 --- src/riak_core_util.erl | 248 ++- src/riak_core_vnode.erl | 233 +-- src/riak_core_vnode_manager.erl | 74 +- src/riak_core_vnode_master.erl | 19 +- src/riak_core_vnode_proxy.erl | 43 +- src/riak_core_vnode_proxy_sup.erl | 4 +- src/riak_core_vnode_sup.erl | 4 + src/riak_core_vnode_worker.erl | 48 +- src/riak_core_vnode_worker_pool.erl | 264 ++- src/riak_core_worker_pool.erl | 380 ---- test/bg_manager_tests.erl | 165 -- test/bucket_fixup_test.erl | 171 -- test/claim_simulation.erl | 10 +- test/dummy_evt.erl | 62 + test/{ => eqc}/13node_12node_ring.eqc | Bin test/{ => eqc}/169_group_join.eqc | Bin test/{ => eqc}/648_unbalanced_singly.eqc | Bin {eqc => test/eqc}/bprops_eqc.erl | 0 test/eqc/bucket_eqc_utils.erl | 58 + ...claim-statem-leaving-nodes-still-claim.eqc | Bin test/{ => eqc}/claim_32_5_unbalanced.eqc | Bin {eqc => test/eqc}/node_watcher_qc.erl | 104 +- test/{ => eqc}/riak_core_claim_statem.erl | 0 {eqc => test/eqc}/vclock_qc.erl | 2 +- {eqc => test/eqc}/worker_pool_pulse.erl | 68 +- test/mock_vnode.erl | 196 ++ test/my_ring | 248 ++- test/riak_core_base64url_tests.erl | 42 + {src => test}/riak_core_claim_sim.erl | 30 +- test/riak_core_schema_tests.erl | 129 -- test/riak_core_security_tests.erl | 247 --- test/riak_core_throttle_tests.erl | 121 -- test/site1-cert.pem | 60 - test/site1-key.pem | 16 - test/site2-cert.pem | 60 - test/site2-key.pem | 16 - test/sync_command_test.erl | 31 +- test/worker_pool_test.erl | 60 +- tools.mk | 16 + 148 files changed, 2725 insertions(+), 24714 deletions(-) delete mode 100644 .hgignore delete mode 100644 .hgtags delete mode 100644 docs/hashtree.md delete mode 100644 docs/hashtree.png delete mode 100644 docs/node_worker_pool.md create mode 100644 docs/partitioning.md delete mode 100644 eqc/bg_manager_eqc.erl delete mode 100644 eqc/btypes_eqc.erl create mode 100644 eqc/bucket_eqc_utils.erl delete mode 100644 eqc/hashtree_eqc.erl rename {src => eqc}/mock_vnode.erl (100%) delete mode 100644 include/riak_core.hrl delete mode 100644 include/riak_core_bg_manager.hrl delete mode 100644 include/riak_core_dtrace.hrl delete mode 100644 include/riak_core_metadata.hrl delete mode 100644 include/riak_core_ring.hrl delete mode 100644 priv/riak_core.schema create mode 100644 rebar.lock delete mode 100644 src/app_helper.erl delete mode 100644 src/bloom.erl delete mode 100644 src/chash.erl delete mode 100644 src/chashbin.erl delete mode 100644 src/dvvset.erl delete mode 100644 src/hashtree.erl delete mode 100644 src/hashtree_tree.erl delete mode 100644 src/process_proxy.erl create mode 100644 src/riak_core_base64url.erl delete mode 100644 src/riak_core_bg_manager.erl delete mode 100644 src/riak_core_broadcast.erl delete mode 100644 src/riak_core_broadcast_handler.erl delete mode 100644 src/riak_core_bucket_type.erl delete mode 100644 src/riak_core_capability.erl delete mode 100644 src/riak_core_cinfo_core.erl delete mode 100644 src/riak_core_cli_registry.erl delete mode 100644 src/riak_core_cluster_cli.erl delete mode 100644 src/riak_core_console.erl delete mode 100644 src/riak_core_console_table.erl delete mode 100644 src/riak_core_coverage_fsm.erl delete mode 100644 src/riak_core_coverage_plan.erl delete mode 100644 src/riak_core_dist_mon.erl delete mode 100644 src/riak_core_dtrace.erl delete mode 100644 src/riak_core_exo_monitor.erl delete mode 100644 src/riak_core_format.erl delete mode 100644 src/riak_core_handoff_cli.erl delete mode 100644 src/riak_core_handoff_status.erl delete mode 100644 src/riak_core_metadata.erl delete mode 100644 src/riak_core_metadata_exchange_fsm.erl delete mode 100644 src/riak_core_metadata_hashtree.erl delete mode 100644 src/riak_core_metadata_manager.erl delete mode 100644 src/riak_core_metadata_object.erl delete mode 100644 src/riak_core_net_ticktime.erl delete mode 100644 src/riak_core_new_claim.erl delete mode 100644 src/riak_core_node_worker_pool.erl delete mode 100644 src/riak_core_node_worker_pool_sup.erl delete mode 100644 src/riak_core_nodeid.erl delete mode 100644 src/riak_core_pw_auth.erl create mode 100644 src/riak_core_rand.erl delete mode 100644 src/riak_core_repair.erl delete mode 100644 src/riak_core_security.erl delete mode 100644 src/riak_core_ssl_util.erl delete mode 100644 src/riak_core_stat.erl delete mode 100644 src/riak_core_stat_cache.erl delete mode 100644 src/riak_core_stat_calc_proc.erl delete mode 100644 src/riak_core_stat_calc_sup.erl delete mode 100644 src/riak_core_stat_q.erl delete mode 100644 src/riak_core_stat_sup.erl delete mode 100644 src/riak_core_stat_xform.erl delete mode 100644 src/riak_core_stats_sup.erl delete mode 100644 src/riak_core_sysmon_handler.erl delete mode 100644 src/riak_core_sysmon_minder.erl delete mode 100644 src/riak_core_table_owner.erl delete mode 100644 src/riak_core_tcp_mon.erl delete mode 100644 src/riak_core_throttle.erl delete mode 100644 src/riak_core_tracer.erl delete mode 100644 src/riak_core_worker_pool.erl delete mode 100644 test/bg_manager_tests.erl delete mode 100644 test/bucket_fixup_test.erl create mode 100644 test/dummy_evt.erl rename test/{ => eqc}/13node_12node_ring.eqc (100%) rename test/{ => eqc}/169_group_join.eqc (100%) rename test/{ => eqc}/648_unbalanced_singly.eqc (100%) rename {eqc => test/eqc}/bprops_eqc.erl (100%) create mode 100644 test/eqc/bucket_eqc_utils.erl rename test/{ => eqc}/claim-statem-leaving-nodes-still-claim.eqc (100%) rename test/{ => eqc}/claim_32_5_unbalanced.eqc (100%) rename {eqc => test/eqc}/node_watcher_qc.erl (89%) rename test/{ => eqc}/riak_core_claim_statem.erl (100%) rename {eqc => test/eqc}/vclock_qc.erl (99%) rename {eqc => test/eqc}/worker_pool_pulse.erl (68%) create mode 100644 test/mock_vnode.erl create mode 100644 test/riak_core_base64url_tests.erl rename {src => test}/riak_core_claim_sim.erl (94%) delete mode 100644 test/riak_core_schema_tests.erl delete mode 100644 test/riak_core_security_tests.erl delete mode 100644 test/riak_core_throttle_tests.erl delete mode 100644 test/site1-cert.pem delete mode 100644 test/site1-key.pem delete mode 100644 test/site2-cert.pem delete mode 100644 test/site2-key.pem create mode 100644 tools.mk diff --git a/.gitignore b/.gitignore index 522974903..8d0dc9b95 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .eunit/* +log deps/* priv/* ebin/* @@ -12,12 +13,16 @@ doc/* dialyzer_warnings dialyzer_unhandled_warnings .rebar -.rebar3 -_build -rebar.lock -.DS_Store -nonode@nohost -data/* -test/*.beam -log/* + +_build/ +data/ +nonode@nohost/ +ring_manager_eunit/ +sim.out +.eqc +compile_commands.json +rebar3.crashdump +.rebar3/ core_vnode_eqc.log +.idea +*.iml diff --git a/.hgignore b/.hgignore deleted file mode 100644 index adf4ceac4..000000000 --- a/.hgignore +++ /dev/null @@ -1,5 +0,0 @@ -syntax regex -.*~ -^ebin/.*.beam -include/riak_core_pb.hrl -^.eunit \ No newline at end of file diff --git a/.hgtags b/.hgtags deleted file mode 100644 index 366e5250d..000000000 --- a/.hgtags +++ /dev/null @@ -1,9 +0,0 @@ -1be0ce0200a7ac51cc3e0ca7ee9c244a539e409f riak_core-0.13.0rc1 -1e43d42258bcc02b5797ee73f02fae60bfeac67e riak_core-0.13.0rc2 -69b0f62c1f01b7a3c48d9379f6fe0e152331deee riak_core-0.13.0rc3 -82ebfed1e301bff550f9690de874ca1ffb55cd17 riak_core-0.13.0rc5 -1048210d6c679d3599b362b6df9a0002cf3c60a7 riak_core-0.13.0rc6 -c1b5e936c950aa4e29b4ffdc760e5a2651349018 riak_core-0.13.0rc7 -cb8c8703125a21e2eb3454236449ca957b26bacb riak_core-0.13.0rc8 -063f7cdf287721f4d160c0c99192667a653a237f riak_core-0.13.0rc9 -5b2683c697e6f322920fd276177c08764c722c98 riak_core-0.13.0 diff --git a/Makefile b/Makefile index 96875a9f2..90f2fb34c 100644 --- a/Makefile +++ b/Makefile @@ -1,27 +1,34 @@ -.PHONY: compile rel cover test dialyzer eqc -REBAR=./rebar3 +PULSE_TESTS = worker_pool_pulse -compile: - $(REBAR) compile +.PHONY: deps test -clean: - $(REBAR) clean +all: compile -cover: - $(REBAR) eunit --cover - $(REBAR) cover +compile: deps + ./rebar3 compile -test: compile - $(REBAR) eunit +clean: clean-test + ./rebar3 clean -dialyzer: - $(REBAR) dialyzer -xref: - $(REBAR) xref +distclean: clean -eqc: - $(REBAR) as test eqc --testing_budget 120 - $(REBAR) as eqc eunit +clean-test: + rm -rf t1000 + rm -rf t2000 + rm -rf t1 + rm -rf t2 + rm -rf ring_manager_eunit/test.ring + rm -rf ring_manager_eunit + rm -rf nonode@nohost + rm -rf log.nonode@nohost + rm -rf data.nonode@nohost + rm -rf data -check: test dialyzer xref +# 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) + +include tools.mk diff --git a/README.md b/README.md index e69e8e9ec..2b8ed89b8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,15 @@ +# What is riak_core_antidote? + +The 'antidote' version of riak core is a minimal and up-to-date version of riak core. + # Riak Core -[![Erlang CI Actions Status](https://github.com/basho/riak_core/workflows/Erlang%20CI/badge.svg)](https://github.com/basho/riak_core/actions) +![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) + +[![Build Status](https://travis-ci.com/albsch/riak_core.svg?branch=master)](https://travis-ci.com/albsch/riak_core.svg?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. diff --git a/docs/hashtree.md b/docs/hashtree.md deleted file mode 100644 index 49598630c..000000000 --- a/docs/hashtree.md +++ /dev/null @@ -1,64 +0,0 @@ -`hashtree.erl` implements a fixed-sized hash tree, avoiding any need -for rebalancing. The tree consists of a fixed number of on-disk -`segments` and a hash tree constructed over these `segments`. Each -level of the tree is grouped into buckets based on a fixed `tree -width`. Each hash at level `i` corresponds to the hash of a bucket of -hashes at level `i+1`. The following figure depicts a tree with 16 -segments and a tree-width of 4: - -![image](https://github.com/basho/riak_kv/raw/jdb-hashtree/docs/hashtree.png) - -To insert a new `(key, hash)` pair, the key is hashed and mapped to -one of the segments. The `(key, hash)` pair is then stored in the -appropriate segment, which is an ordered `(key, hash)` dictionary. The -given segment is then marked as dirty. Whenever `update_tree` is -called, the hash for each dirty segment is re-computed, the -appropriate leaf node in the hash tree updated, and the hash tree is -updated bottom-up as necessary. Only paths along which hashes have -been changed are re-computed. - -The current implementation uses LevelDB for the heavy lifting. Rather -than reading/writing the on-disk segments as a unit, `(key, hash)` -pairs are written to LevelDB as simple key-value pairs. The LevelDB -key written is the binary `<<$s, SegmentId:64/integer, -Key/binary>>`. Thus, inserting a new key-value hash is nothing more -than a single LevelDB write. Likewise, key-hash pairs for a segment -are laided on sequentially on-disk based on key sorting. An in-memory -bitvector is used to track dirty segments, although a `gb_sets` was -formerly used. - -When updating the segment hashes, a LevelDB iterator is used to access -the segment keys in-order. The iterator seeks to the beginning of the -segment and then iterators through all of the key-hash pairs. As an -optimization, the iteration process is designed to read in multiple -segments when possible. For example, if the list of dirty segments was -`[1, 2, 3, 5, 6, 10]`, the code will seek an iterator to the beginning -of segment 1, iterator through all of its keys, compute the -appropriate segment 1 hash, then continue to traverse through segment -2 and segment 3's keys, updating those hashes as well. After segment -3, a new iterator will be created to seek to the beginning of segment -5, and handle both 5, and 6; and then a final iterator used to access -segment 10. This design works very well when constructing a new tree -from scratch. There's a phase of inserting a bunch of key-hash pairs -(all writes), followed by an in-order traversal of the LevelDB -database (all reads). - -Trees are compared using standard hash tree approach, comparing the -hash at each level, and recursing to the next level down when -different. After reaching the leaf nodes, any differing hashes results -in a key exchange of the keys in the associated differing segments. - -By default, the hash tree itself is entirely in-memory. However, the -code provides a `MEM_LEVEL` paramemter that specifics that levels -greater than the parameter should be stored on-disk instead. These -buckets are simply stored on disk in the same LevelDB structure as -`{$b, Level, Bucket} -> orddict(Key, Hash)}` objects. - -The default settings use `1024*1024` segments with a tree width of -`1024`. Thus, the resulting tree is only 3 levels deep. And there -are only `1+1024+1024*1024` hashs stored in memory -- so, a few -MB per hash tree. Given `1024*1024` on-disk segments, and assuming -the code uniformly hashes keys to each segment, you end up with ~1000 -keys per segment with a 1 billion key hash tree. Thus, a single key -difference would require 3 hash exchanges and a key exchange of -1000 keys to determine the differing key. diff --git a/docs/hashtree.png b/docs/hashtree.png deleted file mode 100644 index c1f19c0abf2a8a5483163d3dbfcec428e49365ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17872 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 - []; - single -> - NWPS = app_helper:get_env(riak_kv, node_worker_pool_size), - [{node_worker_pool, {riak_kv_worker, NWPS, [], [], node_worker_pool}}]; - dscp -> - AF1 = app_helper:get_env(riak_kv, af1_worker_pool_size), - AF2 = app_helper:get_env(riak_kv, af2_worker_pool_size), - AF3 = app_helper:get_env(riak_kv, af3_worker_pool_size), - AF4 = app_helper:get_env(riak_kv, af4_worker_pool_size), - BE = app_helper:get_env(riak_kv, be_worker_pool_size), - [{dscp_worker_pool, {riak_kv_worker, AF1, [], [], af1_pool}}, - {dscp_worker_pool, {riak_kv_worker, AF2, [], [], af2_pool}}, - {dscp_worker_pool, {riak_kv_worker, AF3, [], [], af3_pool}}, - {dscp_worker_pool, {riak_kv_worker, AF4, [], [], af4_pool}}, - {dscp_worker_pool, {riak_kv_worker, BE, [], [], be_pool}}] - end, - -.... - - riak_core:register(riak_kv, [ - - .... - - ] - - ++ WorkerPools), -``` - -The implementation of both the `riak_core_node_worker_pool` and the `riak_core_vnode_worker_pool` is now based on a common behaviour - `riak_core_worker_pool`: - -https://github.com/martinsumner/riak_core/blob/mas-2.2.5-dscpworkerpool/src/riak_core_worker_pool.erl - -The primary difference in implementation is that `riak_core_node_worker_pool` must trap_exit on initialisation, as there is no closing vnode process to call shutdown_pool and neatly terminate the pool (with a wait for work to finish). - -A new function `queue_work/4` is added to the `riak_core_vnode` to prompt work to be queued for a node_worker_pool: - -https://github.com/martinsumner/riak_core/blob/mas-2.2.5-dscpworkerpool/src/riak_core_vnode.erl#L1092-L1105 - -This is triggered by a response to Mod:handle_coverage/4 or Mod:handle_command/3 of: - -``{PoolName, Work, From, NewModState}`` - -https://github.com/martinsumner/riak_core/blob/mas-2.2.5-dscpworkerpool/src/riak_core_vnode.erl#L378-L386 - -If there is need to call for work to be queued directly from the application (e.g. using `riak_core_vnode:queue_work/4`), then the application should be aware of the vnode pool pid() to be used by `queue_work/4` as a fallback. To receive this information onto ModState, the application may provide a `Mod:add_vnode_pool/2` function, which if present will be called by riak_core_vnode after the pool has been initialised: - -https://github.com/martinsumner/riak_core/blob/mas-2.2.5-dscpworkerpool/src/riak_core_vnode.erl#L245-L254 - - -## Snapshots Pre-Fold - -Within `riak_kv` fold functions returned from backends for performing queries which were directed towards a worker_pool (such as 2i queries), were passed to the worker without a snapshot being taken. When the worker in the pool ran the `Fold()`, at that point a snapshot would be taken. - -This model works if there is unlimited capacity in the vnode worker pools, as it is likely that the fold functions across a coverage plan will be called reasonably close together, so as to present a roughly cluster-wide point-in-time view of the query. However, with a constrained pool, a subset of the folds in the coverage plan may be delayed behind other work. Therefore, it is preferable for async work which intends to use node_worker_pools to have had the snapshot taken prior to the fold function being returned from the vnode backend. - -This is implemented within leveled as the SnapPreFold boolean which can be passed into query requests. When SnapPrefold is `true`, the snapshot will be taken at the point the backend receives the request, and when the fold is eventually called by the worker in the pool, it will be based on that snapshot. So variation in worker availability across node will not impact the "consistency" of the query results - the results will be based on a loosely correlated point in time (subject to race conditions to the head of the vnode message queue). - -Some work has been done to implement prefold snapping in eleveldb, mainly by splitting up the existing fold API into two stages: - -https://github.com/martinsumner/riak_kv/blob/mas-2.2.5-clusteraae/src/riak_kv_eleveldb_backend.erl#L388-L430. - -To implement snap_prefold in Bitcask would probably require generating file links at the point the fold is closed, but no work has been done on that backend at present. diff --git a/docs/partitioning.md b/docs/partitioning.md new file mode 100644 index 000000000..cdd649a0e --- /dev/null +++ b/docs/partitioning.md @@ -0,0 +1,138 @@ +# Riak's Partitioning Scheme + +## Introduction + +When diving into the depths of Riak Core into topics such as handoff and coverage plans, it is important to understand the differences between partitions and vnodes, and how objects are placed around the cluster. + +This document is far from a comprehensive look at those topics, but it provides a starting point for further exploration through examples of inspecting a running Riak instance. + +## Partitioning Logic Illustrated + +Let's say for the sake of argument that a key we store in Riak maps to a hash value just above 0. Where does it get stored and how do we represent that in our coverage plans? + +Our vnodes are uniquely identified via a hash value which is a multiple of the partition size in this cluster. With a ring size of 8, our vnode identifiers will be: + +* 0 +* 182687704666362864775460604089535377456991567872 +* 365375409332725729550921208179070754913983135744 +* 548063113999088594326381812268606132370974703616 +* 730750818665451459101842416358141509827966271488 +* 913438523331814323877303020447676887284957839360 +* 1096126227998177188652763624537212264741949407232 +* 1278813932664540053428224228626747642198940975104 + +For sanity's sake, I'll simply refer to those hash values by their +index along the range, so 0-7. Erlang's `bsr` operator can be used to collapse these values down to the indexes: + +```erlang +> 1278813932664540053428224228626747642198940975104 bsr 157. +7 +``` + +Why 157? Because we're in a hash space size of 2^160, and with a ring size of 8 (2^3) we can throw away 157 bits (160 - 3) to isolate the key space of interest. + +Now let's look at where a Riak object lands. If we want to stash an object with a key of "key" in the default bucket type, bucket name "foo", we can see that the object hashes between indexes 4 and 5: + +```erlang +> {ok, CB} = riak_core_ring_manager:get_chash_bin(). +{ok,{chashbin,8, + <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,32,0,...>>, + {'dev1@127.0.0.1'}}} + +> BKey = {{<<"default">>, <<"foo">>}, <<"key">>}. +{{<<"default">>,<<"foo">>},<<"key">>} + +> DocIdx = riak_core_util:chash_key(BKey, BucketProps). +<<146,24,183,162,222,0,26,238,114,48,26,19,200,76,183,84, + 157,220,142,10>> + + +> binary:decode_unsigned(DocIdx). +834063867394203420109146416465757269547655400970 + +> binary:decode_unsigned(DocIdx) bsr 157. +4 + +> chashbin:responsible_index(DocIdx, CB). +913438523331814323877303020447676887284957839360 + +> chashbin:responsible_index(DocIdx, CB) bsr 157. +5 +``` + +Thus, an object whose bucket + key map to any key space will be mapped to the partition (and vnode) responsible for the **next** key space. + +## Preference Lists + +Once we've identified the first vnode that should store that value, we can look at the preflist (as determined by the `n_val`) to determine the other vnodes. Assuming the cluster is fully functional, this will be the next two primary vnodes. + +```erlang +> riak_core_apl:get_primary_apl(DocIdx, 3, riak_kv). +[{{913438523331814323877303020447676887284957839360, + 'dev1@127.0.0.1'}, + primary}, + {{1096126227998177188652763624537212264741949407232, + 'dev1@127.0.0.1'}, + primary}, + {{1278813932664540053428224228626747642198940975104, + 'dev1@127.0.0.1'}, + primary}] +``` + +So the vnodes with index values 5, 6, and 7 will store a key that maps to keyspace index 4 if `n_val=3`. + +If we assume that all values are stored with 3 copies, the map of vnode index value to keyspace index values looks like this: + +* 0 -> [5, 6, 7] +* 1 -> [6, 7, 0] +* 2 -> [7, 0, 1] +* 3 -> [0, 1, 2] +* 4 -> [1, 2, 3] +* 5 -> [2, 3, 4] +* 6 -> [3, 4, 5] +* 7 -> [4, 5, 6] + +## Coverage Plans + +Coverage plans are represented differently. + +Coverage plans are represented internally as a list of vnode identifiers and a list of filters. + +The filters are vital because there's almost always going to be overlap between vnodes in a full coverage plan. + +For example, `riak_core_coverage_plan:find_coverage/7` for our simple cluster of ring size 8 might give us this (intermediate) coverage plan: + +`[{1,[0,6,7]},{3,[1,2]},{6,[3,4,5]}]` + +(Note that this function is kind enough to give us index values instead of hash values. Unfortunate more of the code doesn't use this convention.) + +This data structure says that to scan the full hash range we need to talk to vnodes 1, 3, and 6. Since 1 and 6 give us six out of our eight key spaces, we only need two out of the three key ranges stored in vnode 3. + +That structure gets mapped to this "real" coverage plan: + +```erlang +{[{182687704666362864775460604089535377456991567872, + 'dev1@127.0.0.1'}, + {548063113999088594326381812268606132370974703616, + 'dev1@127.0.0.1'}, + {1096126227998177188652763624537212264741949407232, + 'dev1@127.0.0.1'}], + [{548063113999088594326381812268606132370974703616, + [365375409332725729550921208179070754913983135744, + 548063113999088594326381812268606132370974703616]}]} +``` + +The last component of the coverage plan is the filter list; we drop the filters on vnodes 1 and 6, since effectively they're not filtering anything at all, but we still need vnode 3 to be filtered. + +Note something interesting, however. If we take the filters from that coverage plan and turn them back into index values for easier comparison: + +```erlang +> [X bsr 157 || X <- [365375409332725729550921208179070754913983135744, 548063113999088594326381812268606132370974703616]]. +[2,3] +``` + +Compare that to the structure we saw earlier: `[{1,[0,6,7]},{3,[1,2]},{6,[3,4,5]}]` + +How did `[1,2]` become `[2,3]`? + +This off-by-one situation arises traces back to the fact that an object is stored in the key space above the one to which it maps. diff --git a/eqc/bg_manager_eqc.erl b/eqc/bg_manager_eqc.erl deleted file mode 100644 index e9a905cd4..000000000 --- a/eqc/bg_manager_eqc.erl +++ /dev/null @@ -1,946 +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. -%% -%% QuickCheck may fail for both properties in this module -%% The commands are not atomic and we cannot faithfully model -%% the side effect of locking and freeing resources when the -%% implementation leaves that to a background side-effect of -%% the monitor. -%% A better way to do this is to control the monitor as well -%% by mocking the call to release_resource. -%% That however, would require a eqc_compnent specification -%% instead of the current eqc_statem. - --module(bg_manager_eqc). - --ifdef(EQC). - --include("include/riak_core_bg_manager.hrl"). --include_lib("eqc/include/eqc.hrl"). --include_lib("eqc/include/eqc_statem.hrl"). --include_lib("eunit/include/eunit.hrl"). --define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). - --compile([export_all, nowarn_export_all]). - --type bg_eqc_type() :: atom(). --type bg_eqc_limit() :: non_neg_integer(). - --record(state,{ - %% whether or not the bgmgr is running - alive :: boolean(), - %% whether or not the global bypass switch is engaged - bypassed :: boolean(), - %% whether or not the global enable switch is engaged - enabled :: boolean(), - %% processes started by the test and the processes state - procs :: [{pid(), running | not_running}], - %% resources that are disabled are on the list - disabled :: [{bg_eqc_type()}], - %% concurrency limits for lock types - limits :: [{bg_eqc_type(), bg_eqc_limit()}], - %% max counts per "period" for token types - counts :: [{bg_eqc_type(), bg_eqc_limit()}], - %% locks held (or once held then released) for each lock type - %% and their state - locks :: [{bg_eqc_type(), [{reference(), pid(), [], held | released}]}], - %% number of tokens taken by type - tokens :: [{bg_eqc_type(), non_neg_integer()}], - %% commands excluded from test - exclude :: [atom()] - }). - -%% @doc Returns the state in which each test case starts. (Unless a different -%% initial state is supplied explicitly to, e.g. commands/2.) -initial_state() -> - #state{ - alive = true, - bypassed = false, - enabled = true, - disabled = [], - procs = [], - limits = [], - counts = [], - locks = [], - tokens = [], - exclude = [] - }. - -%% ------ Grouped operator: set_concurrency_limit -%% @doc set_concurrency_limit_command - Command generator -set_concurrency_limit_args(_S) -> - %% TODO: change Kill (3rd arg, to boolean gen) - [lock_type(), lock_limit(), false]. - -%% @doc set_concurrency_limit precondition -set_concurrency_limit_pre(S) -> - is_alive(S). - -%% @doc set_concurreny_limit command -set_concurrency_limit(Type, Limit, false) -> - riak_core_bg_manager:set_concurrency_limit(Type, Limit). - -%% @doc state transition for set_concurrency_limit command -set_concurrency_limit_next(S=#state{limits=Limits}, _Value, [Type,Limit,_Kill]) -> - S#state{ limits = lists:keystore(Type, 1, Limits, {Type, Limit}) }. - -%% @doc set_concurrency_limit_post - Postcondition for set_concurrency_limit -set_concurrency_limit_post(S, [Type, _Limit, _Kill], Res) -> - %% check returned value is equal to value we have in state prior to this call - %% since returned value is promised to be previous one that was set - eq(limit(Type, S), Res). - -%% ------ Grouped operator: concurrency_limit -%% @doc concurrency_limit command arguments generator -concurrency_limit_args(_S) -> - [lock_type()]. - -%% @doc concurrency_limit precondition -concurrency_limit_pre(S) -> - is_alive(S). - -%% @doc concurrency limit command -concurrency_limit(Type) -> - riak_core_bg_manager:concurrency_limit(Type). - -%% @doc Postcondition for concurrency_limit -concurrency_limit_post(S, [Type], Limit) -> - ExpectedLimit = limit(Type, {unregistered, Type}, S), - eq(ExpectedLimit, Limit). - -%% ------ Grouped operator: concurrency_limit_reached -%% @doc concurrency_limit_reached command argument generator -concurrency_limit_reached_args(_S) -> - [lock_type()]. - -%% @doc concurrency_limit_reached precondition -concurrency_limit_reached_pre(S) -> - is_alive(S). - -%% @doc concurrency_limit_reached command -concurrency_limit_reached(Type) -> - riak_core_bg_manager:concurrency_limit_reached(Type). - -%% @doc concurrency_limit_reached_post - Postcondition for concurrency_limit_reached -concurrency_limit_reached_post(S, [Type], {unregistered, Type}) -> - eq(limit(Type, undefined, S), undefined); -concurrency_limit_reached_post(S, [Type], Res) -> - Limit = limit(Type, S), - ExistingCount = length(held_locks(Type, S)), - eq(ExistingCount >= Limit, Res). - - -%% ------ Grouped operator: get_lock -%% @doc argument generator for get_lock command -get_lock_args(S) -> - %% TODO: test getting locks on behalf of calling process instead of other process - %% TODO: test trying to get lock on behalf of killed process? - [lock_type(), oneof(running_procs(S)), []]. - -%% @doc Precondition for generation of get_lock command -get_lock_pre(S) -> - %% need some running procs to get locks on behalf of - RunningProcs = length(running_procs(S)) > 0, - RunningProcs andalso is_alive(S). - -%% @doc Precondition for generation of get_lock command -get_lock_pre(S, [Type, Pid, _Meta]) -> - %% must call set_concurrency_limit at least once - %% TODO: we can probably remove and test this restriction instead - is_integer(limit(Type, unregistered, S)) andalso - lists:member(Pid, running_procs(S)). - -get_lock(Type, Pid, Meta) -> - case riak_core_bg_manager:get_lock(Type, Pid, Meta) of - {ok, Ref} -> Ref; - Other -> Other - end. - - -%% @doc State transition for get_lock command -%% `Res' is either the lock reference or max_concurrency -get_lock_next(S=#state{enabled=Enabled, bypassed=Bypassed}, Res, [Type, Pid, Meta]) -> - TypeLimit = limit(Type, S), - Held = held_locks(Type, S), - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case (ReallyEnabled andalso length(Held) < TypeLimit) orelse Bypassed of - %% got lock - true -> add_held_lock(Type, Res, Pid, Meta, S); - %% failed to get lock - false -> S - end. - -%% @doc Postcondition for get_lock -%% We expect to get max_concurrency if globally disabled or we hit the limit. -%% We expect to get ok if bypassed or under the limit. -get_lock_post(#state{bypassed=true}, [_Type, _Pid, _Meta], max_concurrency) -> - 'max_concurrency returned when bypassed'; -get_lock_post(S=#state{enabled=Enabled}, [Type, _Pid, _Meta], max_concurrency) -> - %% Since S reflects the state before we check that it - %% was already at the limit. - Limit = limit(Type, S), - ExistingCount = length(held_locks(Type, S)), - %% check >= because we may have lowered limit *without* - %% forcing some processes to release their locks by killing them - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case (not ReallyEnabled) orelse ExistingCount >= Limit of - true -> true; - false -> - %% hack to get more informative post-cond failure (like eq) - {ExistingCount, 'not >=', Limit} - end; -get_lock_post(S=#state{bypassed=Bypassed, enabled=Enabled}, [Type, _Pid, _Meta], _LockRef) -> - %% Since S reflects the state before we check that it - %% was not already at the limit. - Limit = limit(Type, S), - ExistingCount = length(held_locks(Type, S)), - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case (ReallyEnabled andalso ExistingCount < Limit) orelse Bypassed of - true -> true; - false -> - %% hack to get more informative post-cond failure (like eq) - {ExistingCount, 'not <', Limit} - end. - -%% ------ Grouped operator: start_process -%% @doc args generator for start_process -start_process_args(_S) -> - []. - -%% @doc start_process_pre - Precondition for generation -start_process_pre(S) -> - %% limit the number of running processes in the test, we should need an unbounded amount - %% TODO: move "20" to define - length(running_procs(S)) < 5. - -start_process() -> - spawn(fun() -> - receive die -> ok - %% this protects us against leaking too many processes when running - %% prop_bgmgr_parallel(), which doesn't clean up the processes it starts - after 360000 -> timeout - end - end). - -%% @doc state transition for start_process command -start_process_next(S=#state{procs=Procs}, Value, []) -> - S#state{ procs = lists:keystore(Value, 1, Procs, {Value, running}) }. - -%% @doc postcondition not needed, but in particular should not check -%% is_process_alive(Pid), since in parallel commands we re-run without side-effects -start_process_post(_S, [], _Pid)-> - true. - -%% ------ Grouped operator: stop_process -%% @doc stop_process_command - Argument generator -stop_process_args(S) -> - [oneof(running_procs(S))]. - -%% @doc stop_process_pre - Precondition for generation -stop_process_pre(S) -> - %% need some running procs in order to kill one. - length(running_procs(S)) > 0. - -%% @doc stop_process_pre - Precondition for stop_process -stop_process_pre(S, [Pid]) -> - %% only interesting to kill processes that hold locks - lists:keyfind(Pid, 2, all_locks(S)) /= false. - -%% @doc stop_process command -stop_process(Pid) -> - Pid ! die, - Res = wait_for_pid(Pid), - %% while not part of the test, this provides extra insurance that the - %% background manager receives the monitor message for the failed pid - %% (waiting for the test process to receive its monitor message is not - %% enough). This relies on local erlang message semantics a bit and may - %% not be bullet proof. The catch handles the case where the bg manager - %% has been crashed by the test. - catch riak_core_bg_manager:enabled(), - Res. - -%% @doc state transition for stop_process command -stop_process_next(S=#state{procs=Procs}, _Value, [Pid]) -> - %% mark process as no longer running and release all locks held by the process - UpdatedProcs = lists:keystore(Pid, 1, Procs, {Pid, not_running}), - release_locks(Pid, S#state{procs = UpdatedProcs}). - - -%% @doc postcondition for stop_process -stop_process_post(_S, [_Pid], ok) -> - true; -stop_process_post(_S, [Pid], {error, didnotexit}) -> - {error, {didnotexit, Pid}}. - -%% ------ Grouped operator: set_token_rate -%% @doc set_token_rate arguments generator -set_token_rate_args(_S) -> - %% NOTE: change token_type() to lock_type() to provoke failure due to registration of lock/token under same name - %% (waiting for fix in bg mgr). - [token_type(), token_count()]. - -%% @doc set_token_rate precondition -set_token_rate_pre(S) -> - is_alive(S). - -%% @doc set_token_rate state transition -%% Note that set_token_rate takes a rate, which is {Period, Count}, -%% but this test generates it's own refill messages, so rate is not modeled. -set_token_rate_next(S=#state{counts=Counts}, _Value, [Type, Count]) -> - S#state{ counts = lists:keystore(Type, 1, Counts, {Type, Count}) }. - -%% @doc set_token_rate command -set_token_rate(Type, Count) -> - %% we refill tokens as a command in the model so we use - %% token rate to give us the biggest refill period we can get. - %% no test should run longer than that or we have a problem. - riak_core_bg_manager:set_token_rate(Type, mk_token_rate(Count)). - -%% @doc Postcondition for set_token_rate -set_token_rate_post(S, [Type, _Count], Res) -> - %% check returned value is equal to value we have in state prior to this call - %% since returned value is promised to be previous one that was set - eq(Res, mk_token_rate(max_num_tokens(Type, undefined, S))). - -%% ------ Grouped operator: token_rate -%% @doc token_rate_command -token_rate_args(_S) -> - [token_type()]. - -%% @doc token_rate precondition -token_rate_pre(S) -> - is_alive(S). - -%% @doc token_rate command -token_rate(Type) -> - riak_core_bg_manager:token_rate(Type). - -%% @doc Postcondition for token_rate -token_rate_post(S, [Type], Res) -> - ExpectedRate = mk_token_rate(max_num_tokens(Type, {unregistered, Type}, S)), - eq(ExpectedRate, Res). - -%% ------ Grouped operator: get_token using Pid -%% @doc get_token args generator -get_token_pre(S) -> - length(running_procs(S)) > 0. - -get_token_args(S) -> - [token_type(), oneof(running_procs(S))]. - -%% @doc Precondition for get_token -get_token_pre(S, [Type, Pid]) -> - %% must call set_token_rate at least once - %% TODO: we can probably remove and test this restriction instead - is_integer(max_num_tokens(Type, unregistered, S)) andalso is_alive(S) - andalso lists:member(Pid, running_procs(S)). - -%% @doc get_token state transition -get_token_next(S=#state{bypassed=Bypassed, enabled=Enabled}, _Value, [Type, _Pid]) -> - CurCount = num_tokens(Type, S), - %% NOTE: this assumes the precondition requires we call set_token_rate at least once - %% in case we don't we treat the max as 0 - Max = max_num_tokens(Type, unregistered, S), - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case ((ReallyEnabled andalso CurCount < Max) orelse Bypassed) of - true -> increment_token_count(Type, S); - false -> S - end. - -get_token(Type, Pid) -> - riak_core_bg_manager:get_token(Type, Pid). - -%% @doc Postcondition for get_token -%% We expect to get max_concurrency if globally disabled or we hit the limit. -%% We expect to get ok if bypassed or under the limit. -get_token_post(#state{bypassed=true}, [_Type, _Pid], max_concurrency) -> - 'max_concurrency returned while bypassed'; -get_token_post(S=#state{enabled=Enabled}, [Type, _Pid], max_concurrency) -> - CurCount = num_tokens(Type, S), - %% NOTE: this assumes the precondition requires we call set_token_rate at least once - %% in case we don't we treat the max as 0 - Max = max_num_tokens(Type, unregistered, S), - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case (not ReallyEnabled) orelse CurCount >= Max of - true -> true; - false -> - %% hack to get more info out of postcond failure - {CurCount, 'not >=', Max} - end; -get_token_post(S=#state{bypassed=Bypassed, enabled=Enabled}, [Type, _Pid], ok) -> - CurCount = num_tokens(Type, S), - %% NOTE: this assumes the precondition requires we call set_token_rate at least once - %% in case we don't we treat the max as 0 - Max = max_num_tokens(Type, unregistered, S), - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case (ReallyEnabled andalso CurCount < Max) orelse Bypassed of - true -> true; - false -> - {CurCount, 'not <', Max} - end. - -%% ------ Grouped operator: get_token without Pid -%% @doc get_token args generator -get_Token_args(_S) -> - [token_type()]. - -%% @doc Precondition for get_token -get_Token_pre(S, [Type]) -> - %% must call set_token_rate at least once - %% TODO: we can probably remove and test this restriction instead - is_integer(max_num_tokens(Type, unregistered, S)) andalso is_alive(S). - -%% @doc get_token state transition -get_Token_next(S=#state{bypassed=Bypassed, enabled=Enabled}, _Value, [Type]) -> - CurCount = num_tokens(Type, S), - %% NOTE: this assumes the precondition requires we call set_token_rate at least once - %% in case we don't we treat the max as 0 - Max = max_num_tokens(Type, unregistered, S), - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case ((ReallyEnabled andalso CurCount < Max) orelse Bypassed) of - true -> increment_token_count(Type, S); - false -> S - end. - -get_Token(Type) -> - riak_core_bg_manager:get_token(Type). - -%% @doc Postcondition for get_token -%% We expect to get max_concurrency if globally disabled or we hit the limit. -%% We expect to get ok if bypassed or under the limit. -get_Token_post(#state{bypassed=true}, [_Type], max_concurrency) -> - 'max_concurrency returned while bypassed'; -get_Token_post(S=#state{enabled=Enabled}, [Type], max_concurrency) -> - CurCount = num_tokens(Type, S), - %% NOTE: this assumes the precondition requires we call set_token_rate at least once - %% in case we don't we treat the max as 0 - Max = max_num_tokens(Type, unregistered, S), - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case (not ReallyEnabled) orelse CurCount >= Max of - true -> true; - false -> - %% hack to get more info out of postcond failure - {CurCount, 'not >=', Max} - end; -get_Token_post(S=#state{bypassed=Bypassed, enabled=Enabled}, [Type], ok) -> - CurCount = num_tokens(Type, S), - %% NOTE: this assumes the precondition requires we call set_token_rate at least once - %% in case we don't we treat the max as 0 - Max = max_num_tokens(Type, unregistered, S), - ReallyEnabled = Enabled andalso resource_enabled(Type, S), - case (ReallyEnabled andalso CurCount < Max) orelse Bypassed of - true -> true; - false -> - {CurCount, 'not <', Max} - end. - -%% ------ Grouped operator: refill_tokens -%% @doc refill_tokens args generator -refill_tokens_args(_S) -> - [token_type()]. - -%% @doc refill_tokens precondition -refill_tokens_pre(S, [Type]) -> - %% only refill tokens if we have registered type (called set_token_rate at least once) - is_integer(max_num_tokens(Type, unregistered, S)) andalso is_alive(S). - -%% @doc refill_tokens state transition -refill_tokens_next(S, _Value, [Type]) -> - reset_token_count(Type, S). - -refill_tokens(Type) -> - riak_core_bg_manager ! {refill_tokens, Type}, - %% TODO: find way to get rid of this timer sleep - timer:sleep(100). - -%% ------ Grouped operator: crash -%% @doc crash args generator -crash_args(_S) -> - []. - -%% @doc precondition for crash command -crash_pre(#state{alive=Alive}) -> - %% only crash if actually running - Alive. - -%% @doc state transition for crash command -crash_next(S, _Value, _Args) -> - S#state{ alive = false }. - -%% @doc crash command -crash() -> - stop_pid(whereis(riak_core_bg_manager)). - -%% @doc crash command post condition -crash_post(_S, _Args, _Res) -> - %% TODO: anything we want to validate here? - true. - -%% ------ Grouped operator: revive -%% @doc revive arguments generator -revive_args(_S) -> - []. - -%% @doc revive precondition -revive_pre(#state{alive=Alive}) -> - %% only revive if we are in a crashed state - not Alive. - -%% @doc revive_next - Next state function -revive_next(S, _Value, _Args) -> - S#state{ alive = true }. - -%% @doc revive command -revive() -> - {ok, _BgMgr} = riak_core_bg_manager:start(). - -%% @doc revive_post - Postcondition for revive -revive_post(_S, _Args, _Res) -> - %% TODO: what to validate here, if anything? - true. - -%% ------ Grouped operator: all_resources query -%% @doc all_resources arguments generator -all_resources_args(_S) -> - [oneof([all, lock_type(), token_type()])]. - -%% @doc all_resources precondition -all_resources_pre(S) -> - is_alive(S). - -%% @doc all_resources next state function -all_resources_next(S, _Value, _Args) -> - S. - -%% @doc all_resources command -all_resources(Resource) -> - riak_core_bg_manager:all_resources(Resource). - -%% @doc all_resources postcondition -all_resources_post(State, [Resource], Result) -> - %% only one of these will have non-zero result unless Resource = all - NumLocks = length(held_locks(Resource, State)), - NumTokens = num_tokens_taken(Resource, State), - %% TODO: could validate record entries in addition to correct counts - eq(length(Result), NumLocks+NumTokens). - -%% ------ Grouped operator: bypass -%% @doc bypass arguments generator -bypass_args(_S) -> - [oneof([true, false])]. - -%% @doc bypass precondition -bypass_pre(S) -> - is_alive(S). - -%% @doc bypass next state function -bypass_next(S, _Value, [Switch]) -> - S#state{bypassed=Switch}. - -%% @doc bypass command -%% This command is not atomic and therefore cannot be -%% included in a parallel commands test -%% Removing the synchronising second call won't -%% work, because then interference with other commands will -%% happen (even) in sequential testing. -bypass(Switch) -> - Res = riak_core_bg_manager:bypass(Switch), %% expect 'ok' - Value = riak_core_bg_manager:bypassed(), %% expect eq(Value, Switch) - {Res, Value}. - -%% @doc bypass postcondition -bypass_post(_S, [Switch], Result) -> - eq(Result, {ok, Switch}). - -%% ------ Grouped operator: bypassed -%% @doc bypass arguments generator -bypassed_args(_S) -> - []. - -%% @doc eanble precondition -bypassed_pre(S) -> - is_alive(S). - -%% @doc bypassed next state function -bypassed_next(S, _Value, []) -> - S. - -%% @doc bypassed command -bypassed() -> - riak_core_bg_manager:bypassed(). - -%% @doc bypassed postcondition -bypassed_post(#state{bypassed=Bypassed}, _Value, Result) -> - eq(Result, Bypassed). - -%% ------ Grouped operator: enable -%% @doc bypass arguments generator -enable_args(_S) -> - [oneof([[], token_type(), lock_type()])]. - -%% @doc enable precondition -%% global enable -enable_pre(S) -> - is_alive(S). - -%% per resource enable -enable_pre(S,[Type]) -> - is_integer(max_num_tokens(Type, unregistered, S)) andalso is_alive(S). - -%% @doc enable next state function -%% global enable -enable_next(S, _Value, []) -> - S#state{enabled=true}; -%% per resource enable -enable_next(S, _Value, [Type]) -> - enable_resource(Type, S). - -%% @doc enable command -enable() -> - riak_core_bg_manager:enable(). - -enable(Resource) -> - riak_core_bg_manager:enable(Resource). - -%% @doc enable postcondition -%% global enable -enable_post(S, [], Result) -> - eq(Result, status_of(true, S#state{enabled=true})); -%% per resource enable -enable_post(S, [_Resource], Result) -> - ResourceEnabled = true, - eq(Result, status_of(ResourceEnabled, S)). - -%% ------ Grouped operator: disable -%% @doc bypass arguments generator -disable_args(_S) -> - [oneof([[], token_type(), lock_type()])]. - -%% @doc eanble precondition -%% global disable -disable_pre(S) -> - is_alive(S). - -%% per resource disable -disable_pre(S,[Type]) -> - is_integer(max_num_tokens(Type, unregistered, S)) andalso is_alive(S). - -%% @doc disable next state function -%% global disable -disable_next(S, _Value, []) -> - S#state{enabled=false}; -%% per resource disable -disable_next(S, _Value, [Type]) -> - disable_resource(Type, S). - -%% @doc disable command -disable() -> - riak_core_bg_manager:disable(). - -disable(Resource) -> - riak_core_bg_manager:disable(Resource). - -%% @doc disable postcondition -%% global -disable_post(S, [], Result) -> - Ignored = true, - eq(Result, status_of(Ignored, S#state{enabled=false})); -%% per resource -disable_post(S, [_Resource], Result) -> - ResourceEnabled = false, - eq(Result, status_of(ResourceEnabled, S)). - -%% ------ Grouped operator: enabled -%% @doc bypass arguments generator -enabled_args(_S) -> - []. - -%% @doc eanble precondition -enabled_pre(S) -> - is_alive(S). - -%% @doc enabled next state function -enabled_next(S, _Value, []) -> - S. - -%% @doc enabled command -enabled() -> - riak_core_bg_manager:enabled(). - -%% @doc enabled postcondition -enabled_post(S, _Value, Result) -> - eq(Result, status_of(true, S)). - -%%------------ helpers ------------------------- -%% @doc resources are disabled iff they appear on the "disabled" list -resource_enabled(Resource, #state{disabled=Disabled}) -> - not lists:member(Resource, Disabled). - -%% @doc enable the resource by removing from the "disabled" list -enable_resource(Resource, State=#state{disabled=Disabled}) -> - State#state{disabled=lists:delete(Resource, Disabled)}. - -disable_resource(Resource, State=#state{disabled=Disabled}) -> - State#state{disabled=[Resource | lists:delete(Resource, Disabled)]}. - -%% @doc return status considering Resource status, enbaled, and bypassed -status_of(_Enabled, #state{bypassed=true}) -> bypassed; -status_of(true, #state{enabled=true}) -> enabled; -status_of(_E,_S) -> disabled. - -%% -- Generators -lock_type() -> - oneof([a,b,c,d]). %%,e,f,g,h,i]). - -token_type() -> - oneof(['A','B','C','D']). %%,'E','F','G','H','I']). - -lock_limit() -> - choose(0, 5). - -token_count() -> - choose(0, 5). - -all_resources_() -> - choose(0, 10). - -%% @doc weight/2 - Distribution of calls -weight(S, Cmd) -> - case lists:member(Cmd, S#state.exclude) of - true -> 0; - false -> weight_inc(S, Cmd) - end. - -weight_inc(_S, set_concurrency_limit) -> 3; -weight_inc(_S, concurrency_limit) -> 3; -weight_inc(_S, concurrency_limit_reached) -> 3; -weight_inc(_S, start_process) -> 3; -weight_inc(#state{alive=true}, stop_process) -> 3; -weight_inc(#state{alive=false}, stop_process) -> 3; -weight_inc(_S, get_lock) -> 20; -weight_inc(_S, set_token_rate) -> 3; -weight_inc(_S, token_rate) -> 0; -weight_inc(_S, get_token) -> 20; -weight_inc(_S, get_Token) -> 10; -weight_inc(_S, refill_tokens) -> 10; -weight_inc(_S, all_resources) -> 3; -weight_inc(_S, crash) -> 3; -weight_inc(_S, revive) -> 1; -weight_inc(_S, _Cmd) -> 1. - -%% Other Functions -limit(Type, State) -> - limit(Type, undefined, State). - -limit(Type, Default, #state{limits=Limits}) -> - case lists:keyfind(Type, 1, Limits) of - false -> Default; - {Type, Limit} -> Limit - end. - -num_tokens(Type, #state{tokens=Tokens}) -> - case lists:keyfind(Type, 1, Tokens) of - false -> 0; - {Type, NumTokens} -> NumTokens - end. - -max_num_tokens(Type, Default, #state{counts=Counts}) -> - case lists:keyfind(Type, 1, Counts) of - false -> Default; - {Type, Limit} -> Limit - end. - -num_tokens_taken(all, #state{tokens=Tokens}) -> - lists:foldl(fun({_Resource, Count}, Sum) -> Count+Sum end, 0, Tokens); -num_tokens_taken(Resource, #state{tokens=Tokens}) -> - lists:foldl(fun(Count, Sum) -> Count+Sum end, - 0, - [Count || {R, Count} <- Tokens, R == Resource]). - -is_alive(#state{alive=Alive}) -> - Alive. - -mk_token_rate({unregistered, _}=Unreg) -> - Unreg; -mk_token_rate(undefined) -> - undefined; -mk_token_rate(Count) -> - %% erlang:send_after max is used so that we can trigger token refilling from EQC test - {max_send_after(), Count}. - -max_send_after() -> - 4294967295. - -running_procs(#state{procs=Procs}) -> - [Pid || {Pid, running} <- Procs]. - -all_locks(#state{locks=Locks}) -> - lists:flatten([ByType || {_Type, ByType} <- Locks]). - -all_locks(all, State) -> - all_locks(State); -all_locks(Type, #state{locks=Locks}) -> - case lists:keyfind(Type, 1, Locks) of - false -> []; - {Type, All} -> All - end. - -held_locks(Type, State) -> - [{Ref, Pid, Meta, held} || {Ref, Pid, Meta, held} <- all_locks(Type, State)]. - -update_locks(Type, TypeLocks, State=#state{locks=Locks}) -> - State#state{ locks = lists:keystore(Type, 1, Locks, {Type, TypeLocks}) }. - -add_held_lock(Type, Ref, Pid, Meta, State) -> - All = all_locks(Type, State), - update_locks(Type, [{Ref, Pid, Meta, held} | All], State). - -release_locks(Pid, State=#state{locks=Locks}) -> - lists:foldl(fun({Type, ByType}, StateAcc) -> - NewLocks = mark_locks_released(Pid, ByType), - update_locks(Type, NewLocks, StateAcc) - end, - State, Locks). - -mark_locks_released(Pid, Locks) -> - WithoutPid = [Lock || Lock <- Locks, element(2, Lock) =/= Pid], - MarkedReleased = [{Ref, LockPid, Meta, released} || {Ref, LockPid, Meta, _} <- Locks, LockPid =:= Pid], - MarkedReleased ++ WithoutPid. - -increment_token_count(Type, State=#state{tokens=Tokens}) -> - CurCount = num_tokens(Type, State), - State#state{ tokens = lists:keystore(Type, 1, Tokens, {Type, CurCount + 1}) }. - -reset_token_count(Type, State=#state{tokens=Tokens}) -> - State#state{ tokens = lists:keystore(Type, 1, Tokens, {Type, 0}) }. - -stop_pid(Other) when not is_pid(Other) -> - ok; -stop_pid(Pid) -> - unlink(Pid), - exit(Pid, 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. - -bg_manager_monitors() -> - bg_manager_monitors(whereis(riak_core_bg_manager)). - -bg_manager_monitors(undefined) -> - crashed; -bg_manager_monitors(Pid) -> - process_info(Pid, monitors). - -prop_bgmgr() -> - ?SETUP(fun() -> - error_logger:tty(false), - fun() -> - error_logger:tty(true) - end - end, - ?FORALL(Cmds, commands(?MODULE), - ?SOMETIMES(2, - aggregate(command_names(Cmds), - ?TRAPEXIT( - begin - stop_pid(whereis(riak_core_bg_manager)), - {ok, _BgMgr} = riak_core_bg_manager:start(), - {H, S, Res} = run_commands(?MODULE, Cmds), - InfoTable = ets:tab2list(?BG_INFO_ETS_TABLE), - EntryTable = ets:tab2list(?BG_ENTRY_ETS_TABLE), - Monitors = bg_manager_monitors(), - RunnngPids = running_procs(S), - %% cleanup processes not killed during test - [stop_pid(Pid) || Pid <- RunnngPids], - stop_pid(whereis(riak_core_bg_manager)), - ?WHENFAIL( - begin - io:format("~n~nFinal State: ~n"), - io:format("---------------~n"), - io:format("alive = ~p~n", [S#state.alive]), - io:format("bypassed = ~p~n", [S#state.bypassed]), - io:format("enabled = ~p~n", [S#state.enabled]), - io:format("procs = ~p~n", [S#state.procs]), - io:format("limits = ~p~n", [S#state.limits]), - io:format("locks = ~p~n", [S#state.locks]), - io:format("counts = ~p~n", [S#state.counts]), - io:format("tokens = ~p~n", [S#state.tokens]), - io:format("---------------~n"), - io:format("~n~nbackground_mgr tables: ~n"), - io:format("---------------~n"), - io:format("~p~n", [InfoTable]), - io:format("---------------~n"), - io:format("~p~n", [EntryTable]), - io:format("---------------~n"), - io:format("~n~nbg_manager monitors: ~n"), - io:format("---------------~n"), - io:format("~p~n", [Monitors]), - io:format("---------------~n") - - end, - pretty_commands(?MODULE, Cmds, {H, S, Res}, - Res == ok)) - end))))). - - -prop_bgmgr_parallel() -> - ?SETUP(fun() -> - error_logger:tty(false), - fun() -> - error_logger:tty(true) - end - end, - ?FORALL(Cmds, parallel_commands(?MODULE, (initial_state())#state{exclude = [bypass]}), - ?SOMETIMES(2, - aggregate(command_names(Cmds), - ?TRAPEXIT( - begin - stop_pid(whereis(riak_core_bg_manager)), - {ok, _BgMgr} = riak_core_bg_manager:start(), - {Seq, Par, Res} = run_parallel_commands(?MODULE, Cmds), - InfoTable = ets:tab2list(?BG_INFO_ETS_TABLE), - EntryTable = ets:tab2list(?BG_ENTRY_ETS_TABLE), - Monitors = bg_manager_monitors(), - stop_pid(whereis(riak_core_bg_manager)), - ?WHENFAIL( - begin - io:format("~n~nbackground_mgr tables: ~n"), - io:format("---------------~n"), - io:format("~p~n", [InfoTable]), - io:format("---------------~n"), - io:format("~p~n", [EntryTable]), - io:format("---------------~n"), - io:format("~n~nbg_manager monitors: ~n"), - io:format("---------------~n"), - io:format("~p~n", [Monitors]), - io:format("---------------~n") - end, - pretty_commands(?MODULE, Cmds, {Seq, Par, Res}, - Res == ok)) - end))))). - --endif. diff --git a/eqc/btypes_eqc.erl b/eqc/btypes_eqc.erl deleted file mode 100644 index b7b675bd5..000000000 --- a/eqc/btypes_eqc.erl +++ /dev/null @@ -1,395 +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(btypes_eqc). - --ifdef(EQC). --include_lib("eqc/include/eqc.hrl"). --include_lib("eqc/include/eqc_statem.hrl"). --include_lib("eunit/include/eunit.hrl"). - --compile([export_all, nowarn_export_all]). - --type type_name() :: binary(). --type type_active_status() :: boolean(). --type type_prop_name() :: binary(). --type type_prop_val() :: boolean(). - --define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). - --record(state, { - %% a list of properties we have created - types :: [{type_name(), type_active_status(), [{type_prop_name(), type_prop_val()}]}] - }). - -%% @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() -> eqc_statem:symbolic_state(). -initial_state() -> - #state{ - types = [] - }. - -%% ------ Grouped operator: create_type -%% @doc create_type args generator -create_type_args(S) -> - [type_name(S), props()]. - -%% @doc create_type next state function -create_type_next(S=#state{types=Types}, _Value, [TypeName, CreateProps]) -> - case type_active(TypeName, S) orelse invalid_props(TypeName, CreateProps, S) of - true -> S; - false -> - S#state{ types = lists:keystore(TypeName, 1, Types, {TypeName, false, CreateProps}) } - end. - -%% @doc create_type command -create_type(TypeName, Props) -> - riak_core_bucket_type:create(TypeName, Props). - -%% @doc create_type postcondition -create_type_post(S, [TypeName, Props], Res) -> - Active = type_active(TypeName, S), - InvalidProps = invalid_props(TypeName, Props, S), - case {Active, InvalidProps} of - {true, _} -> eq({error, already_active}, Res); - {_, true} -> - case Res of - {error, _} -> true; - _ -> {bad_error_res, Res} - end; - {false, false} -> eq(ok, Res) - end. - -%% ------ Grouped operator: activate_type -%% @doc activate_type args generator -activate_type_args(#state{types=[]}) -> - %% test negative case when no types exist - [new_type_name()]; -activate_type_args(S) -> - %% TODO: generate fault for type that dne - [existing_type_name(S)]. - -%% @doc activate_type next state function -activate_type_next(S=#state{types=Types}, _Value, [TypeName]) -> - case type(TypeName, S) of - undefined -> S; - {TypeName, _, Props} -> - S#state{ types = lists:keyreplace(TypeName, 1, Types, {TypeName, true, Props}) } - end. - -%% @doc activate_type command -activate_type(TypeName) -> - riak_core_bucket_type:activate(TypeName). - -%% @doc activate_type postcondition -activate_type_post(S, [TypeName], Res) -> - Expected = case type(TypeName, S) of - undefined -> {error, undefined}; - %% always ok if type exists b/c we spend no time in created state in this test, currently - {TypeName, _, _} -> ok - end, - eq(Expected, Res). - -%% ------ Grouped operator: update_type -%% @doc update_type args generator -update_type_args(S) -> - [type_name(S), props()]. - -%% @doc update_type next state function -update_type_next(S=#state{types=Types}, _Value, [TypeName, UpdateProps]) -> - case type_active(TypeName, S) of - false -> S; - true -> - case invalid_props(TypeName, UpdateProps, S) of - true -> S; - false -> - {TypeName, true, SetProps} = type(TypeName, S), - NewProps = lists:ukeysort(1, UpdateProps ++ SetProps), - S#state{ types = lists:keystore(TypeName, 1, Types, {TypeName, true, NewProps}) } - end - end. - -%% @doc update_type command -update_type(TypeName, Props) -> - riak_core_bucket_type:update(TypeName, Props). - -%% @doc update_type postcondition -update_type_post(S, [TypeName, Props], Res) -> - Active = type_active(TypeName, S), - InvalidProps = invalid_props(TypeName, Props, S), - case {Active, InvalidProps} of - {false, _} -> eq({error, not_active}, Res); - {_, true} -> - case Res of - {error, _} -> true; - _ -> {bad_error_res, Res} - end; - {true, false} -> eq(ok, Res) - end. - -%% ------ Grouped operator: set_bucket -%% @doc set_bucket args generator -set_bucket_args(#state{types=[]}) -> - %% test negative case when we have no types - [{new_type_name(), bucket_name()}, props()]; -set_bucket_args(S) -> - %% TODO: introduce fault to test non-existent types - [{existing_type_name(S), bucket_name()}, props()]. - -set_bucket(Bucket, Props) -> - riak_core_bucket:set_bucket(Bucket, Props). - -%% @doc set_bucket postcondition -set_bucket_post(S, [{BucketType, _BucketName}, Props], Res) -> - Active = type_active(BucketType, S), - InvalidProps = invalid_props(BucketType, Props, S), - case {Active, InvalidProps} of - {false, _} -> eq({error, no_type}, Res); - {_, true} -> - case Res of - {error, _} -> true; - _ -> {bad_error_res, Res} - end; - {true, false} -> eq(ok, Res) - end. - -%% ------ Grouped operator: type_status -%% @doc type_status args generator -type_status_args(#state{types=[]}) -> - %% if no types, test negative case - [new_type_name()]; -type_status_args(S) -> - %% TODO: add fault that sometimes generates missing type name for negative testing - [existing_type_name(S)]. - -%% @doc type_status command -type_status(TypeName) -> - riak_core_bucket_type:status(TypeName). - -%% @doc type_status postcondition -type_status_post(S, [TypeName], Res) -> - eq(expected_status(TypeName, S), Res). - -%% ------ Grouped operator: get_type -%% @doc get_type args generator -get_type_args(#state{types=[]}) -> - %% generate negative case when there are no types to get - [new_type_name()]; -get_type_args(S) -> - %% TODO: use faults to generate negative case - [existing_type_name(S)]. - -%% @doc get_type command -get_type(TypeName) -> - riak_core_bucket_type:get(TypeName). - -%% @doc get_type postcondition -get_type_post(S, [TypeName], Res) -> - case type_active(TypeName, S) of - false-> eq(undefined, Res); - true -> - ExpectedDefaults = riak_core_bucket_type:defaults(), - {TypeName, true, ExpectedProps} = type(TypeName, S), - ExpectedAll = lists:ukeysort(1, [{active, true}, {claimant, node()}] ++ ExpectedProps ++ ExpectedDefaults), - %% properties expected (from state) but not found - Missing = [Prop || Prop <- ExpectedAll, not lists:member(Prop, Res)], - %% properties found but not expected (from state) - Extra = [Prop || Prop <- Res, not lists:member(Prop, ExpectedAll)], - good_props(Missing, Extra) - end. - -%% ------ Grouped operator: fold - -%% @doc fold args generator -fold_args(_S) -> []. - -%% @doc fold command -fold() -> - ordsets:from_list(riak_core_bucket_type:fold(fun folder/2, [])). - -%% @doc fold callback which simply picks out the bucket type -folder({BType, _BProps}, Accum) -> - [BType | Accum]. - -%% @doc fold postcondition -fold_post(#state{types=Types} = _S, [], Res) -> - eq(ordsets:from_list([BType || {BType, _Status, _BProps} <- Types]), Res). - -%% ------ test helpers - -expected_status(TypeName, S) -> - case type(TypeName, S) of - undefined -> undefined; - %% TODO: incorporate other nodes so we can include created status? - {TypeName, false, _} -> ready; - {TypeName, true, _} -> active - end. - -type_active(TypeName, S) -> - case type(TypeName, S) of - undefined -> false; - {TypeName, Active, _} -> Active - end. - -type(TypeName, #state{types=Types}) -> - case lists:keyfind(TypeName, 1, Types) of - false -> undefined; - TypeDetails -> TypeDetails - end. - -good_props([], []) -> - true; -good_props([], Extra) -> - {extra_props, Extra}; -good_props(Missing, []) -> - {missing_props, Missing}; -good_props(Missing, Extra) -> - {bad_props, {missing, Missing}, {extra, Extra}}. - -invalid_props(TypeName, Props, S) -> - %% properties are invalid if they include modifications to claimant or active property - HasClaimant = false =/= lists:keyfind(claimant, 1, Props), - HasActive = case lists:keyfind(active, 1, Props) of - false -> false; - {active, Active} -> - %% if included, cannot modify state of active - not (Active =:= type_active(TypeName, S)) - end, - HasClaimant orelse HasActive. - -%% Generators - -type_name(#state{types=Types}) -> - ExistingTypes = [Name || {Name, _, _} <- Types], - ExistingGen = [ oneof(ExistingTypes) || length(ExistingTypes) > 0 ], - oneof([new_type_name() | ExistingGen]). - - -existing_type_name(#state{types=Types}) -> - ExistingTypes = [Name || {Name, _, _} <- Types], - %% assumes Types is non-empty - oneof(ExistingTypes). - -new_type_name() -> - ?SUCHTHAT(X, binary(10), X =/= <<"any">>). - -bucket_name() -> - binary(10). - -props() -> - fault_rate(1, 10, ?LET(Props, list(prop()), fault([immutable_core_prop() | Props], Props))). - -prop() -> - {gen_prop_name(), gen_prop_value()}. - -gen_prop_name() -> - binary(10). - -gen_prop_value() -> - bool(). - -immutable_core_prop() -> - %% use a boolean for both values because thats what we use for other props, - %% the value doesn't really matter, except for active 'false' is a valid value - %% which we generate sometimes just to make sure - oneof([{active, bool()}, {claimant, true}]). - -%% @doc weight/2 - Distribution of calls -weight(_S, create_type) -> 3; -weight(_S, activate_type) -> 3; -weight(_S, type_status) -> 1; -weight(_S, get_type) -> 1; -weight(_S, fold) -> 1; -weight(_S, _Cmd) -> 1. - -%% @doc the property -prop_btype_invariant() -> - ?SETUP( - fun setup_cleanup/0, - ?FORALL(Cmds, commands(?MODULE), - aggregate(command_names(Cmds), - ?TRAPEXIT( - try - os:cmd("rm -r ./btypes_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), - 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, "./btypes_eqc_meta"}]), - {ok, Hashtree} = riak_core_metadata_hashtree:start_link("./btypes_eqc_meta/trees"), - {ok, Broadcast} = riak_core_broadcast:start_link(), - {H, S, Res} = run_commands(?MODULE,Cmds), - 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), - pretty_commands(?MODULE, Cmds, {H, S, Res}, - Res == ok) - after - os:cmd("rm -r ./btypes_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. - -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/eqc/bucket_eqc_utils.erl b/eqc/bucket_eqc_utils.erl new file mode 100644 index 000000000..d5959fe60 --- /dev/null +++ b/eqc/bucket_eqc_utils.erl @@ -0,0 +1,47 @@ +%% ------------------------------------------------------------------- +%% +%% 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/chash_eqc.erl b/eqc/chash_eqc.erl index c2d2d43b3..58e884988 100644 --- a/eqc/chash_eqc.erl +++ b/eqc/chash_eqc.erl @@ -67,10 +67,8 @@ eqc_test_() -> setup() -> %% Remove the logger noise. - application:load(sasl), error_logger:tty(false), %% Uncomment the following lines to send log output to files. - %% application:set_env(sasl, sasl_error_logger, {file, "chash_eqc_sasl.log"}), %% error_logger:logfile({open, "chash_eqc.log"}), %% TODO: Perform any required setup diff --git a/eqc/hashtree_eqc.erl b/eqc/hashtree_eqc.erl deleted file mode 100644 index c7a8fd786..000000000 --- a/eqc/hashtree_eqc.erl +++ /dev/null @@ -1,644 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2012-2015 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. -%% -%% ------------------------------------------------------------------- -%% -%% Hashtree EQC test. -%% -%% Generates a pair of logically identical AAE trees populated with data -%% and some phantom trees in the same leveldb database to exercise all -%% of the cases in iterate. -%% -%% Then runs commands to insert, delete, snapshot, update tree -%% and compare. -%% -%% The expected values are stored in two ETS tables t1 and t2, -%% with the most recently snapshotted values copied to tables s1 and s2. -%% (the initial common seed data is not included in the ETS tables). -%% -%% The hashtree's themselves are stored in the process dictionary under -%% key t1 and t2. This helps with shrinking as it reduces dependencies -%% between states (or at least that's why I remember doing it). -%% -%% Model state stores where each tree is through the snapshot/update cycle. -%% The command frequencies are deliberately manipulated to make it more -%% likely that compares will take place once both trees are updated. -%% - - --module(hashtree_eqc). - --ifdef(TEST). --ifdef(EQC). --compile([export_all, nowarn_export_all]). --include_lib("eqc/include/eqc.hrl"). --include_lib("eqc/include/eqc_statem.hrl"). --define(QC_OUT(P), - eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)). - --include_lib("eunit/include/eunit.hrl"). - --record(state, - { - started = false, % Boolean to prevent commands running before initialization step. - tree_id, % Tree Id - params = undefined, % {Segments, Width, MemLevels} - snap1 = undefined, % undefined, created, updated - snap2 = undefined, % undefined, created, updated - num_updates = 0 % number of insert/delete operations - }). - -integer_to_binary(Int) -> - list_to_binary(integer_to_list(Int)). - --ifndef(old_hash). -sha(Bin) -> - crypto:hash(sha, Bin). --else. -sha(Bin) -> - crypto:sha(Bin). --endif. - -key() -> - ?LET(Key, int(), ?MODULE:integer_to_binary(Key)). - -object() -> - {key(), sha(term_to_binary(make_ref()))}. - -objects() -> - non_empty(list(object())). - -levels() -> - frequency([{20, 1}, - { 5, 2}, % production - { 1, 3}]). - -mem_levels() -> %% Number of memory levels - strongly favor default setting - frequency([{20, 0}, %% Default setting to not use memory levels - { 1, 1}, - { 1, 2}, - { 1, 3}, - { 1, 4}]). - -width() -> - frequency([{ 1, 8}, - {100, 16}, % pick for high density segments - WHY??? - { 1, 32}, - { 1, 64}, - { 1, 128}, - { 1, 256}, - { 1, 512}, - { 50, 1024}]). % pick for production - -params() -> % {Segments, Width, MemLevels} - %% Generate in terms of number of levels, from that work out the segments - ?LET({Levels, Width, MemLevels},{levels(), width(), mem_levels()}, - {calculate_num_segments(Width, Levels), Width, MemLevels}). - -calculate_num_segments(Width, Levels) -> - trunc(math:pow(Width, Levels)). - -initial_open_mode() -> - %% frequency([{1, mark_empty}, {5, mark_open}]). - ?SHRINK(oneof([mark_empty, mark_open]), [mark_empty]). % should shrink towards mark_empty - -%% Generate tree ids - the first one is used for the test, the others are added -%% as empty hashtrees. This is done to provoke issues where we hit the end of a keyspace -%% but not the end of the leveldb data, which exercises different code paths than only ever -%% having 1 hashtree -%% -%% Make sure the TreeId is unique (the second element), does not matter if there -%% are dupes in the first number (Index) -ids() -> - ?SUCHTHAT(TreeIds, - non_empty(list({ - ?LET(X, nat(), 1+X), %% Partition ID - not critical for test - ?LET(X,nat(), min(X,255))} %% Tree ID as integer - must be unique - )), - lists:keyfind(element(2, hd(TreeIds)), 2, tl(TreeIds)) == false). - -%% -%% Generate the commands, split into two cases to force the start to happen as -%% the first command. -%% -command(_S = #state{started = false}) -> - {call, ?MODULE, start, [params(), ids(), initial_open_mode(), initial_open_mode()]}; -command(_S = #state{started = true, tree_id = TreeId, - params = {_Segments, _Width, MemLevels}, - snap1 = Snap1, snap2 = Snap2}) -> - %% Calculate weighting values for different groups of commands. - %% Weights to increase snap frequency once update snapshot has begun - SnapshotsDefined = Snap1 /= undefined orelse Snap2 /= undefined, - SnapshotFrequency = case SnapshotsDefined of true -> 100; _ -> 1 end, - SnapshotWeight = 10 * SnapshotFrequency, - MoreAfterSnapshots = 100 * SnapshotFrequency, - FewerAfterSnapshots = 101 - SnapshotFrequency, - Infrequently = 1, - frequency( - %% Update snapshots/trees. If memory is enabled must test with update_tree - %% If not, can use the method used by kv/yz_index_hashtree and separate - %% the two steps, dumping the result from update_perform. - [{SnapshotWeight, {call, ?MODULE, update_tree, [t1, s1]}} || Snap1 == undefined] ++ - [{SnapshotWeight, {call, ?MODULE, update_snapshot, [t1, s1]}} || Snap1 == undefined, MemLevels == 0] ++ - [{SnapshotWeight, {call, ?MODULE, update_perform, [t1]}} || Snap1 == created, MemLevels == 0] ++ - [{SnapshotWeight, {call, ?MODULE, set_next_rebuild, [t1]}} || Snap1 == updated] ++ - [{SnapshotWeight, {call, ?MODULE, update_tree, [t2, s2]}} || Snap2 == undefined] ++ - [{SnapshotWeight, {call, ?MODULE, update_snapshot, [t2, s2]}} || Snap2 == undefined, MemLevels == 0] ++ - [{SnapshotWeight, {call, ?MODULE, update_perform, [t2]}} || Snap2 == created, MemLevels == 0] ++ - [{SnapshotWeight, {call, ?MODULE, set_next_rebuild, [t2]}} || Snap2 == updated] ++ - - %% Can only run compares when both snapshots are updated. Boost the frequency - %% when both are snapshotted (note this is guarded by both snapshot being updatable) - [{MoreAfterSnapshots, {call, ?MODULE, local_compare, []}} || Snap1 == updated, Snap2 == updated] ++ - [{MoreAfterSnapshots, {call, ?MODULE, local_compare1, []}} || Snap1 == updated, Snap2 == updated] ++ - - %% Modify the data in the two tables - [{FewerAfterSnapshots, {call, ?MODULE, write, [t1, objects()]}}] ++ - [{FewerAfterSnapshots, {call, ?MODULE, write, [t2, objects()]}}] ++ - [{FewerAfterSnapshots, {call, ?MODULE, write_both, [objects()]}}] ++ - [{FewerAfterSnapshots, {call, ?MODULE, delete, [t1, key()]}}] ++ - [{FewerAfterSnapshots, {call, ?MODULE, delete, [t2, key()]}}] ++ - [{FewerAfterSnapshots, {call, ?MODULE, delete_both, [key()]}}] ++ - - %% Mess around with reopening, crashing and rehashing. - [{Infrequently, {call, ?MODULE, reopen_tree, [t1, TreeId]}}] ++ - [{Infrequently, {call, ?MODULE, reopen_tree, [t2, TreeId]}}] ++ - [{Infrequently, {call, ?MODULE, unsafe_close, [t1, TreeId]}}] ++ - [{Infrequently, {call, ?MODULE, unsafe_close, [t2, TreeId]}}] ++ - [{Infrequently, {call, ?MODULE, rehash_tree, [t1]}}] ++ - [{Infrequently, {call, ?MODULE, rehash_tree, [t2]}}] - ). - -%% -%% Start the model up - initialize two trees, either mark them as open and empty -%% or request they are checked. Add additional unused hashtrees with ExtraIds -%% to make sure the iterator code is fully exercised. -%% -%% Store the hashtree records in the process dictionary under keys 't1' and 't2'. -%% -start(Params, [TreeId | ExtraIds], Tree1OpenOrEmpty, Tree2OpenOrEmpty) -> - {Segments, Width, MemLevels} = Params, - %% Return now so we can store symbolic value in procdict in next_state call - T1A = create_and_open_hashtree(TreeId, Segments, Width, MemLevels, - Tree1OpenOrEmpty, ExtraIds), - - put(t1, T1A), - - T2A = create_and_open_hashtree(TreeId, Segments, Width, MemLevels, - Tree2OpenOrEmpty, ExtraIds), - - put(t2, T2A), - - %% Make sure ETS is pristine - delete_ets(), - create_ets(), - - %% Return treeid for future hashtree recreation - TreeId. - -%% Create a new hashtree given TreeId, Segments, Width, and MemLevels. -%% Add some extra trees to stress iteration beyond keyspaces. -create_and_open_hashtree(TreeId, Segments, Width, MemLevels, OpenOrEmpty, ExtraIds) -> - Tree0 = hashtree:new(TreeId, [{segments, Segments}, - {width, Width}, - {mem_levels, MemLevels}]), - Tree = case OpenOrEmpty of - mark_empty -> hashtree:mark_open_empty(TreeId, Tree0); - _ -> hashtree:mark_open_and_check(TreeId, Tree0) - end, - add_extra_hashtrees(ExtraIds, Tree), - Tree. - - -%% Add some extra tree ids and update the metadata to give -%% the iterator code a workout on non-matching ids. -add_extra_hashtrees(ExtraIds, T) -> - lists:foldl(fun(ExtraId, Tacc) -> - Tacc2 = hashtree:new(ExtraId, Tacc), - Tacc3 = hashtree:mark_open_empty(ExtraId, Tacc2), - Tacc4 = hashtree:insert(<<"keyfromextratree">>, - <<"valuefromextratree">>, Tacc3), - hashtree:flush_buffer(Tacc4) - end, T, ExtraIds). - -%% Wrap the hashtree:update_tree call. This works with memory levels -%% enabled. Copy the model tree to a snapshot table. -update_tree(T, S) -> - %% Snapshot the hashtree and store both states - HT = hashtree:update_tree(get(T)), - put(T, HT), - %% Copy the current ets table to the snapshot table. - copy_tree(T, S), - ok. - -%% Wrap the hashtree:update_snapshot call and set the next rebuild type to full -%% to match the behavior needed by the *_index_hashtree modules that consume -%% hashtree. Otherwise if the state is treated as incremental on a safe reopen -%% then the tree does not rebuild correctly. -%% -%% Store the snapshot state in the process dictionary under {snapstate, t1} or -%% {snapstate, t2} for use by update_perform. -%% -%% N.B. This does not work with memory levels enabled as update_perform uses the -%% snapshot state which is dumped. - -update_snapshot(T, S) -> - %% Snapshot the hashtree and store both states - {SS, HT} = hashtree:update_snapshot(get(T)), - - %% Mark as a full rebuild until the update perfom step happens. - HT2 = hashtree:set_next_rebuild(HT, full), - - put(T, HT2), - put({snapstate, T}, SS), - %% Copy the current ets table to the snapshot table. - copy_tree(T, S), - ok. - - -%% -%% Wrap the hashtree:update_perform call and erase the snapshot hashtree state. -%% Should only happen if a snapshot state exists. -%% -update_perform(T) -> - _ = hashtree:update_perform(get({snapstate, T})), - erase({snapstate, T}), - ok. - - -%% Set the next rebuild state. Should only happen once update perform has -%% completed. -%% -set_next_rebuild(T) -> - put(T, hashtree:set_next_rebuild(get(T), incremental)), - ok. - -%% Wrap hashtree:insert to (over)write key with a new hash to a single -%% table and insert into the model tree. -%% -write(T, Objects) -> - lists:foreach(fun({Key, Hash}) -> - put(T, hashtree:insert(Key, Hash, get(T))), - ets:insert(T, {Key, Hash}) - end, Objects), - ok. - -%% Call the other wrapper to write to both trees. -%% -write_both(Objects) -> - write(t1, Objects), - write(t2, Objects), - ok. - - -%% Wrap hashtree:delete to remove a key from a tree (and remove -%% from the model tree). -%% -%% Keys do not need to be present to remove them from the AAE tree. -delete(T, Key) -> - put(T, hashtree:delete(Key, get(T))), - ets:delete(T, Key), - ok. - -%% Call the other wrapper to remove the key from both trees. -delete_both(Key) -> - delete(t1, Key), - delete(t2, Key), - ok. - -%% Trigger a rehash of the whole interior tree. There is a potential -%% race condition with update_snapshot that is avoided by this model, -%% however if called during update_perform executing it will silently -%% break multi_select_segment. -rehash_tree(T) -> - put(T, hashtree:rehash_tree(get(T))), - ok. - -%% Flush, update tree, mark clean close, close and reopen the AAE tree. -reopen_tree(T, TreeId) -> - HT = hashtree:flush_buffer(get(T)), - {Segments, Width, MemLevels} = {hashtree:segments(HT), hashtree:width(HT), - hashtree:mem_levels(HT)}, - Path = hashtree:path(HT), - - UpdatedHT = hashtree:update_tree(HT), - CleanClosedHT = hashtree:mark_clean_close(TreeId, UpdatedHT), - hashtree:close(CleanClosedHT), - - T1 = hashtree:new(TreeId, [{segments, Segments}, - {width, Width}, - {mem_levels, MemLevels}, - {segment_path, Path}]), - - put(T, hashtree:mark_open_and_check(TreeId, T1)), - ok. - -%% Simulate an unsafe close. This flushes the write buffer so that the -%% model has a chance of knowing what the correct repairs should be. -unsafe_close(T, TreeId) -> - HT = get(T), - {Segments, Width, MemLevels} = {hashtree:segments(HT), hashtree:width(HT), - hashtree:mem_levels(HT)}, - Path = hashtree:path(HT), - %% Although this is an unsafe close, it's unsafe in metadata/building - %% buckets. Rather than model the queue behavior, flush those and just - %% check the buckets are correctly recomputed next compare. - hashtree:flush_buffer(HT), - hashtree:fake_close(HT), - - T0 = hashtree:new(TreeId, [{segments, Segments}, - {width, Width}, - {mem_levels, MemLevels}, - {segment_path, Path}]), - - put(T, hashtree:mark_open_and_check(TreeId, T0)), - - ok. - -%% Use the internal eunit local comparison to check for differences between the -%% two trees. -local_compare() -> - hashtree:local_compare(get(t1), get(t2)). - -local_compare1() -> - hashtree:local_compare1(get(t1), get(t2)). - -%% Preconditions to guard against impossible situations during shrinking. -precondition(#state{started = false}, {call, _, F, _A}) -> - F == start; -%% Make sure update_tree can only be called with no memory levels -precondition(#state{params = {_, _, MemLevels}, snap1 = Snap1}, {call, _, update_tree, [t1, _]}) -> - Snap1 == undefined andalso MemLevels == 0; -precondition(#state{params = {_, _, MemLevels}, snap2 = Snap2}, {call, _, update_tree, [t2, _]}) -> - Snap2 == undefined andalso MemLevels == 0; -%% Make sure only one snapshot, tree update or rebuild is happening in sequence -precondition(#state{snap1 = Snap1}, {call, _, update_snapshot, [t1, _]}) -> - Snap1 == undefined; -precondition(#state{snap1 = Snap1}, {call, _, update_perform, [t1]}) -> - Snap1 == created; -precondition(#state{snap1 = Snap1}, {call, _, set_next_rebuild, [t1]}) -> - Snap1 == updated; -precondition(#state{snap2 = Snap2}, {call, _, update_snapshot, [t2, _]}) -> - Snap2 == undefined; -precondition(#state{snap2 = Snap2}, {call, _, update_perform, [t2]}) -> - Snap2 == created; -precondition(#state{snap2 = Snap2}, {call, _, set_next_rebuild, [t2]}) -> - Snap2 == updated; -%% Only compare once the tree has been updated for the snapshot -precondition(#state{snap1 = Snap1, snap2 = Snap2}, {call, _, local_compare, []}) -> - Snap1 == updated andalso Snap2 == updated; -precondition(_S, _C) -> - true. - -%% Check the post conditions. After the initial create, -%% make sure the next rebuilds are set correctly -postcondition(_S,{call,_,start, [_Params, _ExtraIds, T1Mark, T2Mark]},_R) -> - NextRebuildT1 = hashtree:next_rebuild(get(t1)), - NextRebuildT2 = hashtree:next_rebuild(get(t2)), - %% TODO: Convert this to a conjunction - T1Expect = case T1Mark of - mark_empty -> incremental; - _ -> full - end, - T2Expect = case T2Mark of - mark_empty -> incremental; - _ -> full - end, - eqc_statem:conj([eq({t1, T1Expect}, {t1, NextRebuildT1}), - eq({t2, T2Expect}, {t2, NextRebuildT2})]); -%% After a comparison, check against the results against -%% the ETS table containing the *snapshot* copies. -postcondition(_S,{call, _, Function, _}, Result0) when Function == local_compare; - Function == local_compare1 -> - Result = lists:sort(Result0), - T1Top = hashtree:top_hash(get(t1)), - T2Top = hashtree:top_hash(get(t2)), - Expect = expect_compare(), - case Expect of - [] -> - eqc_statem:conj([eq({result, Expect}, {result, Result}), - eq({top, T1Top}, {top, T2Top})]); - _ -> - eq(Expect, Result) - end; -postcondition(_S,{call,_,_,_},_R) -> - true. - -next_state(S,R,{call, _, start, [Params,_ExtraIds,_,_]}) -> - %% Start returns the TreeId used, stick in the state - %% as no hashtree:tree_id call yet. - S#state{started = true, tree_id = R, params = Params}; -next_state(S,_V,{call, _, update_tree, [t1, _]}) -> - S#state{snap1 = updated}; -next_state(S,_V,{call, _, update_tree, [t2, _]}) -> - S#state{snap2 = updated}; -next_state(S,_V,{call, _, update_snapshot, [t1, _]}) -> - S#state{snap1 = created}; -next_state(S,_V,{call, _, update_snapshot, [t2, _]}) -> - S#state{snap2 = created}; -next_state(S,_V,{call, _, update_perform, [t1]}) -> - S#state{snap1 = updated}; -next_state(S,_V,{call, _, update_perform, [t2]}) -> - S#state{snap2 = updated}; -next_state(S,_V,{call, _, set_next_rebuild, [t1]}) -> - S#state{snap1 = undefined}; -next_state(S,_V,{call, _, set_next_rebuild, [t2]}) -> - S#state{snap2 = undefined}; -next_state(S,_V,{call, _, write, [_T, Objs]}) -> - S#state{num_updates = S#state.num_updates + length(Objs)}; -next_state(S,_R,{call, _, write_both, [Objs]}) -> - S#state{num_updates = S#state.num_updates + 2*length(Objs)}; -next_state(S,_V,{call, _, delete, _}) -> - S#state{num_updates = S#state.num_updates + 1}; -next_state(S,_R,{call, _, delete_both, _}) -> - S#state{num_updates = S#state.num_updates + 2}; -next_state(S,_R,{call, _, reopen_tree, [t1, _]}) -> - S#state{snap1 = undefined}; -next_state(S,_R,{call, _, reopen_tree, [t2, _]}) -> - S#state{snap2 = undefined}; -next_state(S,_R,{call, _, unsafe_close, [t1, _]}) -> - S#state{snap1 = undefined}; -next_state(S,_R,{call, _, unsafe_close, [t2, _]}) -> - S#state{snap2 = undefined}; -next_state(S,_R,{call, _, rehash_tree, [t1]}) -> - S#state{snap1 = undefined}; -next_state(S,_R,{call, _, rehash_tree, [t2]}) -> - S#state{snap2 = undefined}; -next_state(S,_R,{call, _, local_compare, []}) -> - S; -next_state(S,_R,{call, _, local_compare1, []}) -> - S. - - -%% Property to generate a series of commands against the -%% hashtrees and afterwards force them to a comparable state. -%% -prop_correct() -> - ?SETUP(fun() -> - application:ensure_started(syntax_tools), - application:ensure_started(compiler), - application:ensure_started(goldrush), - fun() -> - application:stop(goldrush), - application:stop(compiler), - application:stop(syntax_tools), - delete_ets() - end - end, - ?FORALL(Cmds,commands(?MODULE, #state{}), - aggregate(command_names(Cmds), - begin - %%io:format(user, "Starting in ~p\n", [self()]), - put(t1, undefined), - put(t2, undefined), - catch ets:delete(t1), - catch ets:delete(t2), - {_H,S,Res0} = HSR = run_commands(?MODULE,Cmds), - {Segments, Width, MemLevels} = - case S#state.params of - undefined -> - %% Possible if Cmds just init - %% set segments to 1 to avoid div by zero - {1, undefined, undefined}; - Params -> - Params - end, - %% If ok after steps, do a final compare to increase - %% the number of tests. - Res = case (S#state.started andalso Res0 == ok) of - true -> - final_compare(S); - _ -> - Res0 - end, - %% Clean up after the test - case Res of - ok -> % if all went well, remove leveldb files - catch cleanup_hashtree(get(t1)), - catch cleanup_hashtree(get(t2)); - _ -> % otherwise, leave them around for inspection - ok - end, - NumUpdates = S#state.num_updates, - pretty_commands(?MODULE, Cmds, HSR, - ?WHENFAIL( - begin - {Segments, Width, MemLevels} = S#state.params, - eqc:format("Segments ~p\nWidth ~p\nMemLevels ~p\n", - [Segments, Width, MemLevels]), - eqc:format("=== t1 ===\n~p\n\n", [ets:tab2list(t1)]), - eqc:format("=== s1 ===\n~p\n\n", [safe_tab2list(s1)]), - eqc:format("=== t2 ===\n~p\n\n", [ets:tab2list(t2)]), - eqc:format("=== s2 ===\n~p\n\n", [safe_tab2list(s2)]), - eqc:format("=== ht1 ===\n~w\n~p\n\n", [get(t1), catch dump(get(t1))]), - eqc:format("=== ht2 ===\n~w\n~p\n\n", [get(t2), catch dump(get(t2))]) - end, - measure(num_updates, NumUpdates, - measure(segment_fill_ratio, NumUpdates / (2 * Segments), % Est of avg fill rate per segment - collect(with_title(mem_levels), MemLevels, - collect(with_title(segments), Segments, - collect(with_title(width), Width, - equals(ok, Res)))))))) - end)) - ). - -cleanup_hashtree(HT) -> - Path = hashtree:path(HT), - HT2 = hashtree:close(HT), - hashtree:destroy(HT2), - ok = file:del_dir(Path). - - - -dump(Tree) -> - Fun = fun(Entries) -> - Entries - end, - {SnapTree, _Tree2} = hashtree:update_snapshot(Tree), - hashtree:multi_select_segment(SnapTree, ['*','*'], Fun). - - -%% Force a final comparison to make sure we get a comparison test -%% for every case we try, as that is after all the point of the module. -final_compare(S) -> - maybe_update_tree(S#state.snap1, t1, s1), - maybe_update_tree(S#state.snap2, t2, s2), - Expect = expect_compare(), - case lists:sort(hashtree:local_compare(get(t1), get(t2))) of - Expect -> - ok; - Result -> - {Expect, '/=', Result} - end. - -maybe_update_tree(_SnapState = undefined, Tree, Snap) -> - update_tree(Tree, Snap); % snapshot and calculate -maybe_update_tree(_SnapState = created, Tree, _Snap) -> - update_perform(Tree); -maybe_update_tree(_SnapState = updated, _Tree, _Snap) -> - ok. % Do nothing - waiting for setting rebuild status - - -expect_compare() -> - Snap1 = orddict:from_list(ets:tab2list(s1)), - Snap2 = orddict:from_list(ets:tab2list(s2)), - SnapDeltas = riak_core_util:orddict_delta(Snap1, Snap2), - - lists:sort( - [{missing, K} || {K, {'$none', _}} <- SnapDeltas] ++ - [{remote_missing, K} || {K, {_, '$none'}} <- SnapDeltas] ++ - [{different, K} || {K, {V1, V2}} <- SnapDeltas, V1 /= '$none', V2 /= '$none']). %% UNDO SnapDeltas this line -%% -%% Functions for handling the model data stored in ETS tables -%% - -ets_tables() -> [t1, s1, t2, s2]. - -delete_ets() -> - [catch ets:delete(X) || X <- ets_tables()], - ok. - -create_ets() -> - [ets_new(X) || X <- ets_tables()], - ok. - - -%% Create ETS table with public options -ets_new(T) -> - ets:new(T, [named_table, public, set]). - -%% Convert a table to a list falling back to undefined for printing -%% failure state. -safe_tab2list(Id) -> - try - ets:tab2list(Id) - catch - _:_ -> - undefined - end. - -%% Copy the model data from the live to snapshot table for -%% update_tree/update_snapshot. -copy_tree(T, S) -> - catch ets:delete(S), - ets_new(S), - ets:insert(S, ets:tab2list(T)), - ok. - --endif. --endif. diff --git a/src/mock_vnode.erl b/eqc/mock_vnode.erl similarity index 100% rename from src/mock_vnode.erl rename to eqc/mock_vnode.erl diff --git a/eqc/new_cluster_membership_model_eqc.erl b/eqc/new_cluster_membership_model_eqc.erl index 3589f0f36..5655a7ef4 100644 --- a/eqc/new_cluster_membership_model_eqc.erl +++ b/eqc/new_cluster_membership_model_eqc.erl @@ -66,6 +66,32 @@ split :: dict() }). +eqc_test_() -> + {spawn, + [{setup, + fun setup/0, + fun cleanup/1, + [{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()))))} + ]} + ] + } + ] + }. + +eqc() -> + quickcheck(numtests(?TEST_ITERATIONS, ?QC_OUT(prop_join()))), + ok. + +setup() -> + ok. + +cleanup(_) -> + ok. + prop_join() -> ?FORALL(Cmds, more_commands(100, commands(?MODULE)), ?TRAPEXIT( @@ -1360,19 +1386,19 @@ ring_ready(CState0) -> end. seed_random(State) -> - OldSeed = rand:seed(State#state.seed), + OldSeed = random:seed(State#state.seed), State#state{old_seed=OldSeed}. save_random(State=#state{old_seed=undefined}) -> - Seed = rand:seed(), + Seed = random:seed(), State#state{seed=Seed}; save_random(State=#state{old_seed=OldSeed}) -> - Seed = rand:seed(OldSeed), + Seed = random:seed(OldSeed), State#state{seed=Seed}. save_random() -> - Seed = rand:seed(), - rand:seed(Seed), + Seed = random:seed(), + random:seed(Seed), Seed. ring_changed(State, _RRing, {Node, _NState}, CState0) -> @@ -1594,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(rand:uniform(length(Active)), + RNode = lists:nth(random:uniform(length(Active)), Active), {Idx, O, RNode, Mods, Status}; _ -> @@ -1607,14 +1633,14 @@ handle_down_nodes(CState, Next) -> Next3. claim_until_balanced(Ring, Node) -> - %%{WMod, WFun} = app_helper:get_env(riak_core, wants_claim_fun), + %%{WMod, WFun} = application:get_env(riak_core, wants_claim_fun, undefined), {WMod, WFun} = {riak_core_claim, default_wants_claim}, NeedsIndexes = apply(WMod, WFun, [Ring, Node]), case NeedsIndexes of no -> Ring; {yes, _NumToClaim} -> - %%{CMod, CFun} = app_helper:get_env(riak_core, choose_claim_fun), + %%{CMod, CFun} = application:get_env(riak_core, choose_claim_fun, undefined), {CMod, CFun} = {riak_core_claim, default_choose_claim}, NewRing = CMod:CFun(Ring, Node), claim_until_balanced(NewRing, Node) @@ -1688,7 +1714,7 @@ remove_from_cluster(Ring, ExitingNode) -> ExitRing. attempt_simple_transfer(Ring, Owners, ExitingNode) -> - %%TargetN = app_helper:get_env(riak_core, target_n_val), + %%TargetN = application:get_env(riak_core, target_n_val, undefined), TargetN = 3, attempt_simple_transfer(Ring, Owners, TargetN, @@ -1717,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(rand:uniform(length(Qualifiers)), + Chosen = lists:nth(random:uniform(length(Qualifiers)), Qualifiers), %% choose one, and do the rest of the ring attempt_simple_transfer( diff --git a/include/riak_core.hrl b/include/riak_core.hrl deleted file mode 100644 index 436aeea58..000000000 --- a/include/riak_core.hrl +++ /dev/null @@ -1,7 +0,0 @@ --ifdef(namespaced_types). --type riak_core_dict() :: dict:dict(). --type riak_core_set() :: sets:set(). --else. --type riak_core_dict() :: dict(). --type riak_core_set() :: set(). --endif. diff --git a/include/riak_core_bg_manager.hrl b/include/riak_core_bg_manager.hrl deleted file mode 100644 index aa9050d7a..000000000 --- a/include/riak_core_bg_manager.hrl +++ /dev/null @@ -1,50 +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. -%% --type bg_lock() :: any(). --type bg_token() :: any(). --type bg_resource() :: bg_token() | bg_lock(). --type bg_resource_type() :: lock | token. - --type bg_meta() :: undefined | {atom(), any()}. %% meta data to associate with a lock/token --type bg_period() :: pos_integer(). %% token refill period in milliseconds --type bg_count() :: pos_integer(). %% token refill tokens to count at each refill period --type bg_rate() :: undefined | {bg_period(), bg_count()}. %% token refill rate --type bg_concurrency_limit() :: non_neg_integer() | infinity. %% max lock concurrency allowed --type bg_consumer() :: {undefined | pid(), bg_meta()}. %% a consumer of a resource - -%% Results of a "ps" of live given or blocked locks/tokens --record(bg_stat_live, - { - resource :: bg_resource(), %% resource name, e.g. 'aae_hashtree_lock' - type :: bg_resource_type(), %% resource type, e.g. 'lock' - owner :: bg_consumer() %% this consumer has the lock or token - }). --type bg_stat_live() :: #bg_stat_live{}. - --define(BG_INFO_ETS_TABLE, background_mgr_info_table). %% name of lock/token manager info ETS table --define(BG_INFO_ETS_OPTS, [public, %% creation time properties of info ETS table - named_table, - set]). - --define(BG_ENTRY_ETS_TABLE, background_mgr_entry_table). %% name of lock/token manager entry ETS table --define(BG_ENTRY_ETS_OPTS, [public, %% creation time properties of entry ETS table - named_table, - bag]). - - diff --git a/include/riak_core_dtrace.hrl b/include/riak_core_dtrace.hrl deleted file mode 100644 index c0c0f81b7..000000000 --- a/include/riak_core_dtrace.hrl +++ /dev/null @@ -1,15 +0,0 @@ -%% NOTE: Coordinate ?DTRACE_TAG_KEY with riak_core_dtrace.erl --define(DTRACE_TAG_KEY, '**DTRACE*TAG*KEY**'). - -%% Erlang tracing-related funnel functions for DTrace/SystemTap. When -%% using Redbug or other Erlang tracing framework, trace these -%% functions. Include these here to avoid copy/pasting to every -%% module. - -dtrace(_BKey, Category, Ints, Strings) -> - riak_core_dtrace:dtrace(Category, Ints, Strings). - -%% Internal functions, not so interesting for Erlang tracing. - -dtrace_int(Category, Ints, Strings) -> - dtrace(get(?DTRACE_TAG_KEY), Category, Ints, Strings). diff --git a/include/riak_core_handoff.hrl b/include/riak_core_handoff.hrl index dba5e6963..a3dc51f33 100644 --- a/include/riak_core_handoff.hrl +++ b/include/riak_core_handoff.hrl @@ -1,8 +1,4 @@ --ifdef(namespaced_types). -type riak_core_handoff_dict() :: dict:dict(). --else. --type riak_core_handoff_dict() :: dict(). --endif. -define(PT_MSG_INIT, 0). -define(PT_MSG_OBJ, 1). @@ -10,13 +6,15 @@ -define(PT_MSG_SYNC, 3). -define(PT_MSG_CONFIGURE, 4). -define(PT_MSG_BATCH, 5). +-define(PT_MSG_VERIFY_NODE, 6). +-define(PT_MSG_UNKNOWN, 255). -record(ho_stats, { - interval_end :: erlang:timestamp(), - last_update = os:timestamp() :: erlang:timestamp(), - objs=0 :: non_neg_integer(), - bytes=0 :: non_neg_integer() + interval_end :: erlang:timestamp(), + last_update :: erlang:timestamp() | undefined, + objs=0 :: non_neg_integer(), + bytes=0 :: non_neg_integer() }). -type ho_stats() :: #ho_stats{}. @@ -39,10 +37,10 @@ stats :: riak_core_handoff_dict(), vnode_pid :: pid() | undefined, vnode_mon :: reference() | undefined, - type = undefined :: ho_type() | undefined, + type :: ho_type() | undefined, req_origin :: node(), filter_mod_fun :: {module(), atom()} | undefined, - size = {0, objects} :: {function(), dynamic} | {non_neg_integer(), bytes | objects} + size :: {function(), dynamic} | {non_neg_integer(), bytes | objects} | undefined }). -type handoff_status() :: #handoff_status{}. diff --git a/include/riak_core_metadata.hrl b/include/riak_core_metadata.hrl deleted file mode 100644 index b22043162..000000000 --- a/include/riak_core_metadata.hrl +++ /dev/null @@ -1,17 +0,0 @@ --type metadata_prefix() :: {binary() | atom(), binary() | atom()}. --type metadata_key() :: any(). --type metadata_pkey() :: {metadata_prefix(), metadata_key()}. --type metadata_value() :: any(). --type metadata_tombstone() :: '$deleted'. --type metadata_resolver() :: fun((metadata_value() | metadata_tombstone(), - metadata_value() | metadata_tombstone()) -> metadata_value()). --type metadata_modifier() :: fun(([metadata_value() | metadata_tombstone()] | undefined) -> - metadata_value()). --type metadata_object() :: {metadata, dvvset:clock()}. --type metadata_context() :: dvvset:vector(). - --record(metadata_broadcast, { - pkey :: metadata_pkey(), - obj :: metadata_object() - }). --type metadata_broadcast() :: #metadata_broadcast{}. diff --git a/include/riak_core_ring.hrl b/include/riak_core_ring.hrl deleted file mode 100644 index ef2ac026e..000000000 --- a/include/riak_core_ring.hrl +++ /dev/null @@ -1,2 +0,0 @@ --define(LEGACY_RING_VSN, 1). --define(CURRENT_RING_VSN, 2). diff --git a/include/riak_core_vnode.hrl b/include/riak_core_vnode.hrl index d7e50aad5..9ff955a66 100644 --- a/include/riak_core_vnode.hrl +++ b/include/riak_core_vnode.hrl @@ -3,8 +3,6 @@ %% TODO: Double-check that these special cases are kosher {server, undefined, undefined} | % special case in % riak_core_vnode_master.erl - {fsm, undefined, pid()} | % special case in - % riak_kv_util:make_request/2.erl ignore. -type partition() :: chash:index_as_int(). -type vnode_req() :: term(). @@ -33,5 +31,22 @@ -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()}}. + +%% An integer, and the number of bits to shift it left to treat it as +%% a mask in the 2^160 key space +%% +%% For a more thorough explanation of how these structures are used, +%% see `riak_core_coverage_plan'. +-type subpartition() :: { non_neg_integer(), pos_integer() }. + +-record(vnode_coverage, { + vnode_identifier = 0 :: non_neg_integer(), + partition_filters = [] :: [non_neg_integer()], + subpartition = undefined :: undefined | subpartition() + }). + +-type vnode_selector() :: all | allup. +-type vnode_coverage() :: #vnode_coverage{}. diff --git a/priv/riak_core.schema b/priv/riak_core.schema deleted file mode 100644 index 8ca4dfb13..000000000 --- a/priv/riak_core.schema +++ /dev/null @@ -1,272 +0,0 @@ -%%-*- mode: erlang -*- -%% Default Bucket Properties - -%% @doc The number of replicas stored. Note: See Replication -%% Properties for further discussion. -%% http://docs.basho.com/riak/latest/dev/advanced/cap-controls/ -{mapping, "buckets.default.n_val", "riak_core.default_bucket_props.n_val", [ - {datatype, integer}, - {default, 3}, - hidden -]}. - -%% @doc Number of partitions in the cluster (only valid when first -%% creating the cluster). Must be a power of 2, minimum 8 and maximum -%% 1024. -{mapping, "ring_size", "riak_core.ring_creation_size", [ - {datatype, integer}, - {default, 64}, - {validators, ["ring_size^2", "ring_size_max", "ring_size_min"]}, - {commented, 64} -]}. - -%% ring_size validators -{validator, "ring_size_max", - "2048 and larger are supported, but considered advanced config", - fun(Size) -> - Size =< 1024 - end}. - -{validator, "ring_size^2", "not a power of 2", - fun(Size) -> - (Size band (Size-1) =:= 0) - end}. - -{validator, "ring_size_min", "must be at least 8", - fun(Size) -> - Size >= 8 - end}. - -%% @doc Number of concurrent node-to-node transfers allowed. -{mapping, "transfer_limit", "riak_core.handoff_concurrency", [ - {datatype, integer}, - {default, 2}, - {commented, 2} -]}. - -%% @doc Default location of ringstate -{mapping, "ring.state_dir", "riak_core.ring_state_dir", [ - {datatype, directory}, - {default, "$(platform_data_dir)/ring"}, - hidden -]}. - -%% @doc Default cert location for https can be overridden -%% with the ssl config variable, for example: -{mapping, "ssl.certfile", "riak_core.ssl.certfile", [ - {datatype, file}, - {commented, "$(platform_etc_dir)/cert.pem"} -]}. - -%% @doc Default key location for https can be overridden with the ssl -%% config variable, for example: -{mapping, "ssl.keyfile", "riak_core.ssl.keyfile", [ - {datatype, file}, - {commented, "$(platform_etc_dir)/key.pem"} -]}. - -%% @doc Default signing authority location for https can be overridden -%% with the ssl config variable, for example: -{mapping, "ssl.cacertfile", "riak_core.ssl.cacertfile", [ - {datatype, file}, - {commented, "$(platform_etc_dir)/cacertfile.pem"} -]}. - -%% @doc handoff.ip is the network address that Riak binds to for -%% intra-cluster data handoff. -{mapping, "handoff.ip", "riak_core.handoff_ip", [ - {default, "{{handoff_ip}}" }, - {datatype, string}, - {validators, ["valid_ipaddr"]}, - hidden -]}. - -{validator, - "valid_ipaddr", - "must be a valid IP address", - fun(AddrString) -> - case inet_parse:address(AddrString) of - {ok, _} -> true; - {error, _} -> false - end - end}. - -%% @doc handoff.port is the TCP port that Riak uses for -%% intra-cluster data handoff. -{mapping, "handoff.port", "riak_core.handoff_port", [ - {default, {{handoff_port}} }, - {datatype, integer}, - hidden -]}. - -%% @doc To encrypt riak_core intra-cluster data handoff traffic, -%% uncomment the following line and edit its path to an appropriate -%% certfile and keyfile. (This example uses a single file with both -%% items concatenated together.) -{mapping, "handoff.ssl.certfile", "riak_core.handoff_ssl_options.certfile", [ -%% {commented, "/tmp/erlserver.pem"}, - {datatype, file}, - hidden -]}. - -%% @doc if you need a seperate keyfile for handoff -{mapping, "handoff.ssl.keyfile", "riak_core.handoff_ssl_options.keyfile", [ - {datatype, file}, - hidden -]}. - -%% @doc Enables/disables outbound handoff transfers for this node. If you -%% turn this setting off at runtime with riak-admin, it will kill any -%% outbound handoffs currently running. -{mapping, "handoff.outbound", "riak_core.disable_outbound_handoff", [ - {default, on}, - {datatype, {flag, off, on}}, - hidden -]}. - -%% @doc Enables/disables inbound handoff transfers for this node. If you -%% turn this setting off at runtime with riak-admin, it will kill any -%% inbound handoffs currently running. -{mapping, "handoff.inbound", "riak_core.disable_inbound_handoff", [ - {default, on}, - {datatype, {flag, off, on}}, - hidden -]}. - -%% @doc DTrace support Do not enable 'dtrace' unless your Erlang/OTP -%% runtime is compiled to support DTrace. DTrace is available in -%% R15B01 (supported by the Erlang/OTP official source package) and in -%% R14B04 via a custom source repository & branch. -{mapping, "dtrace", "riak_core.dtrace_support", [ - {default, off}, - {datatype, flag} -]}. - -%% @doc Platform-specific installation paths (substituted by rebar) -{mapping, "platform_bin_dir", "riak_core.platform_bin_dir", [ - {datatype, directory}, - {default, "{{platform_bin_dir}}"} -]}. - -%% @see platform_bin_dir -{mapping, "platform_data_dir", "riak_core.platform_data_dir", [ - {datatype, directory}, - {default, "{{platform_data_dir}}"} -]}. - -%% @see platform_bin_dir -{mapping, "platform_etc_dir", "riak_core.platform_etc_dir", [ - {datatype, directory}, - {default, "{{platform_etc_dir}}"} -]}. - -%% @see platform_bin_dir -{mapping, "platform_lib_dir", "riak_core.platform_lib_dir", [ - {datatype, directory}, - {default, "{{platform_lib_dir}}"} -]}. - -%% @see platform_bin_dir -{mapping, "platform_log_dir", "riak_core.platform_log_dir", [ - {datatype, directory}, - {default, "{{platform_log_dir}}"} -]}. - -%% @doc Enable consensus subsystem. Set to 'on' to enable the -%% consensus subsystem used for strongly consistent Riak operations. -{mapping, "strong_consistency", "riak_core.enable_consensus", [ - {datatype, flag}, - {default, off}, - {commented, on} -]}. - -%% @doc Whether to enable the background manager globally. When -%% enabled, participating Riak subsystems will coordinate access to -%% shared resources. This will help to prevent system response -%% degradation under times of heavy load from multiple background -%% tasks. Specific subsystems may also have their own controls over -%% use of the background manager. -{mapping, "background_manager", "riak_core.use_background_manager", [ - {datatype, flag}, - {default, off}, - hidden -]}. - -%% @doc Interval of time between vnode management -%% activities. Modifying this will change the amount of time between -%% attemps to trigger handoff between this node and any other member -%% of the cluster. -{mapping, "vnode_management_timer", "riak_core.vnode_management_timer", [ - {default, "10s"}, - {datatype, {duration, ms}}, - hidden -]}. - -%% @doc On cluster leave - force full rebalance partitions -%% By default on a cluster leave there will first be an attempt to handoff -%% vnodes to safe (in terms of target_n_val) locations. In small clusters, -%% there may be insufficient safe locations, and a temporary state can be -%% created where a single node has a large number of vnodes. -%% To mitigate this, a full rebalance (a re-assignment that does not optimise -%% based on the starting position), can be forced by setting this option on -%% all nodes. -%% Please carefully consider any cluster plan created with this option before -%% committing -{mapping, "full_rebalance_onleave", "riak_core.full_rebalance_onleave", [ - {datatype, flag}, - {default, off} -]}. - - -%% Async Job Management -%% -%% This is a translation for mappings that appear in other schema files. -%% Mappings are from "cluster.job.$namespace.$operation"* to -%% "riak_core.job_accept_class" with required attributes -%% [merge, {datatype, {flag, enabled, disabled}}].** -%% * Mappings are only performed on elements with exactly the number of -%% segments shown - any other number of elements, even with a matching -%% prefix, is ignored. -%% ** The 'datatype' should be 'flag', and 'enabled'/'disabled' are our -%% conventions, but any OnFlag/OffFlag pair can be used as long as they map -%% to boolean values. -%% Other attributes, such as 'hidden' or {default, X} are fine, since they -%% don't make it down the stack to here. -%% Job classes that should be enabled by default MUST have a {default, enabled} -%% attribute, as the runtime filter only defaults to accept when no values have -%% been set from ANY schema file. -%% -%% Example: -%% {mapping, "cluster.job.harry.fold", "riak_core.job_accept_class", [ -%% merge, -%% {datatype, {flag, enabled, disabled}}, -%% {default, enabled} -%% ]}. -%% {mapping, "cluster.job.alice.list", "riak_core.job_accept_class", [ -%% merge, -%% {datatype, {flag, enabled, disabled}}, -%% {default, disabled} -%% ]}. -%% Results in: -%% {riak_core, [ -%% ... -%% {job_accept_class, [{harry, fold}]} -%% ... -%% ]}. -%% -{translation, - "riak_core.job_accept_class", - fun(Conf) -> - Fold = - fun({[_, _, Mod, Op], true}, Result) -> - [{erlang:list_to_atom(Mod), erlang:list_to_atom(Op)} | Result]; - ({[_, _, _, _], false}, Result) -> - Result; - ({[_, _, _, _], _} = Setting, _) -> - cuttlefish:invalid(io_lib:format("~p", [Setting])); - (_, Result) -> - Result - end, - lists:sort(lists:foldl(Fold, [], - cuttlefish_variable:filter_by_prefix(["cluster", "job"], Conf))) - end}. diff --git a/rebar.config b/rebar.config index 0be17663d..c57e19120 100644 --- a/rebar.config +++ b/rebar.config @@ -1,41 +1,42 @@ -{minimum_otp_vsn, "22.0"}. - -{erl_first_files, ["src/gen_nb_server.erl", "src/riak_core_gen_server.erl", - "src/riak_core_stat_xform"]}. - -{cover_enabled, true}. - +%{cover_enabled, true}. {erl_opts, [warnings_as_errors, - debug_info, - {platform_define, "^[0-9]+", namespaced_types}, - {platform_define, "^R15", "old_hash"}, - {platform_define, "^[2-9][1-9][0-9]*(.?[0-9]*)", deprecated_21}, - {platform_define, "^[2-9][2-9][0-9]*(.?[0-9]*)", deprecated_22}]}. - + debug_info]}. {edoc_opts, [{preprocess, true}]}. - -{eunit_opts, [verbose]}. - -{xref_checks,[undefined_function_calls,undefined_functions,locals_not_used]}. - -{plugins, [{eqc_rebar, {git, "https://github.com/Quviq/eqc-rebar", {branch, "master"}}}]}. +{xref_checks, []}. +{xref_queries, [{"(XC - UC) || (XU - X - B - \"(cluster_info|dtrace)\" : Mod)", []}]}. {deps, [ - {poolboy, {git, "https://github.com/basho/poolboy.git", {tag, "riak_kv-3.0.0"}}}, - {riak_sysmon, {git, "https://github.com/basho/riak_sysmon.git", {branch, "develop"}}}, - {clique, {git, "https://github.com/basho/clique.git", {branch, "develop"}}}, - {eleveldb, {git, "https://github.com/basho/eleveldb.git", {branch, "develop"}}}, - {riak_ensemble, {git, "https://github.com/basho/riak_ensemble", {branch, "develop"}}}, - {pbkdf2, {git, "https://github.com/basho/erlang-pbkdf2.git", {branch, "develop"}}}, - {cluster_info, {git, "https://github.com/basho/cluster_info.git", {branch, "develop"}}}, - {exometer_core, {git, "https://github.com/Feuerlabs/exometer_core.git", {tag, "1.6.1"}}}, - {basho_stats, {git, "https://github.com/basho/basho_stats.git", {branch, "develop"}}} + % 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 ]}. -{dialyzer, [{plt_apps, all_deps}]}. +%%------------------------------------------------------------------- +%% Profiles +%%------------------------------------------------------------------- {profiles, [ - {test, [{deps, [meck]}, {erl_opts, [nowarn_export_all]}]}, - {eqc, [{deps, [meck]}, {erl_opts, [{d, 'EQC'}, nowarn_export_all]}]}, - {gha, [{erl_opts, [{d, 'GITHUBEXCLUDE'}]}]} -]}. + {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"}}} + ]} + ]} + ]}. diff --git a/rebar.lock b/rebar.lock new file mode 100644 index 000000000..1222fd60f --- /dev/null +++ b/rebar.lock @@ -0,0 +1,14 @@ +{"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}]}. +[ +{pkg_hash,[ + {<<"basho_stats">>, <<"7E1174151509C64FCC1934120ED32295E14F84DAAE7F84926BA2C8D3700D146C">>}, + {<<"blume">>, <<"CFB4F43688690BA81C6A79F54E4678CFD5FDEDAB692F277AE740AE4A3897360D">>}, + {<<"chash">>, <<"AF02484F2640C653C4B9A8557A14CA0704989DBEDB27E7CCBC442F1903A3BCA7">>}, + {<<"gen_fsm_compat">>, <<"5903549F67D595F58A7101154CBE0FDD46955FBFBE40813F1E53C23A970FF5F4">>}, + {<<"poolboy">>, <<"392B007A1693A64540CEAD79830443ABF5762F5D30CF50BC95CB2C1AAAFA006B">>}]} +]. diff --git a/rebar3 b/rebar3 index a83d554a5b3d899fd25f9d2a0903da673c363828..b40d756a37ca29ec22617ff6bb6ccdd11f64975f 100755 GIT binary patch literal 985460 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 pt^=lR3bMvTblIqU@w% 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
(nKDc{<^iTWQ-OJysl-%aYA_v`ZcI<64>ODz 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%0D@t|7VFeO`i9~{s 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%0D;s-lWo^4W&T((fvg-71wLsTY~p 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

_CyEUfhuqbj+q$wJiG~4eJK32xQ1&NX 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

AY)v&XzxtHbX;6;KS%TUR4Y+)92|h?u}s$b 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 m=Y$6FgGv-~6 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 z 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�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 T^C@1v& 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�>gNKPLhPJS8}=HC&kYZ&@7f)C;qDSIO}hoi~bR>0xkgdy4Ku6ZYBJaqNEK z6CAr68;s0;=){ftq7eu7bjscMaP7{r(%^7VQ{m)7VW3%Sm~gAH1;S`U#F`S^RrjHC ztF3L^yHe=d=(6%Ro&X94Lqn<91w26Mb8!WW3EdFH!^eYaSft#9vi=uIBnffCVCFHr z`g_vug2T%Q=G>CZhR*aH$6Q?c43OHPDe@DX!#T~gB2UmuN z4qzql0=Gst^g`kuzo0-0{=TuxTYQ6z-iWI6gxhaHaCC#{UMTazb|Ab~;`t#=cVG+L zD_2%U>hOC)h-dqzx8W>=TAbgBUBh2^^9Zs0(pW87M9Jt!E^N*>#59K~7h94L--I`$v$GXGl z(KU=3z7qlk)O4sk$eHq3j16+W96O zqM%?W*3iJQ)m>#@E!cXExxH!L(h4^(bV#iK-UZD+8d$OB-g#11OU1FyK2FT=g@tFgAez!Ec(_9vHk>!Jd}D9B!8y@}7e`HHe5h z54UcLr|_4kdW-VwN`wM(+HE6zg>!I^pA75A+PCO$9z*f*&YQaxfpZ4=uU%LNsF7zj zSkvX96g5zo}=8hbTBRfO?EMR(?b-fc= zHZF!*G85zWc=!S`Z6XHkYSDKLrZDxHV}YJ|``&+9d4#i!LC?4nhT!>EK$n3|=J+7y zTo6}u+@RdKe;NJGc71Cv=ibngf0BEkB)&6*lK>LQRlapjfkzkYhhMf4c1%iC(05uc zjoSOM0=LmZp*(9lgRttBxx()4_Jpik8gTOouFz;-g3H)DAH-kNa^#~n287`QghKi> z4nJZ(P4?_|t!{nM6u)c~y+@nqcZOHz>3b5Y3135F{zY~Bo!r#|&j91;fcyF%_C111 z|L{`y`Zs+7GR2qVjQgG5DFJjr%*Or;!)F57ffFr_RZ9BJ$M|IaLHwEo;xNhhW+(I& z@B9Wl0!A_A-y_HS0jmnlyyYtxGIT%_eJ3A@>)}zKviw~Z{7cOj9o9}s z>$_|Y%{PEFG~2UV1~QnK=inOo%8?k4A3X7St`#R%4>ZUrola|XN^S3#gMc5ejX$;% zgfO@+Z~xh@dGr$zNNC;-(;3?mrdN+UX((|gwTbU*kuKn$;du(=3=M4jK$I$SZI{Rdl{6k6TE7S1l8BcB0P2JNshuY8yCG`3G zAUuzOXNBF4h0g7Fd|a$yJM}0x@jcC_eGYE<#J*zfMzEY;yoA0&pWjmlJ0NE(0`EI} zCxMhd@UcI?&9`4(KyiwPGRg?ruoqYW1u4BCbNruzUB{`!001O;0fZq@2N4ko3{2BF zgY*Cc6(eo_K2XHDUI>T?BA|UE2Xy9PglH)UM21}^%L2d$c?boxl`Rz=0mFxYA;tK^ocPCR@%Y1T-FraNPzn$JF~s;ouP&0f1SCn{Q)2k1 zgrg*!{6j=iDv<>IrvxlXNeT<5y&})CJHUCi#|3Ya7_>!fEve3;<#|jnUL*!c@Nr&lckQUJ*a;CJ>^e-(Rt87S~ zXZ8z0oG`-QFk^jbwh&xyyaIMY?k+j3(VJw@Utt8Y(}8kH!^V(qd4O_h!o~!q&u7plRk{g=h2=K@A1}K& z!x&7Ik4D!z9Fp!ZC9JRPJLq@wQj)9Aw_Z&a$Zg1qU5_4-fd@oU9=5l1#>_yl}&E;e#? z?>Wxd|CP>pFhWU>ZyeI)n(a}1T@TWkhHP&yB=k@xSNr8CVk~nEJYPA>{gQ3AoCI^p zn#`B8bl&$R49tY4r*go_I~qJ0AHJU!?!X-6RZodiueE)AzZq*MVsslRM_fFV?KD?( zxRigSxs3-@YaJp|h(U*bq$MIT&-FL=I(x~-?tKromia98iqO)M!PlE&zO|pV0?yp5 z{900}?J^BEK8i;5H!HweLeh~@MAy1p(y^iOTauV-%b}NPHZ5%G{>^cn?+FGcJ2qsR z{bSwLZ2ZX5EG#N~&V9AZ)^p(?vb~#+8BFnFqHRjmeQNh9HT;?}T!<}DMCPqD_i!aB zb#s$f|MC~$ppx#{Ib14wzKF+L&F$7WdW@YRx3;@VOW8P3V)wC^*rH@x@z_W*6=+*h z;?{c==HbMnH}u{_nYP?RWh;G;t%!+XbV%dyy$%VAs>&3COYuAP@$B%i9Isn8pwVn# zQ1G;!oa);O35~q>X|Bl?OODn~Drn{~>(aV>5%IKD_vp>JMRl_r#&emR!P|39r{4Ks zH+S~B$!#Pny2?Vu=$d8fD>5}-<=6?tTkx%>v9ivsnKE+`-BDlm*-O4`DlPuDDJ>1m z*o^2LX1O1k-+DeN+CSVSaHoF*9j%IZ@kAHdCS$O-Wc+X2V8zwrlee>)ArL_xLDYn zTT9fvl#rbJo+O9rRaKf*94bYQr%{J}Io7Z}FO0~GZysA&+ATF)M}&KrHi$WgR?wv_ z+jkbJT@!HGvoW>KI%)MA$LC#+n@c_5b4$v#br${|+A?W-jInJGw++bQCv-g?Tu!_= z@-?R?+Bfvlv^)(TYj?oLB+SD6P*z6|Tjp-X*spEl-?Za(KXlxM7dRO>H4!??gdNz& zB42~|^YFJ`2V3d1b_ZLvL-;^1`D!n)l|#+3$)oB|KCLYK;N4Rxx1C<-Z2$*d=(aAq z8Ra-BbH%U7U-9dSG^6@}E}=!y3DNaClXD3A*_c5#8tiNl-a#t(qs(?rO-5OirREy#-jN=uUko3qTlhR(Yfkw( zs`4@dbDA@!x;Pgm_jP^Td}bS+=3pK#uY;fJK2Q#Am1)`eZj`!0v$FeeTGdXNn4%1R zHV9i@q9ToquyZFxiJ*|FI0A#zrzY^RC`$c!dlwXo+dRH1X>VE_W!FMNn*Fv{xZ4NJN~-K9uTREg4rSqwjA=v?rfN&3qRb1@@s)cr`$h5e_RdatTYVJD1;J@zL# zP?bhX-XcjeTasddV|+ka;=WZsn~0rpUbZ;0$S%Fbkd!MFjeMq5uAhN|?q^teA@Z3l zgsK6WQ3Q@bi?lE*%J$E&@^ns4=jcES+LhNVxaR!BeNct_+p~vEYG6_-V^`Wf;apM3v@rQwfhJruq&e7fVkLU!WX&2Zf^`Xb%*cih{4qHJg5Phbz&$wOX@ z%@k#R-uv}<IN;j`_|35f@O|Mcv*<0lI3Sum zA>~2K>5Hf3uzmi>d&ijB;Ba$l_VjFrq)N7P5qjiZyFQJM)mqwYVMxX$fM2L4Ndnzb z5-lVwg;@@Yovq}fF|lGsCw=P7P|2-(^*7!ryf2!ktE)}sO!tJJLe2Vg%r-H0l8BthTdH0S} zPB@uT1}?c2O9fna@e6+9y*sQbVwITNrI;FbH<)uqsognE4eY{2$BIEca+r!LP~Z#$ zzx<&yUy3~AFXuv*^t0`A*BCr=Mb$_t+M!N6B5U1c=P%f*Lk0k)nXl#g_3S)N__XsdRavM`SF)UU2{$>ESYvyUy6`3g8zS zL-MphW+BsrnAT>VY#(QD86fB)EBZsW;aRa%Xde^d*qfy>S8h)p{kPEUcfI$e{r9D` z@#VGY?n%@vNl4k{hvt!rMeXx4bc+8Lpp$($g(w!z#zi@0h!$263fQu*hBjbWBU+%> z5Ic1SV-94@$nTc>lPuhG$53!@z?5u9I^e&}918j#7xdrPuAEc6F+VR5*YX7dFr}C| zE7RLblzObdvWeq4CVL&e$;1#e=^GSq71GNdrjIJ9E&om)4MHQjgt5oA<;R>2Awk+R zVn(+M)0(;vl3~L}(Z-E>%a-J2OBf5J(I)Nf@Ygj{u1@)*P5Y~~%eg}JqOqc;ZJa%~ z`%t5pibh#TkeP9C?40Gv(Nhd2fH^e_Yp5D2_Gg2V)X|CLg47l>!m^cOzz&@ipukF! zKuA4_7;j<6r!(*0t5A~+u#$4z-o<9;k**CwI5^MdHjco-)?Zm^q zw*(z*V7G!H%Yyojr8k2(9cTcHgB!C2$c!>z85(0IFO03X4;v~-tI0Cfox^2RX9kgi z?l8)dc58S$0aly@x0+8=sxf;^ND@X9n06$o?3V_U3fW|EOGv~##Th%-B*A9>jTam8 zr{|;`MkPUNz;@dMkA(*IrD{OZm>d(SQ)4oyrL`zc#g>9?Z%sdYY#``TCQ22B5o0zi z3lGaTOA)T0Fqw5t&HN`(R866-54oz;+c#nyZ2~}y`vj7{3mdLtNxuWMn&`@PlJa8T zUBz0R*06s+XF`9ZnC4kNA(Sd^9PY_Z>S`kj)FOqw!2ZhnE)#n`&ph7|Ou_fXU{}aLkJJmzgLYPS)Ezh=llxnewI- z*Kz2`c3uWEW>f%z54vBhvjXkzTy$`v0MU*c@vejs(Jp`R5FsU6sj_xfHVhY5D2&WK z86%B=ys;7$-$YiNt`7iHO$v-kmQr9TGcYgiSRV^D+&M?ByiPbJc)TjfU(hK15BWDG zO9Fp%vUs%B!Q(kfmmrZEf7@VQ$pAlmp18a`iFB&hl2ME}V+?)2qp{gqYIHDYf1|M+ zD8CL~9+hED3P9KRMFvl(F2$REhdQQcYN%3gaob<1((OR0eO@uwDYT+?MH=>?9qSW! za9KxG@`tz*UbYa|k2uEbq7Inj#sRaD{*?lEkvLT9D!`2dgn&f;=mrA;@mvDqc?`H= zjyCmMRDC!x4VVg2(<7>f;LyOjnzz5Tx&n9vR&m3C-<6@Xnx&sY_s;v4v8rpL}i0srrBf|QtlU7y%GJ1P$@^u`L*0MmE&2bV( z@;0-Qt2d|;;Z^%25F&e_>rpKW*zx0)apPkIIyCW1z2yk@Q0~R#DM5A6uSo#9I^^*e zafAv~LYnazs84ZVSXaz1a*0FFq|=VNkK5B@>rIA|Mfb4uM^E%mPy9zLNE(GX5%`R8 z;|i^S$*?d7_ZXTqaKdf6)q^6BWlNp|9=-dPX!cM9gaVf2^W5wnmhbzqswC+1K$zu9c0$G4|8gc*& zjJ-{Y!Z9}yqvhblj(hsTH8`O1%l*8Qh1l9oXP)6zb`>~6=E%CL_w_mk&-zig(hY?g zCCR~t|Mswa6wqYzVtV%tF;l4PFKJcL=n@e#LLydg1q{~t=qF_%7EnW6)Qip<82mvv zT`+~mmlTmOt^}j>JpsVBgQXB+5W|aRsG{nmqev5|lT12-_>=kbQdB`HVStt*ftp!l zy%e1bg;}A%f>iWKU~X>g@)$Eb1*3xwTEB>E+A^3fWQL9PqV+(_LZtm|Qxx)9 zEz0CI#;CRz81X2B;(8qn*VgPl4_l+C3%8KQLM&)Yz^s5stvU2h)ze78+P(KNMTxeK zg;XZ#b7iu;SGk=QMFm;)Q8-YB9mS!F4}+HA{t%g@1*$YdKS8B+1M9A5DmWz)vU~G$ zyU(~mz}{iH^T#(XEkKaRXB@v#ha${!qaBh^GQ)E*_rY<)JqoQor_}*(-s(btcNw$~ zmFCO>`V>O7?M+z%w3!BbPq;It*;l##1Kbpl_aS00>S{*YbVi@f7F_Djvow%zUQIVc z!C8TJX&|DG=asGT_k`-jEbhtP4(eYH?N^1F?-af_%Tjm`sep7`>R;UBKyWt3;6=X0=mK&z zz>g>>i(AK@r4X(+=h%6KRM><&gX3Q}K^RI9mb4^PK^+SEH8e4EktmjMn%B-&PJ>K_ zjht1IOEZ7d4u*qesE;Qw;=I?C)2yDMLWd~clHP`eLBq*u-#(YAhVQJWdb$9yReR0iqYefR}O=jNe4fxFx|@Fcr%gT)?a3TPvOc4D1`|JEuA13 zki&EYCtlD4na@qX%oYr`qFo8nv=hrxQFvAg+cvKh^g(Je&&WoC0YAFti?jrwm7|KO z7#L26LpflRk2%Z_s6j@O4uwi6(qpI}qD+EIbbY}b*VdbSKiv#`Vq2&6fCE%yO?~D= zPUf18eCCHw_RNL6dHMUgtup)&-^_U9v_QLpruSqf#`a(9zznsPX7l<_?nF=aaEad} zjb^K0orxE2{e2qXFYF+3OqJQIsYbnSclx7Um9^K{jkO$$@1&i>G|k~=L`xJ4CI9N1 z_vjNh(G|DAgVZKgU3Xp<_w?y_Bdlo6K9bN4AF`whPE^1kV@(+$t7a2l?xcPAg{&l= zYXk)ka(dk;-gSoq?iZB^V}0(eLPR{PUCv3;keW!np11fS;8g6(PXzCn0F3RM$pbQ# z{B97=Jt@JqiuU&kaiYCL?RIAEnJlKfTh@kW)R?1-?Ic?~x0S;3H?~&+{`>SYO6eKDr8L3rIXkCE!}8N@AyF znRx6HFH*)mSZ4C5Rm4SmbavpABQ{GT3J(r0Pj?g#b2>iU=Da19v7wVADdz_ZHjfSn&HDbF3r@I?J-Q6?g6w>s(Adr-=12Ydczas!dSv$JX@uRFm@C#^qylx{F z*Fl^opl-OMV`XN*0ZoHN@{Lmk2Fq}1zKtxb;#>vOc{!?!(^8Uq3R$QWjM6EL++*X+ zq0T90zmPReLad|`_cI*ScHwUYwX(94DR4v+i%Am1eE@KF zOdG0hmVV)8Z`w8hrgjdC4H?U19vEdqX^xjm-#EzKR*he2WnI@U0d1UXysD~Q9m=~6DtPh!EZu6j)CtiV?ZtET1h&svsdA@oXhq8tGZCW~@`Ua_!6aUdDB=kyaZeFR z?}cTr8%%3527HGndf4i}(vv={+doicuiN&neK_c;rqV|V|q0~ui49W`yg7sVEjKy zM0_VEf>N>SvKW0wCWJ8_$}PTG$r0m-Zf`}vEJHqU`F+rlUul2ehRc}zVEp^TJCscW z2MV}xI|X6;FN-^{VE9cAZ$0+FPy7GQkd>!L6u1pz`v<8BWJd}F00#nq0{Nv5)cV|HY$!&PPqw%2zvOogA z*y!wFF#UJ^WlpqIp;SRZ{49!YmXO?Wkzcv%Pwf2r^+@m4WW{XEZ`oyY8`DV_Kiy;z zVu|eMav|(K&bY(-`H=#I*+kzFoq@o{QH~Oa&FX- zu|U9NTjqZ%h;Dbv32uboKQRe!3FhMbf_$@6$1P-Yo6f_=;GXSdbK3;p__MniY`^{f z+Z9TIw^v?9AKRJSu-?{aobV+%1cmC#ith#OwoZg6!cORA*?pygu_!MRFmp@V>Q9{B zIJzPO8&Q2L?{7XB%Wq^eRQTImRG1J)6{#L6MHmcMlX}KL>->J!jAsrGhU|H>(baiX z>@b(ZY4>xpxx@Lg{j;4#aRTPl-U7LPuj~g zx~rnaQ?En;-Q4<-opO@h{VJLCl-V>w={!@fi>fax^=qmU$5;i>Sk*84m(L~bVT=`XX1W*gbR}#|FnSk;V%}nQzNCPELJ;B40 z1b>YecLd)mn&_ktZSWE^c8p~m&$Gujcuf$8ZVen_?S?Gpy0L#qs+5$Sw^pr=vPyIk zAkH?##F>`nsI))Z|@=s@9Zil6;vrO||Z`G`;Iq@nEvMd9?#OZd=K48~?-2Rl_GS>E+`e zS4q0kZ_aYRKCCL6P-pqX*Ao`o{k=PRa?y#Dhw((jnk4mlD`bi~sk9#T)MR__u3A%$4rV&Na zi@%F8I!}D>&8rr+D3cmEjfqJQHj(?xlqtr-H<{WiHUD5C7oIz#f0XWZM#G!NvAk!o zXdKt06!#U9tO$J8tDjk}_e&ywM#CC!jUarZ_gmXzrgW?vGQe6P!lJ4TEmx>w7yl-6 zWSikm&&A{|vI%uHo}yZKlFYiUVB|OdVK8aBrg=8b#QXBA7H{AvCr_b_b>AMoQ%u=M zQry&OeduPP%^?|8rVeDzaf@IJu#!8E;=EVz+JE#)4$cvwgJy=#6~Tv2ID;m+mpo(` zl@ii_8>A@>XH-rzK3kyC8FdDasHkRRwsZZ7uAQ#TNnr(C(rkV5bD8<}HPp3`(2!&< z9C))XKDI>i#9tX7AihspY8HCZD&vO@siQ*3hkJj~Z;kNb@FOy6Kk9bpY~ zqSm-7{P89;BB;40Db4e729{+)-7UP&@0PhqVs5M*T&tN3i zW|^K1p~G;a=2P^4!6YT3HHJS6PfYos5f5-P^vGIM9ogu=a>tz+VRN4-^e>tlcNm-? zq@$5FVnZuPGnOQAR>UW?t|PON$R9~r-UqGNYHM5{wHA3#*zvz6yh`-=dpYb#!H4BZ zuymaC)Y&OADVGeZf;x|H&X>8864J$-P*Eg#3u#~6Mw^Z2oKZtkjjOqpEpT-U|n@~fqRa)u<>sh(~mM5vBuO^4uo<5qc%}`mCS28m;a#$xeP{-W=+nmmi zj96Q0brT_8Xs|^9Fv{5z2^{pM80PGfV8c1PbrWrl=SRL+<{lbVFV3=ht_^<*?(wWE z4RN_SPv5>;9>NpcN_)F^dlV}qqPM`lPsBfKW-o9v<=T8d;u2||F}FKya+!Kp)Pd`o zKErcyqSadps$So~ToGdA{dIrN=l6RR{W&RbA`k9@msO-X8_>WbWWCjry9u`q;J=+3 zuK^FUdT;`jy5zotH5a=Qn5I z-!$UpsXscOEMrr?+;$lo93_3Y=4^1exilgssLl8Q*xAC!sJW#OaN%{fllL~SI~&+P zjuMaY`gQ8#UxsV%w}T_oO4lw0ZJy-GwLktq4gjO?LLe#!fI%?}LeMV-BH|QaANOm^ z>*H@81LJZOV3i`Rf-ggG4BhO}d}4ot z{Del?L(>iM@7j$QK|3KcK*H7|U8Tp3a3KGwN83`5SUhJ8+-}s-zvY zGXm*=XWM^sK(<`sxkS~XnX+_tF5O-0Xc=p%I9*w;c`LdZQ@2~yj`?z6nZTt$t1@{f{K@@|I(yJ}OWa*dCx4@i$=R=4*UH_mP`7;rWcKgE zf&K#onIKSnSDLlueb!jqKa)8h*v31{YuS#w%gY5PHK?-?0RT(OEGE}E>^KN7s5(u7 z%Dzug4+Q@+Yqh>jYC0|8cc|t{3LPI`-}7AFJ|61~gW1dcJpWcM$`P#s;?S?1aarE`dc8mH?g2B_$+XLu_1DYe8 z3>IYT&`B@faXBpuxD1cy#gNxV-Ki=~{n?^oAozyo+7XXD6OcA1>^B9FPDT4a5Vk0h)u4OOQ zl-&pXMWDpp&3N-?XcB0+y(m*Eq*tL&4*czsSYSEp!I?ymJ+g{<6nE%znqjyV7Pj#vY-!>Q%;2rd~D{wsn>)k8bSVg-#194|- z9L*&7pEw-#%Hy1p5Wk?TQ`19=y`dN2Y>d{`oMwx_Qz-MD7BTer@2i`)RA4=u z$*@cwyQ)-HvHV_CvxWMLkJc|I>*r0DccvI7YF$gzNPn9bcmC|Lg+(yUov}AP7Mf^4 z?&D=GQ| z$UrAcP8F>q`G@rKvV9r)1owF?d%!;{#^E+5?cvEHMBHiU8{hdKj1j0qzk@nxOpz!A zGV5H{OGdC2AB!S7?rNLEF3%CmB@-o@PG8*Hmh^n+X*22K(=1cJBYV~=h<28obr63( zR+YoQFDe3W+CG?EN7;HH4;fP{b?CRzp9UmcNc#xOL*&~4D$af*lgU^v&VGC4-b)5= z-BIfa{P7H7xEFdUHw`EM-T3RZL4vb9VzjKBN3K&KNy6mg8>v3N%h}1a{|!{)RgW<6 z`=c7!VIh#2^U;3x)zk zL|8X%?AEwutao{N3`_+Tj;s(b?f?S=W0^uNDr#k80p1WODoSfkZBwzb{%)S4bybtv zx|6}_ar$-eZTs+%GxZNY(W7VP>Za=>Oe7j(Q(al1t(~E+E2U6DpoG>!O zpq@V)&Z{UQy-g{qej;4Y2E4=IW>O&q8~=tFAvTp zTJpUwRvLqLBN-=1i8S9*H;;cXu#d5xytV`<>}>UKzMLdb4>}}fcEG9myzyq4WjB4T z&|&u%)E}W`l#IxoxE_+)0t`{5o^So^fDi_dVzK9$Dox0k>6k} zrw`9XoQ4(@*id54+Wl=+y&^mKD8SfoA&rFR+wtoaq3;adglIMjLb^$Kk6QM+)kqqo z*i!1=3Vo5$i3%t-Y~9R+HT)OyBAL_1&!PvG5Vef-oYFT@_zcD5#5l-BC8&iGRt)hW z4K@)XQzzgf9LLx`3%87?5$5{g?D#Qcjqhv)6o+tQl)TlWpp^}PRbNbw{Upl4NNC{! z3@v$3deDh@ls1xmN!I1MRuWKYk*mhaOnUri(uL_TOmW_zUAQRP?|k|Jp&oZ17_?~G z(qSTl)hB0bKE_SU)S^%)^r4Yrll^hQ_?{doiVDk$8U+eq3}SdNSWcFvfdu!gF6SX8 z)Z;HfQltn=Xo*&j^3j9&c4%h(LYfik;)H#YFcxERAgYL7F>zI1fYv3YRxQu>{tzZKeP0| z(qxH_C8RiVQ1bc?w*<4H-jxC=l-d`{~?_w3_ zu4iWWMp2-5uzgCoai0$Q^}Lp@stF6o+SjxKI=uZCn$2 zQz?V!Wiu!fd2RJuwcbqEh(VK$j*PD9u`ts{Rzub7dA>A|{aN;petUtZ$rRDx!MEIJ zc_h>sD1vo_4|qASr^^;uudzwR+Y~uSI44`V5DfghB{kY?0(qtf;F}%|tdiCf#Iibq zlut1#2mUI6(#Kgdk!van#FZ-gmEkaFUT*CK6&j7~b7!9koDS5Up!!0}Y^Q;N7tZ8YdwN)G;0Dij5nE}TA1g!g%i>ofG?Y8SW^@!+6!$tsNq4t^);Rp1tG(;Lr>6$ zI#oMm@TN+%2??~QMK!++>zJ3XQGuI9nt}G8o}U*%VpA4R+D))3c3`)chM<0EN7gU2 zre+ffvgjwyD70W190#E3g^w!iNZ*y|l06@@!-nLwnIOYBbxbk9i0q=jM5 z(ujy<@<{-nE3B8#$Q5|qqN2!xlXX_=tPFJ=y*%ICTN@}VxagqeKvya#E@}^_%Vjbv z$&n7s7dxa}s>Cd?=f0U#jy3)(UJ5S-D55EQuT+36%;~_UC0l|x0kZ-JRyq0vTw>^V zyfRG8^6}wlMov``lX+EE;2ifHqI~kfdd?S3T7K)4Z8o$tN!?MtsSv@Fdvvq@BTZmw z0%)<^f&w@e8#2FrivEWw>IX@EU1}B(8<)i)7%=*#2#&i0DK5q|@Cn(x`ERzr8Ur$= z^Tn?Dpyv}kzu`czN#s&(;KlH1`w5BL#up_(@L-7+ln60i&jQ`|$4}16QGWNqNtC8K zE~ZO~>EE||4>(PaphM-(nkUC?>;$=oN(LDgCLp<3Wy)=wgsYhsXq<07wxvg zU(a}V67EyFKkdw%u`nLCcxFif&))+m^`acVzXE7xVIBqO0l0c@Ua{UE(%!XHVuFo6 z0}+1L6Igl9z!sr*&KhPnbzp1GPhl5+XG(3&1K5;R$;cobCt$z<3!*GWBA6+E{#QH; z!C(26dB?c}r^WI_@h0taBP!*O+5TYRiw%HN|R)6CB<`a+({bT@4 zQ@5o*X4*0jUJcj)6~`{{dIDUqOK+?#h&J`9p8V)CV_1i$STnf3J;&d6(b$YlLr9WM zT5f$l?y6rLdxY-j&ciJBW7qo_Os#}F(#sqJ^xQ!{L7ZR<;=pT`_3m8#Mbq;HKub8M z;<}}lmtt7?D)U&tF9mD+Rt{~RbLvUGpbQs4N(0La<^>8CM384%+IrhqcH6${aN2F5 zAoRVy3N_i__RQUC0%({W{jgfA0+cR1BE}BTYB#$S^EwBw5KgcwaTDJC&<2%Gf*ep~ zJG<2hS-Jz z>_UiE&D6W@DuYwc%Rv_~fTM7j+_%e-wIhinq!W-Sy){A&gxGMpp6a6>Z}#h>o^M!I zN5*T@!a8Mv40{4@^PvUegMEHQIzxyUXT-9|Z-TS23=#qr#VF(#ftl0M9c1PQs>Z`K z{yI+8647FJX6ja^3EQ^QZ`_i1p4=N9Yv>2%f;ONIc=qRjVwD9RGyGi(g|r4;RG{1% z5>N?SoHk!R0X~QehfOU&N_U>Zbq*247AVMW(i!6gIopb_?;pD@5Xvo)114-vOhNtg zyfHovYDe6*+m>M0Gqd>~1IUm$bb-j*hC$i0d5}PEgVDX(WmA_aQh}iSWec*h(I23} zqFGZ!t1k}jF$=63z}V5Y4-L)90RC*ywgc3;<>I5~k$5kF$muA;y={b%HS!8g6mEVR=9baXMP6sKyVi=`U7q;I3a>E=wGbitM zqj-fMI2=>mLil~nCi2*&--X9<%~+xil6?0rqkCW+hCHRCZ$_GG7yGnTU*qU-fu&WG z4Ki@QV2~?B1t23LdP}9IOXxfB;gdqqM8Clq`w|pN{MuY!EhdR6y*6 zxU0YvfF$adRqcUsT6}{>dDbM0fZ+6bcs6!Z9~UXqhu;V#h8Qb#$^@Ra<|y%)lG#

44-BIrJN~vmO-ZZ&{vO^10kUU_L{7PY=bdU4 z=|=Xu)kKONNJ;>%4jAcgjGr~OsNa3S6djTZOA(x5o?s4{Ge*XV#vIo`_@)uR?Whk$ z##)TSB5@)~2-;%|cB7$5nA3OX2_PTL6ftM$aYCwNfpUc}%#d<_FhGY3+zRfMGbOlT z0g($+5jkb#F^Zoi4cb){(u1%fi@+UCLu@p_D5&sf&FXj3p8y->Q$^mkRCj_LU=_g( zJwf(FtbPkN1+ESWy3~-~8N682R=!-oRk0s#nt0A#GO z`i$`b4?Aph!$!|p>+M0nY%eB_)$G02zU*0~w4=bQ@6-Fz^(j7cjqEG4MY}Y$nk5gVFar`f0 zTWL8rxxPP>?7h8(#hNVt3LZtb*2PZE-p6J!!Ea@b#`zb$1#|BRJPvF)-jFFZ|%6(=p!++ z^^jc0Un+eMd!1=+vz=crdHk!M=3YZPk479Cn@p5oVV@4pvu{6Ay?!9L|fh zei_x*tAMwt&5zJtz1OMd5MugoU!|j>C^iauuASo+f^Dx3!%-+7w{xelI@T|u0$Dj3 zroMEyW`+|pKXn(6i_9cQdMiwTDgoY^uEzoW*fTjFpTlj0p54|_2miv|VrgPe*$dM( zVD{6<<#;G>sh9UHjhP?ENq@G(YQ-t)84>rmg7y?k?#rXd*J!V)?$?j__P}P7cn6VH z`)lwIr4L`n!_2~~J?G2P`|1k?pj6t|b@mX^fq{M_K)QcCs(a zwbRAs<@qUM@r-|c^ZWZ=BW`h|cBZv7D#q_bmo{5ZZ|C(d|7NDs2`;K|)FeWU*XQ;2 z7~gcqPta!({X`%9j>GrgqzE}COQqRjOc7b~XFu<5=h2asswXo)mM+WLQBbconUBlX zi)S?$1UawUPqiOs*CT?nt)IK`eW%$Yw(F11m$y*<6xQkT+V`ld^+Y1S%TA)EuqJ^F!8(%*0zh42G&h#m!9Rx5u1z` z_MW9prL4P&*05yUtqV6DN&ff!rwf}|8XUIciwZ4SNW}a!%p!s%-p`GulQbW$y$@>D zZZlz*rN3^P3vye&8?fw|j$&i@eG7}L&9;MgV_f&Qsz#UCfHv2spgyb=rL)ane$sH7A3~t*YASs1IakOL3X$b=;kdzV@o* z>T^zHwQ2vwCYlak-Ewo?sQlDEVz$>bbZTkcxc$P)m$hQK=xuv`R-5YLvNl*M%THSR z`0>trT+gHw*6|F!FAMPWe14{FjAVHfwe-3zum7sO{yr@6yLx|nMdXw7Y9xIn6{Up{+pR4cTI%1CbmU)Hv*zTEsxhuw?Xbqv znx!*HYn)saQ#H_1=dWr6W*ZkbEs*Yus4nUd_4Wy`*y`=*sJf`=av-_lf5n z#5W-@B{1n5;~V80$TiM0lxvu6oNbtGI$49g6n$2Cc6mnm!1#cDhWTLopnleQX1}~y zLtNu;@JlhDATyB?E~c5FgHH*SEGnK~P`AiFj3<*wB27C?g(*2(V5v~1N;;NsD)FpP zuuN2ypf1TOUS80w5WJU~UO<_kuTZR7q6;amPmWJiOk1LTlE5vFS(sk1S-?2^w~Xr? z*DStHeU)^b)Ju(*e4U0LA1g6dd?OhrIaV@O@{`z0&r8Wm%1fJ*n46HB#Mb%0=9bwS(AK{I9=U58 zj(Mrx3p8PkwiXpSIV>Xut|p0{Jl!H&g>-*bTC}ebCP>q|E_fvr!bB%hX$ca|CnA|- z6k%(!hAq}%0&trJawxRS6*P7}i6H~9PZ!9;KRe4r_OQQc!N-m64cCTU1j_re*mY&k19lROR-JccS)JDk?`^d8l(oSicBKb(9gEpS++c_?K#A5f;%=Z0HgjC( zAC59xLKV@TQP-UI8{L#IZ(1#0bO4YSiy37)nkPL1$+RZKnDTEDVFrm7otg0Jo`+2h zXF6tRbmvW$f_=NtRLGx8m(FANd@?<#PlHL1fI($FS?NxfCQG`Hro)|WYT8`LU|zZi zvu)XcGnsW}&4YdMXAE^n#7K-TZ+gw!G=9LGM~CS|I;gkoqN1*j0=@Cguth82scgZN zjL)#K*L?t^QZnPWF!DWyOmJ8s7jdriI)(%Nze&DvQc1H$eFQ?*K??CPlp^b7Obk_J zY4HeZ=@*~d`aT*XGiQiTB~Cqf@q+IIf{79~0kU-2`>Hxsj`Z-u1a^f`G*-H#iP8ZX zE#|*u?kY=O6>r7R7zEK2??1+GVeA3@|5r@~rR_Plm9)!Z45<6@$i+`g+Nkc*miV4=I>4#t6-Z znG%VjZvmU;cs(C8Uts2?l33yen)EA@R(4Er9l;ZU9NhZUeQs!IhO_&C&TT!T&c?J& zx@@n54QM)BwN1J7elYrUq&8(7vtgBdFg0F}9HW)x+-^Zn{KW6tGiTQ+X*zFt&K#(` zIovFq$52R&EbS;KoYD~8%R=_@2t~fQMFL@n2o(deoQS&$K-dN=>k=zZF&qwYEuL9q zYq+q;-kr%GQL2DhChI^0rJ+vaM6edfSAymdr(h-q3ytb&*Mz^Yq8Pxq4WpB`0u>mWy2cJ!~p zQXE0^vkx>GiX#b&!nLKP+6E-++ra!xQA|M!H(h`zUEC#;%XjGl$Hd|E@9v1 zqP6TelWJ$)@A`MdGIv*y;9JjeU-l@{!_EAs&IMg{;63>}J$g=+t*`uBuyXqP=cL7D zeZR67seS{{luO3)DG!jp|H>5TB37bfOii_h^uv-jtfCF9pNQ3>Pyz-Y_dmG|7wN!I z@ba`SieDhwG;BG<%(|-PipNZDT(oZOd52OR&}`ArqX^68HKdWJogTm z!f2*WRGr1N`p`Xy5+1dybm84)6>14ZVG~+)=~X+zt&iCQung%%Wq|kQ&+Ar+ty=}* zT^XoYAVMl=6$sc6S~rAjSYVN6=p=bbqp;6&ZDf=sQUCK$mFkJUq}kJ^?ED&^rJ z6zlTTdV=T;fmDVb@$`$FXoL0)%Cl<0ySp$kzu*Q1r(NZTj;qRkX_L6G_^FEWa2@SP zy|yh}=>=WoU2Tx+H1cW*=VBjbT`zL&3m&~z{EJ+Ph&@4C?B!9!%R{edQe5qoemRr>T$$LS& z5_w23c2AIFI;Y?8q^=&w*HGGxlpi7%Wz!Gh!o4M+HlUm|!e&@mD{g94<>eKPP={Q> zDrC=VNs$u-=^i!0RzSY|FoqOZFNAOVT+xG;BTG7G(J|pG^SQ4C4D?3#% z(=(3tX6qjGiKQW$BCup=V|=7nI`49v-}?3lJ=Di!{Hj)f-nN*9!pgeJ0Ki{(1F$(XJ}V5SBefbE6&I*7hcO%`?hISS-_?+S**rxw$MRQ_tlZvPi4! zp8eA*pbgJGynZh(IGU~dMxTN-!v<`HEb0nO46QCJq=df`dkaDuAn1}N*C))OE8^Lv zcG3k6DV4r}HnbCX#>@A`E9~H^g_wk&=L@*CYeY3Qx+IOh#xK8q0OxO5_09XM+<0qv z2h`}ZNTH`4r*%nqidD`%Fe^dPx;(Cv4C)f*ahxf#A zKilxaIa-f+9Dh!{fu7-_amjId4YWl|*NMR$Ahas`g!gQ&^LQ4(l!$s3qrf$Y6S;K; z+C#_)>0JK>?eC^VgD|HfF|m>%2v)gb=o5UxQ=2v!LP!o~97qT~Ybe>y2XLJUelEsC z?<8;4s3xfQ0_w{76FkogT>@M_>xBOxxZ6n5gol9}eC%s}U7e~NRZ`!cUl~ZN{E0kr z&D}-A29^?(-_;dDpt_zM-bgg~GJW>scHi?&?jHApv_ss)+fE)qK_^9Ptu{qO;)sPn z->**)jXqkXXMS3(@_tn_-G)*!~7IRAY<*b_g@X;F>7(BlE35 zqQw9UnSP(PQxoi2Zon5ha}1d!4$5z^?*5Bu!!C?Hu0)@gKi_$0@Po`(-V|~vf9dF| zH)a`RM8y>H;w>o>kc$u&O+lK|%3}N+?65OjAjMaHgV&;AK^1KS zxxS!~+pR*a>4ZzfpX4yqUwW3XjGEb6ci0UmY(55;Hl^nQ8B!5Zpn6&YBoiv z$J`Lgcw4Bc@@Iif*Q~npWSLEyRk!PE#-LiQEKjSt`HRD(9)F^tRU)H>6W3WKtzH(s zw&D)39M)sjrchy|HlaASERp6=?Oi>n3HnPx+xhErbnd=ZlN%X;;5`vEFL^|ffn{vw zUJ1{IkA}(IN6L z-7|79vmHr8%|s7mfDnW*lV+qS3*W$aB-7CkZu*Ej*Q8-xb7sV>JT%0+og-j@QXum| z*A3)D5sYfRNm|=4Y!ixbR-BZf`9(kmbs`tm{@JA<2>vjkPocnT*DSls*%vITF7X!% zr|2f9&@Qc7De=Z38ZIr$cPS0YQ`z;*66)nA=MjtJ2^wiq@XeH+UgTh!BN$rh!0^?r zKoII%vGR*AXhN$yL3QqsU;jH6HA8y7?dm!hzynD>EB>|!<}qNX2IPUFG^>12#6N@J z(nw7>r`*e0mtVSKIBQ1hir!gP;MJfBgOlkaUE!gee){zPtD5oqhd0@_@k}>JNPaqQ19xXUMJ-1U*7(%$cJ-?X03YM+Y$=D z03f~ARaPKbpj$`SK1B$YPJThQI!?E5){mJ!NLP6Mv@LzL!cP;Bu1G6H{S#oewL!g( zu^BL-CFo}o484f^s$xI*G^)qEfu$!5Un9-$)7CAGSv{9~$e|0UhpHoG*{u;181}+X z96?`T0!yGbnq<4yTY3-_j|vy{xiY*Vi*b&2_JaEninj5;j-9N3?|=JH1#Vm`QW*E$1%t(N7?--3P zWX39%Q}2UTBzVeVcq$ae!3vvUtrgM@Y*Z8v?bif*;t;SHI)A;tLUi24&u%)H?iA|HpUG3RwC{(fGE9NopC_BY>A;zO-=T-Tw};4{tWBHb4( z-KXcm8J8q0rH`KDH^dtG%7akq@U~!pcuS+mYXgK)19cc|h;)lOvGcK!GOTnZfT}<# zic$D<2`b~*3|a%j^{8nNlj-a=n5OGk;@O(g1R?y_{HH~OtHLYM8((DsPafLCEEKoK zl-Y=vLUr2H>EY6@o!@Ip(PZH~{nzP_?;ZO=!j)Zj!_AN%Cr{PMeZ%Qi zuHT&9X2t7qCE#BJvgg>t^;G2-UKs07S{jYI+v85#&rBz(&z{%K*V!@q&iBYj+syap z27k`hb8oKZ(*PjV=VSPjoAUWdh9IT2XXooU#)RL?Wb3I)Ty42$?gbOD)3N4x_FiDu z^V!q)+FE#eZJi;kkcdx1xjho#FUZ5;4|mLC5{Q)c5sr`2LXa@bNX)=Vf$1T-9gm*>*O2 zlD5tD34Y@?iqXUJzHwR6;P+X_|GmD`+Slq~alCrUeqHV7xQNK7>C$xe4EghUp~bDM z(PXNnqxQTNrS|<)=lhFuf%QN!5*klq zoPmB5jb;||{qFtja^fR%9=BBcWVP^58lsO)tZVg5{)hmf#C;5II#s9u^{2**3oRMvjsAiB z4_PcG(N22G;n!H78D|e0PK-k4SumeTjy83nRgq|K^P0)ZK`UHg-S^7u zb!wux3$EJdSO{`sFi{mRGak|>`q5kwY`HYLD?7XN9#&sV88@{?S}txPr{WfJ)A5hq z^>!f*rX25a(Ica$|5CP;}PSuX72`na!E3DP8*#)&<`4z&H^ za6>8kcyT@)aeDp1mySOK zUp&VCf}vQZ$;f2xf0=V1A_3BOp>5u~#Eag0+{{x_UgXN@L`mA7V9$81CCE|+9078>P z3a4~MHBHye53yAs>a@WGZy<(xnya4a2-R4ZAFyEEQOQ1M+<_AUu(zoE zNijHn3d9?AY^~r1znPcXeAvpy21{iwHhJn_f}6y&03jCCx2na2U^S{$sF#T;>rOpU zX4?U6$nPZ(^f6KH#L`C<7+^{wEkQL%nXq6W&45utFH6r^`&kNjQY9Dzvs*prE?s-o{7!{1GlXNN#!jBK=&%S?kJ2Fw=810*xo zfheFQxzl9{VUnO)AfgJ47RHknPc&o~SOGj$7lM|CB&n+OMhjEnAeuqZ|GLZ)m6l^1 z#P(IrSw2xbAog3B6cJ-p?VHi@Y> z#lf$2;@946*O(3{Y}X4@zd`v0y(0zJLc>O&1#Sn*0=2E^x?S4HgEM(wML(%USp^9= z56+9T0;@w;uOLOw2DAy?rgZ)>!Rad=QstnSQDOIBO`9-=>p#`zd${X?ilo~oK<2tU zh8W>n!VKkuqnBOteyKOkA9vrqg?2Sw%J%kp9|F*ScXs&vJZHRvei3iV8^LpSCrH1W z_L?6W+EkEQj+B-iBp|D=I?YWCHR?p;?bTK~EF#hXutiliy4qY`Twl;s%*hBLHdQV1 zO~;l&{a%wHGaqdqH_m!EZy%qvtHY^Im|ebvr%N3# zUA-Bd&jV&VE|)$XH7}2wd2Lq@e;#&T#CCoqnbqmOUMz;NuiI^NI6r12dC7Ty%;a3@ z&3-w00%qy6*>kzvi;ki`MsM1Bl(MMtw=;iE7J6p#@Wt#*YWR0`nt#2@<};tpKLx+` z8HKbernt_NpDnUTdYw5vdSn**I1^lziJNC4EF3(ddnQ`42+L%a6)pKjClWo<|4+Lk z@C6sH>Yq$5(EiGq!LtvU4?Y{4d#bR^RZ#6-`y^ zT2~cS;HGUuK_x7fgoVN)jVvK?MM;XKcR(R@2p?o6oK)OEP9Tk0`Wv#5&VW5-&&;50 z*-ion%rpfAZ2HX9g!yc+^Bj=oGuyV)cH{kld3mGUV$8|#&DT*Sr;>AVlg+jK5yw+c zizf9AI34c&czGKO6C&CsfC;I6T<*#6=1r?xb{tVGlIOiz?uuMqj$FTe=pBnJ>C~-x zi&2RTSKBVfJYCa&bL3Qfw2aXv<-cKV|7AEx!*bzLw|`>!bZ%X7$=W$t61oF5oBGgu zqvGDdLj2-}*^_as-QTXAWAqwwfuC&dzSXqs*zn7I;qlMWXr)-o^@+r2W+A&)rF(~G z%X!kZHi86mU3^lZ^Au)RWtnH%6}5_K71!C?)$+x1r>s|D)AGCb_N-(iV-o$bcO73I zagIz&QmB;ojd#U7h03wx!?I!1 zLc-yZXT>S&YW7Lp!1jHIcGgPOwpQ*1cn?dIM_(%UR{3M@lv*Sbl5}0|(OzYtbENE# z>YI$n0yUczG7f8r^2+Teex2@&+Hq&%L~TF-Uq{V|$hB_SRL!#7kOGuWq@L+Gzf zoqr%6))g8rl}@t4*ZI(=hc_qY@My@4j-=)D3b9&M+nE3}tOg=g2p&~3-44xder((6 z-^KsdRrR*2(F3^7%9ru9-6x5VNwbdEyn8W7WzfAZVDt&^F${<~o0P{tN-RU1E7>l< z=}&UNp>PRVJ^wL1BeOYBSsux&N~GM9{4t2Zjxtj+Oe<&vSD@0U${vms9a6H1q}(og zr0WAVSKzAL%^nRacEwX#Lo7{NSujV7fN?kA91T$5;%}Kt92?^6FozyWn&uEQRH~j@ zpQheUEOq6IIJvdBsy?1dF-xb%2VDfkXgA1wnxDxJ7rbjW*%8-Da01r?t%^4IHR^Jq zA+KQ$$We=d%ig-x>sJ20h4z*Dhrj7^M@;ocn=HAxX8;#hSvDsv*rNmG1|?HHgbgxOXMNl>mOHz)=nPPWD0e0zQ$)bOaxnA?` z*sFQDIB^uLtag@>E0U*Q_J-gWFE~!p9Z1`5;c{)h+^-RAW+lvf(Q8YLB$}?VR8`iX zs}&C&o-gkQbOzM#dr{KM;S?6N6SPk2)Z-^89-0m23nHT&(?II0gzR8gTIalLLXP%p^-6I6v%bQngJ_;3l*Ub^6 z|3A9UDL9m<&-Srx+qP}nC$??dHcxEZwrwXTww+Ao-tT2@&8_OUUAwERyLLaU^Og3BgM*SJN5Ou5b0aT*Ffu*Wtemzm!(dP zLEZi_I{2`!I6k+A^F-g~h#DS-H*o5IqD|whBUVFM9VjQw#4)RPxHDSo`gd+*JK(@< z(LO;=j58_AeXZd+;~d2>i@5c#ycl#Em1kucUDM1;S#gmpgqF-*Z>@{Vtg{1k5wvyS z`DGBVbIsWG--x2AA>Yh2zKo4$-Z&BV));NoY*Q1K8lK@s;GR{#ePKB*te(EtT8QuJ zxAeL4)dB^yCNO$cIPGi4;4$kJ6=L7ax{c0hZmjkDZurA)!jPZkZkDU%z*)nVBzEFE z{3gF8f0HC-ye+{(Gut?*1#f~c%BPq_4{@`{ z59}PFAfvSYcxc_*p!rtxASAFD&19YZ(CMQ4RE%}Y79BYo-Xsw~;4YG!!=kK4JxGiV z-lBVM7T{!z`&p1ke*m*>zn^XDbTI@6CfX!TrgGq}RR5yMEtB;;E9h?UZ3g87(?zSx znIxPV9F1fLRvdO6Ny+GeE!TWYcpmclz}7hBsH|{42&D*3cn@nOOyEf1uIpDcT)E@1 z>(mfvFK}c{ar9ij8S|r_IQ$$J8=w?G`yd0tr`+X*n@gAmX)^iEKnwOBfFoVL8NkP? zv{@-+#Gx7uGIkg_L!mt81s7-OI6D_Gn-S#M-%e65REnH6`VxS25|XX8jaE{*8DgI# zoG6=^T2yc7&t@a3!;1oC}M=JBt8I?tQrqsaxDJ zs<&J_9EO!fcNyAs$zkzUG#iW# zSjnA9o)hkxx4^fPxFt4nBxGq-YRlXZ2d1K3#)!m3ctk|e4%?X$c~WkG zIfVT;A@aBQs82KTBkYjA_)T0ez=#ZOXW`39OxJT96~kZY=>tPHjtAxp4xM{p7C^3B zh|P*^&ZN;ax&i9K^tAOA^G9)l$@!W`$YzBKr~ zl|z?s9}hcve7YA%Esj1GK4KRX9J9jBUjri$YVq`#fRF&tFY6Tc!qjr**55itSPgzw zqbO;%- z!w-;JVNCerXfa`l5wO$EWuq|9%OT)q6J{9<#LQ{@C@%&u6|D-cdLrICh3`;R)F5*p3v%Df!FbJy`hsd>x1oD`M_BPk#0 zoVOF>f>B0KsKV|3vs;!CFR{iFnH;lQCZs0GSwnC6IeEUYJKb}r5zrsfk($f&Iq3%< z;1Li70;da)t~jupgltyB%hlIlY>R=M56bnrBObQ6@sSIj$d&D}x^ePG;1NJHN?jH> zjaz0zh!6NYhwc<1$w8GNxPtjsoM?0v2DoJ0I(~DykbluhZMN&ROAW$-dIBhN#NgMs zOeNVqGi&t*hjVLmpO^FX3I@(oIGZ{Qa8L9iav0)7izEAEn4fse*Nd+{icXn4-Y{W{ zwGP#7ZfkA$k+>nToF2}*{QhYYi!s@%F39P=h@r9IS^o)O`D92zf@t+z{8w#|1M$_jR>T5r|nkMcC4< z%}{~IWZ-%07Hy^Y?&uOL4wAFYj$DHzI7Y<07YEhjDzf@y?BDf={u>e|2ZIq;N-PeH z&x@BmSq77E0?@`@yzE&??HRRI&>`OM2OUHP9!o9A31-JtXJ=l92J!-IXob{?#&>EKSC)gBaIOE$o22IW%kxB#@V=f~V%5WqQ=)z%&|2krfI%qFM zLamT7?8z!G)(8o!ik7~|d18JN}KR+0P9Q3!BC4JCg zuS){tHAneMIX9`i4zD12H4iBk<{&xk7pm3_6>ZiYY>sZ2TxnP|^OOW_kxE=s9HWon zvX0!vAz+pSLy5{-72f@)dKyP}<4w{;%cn^3iOdLxG*-4we*dV{ZwZM|UO!Uc^HTgB z%>}D0PUu*Fse?VA&3d8Q*g%NEkh|ESyiwkr8P`T?YPcEm2q)5A_Fk_4CU)IP+TaM# zf_uRJWlDDsi}dZ}l4|Vv*rn@e_<1ubH=5e%OT@yBM?XL4C_AH{@0vRxj$Yf}Lo>g$ zLuhIa-wKXzC|O>Po{%@_qdN|Ce=-^gi zl2`n_sChMtgUNh?F(UYoY%=t1v7iyag5r;Ds}a-OqB**VCFGT^afpgrc~cZfk*zTsB*q=gx8P` z&aW!-a<$Ua;^;fD2w$U+Q~Kmnc88Oo(-(qwTI~$m%Ivpb8h;L*a9eaI+s{$&Zzk82(7;}OY_CBBwFM{ve zb$5XAkAU$aN(aB~0OR}8su4S-C9Jj+ACKzcH{#TlyB|w{3wuGRrdO(_KH`FPlyFMj>K#V^a-ZOUK)-9&8>-S~%9U&79w8@wwW8H^rR4s)YEVGq$% zCLc&*u*bQG1!sVV&`fIEItsh<4r8?QuLC)A(2PZdP6>$b@4@1Pq#kQSyJHp|Iy2Evm_L&9bg^2P?~;=bq}?jD}Phe z^mokyO!H&bd_wGx{b@~6#BV=^Mt-O3{|SLJ?f-EZ9&Hw}7vg{c?*EbX{VFiLyK$zr z@e?YfBTh}wbMCqM3~nKvfA6}-f24%T|4`Bn;mQS8(u2j+YotK6xb2jpvlW;0jTb}b z$v+%Q|4iuN2A_ZDGV+!*Z>LhycLH7UV>b4lB*8fBE2W{LbbOqcH7R+|-pQEXHI2Rr zUv|rxE3FpSpm3h5H9Ir<>VL!f>j^X%b~h*^@$(<-mztMK@+j(0YN@(6L3n`x1ymyS z!~`}8f-aJJHIEfaCG;d+8&Ky(YZr-FVV)8U(1b9s7^tYZ5{=;!-l3$z0^3U7ut*hS z^@yibjM&v6UKR#7u-jm=pQl{M$<~+e$H(>Obq=?isahgQ2#Ms%lyxzp_2|^!4AeV< z+rwf-KkxzMbXk(iF>9#qldhz_Lzzz%Q@X%o=Yg6jQw42y)9WEG#s`wiLF?Ff?1iL{ zS=5ntNO!y#7vxV5IOy;b4uLtCA~S?WeZf&B{FyKW{1F;$3@d4O!bXWqe0(cmqr!Ai z=r;{RhbY8XjRi>r$75D)lG^~FAE-MVdcvIIsZ_|PpL&K}6$9O~g|X2@@)JL%&^Xj{ zYwGA2!mhye%A(##%}@k4+PB*di;yixkZkIIEwK!%+VXAw83E2TYl*X9gt^{ly&t22 zCV<$W)<`RpG)uh-eUyPeVt~D5d$PfA+AR=9y9g`A+GWBaEF03?AYICRsz!AtRp17? zm7e*>c97p;!QQEm9xYIBO^{tmSXcYRIP_Gk#fx39e}6D7E+D0wOf429W~a!fMjyJ< zWO$H{yXXz@!fpIlCH z&TtA#hktA)t|-nl5&ir>H%_}nyqWL1dRhW!d=IcGdO~)^JG@A_#3Od4KV3}^L4J6L z>>8(XU%3ui=dd(hEh8trR{IlAn0yFpQ8%I09Exe9&I=OhXzaHfv~})URTnLFtb8nu zxSAL

_dfWZeBw^YI{yIEz-@WGexlPny$3_`{U2XDt1F`xsG;d{ zYJ3%tI62tYN?O!Aa58Tv$S!c<&UESEJDN(URb%daSD)X|Tk-iH43tHL_gc}Pry|xa zAHw8o+%ouFXEfSAC$neDEs()}&JoW!U%frm+;0l`!Hc)+E;87NE2%Fto~r$0FT8^= z8#S-0eMLUuhiJmX%BSJS^yz0@w1>)D5WtqF5lM;{BC~VNJL%Sey~Kj`<~P!h}|5s4n2H$lAeJp!o?t~wxM}OPu{I#ARhN3ZrEQ*(qSi#ug8d8|*rUk#nDS6| z%f9hK4|})%ZvIoKJBy3+*bY`$rJOd=k!>I@CpX480je2dnL~qpL^JH^D>+gLbIGTQ z0&DfhiT=Yd$9e@D)+5m;-7nm)&aaQbiUpNvVQSmDc>yL!(T2?=1!HM_1SpA5kGxX0 zf$@(So0D0H8a3w$1Djs0;>jtjR`a?BiP=Ty?%6{T#1WTKfE*<{CJdLRreX3!a)VqF zDYzz{rECJ9UZruO7U?2Jeu^pQW&y%4F6S}y@{{Q5#UuEWAY~tDGiHiHUhB1&MPr3n zA;*NNyxG&KB|&vfkNo7}o!s2fBex~35nB#XWy3L#-*Vv%6xo_N3vPuHh)pHtp`r0& z_0^d^hF(4@-JMP=f$wZ$6u6cYx9bg>;`*Wkv##w;alYz;H-h}jYK6Zt`mfSKYxTy* zGl#`f3)_wK5qNBN$7M?00I$2z&*I~-BmZB#x# ziZZ5p-8dZm&h{ag49Hu3xIBBHx54Xsz&i*~5Bh{6LP#XSP*wh{c_Gbt0WuT-m{STM zS^CV@Ay*1;%XQe6d1&YQ@JoYyYw&i0%uW4>98fuPaNG7ko_i$Ofs6KNp8Gu7fxfT2 zFnuTX*ge7Gw-`MEcKe(>!qiP-f3m}8IFNbgVNde#-wg@C3>ZT7QAYG>=!Q+&aFQ56 zl^sw`_q3*lXqF7a=cc>-PZb5v*dxxXeqS$YpK7oG1TOA;NV*LhgR92|4Q>rI)K`X|o#FtT0qAW8fWRGg@ z2Xe{;X-yBK!cSxI%)<`n@Opx{?a^xn%GsYx$*TS5aI&qLK}c7B*zYtF6`V>3unc zmN#GF%OqdH+%D-PwxnC7Lq+Nc%1E?v?;6s~DMPBML{b&2BBY8tmAY-cPMt>We01Th zfm?aMB1OArOM$XP%qgU)wYH{>Ixx+`I!v`2zrvyeP8EzR3Q`#?>`vJ#t) zgYvLaG0))B{n>!~&~zuVZN6cuYfM<9ZTXhMeIzMV^%ldmno`o4_i{|~{qmi5zV_<; zd>PXO3baxC-CEJb(a7^z>ypNNmW28MYVA2&w8t=HhJgy;n2Gbi(@4sT`Fgea>{HDN zDlavHR^&n5sl3zz#k(ob#IiSO3caaoahWYm7PVPqc)!fa1MQ-)igIBasAg5DP<`Mj zgOI^NoPOSdK2w5zy0wgmvR(}eZ(0RqyRr%W;9Obwk*8`L4OOEVIM-F4YDM;)W3g25 z&O`gWL`_v-<@!`IVS5V8vA^mh;hH8kue1q)$5C{K=AE$(q@v#XKI#ig1yZT;_<7^C zxl5Pe?|hyEvW*z!Reni~D18{9^oephI}EW@kwhPD@%?pCmK}x@bp~!SHkVTp$rJ^8 zrS3@aZFwK_-PEN$b0AGD>x)5_r zjxLFe*B~+lNtDfsNPSFJh1~L{dcg=vtJtBNDZYN*o2xM@6hK+;Pbxaq;?Ht1!O=0U z#ZdNa>4GjPd+Ln-qnxBQi;gR$i4Ki$PcWAkyyZ&t#*mv0AK{=;3-Bu`jg1*dE zllbBee8x8q3MH-TNEIa{-Z2gl;X#7pG}R!vYg+TZ2wxvLeu5kKD|C5fM}W!-^?u@M zLYrhu8~_Y3;gEHZhWXXq8I8;kXqQClZ%BpwKI_(zT4MwmfjZh47m}m7T{|hhdZVwd zeu5b-ut^y~M~WDiRiwBg3`S=ngA$!%$gWb0V%M)>vJMo6A_ws!#EUV=?l2+-Ta18g zBM%?h^w$v%#?SOu`rOzmgU)Q(4fhQmn)Ibw92Bwz7-AjDEG8T}LUTk`>ZuR@y$mI> zf;Kt}kg#8bOV|=}M#VRvAT?Ss3UV=*NrePrtq7XP!&^?U#X_M8s|1bImjngL?ba=( zxFDg9ZqaA_`H{451nzGJ4a{=#w0DvRWqE-fcbj92g=YJ;J$q>mgMY}8)5Rjm zwyd=Fa`5Z3cW%SCvH8+ZVe!w;VH;EVKI_@}_4pCk#W&JXZCVOxbriV~V{Bquo<+@G zL^r2SaX4M%pQT z|AAS#bRPT?TH6w*9JMZ`+ZREPr%S|fklBRHnl@+%fAFYd(2$;{fGcb?Fosn^JOGw# z+>Ms}SOcV{)Zjs)pBFJZ5veMN!(%SII_1$H2K|Fl565MY6^@+nN~rO+6`M~sWJ8u| zG~*Z4#hb{pfzB4UXldBOyeHshJH%yLhapkR2D?JF=8^2SrQhhYQ&EAHrpgO=_z=Nu zt!!v2q@=4*C^D~+r5_d0gK)~pXGhEuhd*E#;vrMQV*Zlla*T+55Wa1frQe2-|1u({ z59W-(J&avhuP1WJ_`tz~lOi~aT7`_qwP&EKj5Eb(mIrb=oX+#O$`!lT@#ejV1w$Fe z=txojkd<(R1T(c;EnLwTbnMJx5Gl5iL#lzq$F*-HXavE>z=A$Fx*%~sDo^RdW;l)^4_IWpF_~{0MZ%l+2`6bOP_}qiOU=-)ov|( zU)E2j5Y!_B_iotl32+Lu9KxqpRThh^8m2#44z7a!*2OIFlq*mhuaXmK8B)}tQ8x*A z3Z@@1n>HaMw*y03xJMUC7%Ox#If}X{$|O(+5rz}1eE9@w+8cY~|2$fH-CKA1s`&G)TtOYT^QXi_(jMG$}-aON5 z5Y3f%g$CWyj$`}>rt>adx7{a!!|H55Eh|hG_5Elj9!YHivfeZ(*}+mb$l7*k9yUqV7_4zb`2Rh~QoU1lX6+gunv?q2_4l;2 z1lci$xemS7eUE5^A3^aTs9Vvk46A!wo~RTmlnjrIsRh zQxUGgl1@e{<08-WF>Xe{5zJ!Ob8R>;{ZU=|LwSzpTj<)Q!@2X9VGXw1RokN*5sK7i zn*8>KOm#CW;el?+6&oq<#I;VbS~+lA#6_f9-1{%o(!0ZuePfl2R-H|qW|UUkJ5RNx z4$(@q{$@G&Y1J$<;G>Q}Dai&ZOxV(Cvq0S2mg=dXP#kn>30|Jtt2d9o9564{JZC>s zoduX@>8ukJuh6MZpvmvvu30zGxy}GrQcs~e# z+})Zva!8+2eUsnq6DMw9bFj{0RT8f{fvN^gfVZ7KzG;EXZ$3TZb&}^mzP+V zJ9`wlFc^0k+Vx@Jwy-_ObMR~~3|hALRT`+DlF!)7B>da&H-;V( z2@Cr8H-5`!I=p|3*?%4OL{OFc^v2B9h0*RSR|mWVx;k(&3#!vPunD~I^bp7kQ7GHj zyZ3Oy+LLli5A}@T0{D|Ss|Ryn2K@6&OQ%^QX21g4d3l?};?KGb1My1k@b?=&2@8B> z+rv+K9Sp<`o;Tgod-|31bERL219|0i`g)Hahy_1+_HyH2S3$jy#0L9%_a9bSec|?Z zQ7$RZfxc;TdohP*LBA~`{QlIL={JGCx_N)MjINwc9v7E|ljt~_w&IrXZYbKM-rj{H zJP0#qbw12=CJJE4F^3YXr6{ap;esi28V90j@y#tN>zp>-LWV!&a7%SrDEJU-n?-63RP$y>KiPEV_v z(oRBG9ZuA2wnkv0CNVK4%i78Ir_oYLj@T*m+#>p8SYUU+sdn^ITFf|yC|Y5r;=A3z z&$^uR6dB{pzi*MsXIjk?hT`=tI=f1{{twQwnpr=TlKRxFRlsPxJyNVBXGR4@i02x|5XTMh1GJre^MqMHrYq47cloP$e#L(` zlJ`b|-SGD~Odp<@KcFR#@>hTz1)obNqjH;sUazy4gDoD2Kkb;?7InE#BeCO}-+*x8 zuTcm+2`}%t-19DuR7!}k3qzQ#o<^e%`J;rV!d>KYo!LJEM?Nywg}rqL4w($h2cK3! zUrKdx2!HSx{ere->*5s8T}x+b;vVc6D}SGv{FI*H+0N_LZc6M8c-@k@1Z+<^dZZoq zbG3IN(syy%&!mF&jh+Z(0%^_fLVps@rf$sx>_fd+l%Tipjhy@7 z(mM!OT9w%qFL~inU6)SlSnvEW!yDnfu63Q?pbq2=6~v)@1D=ob{RpwvEFH`8^!=_wf8aC; z(7O}-PgMDeA`rF9v}L1?&vDOEue8hRKR~hFB6?u*FIS(r(IJ;2#F_Ui9XYo^G@rGi zq7EeR#MGXd`F^%4J3GI#W4~ggPt_b(hlOpU1zv_3E|_Qb{#1glZi)RH-cNkzF;=tt z8?dwu4qWdvhSLw*Fsoj55RKj}z>xm$`RN}p2?~@A?Yq#kuuUs6Dfg9O0^MLS9hY}@ zozNA3Q*)1!RP6b-maJkwV6rcsrZ=r#ge&W5@pq>tUqmgTP37HoEk5`wZyVufbdb8J z=4m2a;&JJ@#EsC6Vl3%Q?RWHZiHSB}^87FXn1i zJ&F6|pVqO;mZ!Dw1f{Kd3(YZUlXk8BOKBAb9c+Z}Is>#_K^)gnSr zUMJv|oA`C*V8#_5IzPIZ*vB^Us|6{}KQ~P>KfY0Fb6dLwN6pjh=A6|(TnHa=E^hqyZ->9@nJK~!~PxQYl z^m(wB-E&N5xuTn8N2T+I8^@5eN#Bf3YSn%slSO_IHZ3dozsonmn|V(k%`)$u^D9utbXXNu*O+5uB3tr|eD``#Er;OGs?_H^qy~tNu)w}s7 z3vnS!*#tgnlSQSR*XCd0sjxa9)XlyMlc6KkOYeZRNq<)i;#TzXk2Y{he_Gj_Yg)cL znq;1(AGycTE!JOunaIBhmK+ru85DJt92Y>3aFAwH)&(@E^AJ~cDv72*H40B?TCK8t zDIGUAQv>}BO;bQYS(TL{3fe$X^9v$W8bQPQWOySHiGUFTXVG(Tv_OQy<&{|q4eW9s z;6jV{(g=Fa_LCg1o#`y*Bm)dGe}nW^3Npnh^|r`?+yUu%J@vM#4~4Gs)19dykBr%Z z^y=FTD0O9bC3gxl-sB$Ukj{Y|iY*kn4;@sxLD6!mVR9!A*~kf$0}EKSCYWI-!82w# zUu?HUB1-02N}rUf(Ob;>b#CXZOq(BymWQC{kiUemu-~B;s5N*_xn*cFxm6woa#S2? zxD+^7AN`#KcjL<@55$$yQ>8szJ6|RWD;CneA1f6-F5V(0s}%=H-A^&hjp_Xd*B9_e zS~y`P5R>oTBRjf?XkOo&tGc${ZD@2g4zv&7m$m{{Z@DqugD3d3IP)9QqXgS*PZyRa zxtY(~5nZmt`07FQ%VDp)6hDJD0)32T58bkl zvcutGZ|z3O+KnkP@01P6*>qpzlYS?qitfasd5Is{ZcI$Zvszi2YKi3a(Oi>MW7sKs z%T!saG?P;dipx{j&Sbj!E^3U*Opb@Vd?}g*vS^DO)yb3)*+ttlQsr6^%%{bo zvyn6L<5`-txZ{>*(U6)}DbcfJ!QE>hx(u1j>nAS|9{H4qfSoctid2oSKc;hkt$nlV9Z7y!86!TIsw<*{C>O8@?b$_NB9h;5~fhCI1}p z@~{R_o3^+z5kpiw-7j z9}>GCvsIFalwe$!my)2YPhz@<mhe3%4k9a=ai;PocyQ0AP+W1 zfJrp?+ea*DEbNvYs>=awR>u6S`Xb>5AN5m_KCPz2fX7mKO6T3{y*jAoHMAqSR?>|E?fYB|Ngc8 zuSo(IXA5hm|C_$jgtkW+&Dfc*YT~74ow7s=c89yX#|SP$>=craXlsTKc9#&M9uf{+ zwsa+-)w-f%rY1BTB}C(+CK=&qN5RC#o+0b$C_3019j>|OyyJ8Tzp)Oy8u}fboF;uf zqG~Ua*yeOl^4;2HZZsq;mr5zOJkIU?`TnW>QGcmwaeiUrz>)q7A-d_-a^hy^%#pq8 z#DTNkp2?LwcMzdX$Cn^q>~dmHl_XMuBwza2buD*xoLoa`&XJT*@LwZSem{y`ut5q*F=2D`^lIn zM`}R2%iVyAIXlM*7SD&aR77c-9Dq_OOew>ishDu0=(H_DMhW!OvcZ`nVMTS-osBa= z&4sSi#Oc_Vg8>cP2-&io)y%e0Wx1&;bg^9KJCpQbnrV2msm8n0`Y5~vN( z8dSDW^48dpqPhX|2|}FKoYLM%QWmzd(gTFBfN-hZfVDPSNtI3`d4|f!x0AUX*BU49jrP(Q5`7=){ zW~DkcgYw9%cD2+3MT`m@c^q7&LzbXCnR`lE*;ETlA#jSrikd;H6L+FgBP%*v*}Lxf zo|zqU61=ETw-?vvtE@lzk7Au0ZeqlZH#s_ASKM60DIqTsO{MHuwl`5?x8^`ZiE^W1 zOG9nf1%JUgmJXA%mHlm(CGu6wHK&R}RUUitp0!F=?8;=Rzk?iogsZi=-Q0-^(@m<1 zkdZq&+MeIh6!9sLLJ{EMOG}QI7Pdk#HK4a5t5UH5#Y@Y%*IQEAynMTPZy?N)Dh3%} z)J~1M2H)NAMo#o;Ox=U%%e4ua3_YJ?McX?42yc>>-vXL~*) zjA=B;rE%^dnDYkNjuY;VhwAI#2F1eqa+oJAsSGF4(4;A~w^N{#fp=9=245qn=)1z7K=C5_F_m<_2x==`qaD-{fApzM0@{Jdcy$k+ z8^8{93~P>k(*MbG&NQkPbWTX(r&PT)^d)F0q2E2RtVCq80`i! zMjwbR7q@5KW;MT8l5MEAKr{~&U6yrcw4%EMbgGx;X@#RV-mWw~ilFTsBF#0N6IufS z>FdVgkQQtMqX#lTj)5>oo2I*{Por&|qWPPH(L^p{Wf&2V3jEE=3!^19z=#BatmhBG zhnzT+3Tud{Kq~gh5kcx_Z|*@AKWvZwz{8E^@m}O3c*f4WZ69hnXM%e zgpftZ|8=lPo&d3>30#?@Qs%qDKZ9f6>T?-POO~;}WrgLCD_^zGMO9?T%7lhd0t(Xb zlBOmq;@VT-vK`T$Vgz`P)t?q+-z-Ts(9JiVAHU|@VU?S(R`0e6wL&0<4GFX|79 z@2!T!Nk}{$)d}dih#;fe>7tFblz(tO4M3fKz?OYCkOrj!ByNS(hA!|pkBv0DV#dH{ z%*QswM@+wOKRcYVB#pJK@`FMIXwo!GIW4EA1yINy_So-R1g6TKo3pi-``WdagZ7hR z>3r1M??|;FSRd9im?Hyb6{u(Zhq0vPKy~8a*@efi7)XLf7{GTRjYKHFc1R*4PXb&W zW{PtJi7%T9G2f-YA)wGVtjGEz&LjDLiil?1j|&FXA@VODo(ma7jF^ESBxkxUhBs=k z>J*LFS3Z~gh7-;TrU{S)G!cbIQYvZ;+i`)356(1CQvjG%0lDr3(T&-B6XKt@qxLNh zy8`o^D#3avWYC7CKx=0TzH{&=9NR?TZXyl#bR&&5qg@^vvV9a})O6Muo1*cwJ98hD zq6T5A8D%`5d}57x$Qfu$Ia^*OB~Fy~*ksq4I-=G;S(puNV63g`qFL|@Nj?FofqxuU zlm(OQot|?`czpIv(aC7wy`gwGs75Du+br5g^nP!8kf^`OZOW%L`M@^jho z7QoYuD8vEF(o-%pI^s6XgA>I?hZq8|{g+IhNd&xLP=iqtwUiVEv)2OJfIIJv*Lz-Y6}5x<6Hs3OX6Mk* zWvz?a-}O$VkWi1vY@uzfal!krt!nt2W`ej85K-ivuh^v`k)m5{wW{7!!!u7XGaRu{Fv zEL;Xzr>2HC$T>Yk^JwTE1<^Nv!wrP8`iJ3C0^-`5+$zC+(7Nf?bV~z=7<>^O=8f^( z48n!Jm3?%Gfalwu<`y=Nvs+jo&t|mOIvNHO$QmY8B7jTaF8Grut1BlYA3$p^CSJij zte2(*ubO7uvNs$LHPoICzB?s=E|&8uxF%riD}?lC0wz$;W&RnGi!R) z>j|hZ>*tE@M-60;G9LtPam+o!@%}uYRmwI1<_{XskMeaa9)h;j0iknxtGh;mhFv7g z^ksLTWh*Z6MmS%4EjjJ=_+9;l2y@IV)6a=?of zE`UrpfsC4vjiTx#wxu8z!pLht@EjgFf%!gBh42O-?2x#yvfRHQ>X%6baA`tg?`<}& za{@vBX8;@=^%28^s-s)r_2;pNMP3Nh*C2R?a|mZ`QYNSi0q#;H0k;Z5paqFYg8~rA z7>o))kFbIr-Xu?HMz~E`I}S(%D@^62-B*s z@qhX#!HS`FQ7T^Odno4!8x5iGQH=z7fUI(B{&3T9ZA_12mdT!$-;a@!JP?amr^{0SUZ&VK}+6B;|7sMD+BB!SeyU)@`lvm z*4r~1nzzOB4BO>_=031|Li`9*Hw^p?VF8puaVL;y-5_+KC2`zy-eaKzRui}C7QjK= z*jv|7_GZRA@2)gp9w45GHjZ)|+~kCArGc*$qCQO+Pn6J)W-vf`ivaJbP@V?>O0^y! z(Ee`$>8ZGI=^2$euV4RrO5 zJgVb--Q8kO_B0d0nIM8f6b<8)FihC40t2i&aKu7rxxq)YF`{K3M4LuSPWsdBYH8=3 zuaqz*tvBF}OcJWGvUI@ow{X}-~444zgRXrDgMH;$-c?5SJ94H z(-i!PJe3u7{)5=v9^O+PPS$eGDcVzzE-cElPlPWP`8rSJDXmDu73IBYxX5kbyzX!w zP+vKw-pwX^H4?eB5R^^UCT82eaZMex^H9{2Nrj9{ z)M@rEd2k}%z>Cjp5$=y|-1IK2QC4-)*NX3ssgW7RPbK+&M$77s;RSX6CvG`U zl?fkwExl|``{Cr(b`&<%b@-R@_blF}Ue_;mXNmt7KL5n&2BfE6@#84tqg3t$|Dp@w zv~!r^XDg%RXYD1a_L^V&>l6R`bzk8n4U6vk)@rxc-NM0su(rjU_kCX+R{gK<_Ng!P z+gvMO+uPxZZPs_*%CRh({Cl* zM^20JM`uyjLl(HJ?)Hzv)nsqm*Cn|_j7R>)&lY}e`MKX^uCU%C|JOc?E%eE4@3-^L z*m%;!B0RqVkE7wF9a|3zf6Hg9r}_={%a+UiA^hvS^vz$}J+?2sN%rfHOD}rgmo&Fe zHt)y0T0`gQ7UC~@^`5Wi$xC$k=b!LxmG`h0zt@}(c=H(GleC(S_ka7Ha8@tZ-mP!q zwSRs0p|djLzMbEFj>o0H;Cq=LOcy?8g5OZ-dw^eJ zkn3MIK7`!2Y+9W)4yML!c>J+EIdjaCzpzX=)aunXUlj7K zFR@LPYQNN59mT0B=@{wI*9jV*&h+D*FW0bGP|O)0dD1?RAgeJRbt-SF7i5LB)((0=DE8ZfojLoa}?3h3Gc(wxb9SR{M`BZ6M+NV%Ky*L;r;tz_wDXp;^$y* zUfR!-hu7)o-m1TWd-UyOCj0fFRgbghF(Itg&29~U{bOO5fBw-f&DY2I!Ot#BvgXR$ zeg9=g;+HjTtDo}l5~ut9@7hoAZs%qa4_E37@SHS75%5fDwAqjR^3#l}UCb7^HNxsh zNIUuBprc*4CTw#S)*jL}T)7RAZt|#Ya0`Te+$Xd%q%-A%$BmnPdb@vnJZGC#jmFWVQ;O zs)Q419EpUk#a|Y^ip2OP8Kh!WrI;lOn|Rwqp#?UJ&L-gv%B#eVV!m?a4eH@yp9Ozs z0VxUMg|_4rCMDet;dkycx$6t<=*{6~hb(>B}V1~6h2j;L!FMme#;Xeh6Ea_oXVMp`8 zL^<-s5QB)3DB$r&dk$=>t}zm)GYD3BSP`Q$$1fYfnsrFhfk7!vGBy~5VGN;*g?$w% z$uyYYL(E~B<%4?Po>M7nf)bJGjC_n!5pv@}i*qd1fk*h^K^Ed<#v0iXq!pqnq}VD( zL4PTtKS-+YPC*@JcmD{0s32d+7d3soK{6!Y&2>0(!b!oHpNWv6%$!j#?A?WXk))_8 z(`~4NO(RK#_Zlqpb+}ShWkTFYwGO8JC2;FwTZ58SCUB%h4%*8C^$jJ#Dw0`IRi=RN z?Aa7W$FG!eUH-sfrQG3{1@svWu68 zDsWVl2LVRPm$wAG@0b#SmuXFvV6WB!`^C$RApKs!E&R&HP;DJ1BvEpTkWT| zVmTluxTJ?Ay?Lbz62_HDETA`!=e+J-i!SjFt)tc!+-b8>$QDOdypgp`9?7U8hl7?0 ztl^@_sL;JgoubXcA$=nEyrqTEY3Dg*J#oZ;$ zUMnKtUJ#*t#xEC~NqC{0D@_YHLri$hE^(bPP{g|*%E`(tV+jl}pu_=MV5E((B)nyL ztn2g~QT)Xw#+hR4E;Ow{!wW+uh2;0j+}Z^!8fY} zCafZ-k#MKJU~a+6=rIn!7w(~H*Qx8+2?_&}Lmi9s(}NQ9_|L}ZMdGNY%AFWC@drv84hncV;aH5(Hmb8p5k zhy?24HdDID?<=G7W8ELnrFgc2z|2@HJ)@QPuOi{u%Cf?~Mvkq9?8JQ(s2t`=H*X(x$c{4cfrVPgISn!~6&QLBxli>jj)mR+jSGUn=dy{kDpS(`gq zgI}N#OJu8#EX6Kv1&gf+w?ID71|GU9kx3X?2vx5H54&PtT&<8~EGLpFDFNhIn-WG+ z*^G0W0T+wG78$2UQ%Kw~1u{$Odf*jl~(}y(Z zycI~7B)WwF@lJnSuV3FrFfD*4t!uIYJ`(`lW;s%pIYv86m2PlOC()nMuN?F*TZ}mf zR=Y1fj5*=~yZvE3y93p`ZlgJH)ij`SKJ+;Vo2EkI%D-Q}%kg4V&APwog7ZCwl*&Z4 z8>ayS^E65UJZ4(^1Nug82siZ7=S(mr>A#SyJ|SMwk0bt-UFc>Qtc*P{q?$;NbkwN2 z=X-X#+6$prE%+C@V09!T0Xs(Yxzd>x8nZUFf&;1<2x2!olYHmw9;53AFk-!bjxgeVf{_r5e4x%m0w=+ptjAoo1c0fPNO`)hjFb%Chk2Ma*swRc_{rX#wc~vsa zL0X$Ug@s}C9mz+Q4WzJ=Wz?=CIN|FBHvjqxRmq|55p#k{FVl+^cb#KY^K;ST&8x{f zD$$kru>W3{LPWAVdmcJiRPaD|Od-H;FP^smCft+uX>O`N67r4P?5k+P4&>o#LL_{`vM7D-ZoFvQvx}3omRcM=DVldqr^0yqT72G_0Sp?=j zSEtO((6ols35(z!sIim|T)YTe&AyN}dmmm+fln)PYJUZ`aNlve3 zy6X1FlxN5+EYF_r#x}>KN6nviWBcW!*9$DoOTOZ(nWdBEgbf}=W?Pxstd#hVd zefx!cwz)DVFUD0NABJi24_6wO#U4A~uR|V?}20Q(L1I38^J&)!0#fotHn7+@pl%0ITfF+-? z(9A8xfRAJTyJmb|cAd3*qr14O+rtF=R>s{V1pJ=bm&up3ZB^R4fgpK@uai_##aBhd zo(wwDB>e-MZ-CrY(5cPsrn}2M63@rkta_hUfyecR;p^@vGpf&v)Xczchy(w}Y7J#P z;nj85?eeW+C!xX1qeCC}Rm+hd=8HyN?|a1P-d@k5(`mxoc5CA|pyrQDVaV>YOVvZ> zS5S&zE+A$$+hHs3J+(U^tKxKty`k=Ar{3Z5NN}UE{L_-(;oAQzYRAQ&?KK3_`;#N* zDd21q{w}We^0v45n zay_kTR`HkDMVVqo=>*iwD?^V$jrVT4e%dGC{pG5s8L3=&&0)=_dEKFLb}7&Gvb*{b zqUXmvHy@Zyeyz~PI(iqjR0u)GWwY&OgRW;&uZLN|vW8gxR&RZ-c26)EV+eG-SEm(u}tbHGpZDrI$6E$r-*$6LS+{0%4vz>*z&zh(M`Wz zN6MAmk?;(P*R13E!*E?a5$Ucq@+DFG8=Px;0g=BQT6~uflnKQdH0!OyxcNJ|fWO#L>m0q>O3HOcX!z&xLjriqI^xIP6iyU)D0ybBxv>Vy`v zXMWy0v#Z)Z{5iHvg{QgAJ^c0ctzp52z?*EYm+J}Kv^(Fw!uH4KqIGNZov(Vem&-w6 z3Cs5SpBv{OTb-A>tz3J<)0MjJyoT$ZdwF99IU8Pfr4B<;0R)i=dDx#JbIo2_p4MYG z`CkvmWfzDyHwL@)jgMDjZGww$+flEabegojZa`z-QId*5mn*AQ&ZpwG~Eg*P;e5x%`%dFFAe(iu>lfudnKDW>XDg zXX88S&nq79e(4{TggoxP4peM81o>D#uGP<;JZOiEp(2HIZEW2eBBX}Z^vhG|bqyU# z^lGy?&ktcTrFAOytyz9ImmALf+qP(ryR!6tg-Q;MUUlYZI5iJ?h3iEdr=uc0x9YN> zJ<|`RgT9763$@-7JsJ+0F!YRu50~;yyX7mek8HNBFtE=Q`Ji4c_4^l$%aiJ)>-lx; zG6tqbVG?9j%D=MkgN-Vh3*DVvJZe>-=T>kG3O$SJv;Z*b#g|^C7Lpb6MhEKICpxKf z7+EsE-by?yYW3*to^Vn{-28{;l`@_xep|-L6mCp1F3X&BG-@sq?6;)6Yjha^==PKj z>)~?Oe*H^Z@ct1wn66HD@O;)OHW$tf0|`{Qn$hV}e&YC$)de1ePC%+^g&LE0iQ5#( zbG)iMPvn|T__r$tkk-^Iv=?$Y7ctx(pc7=7)R8yXyto77=Q^*e8>kV{Au5 zTs^A+TINtqL9cb%lL?!dZv`SHFtK#f(%+KjXo?bNn=2&JB6LZR-O0Pw%{{#xBBdAN zGA;3qxKm~pRdvTRt!JF?jlXMVFhrR4CX!CmcAYo_ zfe{Z^s=)Ft;XV~wdRp5`MW0P-oEB|tZ{QS#;1V~=i+BkUOe}2*b!uA1k^Pgwc!uJ1 zm&JNfN#JHBqe?QpC+>mY+NR?X`5+ld>ft@ z)3ooz4qUOf)pFniA%HMx-bt!6!SQC~ciLvg%Q#|*25XM5(U0(>)CXVTC}~FC9w+#H zP$xn)b~m5(8&rOA_GF{3Wj2h-2SP0~^{v~pP5tQs7BA7@y#NvJF%kxX#u;TzUDvWl zS$ScPjBLw>YO6Aj9@YYY;c3`<#Zg%C>(*l6ShjOs$!aS~!OR^Ddsq1Yw!3aC6NcrZ zRsc&`Yn32gm6VQi+yK=10M8OjqoKVH*@H5%R}nJTOXy zpYHBw-rMOb-`QlnJK3E~2o#-eB@u@o@5W(g&yT%I4<>D$H_|m)9pnqTqCUgbP3L#p zNm}ZyAuGRO@}D($^Yne(xFVxlH2pgKU=2)nx3ZL?2)Ph4T9hl0jtnL)Yw7Mb(zKkI zAbgUcd-UkrI6fnO)5vEd4Z{NUo@_*2A#Oh-spF;F>Dr9!p~9FaG8WDwK=MamKm640 z|C=S^FUwikW35}+yo_^jbjEGyTG$$!gJ%<15^J{0ZFbsilQv@P7T3y|xHe_DgSm*O zK|?OZqj@jB8D_#}6Av5?whTK_SPr&QYsE^OWmKE85pdEExEeEeU~$|4JjY2MW*s+k zFgi(1(jxzWO^F?uWKF;x=&@vsoI7(-pL?;}o(_|>DrU(Uz;3Z#_}Rv4&&~_js1oFaGi+aw8&BmA7BRTmOt78I5p_(-WofP#)HDGvEhax~ z5|=?w04tDL|1y%K2SjNru={_%#^Y0e~CF!&XAK)f9RNYyft(RzKG0l!Wnim1(Tc+$%;Jk zl07t0wa@vW$?>6S5z|g?LWdJGO5R6qYlypcz!O8HCzCa3Z0!!=%$soyl`U9{V}JW8 zZ3&Z=Kk%Jc>!kXiTbN^K!$v{t+{FYv{q8<-2Uc1N$R_K9P3aQydc-jH0BYAo#0HO+ zJQdSlr+?><-1x(_e1qQ{a|_$;feQTj%@@SK zg(j$p-GjRnKoNQr>$rvADs7q7bCc{Od)?HF#R_Q|f0g93&g~&2w4gg}7HPu30v7Wc zxKl9dA(h8>Z2hG%@j4g@M%N{8ThFmMdV|wOPFNLK=P(duW-!TT%t8 zkIz9x()EYLhvlz{gqbTdIx4kU7Vm9n!7rF(`zOM!E(KNLV-n*}y$k)T$nq)Pc zHy(W%Ce3p!kIjD6<{#uE=Jr1zkqG!CR+k;`3w21MSHUaL4As1 zzD+@8bdd)@g+dB>D)z;J%}-<}g``FD1;VF9PH)L=k)bjVz9^pE6reqb8v7`Vjn+G2 zX>5@s4_pm-_TYb!3l{B`8zfnXCJTZHBNF@E-PFaDE0Bwp=p6vPS`EldCMD2Fc4EXM z`m1#qGj7+X6Jwhs?Es{*;!!3N-Wdc=yReX{EjJf+JGy9T$sA+?j+{$*65aw9OQ3w_%vyc1R-HhyQW0 z_$^Dysc@pMsr+9&Ifj>kSI9Fdk^%q3l=PSic_crghBn+n!)oD1QJo9b#|frG#1r{Y zDL>~*#cx?JtY-xcx<^r;ar_&pB7vfoybA&swBYw1pa|$JeOj5GsP{hv)BHIrTqv(x z;Ijt%3UkI2`N3TXCv15#xUUW0nK|QhpEj{0uE^ZBQOxD=K=}xi@3ViW+X+{WBO4eW zB7-`QlkM^Qi<#9W^Me#fN%Dxpnh?l=)q=8EarW9E-kXR5l!pI6F=cr`vGzdLm*QP} zGcc)x@49UFLM+|7#2K@E`c7;aspHp&6 zxe)bWmJsN9M+~|kyx6ne%!evmv2v}83bc8VBz=J)0`!UF1c|(`ffPaaA$@=Zx+(e@ z!GIE)K&QvyV79Piai|bMu*bt=;Xsc&Yi46o^oMCDmp%XBs~y!=I1!RBqn8?lEsF{c zLL@_lG?=$SF&wtkN3RX;?YGPi+2{edcL(}9VSX+<-!#$7aleu?v@b$8vlPlbaviPt zDcO7}*+3}^9Gmw;$CT$O7e_@`GsMsQG0^F*$Ug0eRn!iYC+Vy~M)7gK`wKxOZtC|v zlF^yf@%s0P*ZPA(U=YkH$pzti6$d*aKCZYcD`;Us(C^Wo_r)tA6It`YC>{s9Efj`1 zwNPu#<;?)utvONa5Z-fC>nfEneZwwawVk7gvi=Z7dEpRvkxh?n<2`tKb zwadOwT2D$6$6QV;PZ)-M%nAK9B^_1H`DY4Iaaa)8kFGikJmwiZ__v`1n9b#0++y65 z1hrvtRQU>*Hszl`1#7AkV0cjN80vkd&^5S^=%dA+r@NMfsXYhDOQY zkB~5~v~snMbj~!#lfP{#$XFrJPzZzc^oR?TDlM9l3Z|yCzMg0$qYHDSA^EvypY(yG z6XiRuKJIMIWS+~Kxnjf?_ejl>vfPa(SJ7{Qcom)+fK`5LYqo&++WYh&@c17N0iQqY_ME!;zLHmkGyb)Log~icK4=fM;#@pgSOul$jZvL4 zbe7avROb1iuX3vh6<#rjl^sY?_S3Uwpp}%aefW2E+|In$S zCopQy`4-jyPa;-OB}WmiTw9DwClAVpoHkg;=(Mn5{bU!4sw6zUFoGjf8Z$U8yHA@h0Mp{SeLg3+l0$u5avfc@i=vF2I;2VEi zkA*y<3y^vCLT|ASgasEQ92LF7XQ6cNA6UC0)9KCw)HZ)DrJ}E0VZ_&_nZ8n{xNOf!W>07O;HBG^6iWM7Ip6n0@Bg}9G`b}J0EaY7=Z}l5 zhKe({ZxwwX5F(k7{tnK{%Q@CHWmozV&1#WTU_-r(?j{*Y8RwNu8UiKz~v zdHIlM<15tJjp$!81KqkKbHJMyZeHOjk)jvA%5xOHWyzt{!T!G2!~DBIF9TlvQPKH zNk{lZ_@4{LVZGcBh`d)nw{=TL1H?y1vmcV{B9>!gT198#k!5F;$%-ONZOHcdWpQ(A z4uDc(`c5_N+_|uFocgQe(G!WKH?^buj#0|cr8}}8;OxDi%=E?4GdaIfr9!Ir{KCL? z2Cx92<8+Pi{j*vC_zFut0FyuPXCL&t^f(~sw+Hcw^X8j%7}{dIfX}ximsg8!d->;u zERLqocdCuAytn_(&2;$;*=_t)n1tdpy{s$C>jr!vdq=#59oiX zu{2@T)J`x2SS>@FqD&#@GU}!mu&WGVA-Im;iiV~%)3PeauphA8z$}b_!kSrx$$fEu zQ4;Hm3p_+6zYB>^XhH>BRjjS{?9$!Y)ey8^8cgZz{GIy(m9(zu(r8*e+px^{dwIS2 zd-o$qMLEH@C!Y*I=p*djFiK>rJY3UleG)=?O~IXNz0}H^?C` z#o`XD&43+xg8=XoSSA?(Sfp5wCYBgUpVwrWrE*rV^l(Zax?2^gk-pYvObf8UCim1u zZh3a!&WD1@wG7%Lx$_L`cmLA7sa&a^Y~{-1BxcPwJ7JawDZ8o4Dpt={Kbfh7MxV59 zZjo!;XHC)HewU2ak8aOax$gZF3KjtE!$u6@rKtlqXb_x@bnR+Mpx8Es6cIGlX91%Qkg@izR z7{T_5Ebj@2S~DQ_i~zurbwxwPPo)Pml4%wKIEo_3hl#6LD%1X=E*c@lo78%TILaX> z{EKa3KY%*bi81Ho8cxZWitbR*iXc`(V_=Bp33lUn6LZ2ZQh0mJRU4KdkQ~cz1>_AT zyutoRp+XRk@!(~tA^_M3Wh_U_CS^X+RzJ(;>6Tu?r|V64)RWi`e$|SVZZREFl|`%C zEmQ`tP~Cu{ThOLlXAnqUsu`8o3Pid8_S8Y1nb&foHHf7O)YWk?Oy6GG|M*mV;uA*idSq z`1ggOB73V|3MM0~geX);9aLJ7z-#A-@JvEXCF|T-n94%s;y?Gx_7~Mt8`jV{r_`aP zC?8B_;2xgxE#EohWm$j7U!WJ1cfq*x`C#n%#gVOC=8*=m=VStVEfljFo!j#?R(#w@ z;xD5uxYE|PvbQtGhMuZ+L}%a>si`de`ELH)GDBxWQ@hvSe_(#a)lHXtw}9>!q=^o| zDeWx#qe6{7C(m#%Fm~WztH5C3g+4|7fB?>G&ug%|3w`6iKL%_KbfbhYsRdP z{MzJEVQAuIrRQ<_hne3E(BrDtv(bWhD13Ss;~6=k8X$Ojmr#Fx4ICS@sez$rm(5^N zP&+D_A^%RWvJpC>T054p7awWnjz*$$mawp)cz#Ws>y2`Lz_dCt04!dlrw!pl9)QQ(Jj^vaZXJ8j}~^@H8$dPEk_^|mo{Zce2wT@mL(e*P4d!nemsjj=D|%=&}h^MBb9xQyxuNaO+KN}onvM=>;mx%Z82NW1&hYf?XvOyLGPBH#0!g5Ef@WQG+8cet%GD85 znQs$xYcTzAm(lJAq`t2;*!2IvbQuo4ai0cczH2sQfqZ+(X);;_l@W@v1P%z}`Zn}-c=6M)dzCO43^|f+Sn9HWf z(&pJt7`FNA4P|8uGPb+fyfrpLqRcS&bc&VaoCkEi9|ZHxrR`m6Gr7I(9Dht2FBPRh z^o&2pB)Ady+kPh$3a(zaKdqcdjKyhsFP~xB)d;BK3w(Fw{_yGX_-@?m|M;D{@1Bc0 zd^yuT4gPZPk|GGKKVOIu(WKS{* z1bqF$pXqTq9MhqE-p1K_{Wd%+)2zmAn{#F3=IFXXH|;Z&WFNJ^=;AJYw|`}n5SO3Q z)#WPM;`odtlr;EpG`qOt45-@PI;&~NJoR%Yy^=F;yQ5)z<$b#;=0uQp+KG#2Xrs*M zvDeCJc763!gm{@e@81YX(Yni~ z$Zx{lgxL68#_SfEI=vgCHSjS1t~-0!Mmm|<2La%T*^AX0wXO7{jtOX5!n?Fo6m)>i zly{*sdLbE>oitXsnC%oK!Wj<`Yf*06BKx76i{$q({Ox{wp@?!T0=cxCek zG2v;tco&GX!V1Y4{CdK@$6Eu`cxG*gYU8zBc>F>;Dm}Y~dbuSUcC=V>$R1>yZ#r|T zJ@R?uT9WRoKx7TbZx06XR#2oVq|9)NXHGdfJL&S1%+@{pCh%yKKZOWzy0M;U=W=!!653$@6^`}b+u?q9NFFD{zJ-P9FF`H? z`PN#Vw@1KHIrR6y9|bo3_?@Rm?_eSIHUujfe4n@XCQXJ;5e>Q*-9`6RF#2qG4OR4A z_CaQX;$4`jzcczUqzN?pOsS&gW#naS>nU>{AEnjBnEtTW z(z(p9)AuA8PJCGf*iR0XZMD?&)!F0RpWGB|x~>Iq*>_Lfh?VBM+z1YNex1>=cM7A4 z4Iw%9D`7zl5o1UM!#E`Z6&ta|20=3+mkqK>1z`?=yA(o2ACPMS!5)}k#&@V2gGj&I8#um~VK)AA-;rV@#wEO7f#W5V z7xEv8kkW<^NEeC_iIU^R!x9iFjwr&{WXWPlSS-I|iAbgCq{*bs*sx{ui04u+jLWLtQCUK4ry~it|$SgCW3Dy zf>to0E)wCh5TT+FU(_K`Fr5AX{ci~^;TrMr10E2NC-eUk#`QnwprM(u<$tMYW3{YY zan;i_-cxHVM;L$W!-Q9-{w4y}){3GTMkw)0v&91;1Ig~e)oz`PN6|(}&It=ga&L+# zv!ZGZt=Y(~pPemXo#$Vgf-9k9gXdo=v@H8Gm-9Z5|IYk#+Eqt3Hk)Yd9A8}ddfRj7 z?-Ag3kT#_W2~ssR5!5UDX|4GL1~M=Q64Z~1kM6;yI}w{oG4&p-J8|5I>fM`B2k!D7 zCDYoSioTQkF>718eu;`9g9;b$!Bwv7Y(G%bLBFEY%ApP}%#mLBT(fu9KdEct>JEIT`D(IBgc}n+D)oEe)dM?Nx7rLA%)0WIfC>zKAk3I zL&v3qMcwrsp-p8fp<|^?tGXkxZne_8MXjPmqv^<=BE3${>!^a?aON%Rgk@z>&3t;r zCY8F)i%++_lh1Ivy#u<9rhwXY{5S2br@v;*kIM(wQ-~v{DnsfYn2jvmbfpy+`;JOQ ziz#)EgH^4HL>qef6<=lVpR_6t$f;D6^GbSgmCkt;CrVk~ZLi*yGV6Dd7H(dcusBrm zHY6qw%|trQ@q}oRR-GxiH0O6fcQ!1r)F>sCxl6}Kv4I=x5q&+<6Ef?Alqjgq?h?r6H}RdjOcnAo4ILPJr=r#t?I3Fc$Wak0!_Xucd-sSK zQJWPcTi7Lq&XG;uK||L^R9#8nP%+DKdijNOzQtyRFsupr)E)9>H5wZ79g|u5_zI$O z+A(xc1v~NbenfFjP6w7QpWi~iY3yl7VDMC3&Z=JJFp`+^@T&lskYLF$J>I`bU=*l- zk2Z!)Yq{H2MZ+j;ja-*hInbWO+{ZA&#L6AeXc+74Z)_ZlDNyKAnaLDyZ8zw&jO^Lv z8bf!CT>hiK=}yJh67SPH!bF~>G=|O~KF`m}5DcE*hY65fb1cuA#R%B5*o@=`64DBT z^}v>jcKEs%X;qS(DrOo#?d%=i7QIE(?QqXxt~k3}A~%G5(W?VF;Ze0MVq{O>T349U zLg}07sBaLnW!BhIg0<|Bs7Svl&UcPd2b`PlV&NGA@-cY@fdSKN;0+YXiX@W8n&Y16wyrq>(p=9RVT6|(^|y5>Tc?Ra&9h3>k~(13^ww% zD?jqCdUm-Q--OEo(c%r<;2^C<{E|0r-*x;ddmLztdS6@ndmWrZAMa#Uoko*!fhAvME;OLbQBU;0769|1iIhb!UJnAb*U9ELKE9rC7 zsP!oZ7vrUtlB)N3(byJQZ2yf!3)o3Wp)b}O_nr_gSXL2IxCV_Ln69L0Os*p_BPwe@~-0# z1P#O2tf&w9tvyzmj%JmHn?sA!(i&Gyqz7gsfr+B$%nA88%`f63Fc>;A zty7teqh=)(x!X^XCjf=Usw9r&PUBu9cO7GwezV?WS`8T8gnl3AbqG~fs8{Rlyd)LF zNY5`eqlTc9*mABVg4iKOBSDvMDZR~jwoh{0)wf9nWYeCanA|xr%|CK6O-ClFqngTK zlH%#uA{OEpO3N~kx4itn@XyiD>Yv|=sSr&i6(y=8@i?dn-b8ky2mV-wiP9QhzSQH5 z9u^h2C9*hUp4JPS$y#ku2=uU_`NcK!Il(=sI$X~b#me zf1{znD+?;&XNd!wHh!Ki2$L)QliE9=^blT>lKgkFntL_&XbQ)JDp(`Bg`&9MRPE8) zNC!Rk@kL`diKOj`(ibBkzx2rSTpyU$4=|}lEvJvQ5Sz}Bp$2e z!5jLC($e4(fL4z%*q4o~oU9^Y)h-ZMLr-u=NdqPI8cDp05dlu>M^_D6J_dQ2hNY3# zj+fRhca;8)A4=Arm|j&`P|m34z0wkqhk5BLwIhVqAsW9f!h;~na^V>^2I=%6p;k@1 zWrou$6=qIyI2Iw-Pl0QEl&<9CmZjo7!v5j!lxvTlRtCcm(IUyD35dB=E1wTvqOE0l zjj@rxa$IC1DHrfgZ|5oc^jka1E+`S7esXT`Ubq?kB!}ufL6T*~=%az5E|kaV>uhkA zNBa}OA9+(6%;V@Oop#4ofRZrxAyiN*Fae;VhQ^z zulfujTyiHfekj>0z?n@wEotn}em$~OiD?r-AKaJ$h(~-YI8sKss=wF>mX41kQ1V#4 z7(B@tfEdXj`paEW$}9o#Um!J)d9i|B_~*<==ty0GO2u?UhlPtsjs66=A@E&-&lgSP zcJNqK`MPxk2RlT0RbgmcD@OrhS;e2A3v2s(sOIg>a289_+oV5hNE-k?EWDtly3+DL z?N&2D4@Q~nX%ex(tHX&zu_7?jWJqb_K3_b)nBnMKTSn9sA}X}z3-`(jwbT~oD&rco z)R-}2ZY0HokG59$ru#yIuxPF^Q$M6)Aq{u(&>x9?^b8yoB2zaibu9Ptg&S>$7|pOwaWlP(ogkKNUl*jk(29%7PWXfccyFYI_{i%tzimit2x*4&d<^oK zxH%FM5gWjxm@IT3A!ea&AL=`PA|yEMod5Er{7nSZ#g`XRgk3Uq+nRK=v6lgF4l}*w z=ncp15>qL(C%(H~4!~XM=K~@2OP?f?_uOJOr~=dm7Cl0{-XU``A5Vsgs}?A@72#8J zL66LC5ZSN3$;Yn`EyteiiH~DOmz2u_A_=Weg@)N62dOx!4G{jZQsiHcZ9Ha zccWhUqqYg9*}9@O(1qp$!iHjhEmrcn(K{g4iQc6nUgE7Vt2=Ah63TfQci~?ib?vxO zj%_kvW!6JG>%^9FKE9k>6a_Q0^m~A{8^8VUZi936dpOAe1tZ|(4#{&d_`V9*DPzaZg z>5s(Dh|a1`xa*)gM7Jov>WQN^AVa;KPPd=c8$eHng-=7*zj}W1RSFE0A%@%fah+D{P(CJth$O{4vWZgr75tNTR#Y)5d~E z9vi3@$BI4S=~d?lBFA49J$-Sm#p?wx9(S9t5fvpMG1OU;bD>iryo@TF=}T_@n)D)-y$XNF$?3nO)qq z2$9a0jfg};2G{6wAk$4WXcb*s&oRs}mm%lwck@69+MR@tbHOo#Puw}OMEMb&PoKeK zgdk-sOg-xu4n``agpWg^)dAt$0=zfH`xS_<@|}YC-e1P?g{Z)g7v6wg>`He0lp{73w^3eH~~8n1U97j#S-7wLSNq-ygly2?54 zD!oC4=7{tbD0W}p{FSaDzz47Wl)4qsAgB=D&;l;Og&awVzA~?k42+rv)~vtg{;Gq0 z87h5Oz{liQ0s2Do8(dILPU^fzAd%jJtQH{ISmjJgbBh{Sz~ARcgz{_WQoLF4jG70= zYt$a|RGT6bAoBj)fAuG>23FkOGTqOhDHG}Z0rW{E4QBcP9V#WfF{_3NY>&wW^!gKM z%ZDJ8;rxJvE!>LEf3G7~?&7_0Ua`EsvHU>zCVIhM|20l{gT69_UZoX~sUFKumBWJe z&ZHDLQx1N)U9)_ED~`C!RH(4+c07CK~`PYKYsIpHSQ-CB~Ji@ zOz3x!cJFTKmJ`2c1>PQ!e<2_r6`6-^p;U;|6=Y}X_dg^xBdUte?@x3D359BzA9*!I zsNtdOWL2N!UBrjSVEYfzK0Q^1g)}O<(S72@>$7G>o$7#p+z=Sf57rS_#x2MaCI8`g z)UFSH8uy*pD?T^?S@J7-`?ZQYobE0BOOi?CoNe2qS@Ns%wpa0>R}qyZGxAT-;gU9k z4?Y7g4EJx>OH{m$8`buk^3i~s$hk}VPqCx?8SWdmpXR-NjJTy+;H){HVTTpWIRgNA z@DJ>g_4MUsUd=2Np5PIz-n-!1n*%-ockn@xAOJM@7JuPQur03KLCQE&#UnfPBRN#B z80ifeTij3d1LgUzECn+~69a%3V^eOa`I6w+^@Bu#z_%&SX2{jUWw^mO?kE0M_qf{> zOvkUl7}e@Si7D2^InkQE`3=Q#f$!NTp$~lIR@CS_Mh;Gz_rS6W&xGE}sdV&b<;Wpq z-yiF1&tivfSGYQl5IsN$)WO&P?@+fzZ_tYFY@g4Uemy_f)ZYflFUYIU|8~_ZRfl#| zT|@tCXqfiHiZY%yX#$s;ROlT@7Xpse%H`5ty4!Q8 zwrc`q2TmGJWjMROT(w>LdNf9Gz3KlV0(3VpJSR>*JfZ< z(tXENW8bLn?qqAqR(L)ySj)DD;NMh%J&0bghIKPN103{~fmrZ%wQK+k;t3px zm#pC3UZw*exuy_xdafXB~6xyWyc>gRqO{5?)nkn4b$p$j4_l+hf9YtfSn}Jjj{o10vDYvnDj6(`D zC$Ks>Days!?ol10>UD>-FC>C=mB@$y7khA}R5oRkQB)JfI-K7mXo1yBzinh0F=69chNR`~!BS}-LA=(v^ z4;c>p_=j(+$TBus*Tv=G5T20G>=p)aMkMMoD$L|`iG(#;%;L+NP)|QgcQE}EC!$Lhhn{seHs3|e#f!QYM4!8$^Y*#@GoQS zm4*#%wVW6~pr;+deidpYycpXgUw?6{D@Nb+rrmJz`9}8!J6AFo;f|IXZU;I)umT{T z_YPEz0K$1B=W&queeETOGvukFl_<@Ry&7Q-)F?%v-K&`@4-T7FS=LXjq#`4q>YOh< zz0H1Z*W(Fy1lg|2_pMIt1cII#I}umohI#&fqvdrMdfktjA8kAY-fAx*Z(_>a?02oL zhc_0BB?@iM5N%Fpu>muZ@8;Y#f^^s_ss7Tnw)O(=OOgIN7PUGH6g(eI=Lwoqq>3kE zY7R2m#-FbVbVWyuyUfYd-tC+jSw)xx@ zHs792Rbka*4mvm`$l;!`ofXvp#baKZ{%&(xzp$U_Toj9k%+2Xf#67A^BT51`0dM=a zel}Hvx(qY<9d}{@4)2HfOP2f#dgs?YOylXG2IcG6=6BgE#6NFRo)C#mO)WHRgn2u4 zsfC&M(?2KYHuSSuBLpC6#C?!dqBHdUK3IJSTEVP+oBO_0mSuc|u*w0*^+3-7kkdn~ z&aDF-%6X}o<#iy_LNiGaXJu$dK0vC8cOY`3ExbVD)wT*uRhoVQ6{i6Ks{cW|*y{BeW+>%6vD z&M$em(K#o$f!;3yw+UW3=XvFkq>nLdELSn*w)d6<7YX~CVc zf#{GV$WYUOAbQQ@@Ri}!IXev=i!go;`aEy1cQabruBS1(8(srvc#2JeQT#f_K6`%O z!6x_juvZ!n-qgz%6s)2ex_SNl()LxN>g3b*DplS2KBGB&Hh+U@q(JWqiF#;~Y1+XK z6Hlb4y$;Yl^ng6UuB~>`9%M`}_wNX$!dU)$>4Ay<*#jSt3$)}kZt#|H7!%?T_I!}C z^DUAv$D0Iuhp|V#ORz_c^^A@tT+j3?JH`fB8Wy&(%#+pG_Z>WsuT8MH|8B|&6N82M z&esKvSZyZv8(9JE!2x!i8B+Y}@w4wr$&)*tTsu`C{9)GqG*kPX0N6 zopZ6z&Awf$YSmly*1G8G?xz7L)^RT~haDRuANN~qe)TIC&l@GLpC~rIZmy~P_16gr zx|iclYlOv<;G9B++WGvYbi%dzY5fON<20_kH-(e66UfU}m0*T)U4UK63K!0iNOuD`zQ*V+jwo!dv1248?1Lv+5SyRk%Y2Ui0Qm|$Jw4D4K81m}6rQ7Y@&GmD4oq=aW7B!Nf zna@m@(4LPSLcx(Fbe#vllGi3UGi65;WsqjIN#IivFO0)7rF99TCl#B3LB&Jgi#No6 zMp%<;kEu1}ToQ7R<2R(?5{Hc=HN<&K#U?Er{(ejSjM5=tJ>;_y%2nWvDN=00`@$=3 zB8e%@u^_&ZN-{@SkCIvxgqSsS=D-siovmj{GM&3y6sDNx$&~MQhNjJ5ICbVqnl5lU z^X~AcD~dYh(Gp9WckIZn$(ua2)DrxW*(udNCGW`i4)GPCIRo#Ax-R)RQ+!wVjLj|m z$xAzZdBm>HZ$0zTB!h7b-juKY6}Yl_4#^eY6+p*)g)`P&v>NYZ*pfnm#u-ZOhh*d{q0 zN;`)BCOImK{!L^&&cJl|!x_%d_5VAj<8XZ?p$NZz1!Mg;$MlcA{r@_q|3EGFs4G4@ zOWJ4KbXxWE_>hK(FmC=Kh*}P%aY?Tll8^zfi6Q;ot9&`ml?(X`TOK#D2*wbwlF>PL z=_MHs%Ojy2LsLyIMkBEsR%)}{X6%#Tl94>XpU1nqD%=SZ)b^maeYj7#zO`4SyzR9qp{5_(1 zNRm5Nh{>5o!{yGL9L?^+d%?^6SM1J6f;nsBO_14eATum2{Pm_|Y;<92&jV-;T1WEtu zqLm$O;DqXOFE%z)7OxmFau8q^kuZCA>Y@68EL3bccD7zmg*QpGpt?c5oQTk%Hd|rP zV##&Byz?I6Bxb~?HB3RtP~j;aN~#y(N}8k?Jt}Zg&Hxppl7$$?(&sv$N_c2t&XEy5 zsJfHERqB&mrN%|0DY~E2;JZ0Au`e|)KMZ=lG!nR%`<;{Zt4yB4sojJNDCwXaIJ7j; z_*0ctCFvNcVp1n53B{GqlOdIQb-i@; z^r4>Ypj-f8OaWb<&Rm&(ntQosZKAoc!&I2xTn#2|$EaOVa&^YIL1aIkoyr7g4&@Ol zJ90fe-zczY72U9l3bl)JZDH9AEEx%UaTBQW(C%4dYQ>$}3O;G}<~q?}92l z=Mu&cM|jPGIgHA*$fkH237@XBrp}8R-8w*XnSt3qvlOg55BFLx#hS89lvWe%t5~Rx zjAt!FddZ$)BC$)jZVm50d^xpS(q`{ry=T44W)(UI)%7lqGk;%ebrzoEaIC-L9jH{_ zbP^WnI?o;XvAUKQ=5M%lva|+r8*x)5%G#)GLhy{RcnXX`lk25kx*G z%C%D5?2jXpunbT=L5?0GF`#~^q+NgprA5Am!St!h@F29*DL~$fs(?+#;EVOqZ5x5j~su;%ScsSgXLTp8X-!hzXefOPs_gWdR|m7`FbchtL~gU+_X|Zz@@>g zQ5w!YA52d}6T3OGy?nShYHltvR&|w8Kufm+G#sinlfCu#En6D6f2-j?Bs{n{7VF_W zVcyc%)h$+Y4o{eppB&Vc%D|VDm&6$)Wsc|5EhSqL+P(Idpq1GwG0y6oaN2uQ)&^cJIDRLG-&87eg8W^=R(RfWjFEG>u4gU&IRwp+29Ys^26sPn z22q`mK}d9uKjJA26p?cXuv)Jk7!dK5VUPpt(>b!y#)OJRC>vpdQD&7xITWu|T|+aH z3y!AnqRmrbDi=f5GuAm*LXB`u|6$84T&i{Se9Qn_S6EG`2`L|9agbrv8cHCXv}UE& zgriHh#EN=jWspr;@ZMC6FjiO=ft5v=*?O4^+;!b6TNp}^eSx&P@I}o$zJ;3C6A}lL zVX7wNfDpv*U;`kSQyaBb=?TwCd1Q3sH!}^xx&cu&0-1sF4dBS(O*rwSTz`r-^{u?e z@-N~marScF!s|Y)QWR^tVtuFqO&ktBZx}v>`veTZ*S^aaZ+p45Jlhb2&}1N&qy|Mi z6|SWi;w=puSnaRvyE%E}!Pd4S6s3(QI;>Arhex)dSYij|(vJ3CaFdat=77pn*LT=R zr$Uspe`}udCYq`D`BlA@9L|lYc%}(>r?rrVVZ`0xOo$asOU=Z1LTw*N*S>}8fr$K_ zvXA!qy@VcAcy|^}Et*@v2cwfsAs#9nj6k+SwCiX<^uR-%i(JV^$lNPx7u%ATU%df? zT>iWfAnvrU+B0QtTl+gUtLpC7;&OE)=HhP_O9we>gGaO22pyHUS{H&Obh=?C1Orr! zjo9o=!GM<477ckgEr>_kG%Z5w5PjGBN*u{3R;rDyUrYn(-W4>43rM-?kJYGvI^9AiQBOalkSaTg%s$D;`J`#5sI|t+i;xe!xQYp(#KROO#$vV9L}&Gpd|mK@(Al7<}6eeUo0=U zGlGH_cuwCoSO8t@hb3uh3%fD*_Sg0m&KED>D5HjMN7eD|dxh3AT^u||;v zDLvOs(5p<^dAy!GOTqD@Eoz|{^SiTbT$yH5BNw(i-coV%ISBDo0r5P9`*j+?RZc^; z(Zh)j4|jk$?)Nb2i}CkBbVU$Hb$}RBknnJf{c3TRe>5;BvLeAqGQtITCuo=Ql-D>l z^-gpvTpB#l@&nRESeFKWxCQ~*S};&DJ|w7@Fh4;Vd*Hl)z{$qI zWN0C}pPxGfWbF0+A!2=8<>gNc6-(r`Twv}pkU0qYE|G2HK zV%9Qe8UHahOFOHd9GQq_woiZ4=NR>28yFS!$obj|Gji;{T$`||60+EPO5yQE+gyRm zo-tyG+sFIyJBlGk8V@x#V>^sz6xcQC5Cx`mX0^V*LO0e&g zdfUAz7sxODiof0R)`skhFgog?BmL?dEAQY#=1nk~q~izGn|83Uc|!K-8;cRF6pL}! z*?x`r64G~DJYbDyjG&Q>6&}&L-d;Ue(#r1 z^vtH)roS(!_cpxFDVMhde?8CO(Em)G)#`npRhewI9dCZm zIy1*~a6U?J%VZx;+RO)+Jbm)EhICTdA7`tyjP!9%?esSX-;R*D^*6az4W+=^;WzL>=^Ck%tB4t(4w$M(L)c6>Lx zXW250CJn@N@j>k@R^b-1uV00%y-xWhx1IX#cYqD~Ewb!mgM_a}D z{pvi7_PhM`KjM-u#kQ`~5d=SX$H67NUNS<@U5tK{jpwnJ;W#(Fo%f%mB#7^i#g291 zDT-Xk??~tmd2iO&gQS^Uzo*hD_DelPKF2qHJ-M6?&!a2*rNV{vV&=G?6L!DnwGq3n zxa5e(rBUBp2Vlrz+mV#~8XlIf*$2vGPa58V>Czb?aHxZU-#f1jXb1wDQ@Flhu!x+ z_g{`Ov6E09N_>O_i3pPjf1VBRp^#k*txo3J-Kbeq!#!VU9e^v30*8i*Goi(JLah6h5-%_iyA}6TY zlR5mT6JCdrYD9>K9E5DGu|nhniKan-MN*3!eiKUzsY*$_X7qtPAl$y9B7_r=dgI@6 z)pqV=LnY}|t`uNBmO)^>gfCe=<(YNQR40nYIpyBJ2bCK&YL+dV;cRA< zFT)&JM(ru#$j<1ZLGGq>RwHk1ZEGz(ZT75LPC035F~}F-dL9KS=`LBbW-3+n?z@K= zRjYC6RyE_L8K)@IPjjE6#8~D`VPr98UY1=45y^FLLdXt#7Mq!y%Qmh$<^--#FK?}h zS#4|FT|ZA@NLPnWRz4|J>$+}ImIoT&H3(;BdzPQK%~xm?UZK?)Hfq(j)hp;-V^?y^ ztx;i&v9U`TVP4U4Gha!a`c^9%wmmvF&r`FVK-<**i&byrCe$j{&N<`I(yu$paWmMV zML$;PH7mx2!n{w&P2J%xSvBWqwEm&Kg38PBtX;5V)#8m&?k?6EbTK;Aoue63EL5pl z!O_bTXv%_-nVnZvD*d(z@jcT?2uVeNQcPx<%Y*t`x)lc8|8qJ7pd^OKcW02JA% z%f~Mog{zJyJz_~F<& zU6k%ILUUGsLA2E2Z`BI-=7eQzQRHgHyrF;+Bau2`iaAZ9m9K-$B&_9NvuRVia-B2L zF3ccu)-+2+jNpRX_7`(fgA-Dwlb5hcId;N^=v$`6>b=1qFRVC0H#2wDIFzlIsB9i@ zbqj>;^g2}$c9w(f@YVvRh4W8CiRhA8G|Qad+AF zyL9D-Za~~1d4@Jg`0p+`?qR={*)&#y6pV}Dm34qY=^3L(%n@gKMls(GLZ<%~CM5ek zupHtMf|h^jUOdA-ag`a3Olm|bH`C%O%J}MqilfJERW>4RZx;41H;1wp< z1{$Vaa-hy0@9R8llo={{Zx$69LFxv&11zD4T;HW*)YQSQb8HqTnmLeTl+>xoDz|7K zh8vmXh;VNjT4#TII#EW`B44DG=ONP+vV<9qX9?xO{uHs44>yGhv}8+ls#)JLL1waPtzrzzX4K2VZwMyV-{}<{yqc zO5MZWBr12#&sESQJ-UfrKK^?(Pe-GhcFh+V`VtK7;+U*cHm#O(KawKUtaM%kx8&+M z<+w+)6lt@vmi=v0uKC<-x19lS(88IgX~Wk_lKt71A@4roVm2AJ)u{h)GjlU^UAdVC z$G4W&FJ1nYDnK|TrrTIpsa&+b&Mfl4gJPzY{;oY-F7AvwJTlm=a>QXxN37BT@-k2o z>u}yGkG)1yF7k5ARF0rh$9?H|=$xmPZ2%dBSS}fqgIlk$!4%~dq^d|(pT0@#9O)Db zf-4-xN-OJe90{#S+~h&V5=R#!)>b;jijlZ=gIf97TQ9}znPaZoQmFbaA<|fDEf5<@ zXQ8VXq#-awsWOvF&ae}Q`+Izk>} zLxhdWv1t@-Y58aLhsg3bRw`q{1>*tdPidJ;$RdSC-afQ!IRpD2I;|uj9Fy-Qd+iij z?13Lq*2f<Hol$>gWxq#*R0q(qsFPC?EMCAaJRt{)7IvqQ%@~+$+YoBjNf;c>fNfNlP zGdsde6q-3pC7%HCh!jkX`uXj+%mvN%)mwV;Rn(o_!?q!kRV~)U!p2Ml+AbtT-60Bl zGmpdL_x0OnXxZ=qY05dYE3UZ)>J9F)rpAlDNKX83Z=BV@K4pL3Y1#C*64;FyRMxhk zeX96?;2P(EF1${7SWX!nY#JO`l)HwRBqcGfWI~(+<*4VP8RelI7^U7!vL#NjA6YgA z3+jbgmvkywz)pDEO;bupdfh>V1bJ{q0ptmW!M^P61nyhH)klIRWHjdptjpr3gM#^B z8taG8QQ#@jqoF0b$>ZD9?nAl%=O_B>2a^S`w9Vj2>%imCEPuMGu}L383fU%7J!pOt zNRky4EStGiMiq;*!1qe1CPTMeJ1|+@8^o#$g0k=Z8)61sa%H_FkSJ$@WH>3-%|p%{ zBtg*_3HrLHxrDe)557+3n_DI|JCDV zH0iw&ly)NC>88CX&w-|t8y6IQu9&Hq;&<0YeiVQl`~nH>Fma5IfQw z;dgZ9!AbJ`HS0cb$}C3Ex}yhlOi;eNYQ7za6Y||nIIpMbd?)R_O*Kc`i~7|^(mU1Y zQW0{RL{3d6vHm7nF=nRJ#A)DmlU?h18A5)a9)cFR=wjjq?8~&@5>T`V(0HMD5Wj}i zZtn|vQ0iMkTx+RN?bQsfVY%oV4(XTvgIWvooW9nVD&+`|FIy)AEc|^7Vbxr9&~34* zEJAirL9N1Im#0R+#_hDGJb|g#`}eg8h35)SwCiajfp>uHC?kdYVy?LZt_&#Y9P~x+)Rod`Sl8kh8=_pjDn8Ocs=heBgWFqsi z4m)NZfWRg5P0b^rCk^Rd*$^$#W^O{4A?iM^`J{gkLd?8<5ybF=!`9MmqDU|EO%lwv zVScs3uu7&xNutB}AduR&rR*JCnX8? z(Ig?3f_j7M;wediGxRISd;12?52eZyE1wzcyS;xZx;p_Ya$`D*T|Z*FR>({?d~rm| z;Wi=h@k7mt-?>ww2ec%uzNYSiTjm~u?;t6@rq94E>IWPi)Sp@GI#nr)%T$mo()t7a znmk!(5FWx`*j?JOc(7h&M5RjY7bJ1eV6p!@6aQw2lTbjKCa=l!XM8Uadyas_Q3)qG z|GR|>kFrqC|H7OR7gNo@5@qs?=pGokQNXcG*~Ed8q+bmRZkFd!+%oHw-hO zFjdG^uGC;~8tF^#_KWgvi-G=J+@WcDb`IJK;Zz*e_Xd%?nPjhA2ZWKJqijcKY3BoB`EA*0{>p z%76>R>U89FBycGLh*{^KpqZ@INTW9eemP~!SwEpVKyddU$vYGml-#W3ZFn_*)ooZ% zr1wCwjl}I^5s|_=ZHm;e2=Lzt{o)4^r#*`(Pj7C>gF0&IA(BaINM#hS^bdPYNRVc; zriO?V+u1xa$i`3lU1*oPT-+j~^mvz|n0mGtEEvPrqcGVM>%1$uK8%59MF1eQur$Ft zZkQM;;RGBVAeekf^yM(5lR7@?CpuLcp4n#6?TrC*ekut7gk(DPRU#JJ5hSNO|@7GBtQ`+;Md)`eTsynSj?`oIex30NEj%1oRn zq3R*1n-vp+WApjJ zk@rNhPF)YqpVS&patChcak(7{Wv9}H^PN4go1>vNAp%YyYAuEMORrXDEbUI^E$q(C zniRj9QkOT@wL2>9*-b$!3@5S_IG75&#suld1OdGvh$>{Wh8nlsFV7S8u4#!d3JrE5 z`u>Svrh<`=zom1p6TKl43%#B&R*6i>8{c6hIp68TUfgK-Q5r>7)fPUz`YRsxDjxbP z_~)o^P38pJc1G9gDJ38H3gFOr$eO;Y5Png8TBiXKfL7?is&-?Ry~i62+Y~3A1l9;m zc%xQ%Q|Y`Z)ye_@Qs}!$2-U`jlot4mC<7zdV^W34U3G@WU}5MaHSy-piOB z&(N6Vb_@H-RqH@?AOrjY<4U<5?0LiPX`OyNaP!;pbJ_%G_h9RX_3qw8$Nr6s4Eq{_z3n}aaUC7mao0W2yK`c0 z4(WZl{2Exyd9SpLo8cc_g{Qo1%6arHWA55)^o~`*!I{@L_JDuThg0sG-vJHMFPyFe=Wq^65I%H+7SYy?{p89yYq)<;4_#;eY$oc5lF`>-AIo@!u0xiJR3lo*jk!@*Y*VDle-EG2Q`c zg4$Hzz7}HrAe@zHykPkFQv6H(Da;QXlg99qfN9`+Sl0gl{Su^j`M?M!D5rr-I|lIi zX8-FA^_xFJ6Nu#3D1QhYog@bRz_2{pcRA57-CTr*2vv%FQ5>mIn;|q@5;wD_8I50b zXeUp5^x%G_fX)H<59YTYBe#X_;BLr>-q%ln;pj@;!2{A46VqA4Z!yVpDY2yYKN*r~ z@sj$KpD_D15s*KV6W;BM8E-2o%xV2%n>|Arfj&Jz$ohM;oniI6r-O?t95D<}v?V=I zB@D0Xk4%`K@IgDzSnom5KkzxEVm;z+4?b0#Sf9BhBaOr)8(QyZbIAa#gVL%`B&R<$Yz{ zs#=gUIH^h~q_Icj*hMXWUXvtxKG=%w{@OE*&==N@WdbQNyH7g=Z`#u^?{DRwoU14? z%-XxgHPPE#BcyZPt~b52L@CNd7x1+~eYSZgt!A~-r&;V~q;=5BI%V1@qHQC_n|&K* z+SH&cGpQ<}Xkq#^qi!imIK-U3mM&y~7`Mk<2vHIvyvkb9XtU+#x25BhIaKUFo>ikXWzXKe_m?tpma3c!ZA-a|^ zn3R?Eu$`dY41$Ho)Kvp4P1M4b6E6GkdN=#m6K6s0a9ry#vE*$W&_N8iVTP`=U3cvZ z)G7xVj{GSKM-?xHA&JgR^yA<>DnTk2Ce4D&lCi$~wvU~Y)Qbgg80J0P0#$pufB4sS ziKIsa^vq`3Q^D`iE9=!7!UEKkr>tT;u=%}<#VCF|nO0 zCKoL0Me<6(V5tyhbo_Flzc~*(x~&UIvrc9$h`3+5)3T1n_5?Z2eKBCqTd8X*vtzCN z(ks-E2U&K5(lAC?H9#X~G$1SKq8H$qrTr5zx~~z!+rr^0u&^V)up+6IV=W?|(9*i9 zB{5`9LHvPp{~0e$x@-bSob>&}`fSJwk2x$RRZ|bsF2UU%q(+20ekI^23$&kb{bJZV zVh=0-vjm9(I2tx}Tl*8}zB;VUQ-ln!h*JpU;hDE*LTda;FEV(io0NEJNH#}K>N!M- zUo4U}$C0cKCEke$--=>e5A7n+23>oj;qM-Za0vIQaMxyt8M(cLuvU5YFI*-F4ljQ- ztemt8c20@sS?=QQH(D1LxQHF`oEY|)mln&tN0VYdK$%;lBIlZ~U{-ottXd`x-ISvZ zGNgF>=cf=fa!WOkL?TL77_uE9YjY zU}tulqRQb9TanPe0!eWmGETi0tvXxSfSzIoGSqV2S#-yLh0Ghu`*ET>Z;CoIw|mk7 zy0Q@jXodD+n8uG@z$f%A#3jT&$?FcFUp-!N?ewh2+qek)%33CoFBC_>Z0ly$=M8-y zq4bp&_T3;eA@CZzsS-j7ts0ESu+VxYBe`qTzMLF(JwQn03JxooeXpDoM!9Aq*tAKj z8ZdNLjH9DFP)Z^bK1t*XJXQ{iRDU(3bVR%veX&O+c2DE@DCi7CpD|?DYu+As_?TO2 z{&fd&$qn^!U9u?LMa5H_0=vC08zfzrCC0CVY}Y>NdFRD{*CEx0PwMb`jo!2HdKN?) zLnJZ3kqJ*BtQ3c6R~CFz4%c(vx-tH3nPNZa34<}m`bT`zStvy6wVzV2IHcnbTBh*b znjx*A9z^{>E65Ocmkp?M3rv4hsj$Z)TQZm55q6<)L{=53{+8NEn=$H*(urG2tAbH) zu-EbvW*HQW{Z5B(fmpZ-6u;KlJx4U_SGkp}wlz+n=qx0?{pTXAG-w#Wq5SMs#p_=Q zaZhoPk~$O*Z8gHs3>9b?2uwi-^EzOE!g^D|lc^hAw6gAInBj?paYv=r*o;8PBYkbw z&9met%*cRi;)Tjo*ul?K_{*L8_Lr%!LRb2?1u8*Fse8Q84?7qH$zYITsQoj-)CJZ^ zz&Qx2M~sPvX%8iS4Dw%wW`fDjXkn;7p4c?eZ$)OK%s8HG*;^3RODbR|kRvh6JW7g# z7^v;yRBf`xo}L)YXzr=RI~bj7&daoF{mgoM%mI5Il<1)tc_uX8bSCad6O+)Nkpm|< zGJvRt^s^li&4EW$dez-t<}TbnA;7(rb#Gz7y`_C%k?-Dp=VA}d)Q%?>8iMI^grPdD?{ZNFH(frgKEq;65Uu|bq0x=M{*}7a3y|G!hSJzO zlZ(5s!uS!D!GP90e6yI=c%z!blim}(rtWAh&g4V2;MZU8Gyb@dj^{J4smA=J zHge;X>O?U!li>@~`6Bm)Ub6G|I#2nBDoXmJHcUu=?6JvB7tQ-TG^LOdF)X(deA`QgW&K&MhJN4sm`i6EE_dhN#j_J(xn*@Q+ z(s3t96b8GA%JxpjZO`-L1`hidF>REr7T1wcZC&LJLFd}VQV)1vU<5k`{i4RD)&WTEnAhjv)roB zpXM~Lr6cyx-k$v-omR-}tNvKM!UOOTHvMtG)<0f7Y?t1b^eZ)6GF&~IxQU(b54s1T z{Ob={FeLl?I3qR8&-deWO0}2^uirV3)PO=p2mqxyo<`k(VPEm`rUPSy95fE%~D4yO*cd&g}~kLin*+sfK2+_&2JrfBRi06Qpm zM<;xzuBWk_mzeS1A3(N;Ua^VcIs`#%EFAuUC(#(=dkm2e-zvb_P3X&M>S%MgujfV- z&VAD9a5&CeX9BwB#yVYdX}hz{?c&%N=ekpz_Hn(AVeqOi7W&0I4kwMvlRk8++-1;+ zK>9|LgSpDVzBisZ<0K0B-VbN5SU_-r`me=azX2B6-;i7;tXBoM2@#^j@Nm@ zsF_ceA=B?O_o7qno%h08hju_kT3E(`#mwvuN3ZQeS$2Prb*ydSrP;gH*1G~{mKUb2 zc=?}K>sHRKDSMhM`N+8ZON08%Rc|F3HyyCXa^r__W`YSU_338E)F>>vE4ImrH`VDX zN4b>7^6b%O*b}GcZb=9H38~Pto1KkppBoL#5}pM`M@%^}kDOtq{H~E(>tuDTlHLV+ zM%Emp`9oD7sBbLcR<^r<~oT? zjN(I^VPO%0z5`||-B3#l_A@Q+tW!co){mh}{#t<0x$f3O*0V4e-h14ij1EZ5xb+|1 z?L8b;)2Hwf8{e$^IRerAaP20n@{2@(P6fckX32WBF<@{D9Ra#cZ5|+7yM1e78EIC! zE3sMZ%4b)`%Q>&h=kE%g?tVg-NK}z*X(8h1Gn=k2*~Tm>xwuc;ms*)Va_DfhuN%Fu z?L0`DVY-~|dFdcGqqE`g!<<%Zt2ox#Iqn?}295!fO84v9S}}5V#g@-Cn(xwgcf&rB z(4+F$OuQWD5`u5cvQsPQv0ccSX}hd7w{zJ_$t|Bfp9;NEcyh%K)I!m|0WC>p$`of34@R2xo0vXHeGG>* ztV=RAo~I%CHwn&|sgkUv1Z_D5#2C`NOl%^`A?aIUHnGhit_1}kk=6u%FEQX%@z0OhYGK?rJzh7RFJ3R(FQg^iZg#Aq)z2;O+ODld zFDuHZ%+iV~y|M|RLQ)Lb;S`08l29Xs!pHVPa?)Y*G>sJsOjywqgHYtisO0J5L+_U%Lg0H zN!*sO4iV@juuc~h)+f_uLXQ;WNx(uVTZD)(!-W}9ji;+IB~q~@E6n2tOMv(yOER-1 zh*Q(kpbMRe@PKVV(hZ_!!%{JEup}ax8IK^7z$*BPNJ%-0Bn~Q4r9gBBM`+F@dFXKQ z;HHr1xQ3vs1X(5=s)!{7#?uHJ;lhO|X?5I_lA$Mx!_r~kO$Aj2tS2WPjMqsjB?lW# zcEA-ELUD570^1>F2h1V@w?Ro_Nfi~G4RVx|Ca$+I9MVHtOiFN>+MAO%`~#N5a)R+w z!K_(wA>pbTg}w$;;U)>)M~0&&%_}KDhltBc@szkbul*AF8gKehqfBl>>X;HFC(?T zr3KuFR9^#rVfhmFM-xFpl61bvWcYgX-OJL+I&y0=3vNhr)6`sb-YPm<;zyKupXjB@ z-J3J-yNVje&5W2>5f!+AgZd)_=p9pmXsSHBU#)*`Kq^)lj9J_P_{0ntm7Yl~!Azw# z<3Oa44+R9bHqumZx1=4bL;w;p8oJe8#eNi)u>0 zL8}(4U#7d4t4~#gn95dX;TRfqXSH~a+|}W=JS3f)E~EGrICfi*z&QcK_mF7>i033a={}^-9)L zPz1tEcDEQh8jLk?f}cgh=4AU7l);@a6(MPmgBw#tO%42@lpxmf$tO|0M7PW(x=q1k zLwti+?Y|9k5jC}KA)yP>nYso~iWo9u_!ObQftF&fr4OPFypAkp-t6S61l+XzcdBF6 zXhdoI{J^^aL8Lgd3{u31a6HO}keV3=1B%)!6$A3r|Cg7Z8TxTsRQ8VTt|a5{3lILA zLo?hy+qw_DSzx)a)e$QVths*eD{ADw1I^$qi2kU+h@ty99xaH_%G2w#SsJ-w-ZX=E zbS?3%)@q8J1?cbQCKx&KLsDT&R9ZUz1p}9&3K*qPx>Fj|)pBT@e^DEN(INS)?y!Ny zX;Z)}hp~M&3=A??Sy{BIiAzmE{IE6B7G`i><5nNQL&dBlb_9(*!O*J1G}th-1(=Nf zk{bqT3iy}mSaGQQV#BK|Lu7-P3W_9*Fwuj3BQu6V%^MUiY*r|N=Z=w5Z9=ltqM0rG z4M2JP7Rws*(6DrC!s05By{MAnfGmjAF@;}iPKC?%ClM|;hsoBsicsrZb@87O1Il(G zBsK)bvU^QEX7W0o}#&u>wh*^dtM=KDtvOH8sfJkNi#YG`FI>z<#Lws}NlWBioRjz8zjh_-1ARnt-&fE?{fy-=lz*40F{c zG%dVb`|C(bY#Zl*X<}qV6ND_4rkEmRuDsOCVkJ=*#A>jD_9pYEHS;C*Lfv3@e>vEzlGEmj@a=4f<>FF0uVXhKpI&YYNa2UH$9ob8U?7yLbE623BLVyjp}DCv-01 z$>W2gP;Fr;Al(v!U`7)hgp3C@dFTYNwWEvP?G>>yte@QCgG#peV(f)k-&Re*i>B5( zVYPZ-c$x)XY76IRXES~k;0T02S;HhDe0zAoG`e%DBu*N}R~df-#TtIPh7u{6i*^R- zJZNGTg*3y@gv{+5YfJ7fBY@TX1>c4W0|CAXylh%(^aan%5&@&S)E{HCky=prP-yCVjZ`$Bo5e|#9p}^n%@QH88^=z@z+%h%vDyC~mt6xp6m<3TiotmzayXP(Up`jBZYLy4X zZ3*k#jLR-rvnhKmSwOBJ>^(0veo3S4H`^~15v8gMeV|Wong2VFeAms)6Q67s^KGG# zzSbE9KNHu1B<5LZfD15E3Q{;Y6VMUu0bB>%@)3>yy~`T)S1U~QLzitYwt37n1`yiC zvq+CxD}{FkojwHV;ZXJL3YT+q@D8L(#Y0s6m>EpG_KPyu;oQ+s57($)Oi$`9A20e| z>$x|cf)D&o*#ozKrsM5S!6Z~m&gAQG_lMJ~|8$a%%kiq+M1uO^rH@;ztUi2i*zLD) zk?Uf$fN7qZZm;Uec&QpiP_BL=vywiJLPQUO5_8dHOb6|qvH8r{ke^7}&C*e)^A0NS z;sY3_r;A4#AKk=;v%X6dpNmH)pWW<%)xGW<%Mgufp4UYvA4+#z-!XyTkF$RSUcHLMiDdW*Kk zWr2Of?-Od_$BP26wPA@Q_XWXfc*a+!+jY{>{V-3Wzebe3<#Oo_xPQ1XuGRk%uKM5( zTj?diM!;pt=I06W5{g@r36byZ|J3d*JsPFweT*T%%=|X%xXz;C!|y4qR`X$aY`+!< z&wY*At9g5}BWSmIVaLah#_MKR-f+2KCs^M{l=T@?d{b+drTR##iA~mdIQ#K_`NyNw zU*ptPVs@H+3|l>VpZPpAdhoi5Tb?n)O`xy#FuPwLI<3W*$o6@7r3veK9@Hg40A!v2 zoHVpcBy+y?D`(aE-qo*Y6(}7B7~iLT=T})3o=uOeWU^KKNH@6{~SIg znE$MHPp^%~7T^>r+jZaHhrCVlXZ9-o^e0r_{1`3KqU0utTXx*rChy#RK3t%?b~zPY z1c`gc)y8(W|C|mK^PD(US-sGkUZ#~kze3mozCW{=li>7eTVh$*X87ON(+Gb0)BO0K za<6_yHeyZSZFBxbjYs-Wo#f%P8)%Toeb^yPz|L1b{s82HZ#0+V+Id$CAAoelFS=K& zYtaI@oO>KJ`H!Eiqk5LXnsiUtPhE#XH$^v`JvbEtrfWePl-X}aQ@8*tiE=aya=1|m z(*&#{l%~XFNl>&-DrcLW7{H;^B`X_xJI{AFF1A=C;O-LGaIzvOSfb2P3N-wma^lQd zNO%b-k*GXH5`&poNXG~isIP9kW!=G$bH>K@R4x;Pc~hIwcDeDW_XJNIe`+e%wT>z) zmW$rC!HrBK6+|70)1^YmkFx9%6QziM7b^{=|C<8O{p814*zOriFo2#7C6mR#E5+t1 zjA%PlWNP?Ll{+5HbUoLi(8&QB#x$of1VTrGf17~jr6lD(C%mw8Ohg@KoH2$RTkV&G zLEG!Gh8Lr}@so)laP@X7-AXMP5tDF?jU6#ye~r0$=uErmsGg~&cYmA(PQdqosOxjf zr;?lI_Q(87d5b&l%F3X3Tjr%U+iP!$+iRxl4m9_5Imu4NEn90$MW=iA+j%L-m_3$V zn?l!Z=jM~D0DkjJ^hA18ZieT>(PLwD`5j*0<45T7wYh!8#{&@Ql!o7Z6XfUfl-oct z#J=c(&=|0-|i=W}o0ufFh*hZFUK z2&14*dO_MLwe^KpdVk5jDqUd=t8PQY*fY`zT-jIpy$juiZ`X%&XL>oJ+J^pNk7qkT zY};?M8n@v9aXqBlhV!z&ai`ZsuoDS!3xqo$%n?n7+dt@z8n=fkcL3W1L(s4M%FzSi z2kwWy6UQGnv#b0{n%kH3iWqB*HTsp~eVFq?|&IrEOFw`0jl)VLDODVXxQE!=h+7G`G4Z_1JH z0se04H#~9DET*8q+p5ui*Pxs?LC3)R88GKdQX-5*>z;G*9|mQLf#ew8+iT^mxdbxP zvbjD0kMGaiod=#qpU#(A@eWM#noIms?$s0DrZmIV9Y)xNjD~UZ?P;_sBT4q~oUHm7 zjeaIwri0~V-8Utw(kx^2d1r0RAVOw+($AvetfkbG$xfC(j{Y2bx4DyPu#8il!)c+yu8-fIZwk6B9ZQHhO+qP}nMwe~d zwrzFU*6(<;nK$txW_R~@kr^iyuQ)m{K0J?00K8olm3AtKbBX;}vdlJte|RF&6y?Dh`$f!1Q>Byr5d>0MSZ+y~ z`67*wFkE(*qeAZ-QTRB}7NXQR4EHalu?!o^Tj(TVB>h84_bi^uyL&0=tMq&4R_7nS zM*r$D1eu9;qMCw-q0&kE>m#GqwkLuwz<#OvUN)(|uH1!4d@bg*B?l>Ue+++EVPAh1 zNJ#3Ym=JFAa%dMqntEHBRu$wWVpg|U{F1H2Q!=Uym=F5<~pNHqyyt#?uohBBnSgI=JC$?-a==>@YUD5f|q9kY@x4M z0(eyeyUP7~&T2`<r!R|1G;M3($uIm=EYDs5gLN^wlQ{e+4 z8M`|3xDeh&bIzxga9539w`X*?zjU#ja87Qg(*x%4qw-X5k=yR4T0QXoWDi@Xb@noT zLeYMX{@wlGBbs@A&IeD}_C3#V%0_-~-}c`>cjNIl@F?N%zgWCYE*5)j*6CP!Z$oJ( zyuPn_8X4`sZQ#e7@+q!sm%Ya{z7KQU{xp8hkB`FGb^fotubU=Y*wN~GeeR#vQ?m3s zUi~6?n+d!IsA7Yhi+Omp>(Zr0t-m(~bFQ`=@Ododra?;>EY}%Nfvk*=r&q_!WsXlP zWu1B5MCAHBjFP~^icE?5tF&`)gDj`K>1)R%8K1A2#`{k|IwDI(OT%vaw=XEjTdN%{ zO=V5g|KhH|V&P$;ETsd@PI8p~%RaAZbQ@}c9B{B^tg(rIQw{$XIk;wM%>try3`VK$$g<=1kSt%$>UzvwvIsFmlZ zZ5AndEV`uUUG;bJ@IGwOy^@$2e8$e_b-8(wK76{Q-@EzPKkw4JteNuGKlibF$lcJL zD7q%ko1uZ6J|fqf{yIF~=ur3HXgs^i$}@iaZMT`Gqx&i)|4>2H=YD+R?{hzToT1nE zxSA)%-+OFe@B5l;&7bM>wOPykZrUvMMaQb!Ui|UvczOf#dtV$3KJ(lCC_DLEqWFzB zgflPemFgeo`P#(y728muPfHu!Vier2W`m|Z@_Y#9nB1;89i=TIx=qDLWQXiMf@_q% zPQmug@BE4W-!RDXRhe%74+ec8|9>#(`G3J6jyP(5&qmi4@7~5ycGH|&PGcOsrO{fi z>s70q^w4IU@k4x0mO`bNLvI)EnDy1~Ems%6Ebv1OZ=%h=5=UlXF`EnU4S!^|#$_?`!s+_oJEn%L|@gGd#coE*>ry z%dwvq0)QPVznlFS~xJ;|#~mFszVD;VI_Of$WqkNM)+IST)(Oj7Ltpds$A)GuNCFG+l+#Ayq>} z0a8&hA~{xlh|xd=S)3;579rcz;9R0oq`6wgdaGsl^!dkc3flB}_oXIRMHP~jTYGVG zP@t6z8~1HT*3EK-2zfJz5{2w)s_aS;VCxk`!*h^hcOY8c-u@`BYUb4}UQfzkrEuGMTU4rDpwSt&GEOi4J;ZKZc&G3 znnn^GNZH@qq`)656|6m1U_YGQe-%RV$8}E8LkRnZ6s~+R71XOwJsOYE+n${?qqPu8 zq|WJKgo9F*`JQ%AlaiU*rpcZ5`x;G1)?t#E&Zz#b{Ks}5m(3q+k=o`ps0i^$vc2;Z ze?J!;rBJw9`;> zFoP&}BMsVIg5adu?WS7iV0n{7da!!VigX+sdgI(zfz0OhVR3fl>3=Oy`Ix z*?!)V6k}60uM`?yq;VQ92^cX;@5z-|M2F0*l*N|DxC-;5r-Fb0avW}oZwPnR*)%i= zEl3Cw2bAqo45B3VoB1);Us4x2TZvLfwQKc(<}J6zg!j2_h4nGFXZLBxyG_}d$b(-9A>|Zuc7l(yI*@qc0YXj zf9;3&b^V0l^nHWY4z_IT`5g|r%kjLAw7Kc$`26&qR=q4hANmA4?qlVB+Iqbm*691+ z9fh_W^1tGF-|FCY-0dpQnWN)jZdVaqES9O%s_db4~MmX+2 zD#s9@O_&&pG4pmwDG%t9e=MW8#$Pd$S$H4RRrrD-N95FDJRRT06Ypz8-g|IDm3s+GjTFGRCbu}iNWt!N| zF+}9@8g4FaSXq9%hxsflxv)x;uF$NMcQnQ6b{5@@i!0B^B;8c})*k)D7c1G?6}J{z z-p&6m{!umm{frl+|3+#2xuwKg`&-YGU(_|v@BOm9N&H+laew!=ruW9Q_IlhTBu>(( zw%zGuVDd9wI~?!kEPhGN-}SS6fWF&HFstMJe%&kYXS}oZaC*|C?lmXV$;8_}@$NhP=N3W;fes*#K9FFf{ zGjD$t5BT3O z<+wfoZ-xi}u#W`*@NXmtz{%9e(23sE$kLAfKTmyQdpk4B|Fa8}s|oFbqMB8EQR%XG zQT!*#YCKw;6t}7lb;xB*@glt(?lFQ<`T_-n)&z&EwGmfBRu9jnD zP%RT5qPVzwh+`OTt|~~Jm(QQ*&YSj0j=$yAH|;n6Rh5KHH&>i5oc1Tpb zCk!ZX$E%f;WQZ{3Ee?$8r!IpR2uZ~^5+Ftgvs@{mT$)^!Szx$O&4=|qA;UE zQ}ZNbAhnYwy+|{aYE6)~X5;WcMqR{>298Gsu)4CPm<u%Zfxz?JzjVv(~@LHlQqwKO?)`K6(nCS808iWNfReS6qhCjtOc?9 zS6o}_`)xsk5>VAT!@Xww<`z#|;hM}Pt(BYRa-c|wBVFv2Fk|Y}fj%Upfoe5ij4$K} zDKKCO$xC6t`?nlORP&K%?k-;GFD)X3znFytt!H*6JBg{%vlk=gSxi5PtjkKJq%#=rj zO|D9)uAr`<8heKs5&ED26<9b>lzio1to)%r0e5ejZigd!g;@Hh2hG3GPN|6=KIYrDC-;q{y zt&Xh(N7_ai;MTytJ=#VQUkQ*1MgpLk3l(RR674{8rHSR~5BzpuH52jqHXN_fdZ3smnN6_0GzC9oa zvi)Pw1Ob`3C=_WUu|Akst{{43pvl;l_NYWQDXpBcHm3NI)$)hkZ#m1yS2i&U%HR{p zAliCEk|Xnlt2LqyJZKwHZXBO~YXU9MyyQxxDmPc45Rx+~MS7}Rwl#f%Oz(vhpdKMu z7!4L2Y5?gjEN#j_0R*^92Q1li(JOmp z9n5cVFC_oiD4N1UPHjQNp$A3>-D(4A=y_uQ!$i-3^dJfr0SpQVDl7)zjf5ctnWHWC zsHa|<%?Ep%wnMf zV1SfXC`ja_jt!++c448CLhxfy>8S$}oiR7XhGE;K!-mi`hIl1VLTN=gOmi8a_YOu} zm8q!CnZbjO8&{+V`elHx1(NL8NfbQ%XqHjp%K;-tm}p5@L~=W^O0U4B_+&w0MSI$m zDhsSz2HcCva-%AOB6&`clsRw0v71w#uuX}0BbO7BErPau=9SBYN|DWN!h8LeZY#i(w((}+f%~?EL$>hRY-;wjL<==>8e?(pkA?Agw(gma zB|Uk0;HwcjcP<;YSZ8maIdaV$GDTSVAzikYt)82Aob4u@m4l}Sw!n&c;%0xk&iETp1ZcSJNZEqykzeh|1hAU%ve})R z>FKCVD+C4nK3u~T(|MI4_uY40$MQgne_N9NsTa}|a*0~}31rNuwJRVA&; zf-vJMRHC~7q_|MD1}G@tscv3Rh`K=y8n6x}B@M`C4T+?{asQqQb)YND zm9RdS6NID?x6uh0<(-V;VTDQyDmmJqu__K$pdUB|M0eURLf06*8qR|fGRXp#JTPJ2 z=g(Cq%^&{N%5ivrXg~suu@_}$idKIAn&}rvoA_b3}i1JekuVK}8hMi0pW#AUa_`#s|iOIS{W%}HyY^}m1)BSs;nTtPq(j4=u01QIB= z%mfY+sNmDUAgA6=9A8-hxk?L8xPQVQ>Xm_HnH`pxg;fa*SS z-)dX1GpJprAq>cV!n6^=Ww1TIk-Fjr-R=`+E(<{Z^^&<|IT3zR(;`jMn}Z8zidHo? zDG0KPa;{T|CRy~iTg5G4$)TvD`<8T$K5l-}T@0_7o;>@46W+CZ4-@#jVTM!en*-5| z&AD##eQRaO>n@S2UHTGL6w-}FPi;`fimMBbNJDgY{15uGJh*2nKXabtL3e$QMm-NJLVNvM(ZTIVH76Z1Q zZ(q0?(ABHDSWthBrF$XUey|%9`pPov!K1MWUxKQuWWRi)HawGUxk9V4#xr7n9BhyQ z+B}G{AEb9-@hf0vU>6qN5hDjw$h+|@MN>HiCXK&XBp&jfWvLV!g94e@(A1fU7)SAE|D|JWhmS#-=s0A<0W&^z!?nYQ=bE397|38OA0Y$G8>S;`b*`(VMm}Y;L&HZ&@!FW2_5sEQbRCBvqbtwR7ACKu?>pyG=b3@(TXn@1C4eq_nS`r0xJ$|Xbn z-8Pl6T{fe?N4vJ)OTx58n{m=lN{~Exa!6lbY&luNknyv3^#n~jf+mF|)b8Gn4 zYilZxg6m!!I=?UZ_u@!8$(gSFZF{@J<4?mc^KWYOoXy7y+!_9^?DN;bm#*oI{*GQN zm!5aMtu=d5yk}4I={HZygWQ|g z)2U@`f3L%$sW#0qoMsieb@rpn9$NUH>JoRZS9n(RPd&b#yZR=-tNU+S^S0bvyK8Qz z-}ktaC;Hcxt4-FOe2aI<@7{1ct+jb_7u1^eGk0Hc?05LvH=~&`WhmMuvNiaxv*?wx zvOd4o-u=J$b3N)$_mJxM#qPUae_J*=`=IUoK5LHZc)w;>%`Km{t*PyLJ+IQcxbt;g zKNfPywW`eg_1*_J)<%7Xb39+=^YM8a9!1V7ZPMQ}$)oW(4D7CO3}?UY+kd-H3_N!4 zI3GhMhCY8~eU7q~R$9GoD|7RIrl8xx^gisq&J*AF_*^DkUV`1z)_NZF{XZ z&Z{rd{<#Y>y!2B)Tm1QWZezEgBmQRT|Bm^qcIz@Yb-r!)+^FZ{Xy zbH3flzs19=#BQ@xU9z{%KUVd5z6{KC?5W{b?)CgO-P(CRB>R8d=7VEp)3>>=#B<-h zw`LWQUia~8Yu$Z~e};FB)pcF@SuJ(8*~Ztxq%}X$cb=fleoP-ehUd@vo?gEUmWVsg z*?pUM3_Z8z%T8|ioMr2Ge@$fjcf1W$nE(2C^1aUkJw+T881g7FUGf@RwmYaVumFKnsw9>D%O(e_<{q$dMmx^y0d!Dd$tlC|oKt z@(>u~I6iglpYWf-`7yLxKi}uT%ELYxhh9n8)8wfDVJAt&mqvu{eG;-ryu1#DlyR;C zFFC?y4{D)(8QYQIVH41>rZQ9OrmkeMiZ~ENWqO5Ni|w=`qB;d6^adoValHR*c;6>GYmFg67>ifPSt!O~f^x z?e@4CB@LhDpRWGBCO)e|-*&Yue~Kl~ic{a+{JqZe>==r(ZA#qugj0P>2Nr8P4|2yc>Nma+2irD8!HyS(Qh|dtsK47=X2;jeJ$hP<+v?M z<2^W^c}36lApSZ*j-0J{GLO%HzghLC{k~&P#;A@%j}{%oA(}%ahm32~p+UJC`Fv=jh?YG(VpP?xqC@sEl6pwRNB|e*=-AXQ zje};7=ufpv_S56h=27RNarNd%2{QKk|Hueppb?Yo|0IO3efj!!z>646*jcoYkrWWUyP8_ z;P@K)Ch3HhNw{Q zgMP{MW)I>tel0`k5ToS93JvY_wTJce#iND2ZYwC~lM1Y~g&T!h#k#R0-A80FSvLXt zD@K~RR@>Y!VMB@SZNy0spN~r`jP_frpS_uZ5$qTiQ&$ldg!(>*8aBqpa2FV_mhf-p zZ!4`L`GQ2!|T& zCK3N^fPaLqGqz73AERfxtjy9Udp7T2FXK+enb?W!3J>?BU3V( zUoB7ei0d0WdDd@y#44(()F(4Z5&I??Fxv{yLCBst!4AO&s{cTfc^3>zJ&w3?7I!W% zXR9`11U5%>nj~TzA~F|q!$`yA3c0RO>N=wlpAXaE>Ib-;AW#;R+f;!w7FwsTp9u#2 z6+|K`lu3{$A+k)2jEK-&ER2Os;%Ia64k0$Z`AwHhNJChgGs=NnvfAi@g8EQc|winXRc`9Xe?~ zLWapQNyG?M(7KI65#63WzTIQsI&)+Tm$tc;Y$Q?wIAKoS){JvtWJ}45eR(^lG84H^ zpT!&*q6Cz+QxQrG;M4=cEdTZtcOJ0&@4g{QS&=6J(lv|)mS^wy z*;xV~pM669uv2nBU9fH%57WBo(5_YLo6aQ+-`E9|46G$O| ze7PcX`iBqz|COpn0-Dy+-=JwHS!>$Dw(0LfwFP1SL1j-GTrGi@? zII$NFki-a97IoNi(!W)qK7doQ(uHOuT}!z-=!-8d(I68EiKR(^Q%<1SJ6|w|D7JFB z&RQgL5bc+5L>vi)%YgtJqE8IPf__|6vTeu|s)hQt98Ox;h8>vN+jP5;V7fj9>nsEm zGD)c7NLmnR3l|~wzlmCUV&aJ!V^fDb2<>Vh8zWPVW5iNS7$<9{8?t+%?F0b(7-a_$ z>+}?qWM)9fg91#!uBDlLSK}NYpoPW}WYp5(*?yH^_pD zAfWC8i71ykj6QYIplQ^c)9AzyFwX^Cy(k(KqVr%u3z_pkWEP-`B(lN?eaDcHh3TcO zke!czsAVrEU20*3(gY;d4E@lOw946!b3m19nGL8-HEM&_6K8n{9o*8YWGn}S3&Jy5 zByjqx_QL?8p=nlHd|)S$LcBtzE4+t5U-5gyho8KMV-j=$=CIiHLq(eZ#Rf~ze;O51 z_|EMEfJu;tfsB||kp(o4GC_l4Tw4P(Exz0`7JbI<+<@hedw@LvpKLAZCUZ1?b&N3yyEAus`Ti z>FdmyucF24=zR=t`R9C9@4iM-_g3tt{5G0-7$45NSZ^n|twHBfqei5qJ6}hB?nd^0 zx^AvUVzDRrcwR6!UQVOwUKa-Qt2ck;uA5c}(SJ@Xl~_~)*t^#>{q{RzKXLQy$!vO( z+0U2BN;*h7#XmpVI-={wywvKd@`m*G-@Mhs`8u7`Fxm1uK331=^;YM;|H`X(`SlX} zT{>m9JjJKS-#v3eukv&lEd|Z-IzOCoiACc-=6$&;u1crP6sU*axblY+c}uzR?r?Jc zuEgh8|NU~?@ONYFZup`;7*u6)c^&G>e^u#bY@Fk2ce?%8m{oI)>z?U4R#~T;?RF+I z7sTm5k^7KM|NF7?k(kVjZojAFzs98X8a*Sh871+#+05*Yxvh@ z$d>&Da}gJM4vme5aouV8T2pk(|5>Gp3A=gUm`01jKsb*X#<;dsRe>u>pvuRf`Myr8 z-Cu8_*$zBiU}7Vpm}ZB;WEgU3MB_|trru6nnY6jAgI-h*!=H>E*AH@j3ArRm4OLWn z$|^<=W%lhSRt!uL)4Cf65EIZKA!Mzd+$w;stlq(iq(t2!!clFN%8OW2#l%_^$J=ci zDKM`ON%)SuGOs3DbWx9A{?GSNghNAPwEbuh7V(rO(|RUh{EaXD4QMTGEa*21zIt@wJ@HODW^?7e^F9$LJT~jc zR%H0C^13R$mjm|_5BIx~`z|E$w!eSVMK11!*6n+Euj-s<=W(&*YksQN{S;pl-K)2I zORw!l^!q*a!(CQ{9X-u154-1max`eo&Me;o`UC5W1u=9rjbn7cEl0bbsvAv_JwmZ!aqWP*yDlF7v>-K zdIbE&;fD-=p!~+-_o^5XI`akp-*Q-W?CSuAQaNLU6o8FWiOYTiy1?lb7KuicG|{P~`GJ+G zn6m85dz_u4Og=NKINaNL-mcHsHh)0<7jA!{KEJxY>+m0BHl`*M&F!8ozq*`E#Kc6z zzKEDfn%r)O^MEntCr=tqH@j+2&Wrmezmt29O6!XkmD)VY6sHq#_-ik-PObbIR`n?| zXL|Lz6si$1`;KJ`Hm|a(6QK?5w%g6;umYI3HwF0QRAf=bP^dEd`bm0qz5nssK*vIw@=NExizu{sKKE!CJ~ z&2TAPDpe+qt57jo9&}t*T&j{LR;)1XT&oU)OYPXTpP_731?>Gs>DobRR4rKzK$Myl zn;tVal!^uxfCekMGDe=!q;x2!zyB!ps2|WYK%G(_JD)U8{#uTx)xt$Nl{{2N=}xmwvcrM{zyZ#a?4FtqfNZ%kXq1#gjAlJ=&dJmu3OHTkSKp56>3>=v9uk>E(ve# z!(}gMM^1xTmy}NJ>Ts$^u&hI`9^9oAPVj(hj=au@=vc;u_?zWcbZ$?M4X_E3W@i0N z<&k*6y(lYn2t+Bq-aCiebo-_w`+_@jt$M{B*xI7}B6DL0$+iY%r%_9;99wvLl|VdSC=aNuGFMYpj2Zn(&+jEiKY~*q!`ttNm$@Z0eCUNnp9&qQkq^EDGS$9TSnKpGMWu zKe=I50Qzt4@#3OzXPO2Z9;Roq_!~TI@_oLBq4}WTS(qMW`x`u*;Hp1T9lCX_>Bs+% znsWTtk?SY_fo7RP_{$S4M$|zW*wRX2cm)~u>)*%aBaGd8^EU)6&X5?4!f{ArDPE~{ zMmfSz&gwFIs_NpfS>RZ30aCYDGq1tmd>3L;#xxbQ?}V9v7B z5-?dn?ucHY?@8IlX4d=UPpUwP9CS}uef~IzO=E(de4kxsZ7Mfya6ELAG z?PDI*p^(u8@w0Nq9TN%g;2iVqCv)4S6C=U3hmI}C$(Z8ZB636-jJb>L>9g8QM3e}Q zJ(p}u5ue>4e?n{pU_p)bn0l8W&14!q125;(`!$~p7N_1j{OqW zI28oW_BrV@jyFLR2riA+MNm3+Jz(Ke0v_lzZt}mT(G1~C@=WVTVx#~;(SM9%A^t#9 z>Rqzt1r;FxWc;G6TZ3{BLs2L=IP?YBBngv|fso;L->j4$Jmau+_r_|Ac;pL|jQK)$ zHhO$AE|FtW(Zs)zh;;9Z`7kN$OB}+|rO2XKaCsPGPqnhuURDINKR;PsRy@Q!|ApK2 z+4U&palb>8V@a{c=}uMdb*~3Zku?Ne5=0W%gG=V~4FPcprt4?BBUp#>TD)RR?wly1 zOuoQeM8!!c^d-?QyfQfi9Ne$Sd+f`mgh_mu+`r^ zqcZT%@`MoEZ`@v=Rm27Pa-_Y9mbBQK1f3-)XT3E}X&Vq@O~zRfDxtI`hqMWYwC0wS z(Hi|v21+*G#B)-?CMnv~V=9DAG_=L%tiC1>Z)S+J0FNlaB>`uR#+fG~sm3MxY#B1i zcME~BRBTkoCJWw#*eHrk+SycWl;#$5vl^R#y9U{)WkgyWji?wI4?rW|Y6jV;B%MIJ zCfTTtO_trHY!u{{UA0Cw$#n~RvNoU40<9|nd&Nb9R&E}AlNoK{Q|11CG23(kssUwqagsq3NwN8tcVua0|!kW}Lk-KhK zofrBtw`^Pd)z-*K1JF#LE6?E+6cR3y}xUtPf{woPT08VIGkWkcHEg+rpd5; z4dS8&j~Ui^1Mc8ZyZG&8tzwJnojc8ZJj1fXcH4HTTlSYYH(d3x-ii+fOUA!_bdjow z!>6Geyn#anL78=2TxP}7b_Ee%nd#X|0v3HS_qLv+*;AQj(u!u!6MrC!$ceCl#sgGT z2i-X0n2GuAjZN2Q0VX8|Lb=sZIU~ruhf;z*key&)>l^EH38$I-933kouXF=t7=rZ3 zAb=Exp`?^&8@=vHom|*e3^AwH}+Vr z*svGbv$$2b7%%d*e3Jb7I5BXr_qL?7LArA5xAW>?gDBue6Yj~5llrR@wn6*>zS~q8 zUaBGZHmkGIb{s`+rXg(dLC}w;nMg)H0%aF4Zm($0f(ekE2vsje&_n1>1nk}P-_jyYSTS-U{z7D~y}MEV<#54o6|!YB&!5i{&<#)~{2Tot4}I@EsUjPhBZZrOUs+@TV>jBgE4|M|2tW z+38&+Lu7FPmhk+xm6m8RO$j4JWYPln!CiodVj5)8+BCTN=F0=YR#7q!MWvIhhDV$j z{!iejy~2w{#`JPryR>c^QMk7XaT1e}6quJ;fVH%Zb1E;639Ldid%g01Ltmmz>jXM4Q)uPak33WwyA;EXJqxiPXaxA0aUOb* z9^SYGevlr-N#P>heZKLN4=3EYy>ZeP$@i2#zjILmZH zUXVDe_M38L6CGYpI^ZbJlV;r|$aNP(+cW@lB%QlgyQ=^S@fPdI)FU9I*#ouZR^Gd)kz_u(L{Xl zkQ8IcR`OmiXF3FSpb@S?FW=oo!5uT_=qTU0>gjVq!L^}|Kcc4dTvB9xmVUI{-d>||EyzCDxCkLG04oFE`QE^nez2ZaQ1PD~RX{R3op{lYU3Nn3X zNV-wy6+&(bpL)n#)4sFjfN369<-F6#h*PU@=S30~LuR(J>z(B8Dh?0asYw9nfmQqI zGN9qzYfAbe<1qhX&Wn?UTyT>(;#7L0fhlrjQci8WVL;X795|nY>%~pv;JY43=jC6pL%}p0G@3z zJdkl;&^_?$H9^3XLhyNCc{hBa*RU%;4w0KexvU;~z#nw*eDGY(`F9Gb(-7(+uFOmG z-mc@aUaa@XAb%j3do^ql=T7=HR;yk^6ZhB)-6E;A@xMMY?UdIa=h&-Pt14c>$0}>( zUtpJMnhw%h3~K{a#FYHbccA@NP(Uw;zbvIE&!~nE(4hWT`zQ=h{T?(Jty6Cu!Sq1J zShXpA7({&{K8WjXN$=8qh-mmy!H3XWq~l3@1A2{bZF?^*iJ&eG=m$#Dekc2q3Gduj zEbGR}52?Jj`&0Eoh?NUDYe^%M5ZJnt<*{DbRJf-kG>9}*#nM&TI=G3qW+I+E1C+v zs^z^ORx7P4zR#j7eX$Ah2spF_pOHGGcARgUMY||)e*t&om1*FfpEsi)`CRW@1&TrT zzv!g+T-ndcI_=T@5nlv+8!$ow68ES*1_o{&H3e>86(7I@^-^g58gsq=o$|@Sa-L|n zYy{)?n&9-0NT5$d0V+Q_mR_gonn3UEIc5g+MGn5v416zhm zR1u6$XRw310L@Kc%m0k6{yYhi?)~+epzkELr<06QA`Ua0UetlAd*6W+|!jM`{L?!?sw$5!{-w z?AmPRhu)Nx>sl!N7M;g)+zhwf)CaXCFT1u``Voso8PkaSSs7>}AZjD@@()*sB~gG& z;yq$@$oEK(Kcehq7~TY)rRBmypc~pc+0(#x;yI%PyWl55RpB{sRbzm`QMprB=m=B> zoLy6VkUu_C&Fw2DAI5dG>^nmwzc+qbj22V*IIANdW=O#7U` zq0=~+qS&dHf57*Wn_K;(>fsK{1A(_<`@VFUD6{+8>5I>kCH*)gynh~O{`?E{pBBwD zcNOF_fW;~TB3bYRvS*?40_jwUAS5ZEup|Q^fKu~fvkh9*ieES`C>+jX~)x6uQ4d>ZuF6=;oI|2jT`8S9)Eads>B=ga9Q?sevEs|rji*O$%8n>9?YS;PL)`A7xUj?h*`r~w`DeJXV)w^~pIqnwiNd2R=i z)7JG*Zc0nulyo=Lk*!)d`a6_*;f=ifMXgMkTB~c_5$cjHXlU!$A{GCJN-tTdF;ci9 zDC165Sz5Ht*@}niSU;fCL|Bf-dmE4c%*HAWf9o5!R`9|*qdjPIS(ym(*y=X^v4-35 zEWXlqC9Mc6cM_B;oBFX=D?(eoVd<>2DVfefj|HuEDP4%R3&i4Un`FO@vNbkXuPgNo zkCr?#bW+0UtU+;XRj_>CDq0qdXfiqdTedTm_*`qF%HIo}$=Pp%Vq|W^=9lIQ-eN0V zd&*RIvfu>#GBq3P@=24)6sG+wuiD1G4b}b5H-RTN5q^Gy`c#EsHKK=*KetT?Jq#Z2 zxU8_BLc{Mm3VCy{xMLo!c$yO^rg^bOFKlGQ%M!(Kdn<1vZxiJnz0UE@7Ce}^{wC({ z*tAr1E)W{no7lT&cGzq)o^@Fl5uVN_DzHNx*0vF<8*SG?U}1uo(xYIdU|UDwux<-+ zS1Tni1!x%;(w5>|r2NnmBCVKS*HzLG3CC1z8C!j`h8!~tf%oO|e6!@nP5ka5HSPkc z5-uH7N3SSVu3dZn4)+|OA?Qx<%Uk+wGLZ<}jKSL~jjpYEPTgcxZ02kUF>(t%M5ez? zl0r#N>Lx6My{DGYb&b{wzWbkx7pLNxpQ9DchGsUlfxONv`4#5v_=?>ot@s@^Ar3dY z%~$!kETU$U@M`0q1vewL-MlM{_z&7)4h0y8(Ba}F(sPPrZPl*n-GPp|Po>M-p-we} z+%L|rB1Mx6SI8wL&zsL;s)sfjPn(!{q zpeIEAcu{KbhaW0@m0sivA~#^lYac@EJwuGTKlo}J$= zIk+j9<{xf^o?}u&4Sh@vcLa$Y4Z=rrYw7=DY3p>_&Yqsvaq#W%1~Y2x)!hSET!cr;1X`WuBZ%Z(nZ!dtdz=0JEu{d=;*Ne4!r$rd6yk?+2$H!N>z8k8h^c- zW3=h{TJm1KbR>60KU_$$iw<{qe~xSyFhnjt0-R$|0~^cPPJ4;I29I}??$D-`?ylOY zKHWLPOhKj=;Ep^@YD0*J3ectOI*w7dUX%wFGi=uQdp@)#kOisKjCI2Qmja-b9A(kbc)Cpi-!}W=ja74 zVNleRA?WgIr}=y#D4AI|M|Fh>+EPk3Xm{pl4l!+G_9z|sN(Ohiir39LRG)|%Ec_Dk zdwIHGe&I}-k?JIE38#GiJ)zMNHwKTo0n2Sf=c|5xWQQ~_cTtUmyeLh71^HC_ThLj7 zv-QJt^H6v{m=jt>Aa5eUs>mX=m^H+-;c*Q7@R<6MRyIIV;hl4bf$Xb;P<=n1S<$`$6ARbyLKjI` z6ATB4F+^zl8Xux30wYjej_z4gvn5T2UK1Z2FMnrX@V+!j;{7@U)2{iP1iaHn!gyfb zfCf*d43Rg{_utTL4Wxo+fw1cnv*Iod;X4zkK#?c$dMipxiVEtA8&OHY0fhviHpU}_ zLJ_1iq+?8}VXtJMUg0R9ykld3cnx|gLVz-ul3_|=PQS2JN|W2Z|Do#~f&~k< zHGOQ`wr$(CZQHhO+qPN9b{*TcyE@*R+>YDB9PNxf$rV4o#a!^C2?n&l9T4>?kBjw7 zF|`BK{N+>pTZmL~k&hHj>;ab34?w#z=c_Q34E!~(*Y|YW!ZeHbH`Le=G*ph)jeB%fV{kWJPs4R#+*o9vOMuA#^D4dJ7tCheqOE{o0~u zq*uzCTUNbg%0Mo8b*XUl@dLj$$>AX_^%H;I0XtUE&PgW!QrxcuUSh`Itn!t}M(CF$ zFe01^Rp9GY>g^MMA203HJ%ECA5}CIi4? z0EGc~8jyOA!vK687%qT#55xobHo$TZbspj&7(fB~4Zvdnod6hx0Dc^_4tPy~^A6$- zy8^x{n2Z2x8Axy*rv-pk(0d+`2eK>3ZVz)F_z7fN(4PTi>Rb-+(6rLJw?d z5QYJH8mvCJ(|}L|YzL@%klTRv4de<~n3+2n zI#~Q~M9JC)TN5>J;`vZ6OR}C8P-*8H`GwMgtQn zX(Ks$^(a!-Qf$u^2WINU<)vArg_^7z(QO6hPSQkArB|o5@V8$uN!bb4q1;Ktf$-)Mu5-4A+(K^%~R54a>|X ztFkIDD&@)ylg5hU%Ct$k@(S?k&XnBJV6PFGN|UkD2dhz=`t(RK^j6VcSd?*kVRq(R z)~xv8utKM@gQ`^3;(|Kr%Xci5q_A$4;*fSLSW021wYtw|( z0=WUzC03yqNx#U1t^>JVddD26j2X5=EBtE$W`aIEjS|uB0e4Q_GAKvQChTLBw!(JY7fk3oAj{BJKrQ`kgJG&yajoSI0h*sp=Kf*JM$tZU~Nlt2+Lb zE|RUs>3=a7Zs8I4g!h76S7jFgZtpeCahui!i`-PI!@=$>2RP*;To+`i3hfKl49`iC z^c&Gm5dBxXI^gfoYpZE@)Fe;p+eA%8A1Em}$Q|KE2{qZb9yUhi=9h6v<_P7ogh?3u z$P>O;{fS+`b%P+{g&~P9+qC;C2qODoqk%FX5ht`pnIa#mS7Fyr@?7EB&Pcw7M|@da z@mZrD6HvwT9vzcHC3|^7D_{e7pG(!#JY;CDKq2_|8_7wKmb(Nk6H|IYG&Q(L^p6|Y zhWH@P5p0Ur<&&J=sb58x25jvei{p+27#AvOt($9;(f0?a{pvXP2n$^katDg#?v;G{`?tyV(e~?xRF2KKs zWZe%R9zcxZhXMjsKo($0MkrQjE!SxQm|;*ZVj!p}2w(=!u;WG@(BX-%F+40|jvCMa znjsmqk&ZA1V1DW|Fb%jodf33iR1U{zR|g=)KX??;VucDL2LwWrja&nC^zO()zY2GH z7br?PCXH><@(ir<RaM!RXYyy(z$3-){P4ttInQl>ohK-bv3sCFg<9T4y@?esFwl3?u zldxE3jWHh{!2J!F(@-3c71~Gfmce;J{3|0~bv^q528+@)y zur2HT%-~BrPFD6B48yVyo*{QVNcKq(UH)NKW)FyI#t7SM2+zJRo@G=d%XpdnbWirP zxzU^m?Mo(5mgP`Z+4l)k%j_Po;u7)xnK9d#gY79z;D>eycy8hq48EfMvdj|YnQ2It zDR1b}b9sxeDChXcy6B$UEZ^jQ6DwnyZ*Udyr8~?wWy8`JSM~)ltUGcgr}zbUlU#SGHWzlax1K5+5eM2RZQ6`&KWaMnvrGoi;hNvHjPV|H%7p@4@}S-;=@T zy3ct|Rl#lzL}jaugc^gO*Kz$@GRK_(Z%O`mE63c~&X|S|1j+cN zu>1k0F(a`2AtiHX)N6g{V`b_IZdJIdeO9d+jECR5PJ~vP))Ow5iM4Bwb;z|Z6ZWM) z!T+=5<$FH(jGrMz$$*XlgTOSiI?^w+u0{~ z{dYEe?sudc_fEB@VD|h?&l?G$uTdEP7T;&~TmR=fYWyz|j_2w%zKHA3o#DR&+uGhc z7`+Z({HNwT<-+uS)Nka|xZd~RgS&a&?|+I`}^)&FXwP~enxfm-?oq0$#ym0Hy@_;Pv=g>U-WPN9_@bc+o{Ibxbe1izTbwr zfnV`E?aZQoL!6bD_vB_Yx02_44tbA!Ne~8!-$LmOi|5HfLIeqEVxSZah1RLBkYAv| zLx_hI_cQKD35iWYMGFbeghV+gF@};H6f)2chEf=4ry-n!)D!X=iv*7P|8vr5elkfl zMF0Tszy<)o{O^;F)Bj948lDc=Yo5EKK_l7-()67P6p35{L0oAlk_sgxN-U+vq-P}+ z!K<_gAZa8L2+;HZib?PjNsA3}y4*`H2et4Mjfa^XOBzjAEpg;=IU|-h+;M+0+xUz* zb4TQ~&5ugltlJ|$y}RK_OuiE_txp{LUwe1m{cp7`*ll(04V6Iu2Fjm8RfB&0XF;6eA)S>;Q^CDc}?%a$;cGG0hYlp5L7#YIIiK# zlq)hr6el~(HUy|52*}8rAjnMgDU5by#*~eP%C+X6A}>bfng+__DBA4oA~elNUNAZ6 zz-xaM&2(W(%tdA=S~HGT++4WA*d>q=i;ud;NnpfqTUkqv!E8oWtHPhjT9EM5PMN|m zTQwIeH`4&QS^p*)T5HjbR^l$5Fgf~nw(DmIKHNRD+V7AR^*2M$E{v zgxMNHwDU5{i~|RjytqZ_1H)KVMxmwjSd*9>%%$A4mQVh?2-DCMKG6rvoa|RCFl%Wf zmyX0~)90dn9U{#7jHs+iYeYm~z7+jA`X*fZz(Y4oB(X_56qn5Tjpg$Rj+ShwrptU5 zG0+;$GPvXlOQysufeqZ+BwY_I6(vn0eJdWlS`K@6>=8{ zX+-&AX$u7|t&-+w0teNE(O3THKKh&VGY90<8#W9$m;a3ZEb*Wv;Z{>Pm_`Eb4Zv*RvnS-z$Yz{@&bVTiAG5cf5E*;o#^Bs^{^x8 zLviSm;EZ;ehDadC4-zM={E6lWd2_Osl(NIt0J1F7K<$4x$73M5NI-j+c0wwfCFTc>ME+o% zfpi0^JdLQeBbOy630qNWnsy0VmxE=b6g{|R(B8!{KoNv~&|gvqe76glCX@yOgJ(Ix zmOE1%`p5AO3TlvBrDz&==S8I%Xl$W*x-q99pF0!LPMBa=G{r(gPK?;LLN4y;eQJnm zIL2X#WYG&s5EBSTO%u?Svo|Ny4=f!0EZW60Dt=H=>c`#%7HATt1j2Zqy7^=T$j|`$ zMhRw^3Igp`hC<%H#Xg{Fn#G`CE(?8IZM$cO^f@VO3${WuNK^||+NMcILs$eBZ(B4? z*iKZ1bvy9ZFtAY^N^rl}V14UEwmqzX%Ld15P>vX}#hX35mT|2;tia3ZvDLtJwbRqG z7CiAw8Yg1WLfO^ND@DmM>hq`Z^Gr+Wa5BwPNF7Sbt|-11=>X{tJg1q2%gJ5nX)U6; zS&PNzPG9yH)3xizou`3pyXYqYYwCXni)3#`)gT(rf-i6PMd?mnL0hz&F5^7Ud8@>2 zttg<9+?dF%Z2?NDOeUnzA*y`9o)ZE;FE}rF+cn{0I4qfJesTq0v`xT5YeT=FGo?ab zBDrC72qki!&2kFC^J2Fe1)StJ&xT22EXQTQfSI@fwS1d~39_k>fwf*iFr-cMxLFm= zNU|S3debs*+P^0YAJA?$boxmMXKwQAAS&ZRsH6 zKk4q=%O z6{qhh;NlO~JW$$svBJa^^F%I7JFXL#%!lVyPReO9#eJ|2nTpr0zW zMZ|a928I*ATCnaNNI01B|2VK%B`QV<6^*TnzTUV=aYZD>6_(%zrBq-%?2yQMxJygk z;#ua9Lq?N0tia^R9>hGHclxr)-Gb#>ATP(zWHKbTjC0tmp-opoj%WXiP6O4pffPta zlT@BkM#~J9_Znc%PU%112y0)5t3XX?YblAO8M4eda(|Tyo=yvN)7Gai+S!-l?0tM0 zGOh@;5z3Gp2;AH(;RYdTlt%cvUW62J9lGHRXpX3g{7FiedpHUab+VaDPPS27 zUrNC$xTVNy;MOYLtXNTAB|Xaz@cUBXCobqM*tOLS3Y)iyyv~2{biDY?R69q}N;`Bj zo!NfkC(kBZ^5_B+U^CtiaW=k>p)+F94dE4~q35O_9D)a$4RsX;r1gPQo;CT_aK_+; zx8@r@eOCA}ssSjrZcJn7!mEz^&Znx+pJZG3)n?4P(4V+dF^4XuG*boa?GkW4%C#5d0%StTj`j9ctG zpl|#*zw(J%c+!Wn247MVA-rlC+R7Ir>jWx%r19<*=`+FAZx!sJKI?yYV?PiLNiQ0!UO9k!riM>tF~ zT6JLN-5<2DqT!rrAB{P~%o%!LjUoH~q?h{d2P9yc!4-RkrFLxe(V1bedn@%>TN6oN zN|=uv6vLmr_O1U8C-mQ5Z$qz~pFL7PC7nO2hXewj;_dbxYF{3|^nYFU+jevAI9eQ` zNAGHPm)wL)$M?Q&(cbE8iRD4&+Z-)?=H{0w~eAMbJ;cYeO-WzWI%{~kwn#`A7yy)RwV^Y(x5hr`L% z|D&a&-|+htQGHqL4x9VG23jvzlk0V1_?_JU(&~D8yyM?!r`2V1-zh$9_~*JGbsoO% zww}sQK*MjT-j`pIhC_+ENi=`_oc_JK7SH>7SLtxLM|L@+{mb!o6YtLVcsI54=hN@^DQYl(i;K;F zf9BAi8rq<+HQk_lO#kOPCj?r2M^(>?~6J^)FGSllx ztoff_cmH|M{nu3R-?!~Ge!TL4q!EirhUalbW&Fm#lyl>J*lYSUMZX-l@H|<{Eo(l@ zOEii}XAyR0NMhDO&sCN>D;ryzwob7uzlJFV4aJ=7d?uny7Z)nlM@iNpJ_cn5{CH=m zZvk=s{CE}egU(rj7fFwO-N|0e4RexeuhIkJivcERvryUC2k zp0HW^GQz|tQs;Y2el=f0TDPF++z7Ic6aI2wJ@y%&Is4_ABahoVitFMrxnktEv|@Ok zH!1UTc%i)-2x72-7^tPv*ofSG?d))r+r-$hJou=a_l5Rd zs~wNu6`dJtbatKX8+r z=5@jyiaPY}k%kW0D|Gkh-~&F#eh-b92uDS9XmBU1WYVepG&C(3Rp3m7+NKA~CFiYQ z;Q!PnN|I8zLcsw55TF472>!b^;rwsKgo~w(^Z!T`YQ8qhCz$@e^|!OPq;kHe(n1gj zty4ng)4%j zUFmikw)|Weg{D125@<5C?ElDAb56;nU+L^XS#Wv_FiT3Rx7x_9spzr02(O@QV=&Ng z7i7N2?93^tih9;}&*Y!8%52)h4zM2SJOFq%avM%wVLIl{KICi!Pn@i`I+GX12uxy8+j! zvY9R6Y7pCU<%|*6Q)F0H(vv=Ys<{V{JSp|pNaW`q+To|*Mf zNXT`RAma*$KU9DnkEs7wuNX4wA6T1$L3fm^8-*d~VkdB_9dKA6_F+vEGJ=Bc03IQA zffW3=zT#M~7Y3SfRz14#0ws+>!XvdH`&wX_(fb*QYXz-2kxx?)Cq%rnw99NJD@$dP@H0xvaTSQd7Yys(y$LJ-L$FfL;h z@gMgo1f#leMix#Te(+T2Zr#WaO)pN=!YsN2grHOeMLII*O(DiU@VxDTS=iQxd6*Tt zNu=|ys6o~_?TDL33kU($@J!YmyP>HnyX~t@cs3X!5<=mMH%I5Wou?xOy`G=nR@sb$ zwB=_N6k0r#f+(>=LfmW=)uYba4~zvQlN06xOq&N)E<@Ed@kz{rxi_bo4Q1-Q(kPZ_Y8hZp2L#6SQ> z!A3IWugsi3nnBws|2cDIzH@y4)w|4O-)yek>}9V`avtw_;Liz=hrIrNpc67YUp-$w z`dB-kx$^9*p|re6n%%S|oUzRl*&wtJt6B5ap#&&TX3xOyM`@6EGve69D_aqJv>c)zFPLSJ3o?MRcy zEkpea&(o2i(!@gcwx5T1a(*4HZxiXwglCy=cQ(E)$5&c%mzP8T=@b74snO72e-D$* zG}-g~)#)GQgUl@0%@e=-!JE)qUj_etyNAQff1?xohlOnw`&`Icx>~(_^0)o{5tzUd z@1yOVmlk-&#Y8J!h5WKNo&|n&+GZQ%YkmBYr8>9|)sS$S9C{300sV+B@5=Bl1D%fk zwYJNfff2ZC#rX4OSY@eume#6k$>ik2d!`%wK1{PQIEGryLbE}ej-5%8DJ zMW#=dwKQxI+zG(q0@9hJI%_khbq4U{o5s(*Bie24$>S9gg(}HCit6OF4fctKrymR_ zFa5rfANF|A*U{i+N) zr&9mVYH>ZI6W-Q%YZwr^*IAxcyHN>waDO|@=1!}xHTAq5m!rS%)Bq>+$}Z9Zpj%@7;8}oVobDj6a|6f#^^} z>xI7gzju?)%yKyT?Uws(sqy+=$J0g8>Azjp8{*dDD{ZV}BE-V@)OiFiGA&Z;6F|{~r*qy>vP$tdo#@4#`dk%ZyOj#X00 z9RrGtD;N-wes1dy;wTV8p(3S27tzn;4}L5$S<&u=N*M5T6L{E>#BU=@xOSEM4_+=& zmx@d)lti_mACi3LBdxKwgFuD^?Z}?c zL1{=}PyWPg3>{I7aaa*MLx%u{1Yr@r**)5jz$>(ma|!g|YzW}aq;+qMEujomj3YwU zz;a?=7(O|u4j2V%KjkxUVSYv!h7M{o2Awz<1mxucVBl!XE#moO#MOZUzQ8td4PpSB zKd4VSBFK>N5H5Bh$A?xj$dMJYh^r$6Y=3#!a1#KVsU4|vE%U6)s4ZZ(CxKh6s6DvA zK$UUmW@3k_ym7!L4;`kCIczTChtmc*c=RyCb#FMXAV&@Lg>m4n;)T)L`9{Oy%GW*c z?hFnA;uDw>20{nKMH9tf7aWbO4++ zk?Ad*Kyoo{h%u?Hkyu&~A5{p3;ua5*J4jav*uE{p4fvD5?*AegiVwqanpH{0@2wsu z7*7Q%7`L3LAn_)HPiJkoh_s5VH|}MJR~~wW45p<5(_rKL8SKL>#a{sTwrr;JXN!GL z((8+v+rRE5$wItWQ8%Qo%@%P2E(FKZ6j1g>1i6PoU?spfhwy@I&P0hemXc`%OOjqT zFl(k*g@_C=ZOSxyPf|gyWf$%%W6D~CB1>X0Hfsh&MllFtmm1&4-v5qB6}(AgQ=_+T zDlc1VC=;ho4?}kmy%;983{eY7k$PC1eFZfrJpsf41wktTEec2qNJ3^PHbRS#p1(wL zkOEpI-&+RBNed7sF~|vkg|>Um)sp4*Q%<$kR`?NnpC071x_{r@^fT*z{5G>(?9}xh%?o1xL1~12 z$;VuO%y;gd>b~f;{&l$RrQiKoWZ;g){{0~Jaj&TSb)T}&T1_vgj(g1h$EJJRk>=i7 ztKzC(XQy{;-7aCOcrC+e;+5kLd0|FRpXfjHd+mPpeRQk)tNxMP%}nObRYLQUDoqbjBQ`%V+hwD#wJ!^^?n>-5*-rp*31t063n=sH;P3>xIdtT3<`yJH{ z8Il#>QV-4J(xq!~`%ZZizl7JNf4G!xzukyUQWfW)eD~bRE`~$BGY9ra@M2ctDCZJsh@u$nn z5-aOL2J^mtuxTY0HrbxA(-f|eX^K2G8~QfURtBp;CW)=2Es9Ng?jXQZvA3eBJ^&ca zDB^-~Iz|kV*_6##4<@g~^Ws03?%Y968jg{Q+3j$tTB{R$3qZ}G`YJRGXUm#J#N*5R zql&mMQg+ZGF4_cQGPZ$|Rvbgq=Fxl4-6aj&d1Ec+QAoB9PBlebCZGO{1lH0%3AAD7 zHElhA4@247Y_*|s^R;$;3cSt!YF6`AUR(!zQ*M6bUcDV1-CXp%ggUp?QpkQgps8lA zKAw-RrQ`JYg={+foVjlH+s$iiQnh_9gA&-!G>x!b@9O<9Wb-w7v%2>;to!nLI47*FxV-;-_}5>|4k&$?ckI|1 zRELl~llmZv6WaXPW(&oR%KWs~3+d5dcG`)^JAb6dBz`(?|h9rtta z%l1#o!IiEFzv)?kzMwro8Ft7|!om=C+!OYj|8_nx+sRl9Xra)|3^H{XM{ z-4=CT{AyJT7$qg3`wCcgla>vqRo&~UwzVi*T}PmH`|1mKZDefjP?;KU>flSo32+na^A>%GB8R-5j*f3=t(a_3uz*GU_(qEnF!z4mwwAW|AUJ8tS+ zup9f#x(g4|NwBkaq$X`ab@drwTJ1@4Qw2EGtk<>`%k|p1wJKHXRnz6L7a_dTw~Sqn5a|-# zhkv@R>&rmm?+8``+}6q&V8CwD%RMnLHLE1fk5yRFrCHeUC( zY*G-B+tf2pa@sQVZ^NCF%076Hou^%{Zm-|>Ue5lBvK}5rUDIsG1sSPj-%3GW@7p|M z!}a%Au>`9VTP9|rnBbVDq_GWQaj`F_%y+Yeh22|iw!1XzKcZL~mrc;TZnJta>u%?U z2-e1@LQyGiZJg89b+sOe-TDjLe*6KqP}!>ejMxGNRF`N=OszL{&z_{vu?V+?xJ$~2 z{9w52^p&<|1>)7?=G%Y0M0NF1>%odx@70pri@phIl;l^aRLq2kgmNfhTf5nX2m_53 z+aX4&N+dh6-p`wIC0Gv3?J!*E#sH)QB4XProEso)03_;Mv{A>oCm0&Zwbq-4{+Ac2 z^>_zM&zAji=9^my<;fX^A*xs1894UBN?!-r<*L0zF{NxG}FA;OeyWpVK z%P#j>FF`w>$}C5q>ewr`6*U4@XbKE*Bt2x{^%DrHvEjZ4(x;5ARiRl5c z;RTla$}Q_Ag97tCuhh={U@?Z90|OdSdKszJ2A?r-{M%iCuNxQmL_@(@>kOVr*}CiI znh%vB*LFmO5|AOuVz_pN3`_*kkf~$emCH_-90$UyjXIqbaJIe2toP*YSp_CwT}Fw_ z!a(xKX=olktmmae2Pz@hoYD)DO{>sZ8=9Rfz;fP`dV5}V`^AbYE@lt!7C+LU93s_( zJ+`jHdR7*`(eOT-f0f#d#fZrd|9-V{YOGy#@!Svm{qGyp47J>KUs`W3aN_PyTc<5p z(tK$pZV9kWE7l^GnsvJs0PM73RT-bjWyP+Y@*XXX1oYz}pq~hvwT?V+S#)G-3A%_9 zK|C#W9cegb^%91FeB4APJ^0tlXG1ekeoUSSjEG`rhG*Y)KYfgwwku2#8UqHLhpV?Y z&|vC{WI)W+b7%>AMC6l9lF`0_Vf)xp`9U#oXrM%3q2`o6{edRU6)lX~rVFRp zI9i)^7rki{K?qz^yob(LWoqfgS&BfF$7y%Q=ER7|pO$LYT)Vv+N|-0N zUCvZGO_y(^_QHbJol03LE=Is>RUM+OkBS@*y^h3^c_WyoE$6ZY^`dpv3$SdG2C zw#E}>ia69fFvlfxuyr`pyn#^;JLcap&BliQ24uf-X~twRj;|Qy$!EKQTV^IKypb;% ztg3KbW6<{`@-e76EE(VAc$7S*xsURHr>sHW>*5Z~!`Y~oYg!n+un(peG_YIUh~_7m zc>1oHw&3C5?#Q-e$Bw(Bm48e+lWkpn$8X?JU0Likzs|dwWF#K{hme-MpjG8Lp4`Fn zX=eG-(T$;()K2?KO7_FBWT`M8^mOL}{h4h~n%1kW%htC&a?u=1C$qJ-<|wQ=eR_Fx z!n3`brC;%#N+4pK5+43%pRxkItiF-6Pve!!&`dm8oK5A>ZSDY`b~1aMZn-Gn7A6(* z{B_R9k=gU1yg=NCG8&++?3-m|7gEHHZI@B+pJzv&aFH(Pw#PXTOsxJoVK=U%@4<11ndvrK=JSwsGpUNcCvw zo@`?)SaaDuNG2^ZY{}$}@X6UzJgL`~o+#FyAhi6^eY>T{_j0uH#4ja*qlg)|~p2vF4(H1V#A8l{zXl&&1MsGe{)X2fnBmOMoHRj(4?48OBV zTrC*;yOi08+(3GDTiBnx9;an~{NQ>WI*T53Q!_pzaZqlC+Ibz(lfh3wa~3@*$DKUv zQ#!RGSDcFdrmcdRC=2Cp8je0J&vk>uFFg&s;+C^%6kVE$BgRB4WSr{J_e2|PZ6WjlSjvT^bXu*`ckKsnYF+8+@P`6@^6#v?=OZkzEFwk z`G7(U7-Nk}fB(QMfB3Pw>e!$qgE1cwGnd{fE0asIVdc(Pr2XLYgw)~eGFi?%x4$dJ zby-I@p*JcMWM-)%N4NZA*ynQk^@mgy{-AFhJCo{VM{7uGua-}FspZyU5QOnMf5}De z&Y4m<6vEk>76n{GO)YYs(?IUZ313SqnHf8`B~d8%+h!h>QPy$*hd5Mdv@OF3xwBa| zN@AEw=|rt_+86{Pal+HzcLa>#ZEUwRtm~z`{7vfvUrqJ!jH9PTIw694UHQ|y(G%#z zP&sy6JuvE122-8RWOyQX;y0ov>(n;4S@ct14KU+1LN`=EPj~K(+IBico7X)&^C^$> z&o5UmV0YEY^|7F`!B@Hqt7`a`K;VTJxk9S4`lGNu=s1P2s{aQ7QL@f&SG;Ep;=U?g z)~h)p+gfa2I0L(pTEUstsM+Bqz>xH$^#a}?1336?4o>boTmkgK0$CiDFdDH#t)#&d z!kgZxJ{e*_6--Qpv32AZ+(atX^nlD4xYQwJZ$L`qO4i^g+k?SElHv*hB}qA)_ysM8 z%b4T!cATjlhTN~D)o#z#Br4JUIP`E26tsj6j>{66E0y2PL^Opy1Wu zLi6eLag%`1fXXOi>k47;L_yME8D~Ok-Z{aQ#^@Fqf1bcyjz3Y_9Sxwu*;KE}!5OmF znKXSah{tFx1fj%H67^gwggLzY34J~gQTxM-V=yivIVOyB)`0Ync&h1)^oL_8U>#q9 zM1|8kP=S=;SS5SK5r0WHPz0lV;G`!j@I!o(=nKwno4mH{i0-4FN;2|L>$RmL(CQx5M=-d>cfM7@5F{2j-4f$raR>6J5AK0yC z$DI5X80EOtZZrkkOdpo0gUJ%BWH1~d2V4#nL0GxcbGkA~Q|gj`YZ)X&V*v%{J?X`3 z;Qo5{pe;g9IJ*=$uqI6Z_FKtlvP$!RWXcsA^f?gAjwk7KLB>0P*=P2ak ztj8=0QElT7^Qn(?C0&M%@S8;Q8o@f~np7?)wSXaMZC|)5FK&Z-(i@+UBdOidZbd@t zI&&lyhYzd`oyrV~Og}J^{GplQDQ9R-yedbwKD8OUk|vR*y57lQimNh$8uFI^{8*LB zweuEOMSL@ZuV^^#W4Vdl%N;6c9gXVc9)M4nQcsX_8v2Y@(+|)+{-I8MGW-GW=yBiU zC)r!jU#3+7j|$cg7R8HQvj?0hTZ~BE()F*=( zkhLa3nAdRxqRcyaS#PiC`v|zear_s#vt%P0CfOKApl{jrC9) z7BW+n##RqF-DELM#Vw&;x=h7$MPx3`&S-7Kd;?I(qG(AyRgrCoP4ET>MPtXGqr|q+N=}cp$w-;Iwjt(La%Sk79C{tEDwGocY$k!2)ccuEX^S> z9sbxMO@z{4I;mgY&|d26l6rK-9RBcvwxOM2BPYzkLE6hxd#bDNh;PoX*M*lguuVQA ze?a27aqspV$`Ie_gsGUT`0fHu>cm7XO1&4aYrA?*lD6NVf%+QyD&H-Qt9H(wH|dN8 zQEz_);yjSE{)^qlTP%#f{UtA>z!heM-uPly>IU7Am;6%nDCfZr+^#6q`oTXqFg*4C zfo09A(k1)#hNqrq8H@aCsQ0PiGu}w$tK)g|{Dkr#bGrejL2n$z*zB^! zP_abl!cWK_B=dKgqDFqiP08r_N~oC){h>$d`z;yH560Jgr7~s_GN^;47{1^)f2&cy zy8!;mC(h2HyqrURKhks^H21mYKQ6C5Tt`!Sq;_Fpzq>CsUXO-)c-%C-dDTbu3yyvB zp3zZFi?!?k(b0)t;Ug^J6Qjxnn-&<88X>y*1?6gWS(qLmSvE)#>L%yMAb!%mQ})Ro zgzN`Ba5EbCgQKQXc<@@30?nNey~IZho2EnuAn9=bLVERu2HJUPZb>%vJoWz*Tz-FT zG$DOZM=||B&5~oLw71fIkw8a7Um=W#E|z%iK|#WCKtzO6A}T5r6C#4dMu9IASD_0_ z(^fAus4F}Q2$rM0jCn77cUPiXi&Ry5>Z`u}nLm?ct^E3Zxj$#vcfWlfXGqAKLC@JG zSLuAowBKg?4%F2^eDYE4$f0vCz)m)p&Zl(Pa+BGVeL{2H=~FQaYFmI`NhTnA)~%Jl zs-WVhwA|^Os{-ku`P5hpM^{ii`S9{T4zcF*2sCfSgIk)-nvy@WZmOaTdR@>OC)sun zoCV#Hnmx!zie4F`^s{SR=%%%O^r-UXHy7s;U^ElDXJ57^JOtzZc)0^&2a{VEK>F9* z(p4nMwR-0`w|Li##*b#Go(TSMoQ0>Z8A~ofx${kNO9R|nZ@>REfT68F-}rdLn+wOxS1!AXpQOSTM!TEVB86p=Vdh>4~BlIiSq10@Y^DL(%9K$O}=A!w`Gg zks(WjEp$QITi0%antNj^X$>)jdlwJ zpl~SOYZJWL14rklJOCw)h4XAmV^8it9qkM7Y2I%JxHyK7qL*=T6>LAn*i1i*sja5F z68Lcgm0|Z(H@vtxkj|j?3qyN>iONd1(5 z5)B79n2XMz)IO=bs|GgrRBqVs5Br`)!LLsH=p)OpQ~ISFMp>Ah>pY#idd|$=VlG9S z|DEBp23l%yoY)@7(7B~E@@95dOoiE6dc2`T;|~pj+D{ZU0E{W%f*o|N8kJAI_UoeD zt{c9`tMG1fOgVTRQu`bdC|C5DDC64Lf$-4G_9hD`NAA^fPlU%-FmWSbLJ#B)oyBZG z@H{||+65=pUo^XCR&J7I``biE+{}rL)`V!*q0cPBb?hSrDbW05L|^|VMl7lJ*L9r1 zqW%q7=YbMptQqAOd;A9xj<1^sVv5!;?f@RhiIQNOmoA;wlfeVxWW64R3f>W8`=DRt z%dkK{Y`>oC9WLQZXA~b$B=EyiLNSx}xWc&;et2Lw>bIAOzL)K=k>Aw71)}WOt*dHw~f@J1x1H7Sf9N`==*+@)%f_~C+qTV$Z6_7mwr$%^Dz=k~ZQEbmb^dWK zx=(jsJ!8B#`*Oeg*=x=PxJCDe&R7lpB!sykZ^g%lI4C8Ate|)BJmGITP3Ya1<34VgGFF22z=T7DsY9on`cWyfurHRAoVvzNimI| zINu4{4`m0wq5h&P#lj%VxjyugAni9sEl42k7|Ux}mHg25Wsc6aP44EF+U)fW`z-#= z^6aly8jIlW!2?>Ayh1o~jzE3yo^F)QWtkp5;1`Zb06oE5KgXYyVVxtu^HUmPF-{t{HcKJ-bN)b#dVZDW7k%F8?Ux& zy~ZnEJ@xZbfaQ>*hw;x`Wu3N9s*AnZF;l`weXR5yp{R|Xm`!fsGjJw){kOJ0C)0R( z31GfPm#|jXLERqMg<`O4M-Tp4V<^lmXu%CmvPL3m`*de7#=X8B@SLDp52z4K#+6|u ze9hPDN%t<^o(NaMQ+9rUo_pj+25=UM{elqcfPMz8XTJkZJ#TGb>Tw90IqN}q|Le_P zQvPaywi_kXNqEvpo*J+&5c&j}{qRn`4*&K~f}Ib13f$0XR{$qxPxZ~sBstF^1-=if z+Hl5Ra%LYOp20uav#mh$O>RhPlKEY#UdX%-q@N16KrQ+(Kl$ zI^DTm>TuWkWMGtH+mv4P-1CtB78j1%Bd}qW#{DxbZE} zIoyHWc-8zQz+U*XI^M{I2=8}RKH#e-0wZr$#)2Yk4XTO{?56MavEqUUKoRT1*GdEUgdivtMO#o4#vhLPXm=Alq>!7BT@DsL>2BDZ>>l;DZbc!+R+g$ zrcLmdEZDHk))P*xPc?D~;8X0i7xwZP_m(@HrJvP88=6EQH~I-q8k@9VYDb*Jc~HNC z=dOvz6TOm4`#p0dJbpyUh3>eKd_>h*Qu{~UQ$}{#lp-D!A2RZw0JhP6;GWEnAm$vx z0o*bB?uZg8J7IMhUeKyPEUG}gpzR<4mVlp8q$OrAjYxbTAMl|W@mGF`VC61Qm~Otc z?DKc;W`syfMgRJ}URl#!4Pz#%KQQIr{>kEF*98{E}5T5W)Gmz{z$EG z#!^4V03$2&v2RwLe!}|rhV9@vn}nxBDs=#Dzn(n|;>8pp(=+r2v|&%&{z}mYw=DQP zrOD-nush$#TX63y74$R9MF zlj&J);R^$uWlFtc*A(5><Tuzb>8{dz^! zW(0p#2wIL}yyg+G+z{={4pxj#)Nq2%AQU^7eR>)iVwt>>&gDOOI- zqiFWK2xS?`Lf<#T)Z|V~@|LMGen+rq`D@@n@a)hv;|X8vSt@UD?BMf}bm2F_Tv_%% zgck)G@9QCneYs1JSWP-gj|SzFE25D`r*(&$VttTx_Hd%5dH2t2k~9Z{7|(Z!Sggc> z)nWP!7nI1!kIo)tCOJw9J5-gAex&yAYy({FlCD}@FJ>4oIx0OBC|ItwZgCVClBSBh z<1^gIgi`lR6yh9!uwmqb@wjWraya@rvqw-xcnLtbqp%aTI|y*UP)Q=n9D1!7!gZKN zT2kRaeDAz5o#h)UkPfX6)h>(|X?NgACW0?HI6#d}VjBnr8f6r9F2NVfA#IVm77K#? zRV5&rUZhD_Evx+J4`q~i6;jvm_%&(+E?jY-%+bIZDbq$;hSG5$pgS9%rKSX*J0w?h z4uv4Y^&z*?0mXY>4;Z6Vwp*|bLpd_kRB3uO@N6t&4(C$p>n7IpqV!N7suA7dzC7x3Pm-MES z4}xXLYs$`m<(Y_e2W99zff|QpC>0Bo#Xv^ZRMk_uElxpZ2{6f%VMiCo4Jl3@1>)}D zf};1&lz=&Abgq$LC`N<)WKA;~=+-Du6Q;CGmQw!8sT_+Pb(|;@Gd5U1pjyHw-6MjJ z!GSU-LAM)@wG!6NWP!|QOxGvdq85!a!Z>)~KqN#z;wx=PPWI_xY{wPVdgNU)5@_RY z7$;K58Aw3mN0R0rKEIAWv$m7ACV$@<;InHK=~LAmJZYj$h=%LxIz5~CEuvz}LzZ3O zke;CW9wf~+Ok<+5SzU^|H~P0W$x;k}NkzKR*ireDn`Bvrlmps4b1wfk@_o?K=2l$w z7gYM(d2M8hq%)CaG9E$~eStR$`d%nqk5Z(xsm}yPkVRLnfFs1~1HrZ$`r7z!_vr-X zZljp(%IMtSL))%|JW(4;(Y}S&eS+!A1t{+n@~z12w2EMwh6Tjmu7y}P>w?d(Uztms zT|aUcw^~q=su%G$sBy6rc&{ox99Uma5+f?4OyIaq6`M`eQg_Mwon9mHQtB&Y0qo}D zTxsC59$*E%=I9@R^Alyje}y^IT1LDb$jgjlLoKl+;c1$SSJFY+(3?0i3#g~UKLTz% z$jgBFp`U!C_QBGUJe^ZjFGz;jjDO+Ebd@e>EVx`y&yNITm8vk{gJBGq$SOQ z-4`?FYD64TA8HW4*D|yeJ(eE%z3WFq+EF>$W+h-QbfHM`%o?HVYn)SRacN2{3ta-9 z=&I!l&IikpiI#5Ww1tyw80!nWkA`9|lh1FIhHNi5GJ#`u_r0XDy1LPKiCP=Q30jRe zWHr)IyEJleChPlQ?+O?o*1R$xeiQLhMqF_Yvuo@5t*txQCbA|2a$OGqQ`&~e<0`;X zxQ+Z)2_L3B%ekJH>^CprFqy#~g^HW4_(_YvK_Ni0VC_L_L(P5>@KR**BCO~DbAZH| zp$db1emc&n+J<_pilZhj9FF074u;te6!R@Zfee@jGJPDVth4uQ>J{enHB>CkhCh_! zjN=#MZFAK1s31p3bSoxDAP--tWw9Q0;hAvnfNkWRQSos=QW)R~f8IK#SwI+2sDzIv zVp-CnOyQajK%i7|IYABwmGd4%))c-)7-{5P=_qhBWzNBm_p;uW#NChkD{X;CNDvvo zU-fFt0E8juV>$t~1UAhO;ye!J{GP$JAsw%7455htHr2_W9{p~BH1LDo8r*QSbmpc# zEyTTn9(VrBm;%a!=(pT%?44mjz7pZ=kOWse#~UB6(x{>dd#c2nXFpMCyc!=QhyWBG zrVW-;t#CH^39Ta(1?zYMcwLHDG{ZLSWxy24(r{tdz$l|2eyv=(y_td#t@9u9IL7UR zC{#H{lbbW#;*SiDc9aq;W>*eM8UeU12;r1u<081lqMRD8I1hHU3|*{jyc$YH<)F#2 z7b3T+w8gEf#$G3avSU8FB{9PZEkrBKpb9sKX-zR;*+T^r7YtI}N@s=iI9B3~t&yE(^>-XDajAb5z#6$V_{3 z1juk=s2+o~(`{I~d)ijy0Q`Z6En^RT!L+$=xUpD65Br>b&(J#`V-LTaeTku45OT}0 zP3TVsu)asSMom{xCbUlmnlRb-`|f|meXhZ~;*Nf@F#9S8?QFC4*?>kd+Izr47fQ|@qHGj^J*entJvuupHotQIP9uvn7dswp$ z8%5WfU)NfqfVbEk4__!${;2n;Db=XuiX=eHSq@HsBPiXn2}*!ra2+x}X5CuEb_=O^ z5o;jwb~po$o>`AV+@xta#gY$Q(S|KAtel?W^yy4~7m{q6(6@cel#2;x?wjyGE1^;i zPu*B8LVx?xoD_QRG^@r>5ls5DO4~>i{F27$h_2Fdd)IA@30fLi7U)iqHqb26{Fg{| zKM6Q>@Y`H$$e-XM)8-(I81MQdXXHVC*scN;oF#LYg(7z!1-l9R3>U9Ti>-m}s)KF( zLbLpc%whOLq(*UhQu(W+uz`JIf(}DEMn2Z1bC(TuJM~P)mNCvVQ*r46wdCT>bN_fG zA%7b^LP;^ptX9PGsEF7avUX$FJgvXaGC=+X{m{?!|Pdxti z1|s!(Kgm)0j3wyJcD&0JwA6dSMhEAm;>H{Whxo7gYen#j>x)a}5Rigs~-sy5M6 zhu|)ZkCH_lqa2~DV1_vC_cu>dGC+3GO|*?rIcMchZARFkO@vqR`!^LJj}_xR^ipo0 zZof-HZx9gt+lRUL3HTZK%8KUf_F}X4Y$)%KU93|5fR~-)Y=i!}Lrptn9cPWkJM36s zeK$tXH^k+2)TNNdt<958WBK~2W3qnX5ABOBIiOnk^l?{vzFO(ukeJUeo;~fWEzl^M z{a8|%zuohBfchGX(*jq2vZ98g}mEU`Wc)( zS*$4tK5_@eEF0qk53hSBgmXBYw{OUDezYQUHx6#mbH_Oiof`m(NwB0vU2-x zeaYyICec@iMSkHZ^ta(4Cn8RM@2UW>kqw?eF^GY41Rb0U+|NhjDjxyHFi3xTJKJ#ac<+R#i8Fi z#zk9Evas#&>UmUvf>=JMw(j+N_duIfasHm|>T}X^aGdUEidsKb?7Et4?y`Kvk$c1* z1fF4lBw5Kd^SASo-l?00j%nH{*D+eHt(%AarTv0v;dm{Zh7kv~zmD)$M+sRrF0wtn z-~5ZS()v?o{z=N-+NbhC3C|Q=cS^uD_z3;s>D7wm=d?E_RWW3qL&>%hR=dQm&wPv~ z|JbzJMbu2Yw)V{ORXx{2x0UgBz#HSPuBZF!t#>_4byF682R6RtyZqe3f~!QJnyNX* z##Ills?FzPWq=w11SYL&cB-46ogue{=}!AGnZ;`ZRlYDe>0tX(OzpK^Rh*t(Vgs>6 zXW8Fz--{GIa_DMa`qmug_WT~ZiO6i(Xup~3r`+YEjgoZMORrjOyQJ=U405K+0Wi5Rk55H20AlFZ?(BI!TUBea)XkdR4>_AYX0dD>ETn)X3!4Xv=XgK8iT|9 z>W6Hj3!bgP^#XlnzQeU={bH=InAoC}bkl6NSSXcE%`)6B)Q8iKeL`lsEB_*`U%KI3 zB~Q;Qb3Au+6E;bkhe4yO<>)nWiH~K& z)+4d14v=vd?^MMPmD_8@dK_l1?F`$F?v~kY(vIkbkhj;H97V5RU)<$8p4L^-banOu z6;CW3niyJKEur1%hv8c32G}=zW~>8#{*RHEWgDi$T6RxzyL#Ooxs|tynNut`yK%Wn z%aq3AQ`vU{7f&;hxj*A`y)RexM+NXBI+(p2OuI&lj~QB?54Wx=;y%bzC?>%@>jbRh zDFQqE=(&!Bb(R^)X!y$UcKdcB#Dp5%;~#C%1Dwu+hhdt;3IyGsUBh20IXwwNf{$3=~AJma^%qqj&;aGA#< zJjJKUjlYqc!!js`w}?(a?`_c^2UL%IatKH{KS?-K4m;;Io$%*wFb$5NnK^aEzrHa$ zg{L8n5vY{R^yk)K5Q9Qvd5Uv`E_~2KiP(~j>_*iUkOKc za~_|4LH_lj`vHCQqI1{NMiRrnL4@Tu()s7FMVhU$TnYKI54lx-?+ovnB>g+>TMxsVpyd#(iNaE!2)TVLA%@|{Qf=)eOH1&JW_x|WiBHfvW!{BoOrL;|!*K_cr#_XJmRB>(wMa?E)V?{#N*V+RcWIgEP4)$eh-PeED`>N%nP@P!L}~ zCOkt=Fa4)9}hS{UZk#O2~$T9mAYUzt@0 zJYwGLvqj`{?-QC_I;Sgl#B+!tAiyNVyl?WXZEU`LRY2H?WMU24#r{(HC@`Eunz`~6 z&f6IX#L>DgeqOQ+?(r27>Ch@vkv8v@Q=8Jy>vc+)WF_O0yS#q97vvVgsd$1#cv7|= z3JUURne-gk04iM>vuRsVc)fdqNnWNQhpkj;!g_9E5xcC7-us**85iEUU|KGBQiyZS>5VdKhgc3AiF&8FXWg_#YcQP1tOeI4}`HWQ>Lrt$!OTE^`whcmO0 z&?K?oZtr6PD>?+Lug5wH7oW>F&$cPPztaNnnFxZWKK7OdWcnWaO4@lMn`^m^(=Yzh zNciT+Mtky`pw!&5rI`<3H84cTEAZ=@?q4h{_fRcJt&=srCqzWG>7U&=hwtFz-Ih(G0;cX69y@ z922$uJY~z~3wT{kYj`}cuO!KlvPM#7ikqXN-;;lfQ2-CegC!Fc5eJf`gd{MbD72Ug zL=q*M0&7X7C4e%^C8s1?9C25YEFYnJO6w>0Nx{EmFD1Pa1rlHZ0h?HYn9sv(2=Q7X zp3Fnj^`mr&A_6r8?ieEa_5(u%qH+bp!hv#PL8}_^cns2I!0Ye9I`<=j2*KlM!Ywqw z85=;Hwx>UInoMz!5}v@Ip-zz}J7{DGX|jhx$+j@KJ?K z{RXZZr0;-j-xvH%NYF3p0T#ax%@-=;0bXASu_KKCr&OYanS3dOqmW`LrL7p>O3+&J zx{~x-5%Mpv3zBPLa3w9i@b;OM%sCfNo>U)Ijtp#e97fGM3z|c zIY(FSO+lp#=2vFff{RxMLE)Gs#!MNdB?7$sm8i|*@I>$dynvx6}X-RrK&qmsMmbuKYgSy|G8~dAq`LXyDB?;iOHGe zg%Iz;?9xA1yUj+b%rD^9JA%9cXAfZa0=T*X0xWQ}(SA)V$U`F(IS6+w_}~HLcM-t` zP@RXgEt2*L(1!$FveJ?eT@oE>m`IZ7aowWtzP1Pd|AG1W$5$5^|2L`sPbBz%_qm&! zxtRR7Em_^)cIgGZ{q}PB<(L65o386bX6O{yRMt&+L?yqdM45o3je{aW$)nDl-puHD z(CpCLO}1SUOHnK1Z(H&~U0+awTPUX{i)FUVql^?|rN@b*wmD2u7N+K+(^^@uV7JZY zdTYbWc9k!k^K|pk`|m3v|JM7~#y`K??M4Pg41956{aeWUexMsF=o42MX$HNFC4-~1 zMr9gK!&1Wh7Y!CUYcUvJcO{pql`ZJM=z*z;?rKcS)gTSNCQp9)FMb;$E%qt2MYd_D zk)^-yN?ML3ruJ-+KDU=BO>C|jOEc$A+9MaEqjzHP1@sFCQ%cn zYI>s>RhDUJ`PvD8O{~;p5v^skIBL<+WE4+R0&0$~&AOCRnk1ytXq)a83I$l^>6%>QY^_y&D7-gfAtiY%9N2DOB@#^O?5BRqN~*kVZuwR z!it+)vBMKBr#!&vM}d||z^Rol27`MiF`I@aqRUT~M-SCB^X_rK3K_-@>6o98v0hHZ zzPX4e!X~LQ7_2ZkpBEjW>5S+grt!8#lCcL*x!uET}}TZ2@$UVfyi1~0M>;!7({^)9Jp9Z>KNRPmwzqiRXuSg zj)Ihn1b+YqaL=Uh>JHOOkYlS!j3!t}Qy@`hsxgw57~)unblGg9NWe3f-6k;;dj!#Y z^ojlFpxxZD5gBU1N>D&}fe;_jF@PV8SXdLOzWPJxvo4M~b?OP7K@y1U%*n{x65FCR zIzFJr<$g{7bVDN;>c+PLqGX`eM0W|Fxon}e9$f46!Q_i$wU^*Xb;`JVdpTR^MzhR+ zLoeFXq%Q6<(Zw~#`>~0~aC?zE@KWOHcPD4Zx0eRx*49B?k2N-Door?`CboX7T@QF&n2%x-PDr8&waapM9s0J;9O`Hkv$in(Y) zyjZfh7(<~@m>!h(t&mDnJ0gyqCFj3K<4{~}wyVt$%iy9wtd(b zbM5N_i#+Rx5K;`^;3W|w7?GChb7g=SUB=V23bSgL&+%?Pv~98(+F-rE-6D@XIp04@ zOI6>`==b&gN4wl}J3!Hn!d-*m&;1Lg`>d{4B>u<5RC?0(oE|;9F5kkl%vJxm|BC}c z45z$b={<|+Rqm($A!8W={`bC)O`BgC!}EA(yn^KiCZ=C9jX%j)EZ>RZoch0PeIfWV#kP^!)G802!_ zkZkqE-L~)*rNGy?)qJ8gr_8dY~%Y$G(sMA=&GRqhqV3&V?j zTWU|Zoe5|2Ym=TW=jPCj>BoAn4$c1md^P)Q$^dZwnSFm#|9>Pp=KmnM|4pLfqxt5K zDw(FyZB~uMu;>OmEgw8g4F>|9;F!~57XuZz7ch}K&a=@LRM%pP>x6>BGAn=cbkyLS zJTY>Vvvri=jcD%9!kTH4zCLH+KbPOItFeu8&D8wuv!V8Uv3C6>Qkpu3kZ9xv?f-wCt%17{l!j=W;2kuAK3>GgMWF>0z@JU;%89Jkf`o+)W6wq2WD#jhD%#}evnmcsIME_N69=Bms|VE|N45-l6rXb&oN z^Z4J&D5hOVamyTww7=v|@=Z*6a_G$wQEMD5B(*8JjmD;+F~aVh~ZNm>@chN+&VF*BD4OspK-T1SW> zS!V;8i9X!>#ViK2A1q?EWm%Ip%2G`43Jj8IroyEO6)I>j$fh-e4kvhK=m+dI<7fl> z#32L9ORO>yqg2(0EzJ=K zR^mFR@x3JMCfICZTC9y2FHg0^IeTu~)D%29Y{AwW|0%c_Ml$6=Q^|U+>QoSOBFE)n z(xJeM$gUyhauPK0heX(%5CfX@#81ZB`+}Sbbp)uwWnRw2lrEpe0#jz4dCbOH%3+mf z-Z5@qbOwLOWF$^XG8%|yN*>>?)l2}jOQ6XSm1zmVagRw5QfK2n{z5<3O4ZEPgUfyG z@LW{*!DEB7IEt3qb;Is{{LaidtC8;>to8M_-k+MHV^=>p@_E^oU9BofT*s zSm#W!j76>0-i&I=ZTYuG9A5A?)89>6nVQweVt4Vya;pq?0X9;ifUt1@2k~fu1_G}2br3GxCDlkAbLBb6KXXZ0#6lb3U_WzRx-eN_crzy-Ei7Le zy{o9m%f_%iII2%T=CD0D1_UQlrav-&*+E>>2AZVh8`ntc2UpLbV$$ippo|vi+OTL` zg-VZe`N$l`BqMRJU>=Z~(jXUoLWkA+)mXT|Cq7v32Kmrz$u02`2)LuAQD3=YINFh4H z9Ru8*bRl>bN6Kp$t%wfklf_Wq#sv2chq&Zz$bQA31L{F`-M(ZAN22o;b&LLRFVxh3HfEx3=@^3t{G zWgJ&HS#R$!%AyF%G3S-1;)09)~wx4S37 zrqRCp_cd}TZQ$TCWuri&GqH6P!G#zosb6_L|1aYzuuWc`Jp-^AXF5?R*NXz2RYm_($ zOxPQP3?52ZI0PlBl1Vzf5~4Bzy959oIr19jFu9O zYa+VBd#7mpkVgh#-8xHxh`kEPC!(7Gtd#b(2mi9H?QMwAU(GN zxjmeQH8qjv>WkOyWfu`TH~6OxhUt12hHhX>XY!ceK2G$WRAfFFr1|m}M4fT(rG&qr zB{=V%MZ_NXZgtHXi8GoZ+4nB6N7#-n6~SqJzu9M?@{r|NU3;3_cEW03+3RHAabU1< zqP~$*qLxx{FrG+Hsav@_Q4OTXso-9g~Z7*fs=4TR-#*z(U!n$KJW#AFSh zR3&FgN`6ct6w+zY&GFHNd~l#bsA(IgXvB7G?#Ypks?L(L!@Z<%lVZ>ceVeV}FMoXm z%Om>*4?AJdqM*IGfNmt=!K?u1z22UNletBBsX6*;*MPxmtaN9S#Eh@H3xnLI?|-SW zGQnVUBmZFxA3o^pP02KD?MlwR%hr0WmiFsmo{>eNUDvb3{?}#KAouDKGy@A`p{5y9 z3p|HwAykd96avK3ZrsQW)d%xkdB7fkVWn$qf`Lm(l!DvNi@NR49zj{~cY`TE0kuOJ z#a3YBcnBrC-vu~Q6Dnnh$su~x0ov@XHldq9A@iX9kf&+QuEGodAg?diya!kuy}P~Aa!V!iI%zKpCF9jVLCq1n4@^E&UwZF~zoVNE%DA$T}o=%&Gd z45J(L)EouW)%|&N!g$Q~jv2Tv^i@IAaoX5DXpG5Y3;WbvIT$DQ@z6Sc!<}e4{uTTg zw2B}#JAl5i+xU~~W}|z5wm2nq%!;9FqTA<4@&kwme`xz|&v@`XaU@Q37^*}b=BPUm zuMx6P4ixPVuKZgM#s{+MEYaGlrfrf`!Ez6?AED`vq%ZOv1tWOv@J;mNN1+K5&IuwI zs%<2JTH!$tO1I!BVS`#1@BcS3*$6l6ve#GbESvVMhoI7 zK(whxF@_N4uV2bj^DAKyzxZN9?F*zCq}QPFtH>&@;m#0!7Ky@`Z$b}t?U3rV=r^DL zw838dd-NxAB!7@l^x|E`$c?0%SUKQO3MU1Mhq1!mx=-%jE1)IpIX=?lzTlb(&f?%x z`d(=S%ZE5(Y$SO=YqLuRk0o9KIsa~Es0J`1v!nta9PT5A`6q`hxUHOTLrSl-fu zF&H^d<&1|TIb8jwHPy9x z)&%Cjm*a?rsU&Y&+U-YOBRPNGj7Wi>vE@zegg>IZe=mmlWVK;Xj>-DC}3=@D6(JjO-xM zsWsdLf~kJ(y{FdMD+@akFirj-bUoA_ZJk1p7tuvPg`k&O#W&5b+ml<_EB=Agl5LTE zv=qwR*{B8s)P&U>gis}a5uC{V{1z?Rz^5*x2c8hAE8k6Vhc*1EY`3w8z{SS1-?NZQ zjUoM%VPNx>CR*Sa4$v45`KygSQ0@yxADJTx1F4(?sf4Z%4hfFCYkg#URFaN8{-l0s zZ*T}-n#P2nqTpdw&sF_OsREED=s#$h`BGQO=5|82#X7jITgHO5{JLkQb@Mpe1W!tv z>@8fUey@O*bylH~M9ZDP(9LqdoU*d@?ZDi3=hkAvN9VAB`;o*w15ms>ak~xw4@mnz zw)Ka+mB(OBkUBE@mVfETeee@=cEsI_;{JoE7s&Gomw1mB3ZPvAqtyd!?YVK~0*1jR@HKJo;oeiX7a^G8`tJv-&aDBr zm%pk*qS&Bc)RQ~b_zv=nf?0>2t)KbNw2{WaoQ)va{KPl6u0r?)<{fNoU&x2$C;HI> zzy?bs^8wc*Y;;$ffNa{1>-MMUkbZ9ff1SS3zqK&pxGxc{v9J-A{N)xYJhxb?fweB} z1~$EEi5KdlH^7%L^z9b!!w(Y5>W&a&69~gSV8p*@-q`H$YiHntpD5(Dc7y}u7AplH zn)7q7`?XHB^L2WW4VVd$L5|D08z40K)S+SWZ(76oU7&y5&GmB`6XzYPr}s_KbigRhu_KlJ;GqPD}35F3doOm+YOLF_+*S;h_81yy6kJe@0&V8U-uhTGSY?A zG9VGc41Lq$**P8jN!8%}4zfKR)f%kHudWa5D|MRLH6PA`at#~?UJ0f zdmVHRhxRRHGLE$m7Q!FEb{^F^p4i;iI-ihnUIo>=-*25YnI(gkdlpAqOpjPhA==j5 z$8vd-=6JSG34-;Fht_xh_QJ=PR_~L&QLyNZ9y|m@-MMvNZJhqK>mMNg z4o1lF@t61_B6NLYJ#D&7 zkPT0os!N&@G}DNY!~D*Oo~sBJZOr(+zjgKZ4MXFPeeL~^;D2IZxvAbtXp#hD7M{|W z0v=>Ad6=LyTZq#jV^LB-vA+#rp{P(CQ&W8drWm@px~GB|4<4YbRb+zne=(gx=Y&3J z5@E$fr;tQO5Frv4R09JG^Ql6YJK;pG2HVl3`qxcXzAyQlZuWi4yU*2oV}(r^V}(in zivZY3ctj^mo%flRj3k*e7Ue>9TiHS`Z@GpRlz(H3@GKvL(Jz;R!7o!nZ&nD%NELPk zB*?i62uqALg%cHhD-4=fwWA(XDwJmx-o_ATEN(Hg&8ZLK;4o5vsrqy8`&OkR`B=f_ z&t^VeLp4_lM(+uIVT0jT)t=`@Gs7-dj(0I5yWnxRTzm6KS{E%L_ z_s&kdAv@7eSheLD(Os}aIhl|yBkZ)fJLw{>%y{s==({M1DLh@Me}6VVwmoj;deX{9 zV~`2T^fbSK@KSOT?o(3au{&698khGNr{_heh7yyKLn6q< zX>Be2ZG1a}J_n_+uJ&1?#n)sw%%@AmVN`4nrWr)Z zGvGJzC32n#lrL3}-#l^5B$}eq_Fk;E)>s$29;WS>#D*D@O?}*?Y1|?nCZWFM>%;rl zxG>B*$JRIJ<8kAh?LONb=Vl3q3UR8lZQdi2_cFxYdN0c|o^o;C#w5-#V|;Y7%btwQ zh4|-sd2oLC|?R${LGs8Z3XGdoSGwKB#F5 zK6ED5>1dlK@@sT(9TfWAH%{F!wU+q&RyqKFx@EAl*=eG7m3T?O6KR$r$h!1ULH3z1 zysWHN9EWPR%uWtJxV3cLUTf?3dyC*_uR%>55ZNtX9^JzLc+PIJiCs?iQ$BU;`@Cfx z>zlIjcH)m1wcbgju z4KkXL$8FYXD^_6Kc&lzPfS#2{$d7WKT7TRba}~~&r@yC%=HDfExR74afP0T)3x(U- zXnoyaT%3fxTqW$&^YpuaeP03lK)xPo81Vnx-anw|2J&LP1fb zxiV5aF~)4!mV_~sHz24nYC5t!bJA}1A1|8Th|{TEYFI{p%(xE=*io(Hk(ZT&$26xl z%lT!UNI|b$k0QNPY2{QJgI?Nb9Vu75ALOY*eVFiXA)reqlT=+o601EXW2$QB1l~OD zT+O3)GI8;X2K%y7qZvj~okGFXSASQ`I9HeYnT)zLk8F%~Q*}s2-vY{~8O|wHtTOqV zCyv}9#mqXeR)0on0Pxj^XS!5h5}|{fs6eY>4Pa5v91Mv_J~ri^YAT+VMp6o7-5QtP=e*jzy5uW4|8b5aiLw%B$1uF6L`hC3KESE5GxvN2J2} zycWLpkWeaf8nJ278%scs%Wwt?o)S}kf`Os3?*b2nQ!!!vzD7NBch^(Y@Y%8II<&}l zuDZ*4r;-jf{$U%dsj#QP{`@$uak^k(`Ax-Lm!rK>=J5x$*HhkRyFRzb3}` zO;u&h3H|N%zK*p|pRdk5o7*Tptr(pOO}s#=1wy1r4h}Mw2 zCTJN60XcveWu;$R6OtJT9@mf*ikN^y7$kxiIY|hZW5e5%nx6!&a_#bG-!5a_em%%*E0ML7wtLQIBCWN8F z|9Xt&ABeGik5A&AfVKiLGVvr%M#%@{AISexLfBCX{|1E#1jI!S1Vr-xiac0YxfnQ^ zIXk#InV9`YaU7BXtBb19)z6w4f=5z}N)ZuoAa%e>h5T2>V+}Zjs22&?KniLCXdz*k zEFem|#?tCC*xKN*xWIR9^QQjN*rwI~waa&HN3Z((YN)HVR>#}MyIbIWzRgYV*4>-} zNy+`~3&A;W_sxIzZPtBOdLgH20%pY0+0SUF=8uwinTRlfIu+W@8j!&y)Y|1Xv3CIC zdlra-{_#tfC{Lw;u7!gFWsgtv-*&m7oN{Q+s8Il&v!4!^1VoezutqY z=4Axy?H#>Y{}uxR#`bG9vgEul4K{x{xG%kf5O>enoPq)y2w~eQEx(JvGbb$>QtiF0 zRPXtdV((op8J}V?&UFX9Q1ne9A5@M9@mF!|-SOa#Clu?SyHt)~7m+Iy81P3XuVO|e zGUvj_0X2YU0jLmfYZ2KkgZkko6FaRsgL8T%`bhgXvq1=0IBC;^L=rG-Vc92v6d|(y zSTlt;121a^4{Ul-k3cuuGt&4(^X8Y~tYuBo;^E`Ng1o-vZ*Nb`DpxS^ST?3uz({UZ zuzqXBIME$O{N_1Sr?0*|KVj43j=8+jyNZ*dH$EZ+R?v(U;#+^ahz~!ZP;8tTpMBgt z_|~&MV}S@T-hxg&0*7JNZ^-VATgQ$boQd4aFff1;Y6YfSijhM8*buL1Pn8g1dHn=# zkxlj%K{}Q21A%-1q_l!Q>YxH19DJhk)jo@Qf4s&N1I)Y(EIh+M=`{e|u(4qB5Gu^2 z$F1q(Q}fXfEe0%h*%d)CAs+m2&}|^k9+Bg%(M;Ns@=Lx@I95Od^$PM&-|#xgWP>BD z4}*STL^ha~Ht`of?75LtBpCht{E+kl}g1i+fyj)D=-w{l@X_F z@Fx_5`EyioWiXT@WD3rM30`&=YV*q#D(fx+O0C+w=1k`327{q@=Cs($scNZQ87>@q zD)JG&>vHB;jvdW$s!S0b_@T3yj#Bzp?xN)8w`0fh!NUzHX8%*i`M(k_?mePSW^ZKw z3{484`)Y}VvqG>|v#DB@ru7$_oDLH<&k zv`)}D>gxle;p&47Kk0z#Ug?2Fl|@#A{2f|LqzgQ&vx(`1jIkfL&>R&z$J+GEVg>E) z95dv_0sn$7X;yKR!ywbd7l&|R7@sXTIN+w2W!_N!MHgsn(xIZ655jN3iODlV-zq@3F-C#05E1gp2VGv9iXU58ut<>Kg+OxD zDIq%ANGnd+u|&UxZZJBFPT}8WvWGyielgk(DAyy~QSybgPLt$WZ%GNg1Me;Xv9Wsj z$ukL05}rK$)gFdTW=J1A6pAh7q=CbbpSXVQHdU57+ZWf#{Jg}RTakr$Fjt$s$EM-R*ay8xN7k* zxOA9fPTp|P=)oj|HJCn09E6eAKMeFZY;y8{v2_kXq5w;mZriqP+qP}nwr$()+vaWC zwr$&-`(|eIX8v78R8+1r^VB(CY;wwCXeu_KaRbsg0R}ZYQh`Gz>YRsy6_QPc;zAk- z;l0KJ13^{+W3dKxs*sx^ScFKjp%7Uz6N6`r)DIR0v`?Wo(BQtOEEXE0ODu-7Y6*^~ zC4dBDAVdwQy~8!Hhje@xB`kv|qyh$LN)%;ZbFs07jTWHn5=8>ufpj4(X;Kl%HHy*} zK$0(6zl@`r6-<3B>9iI#$cIl-DwkF%=jc^XSvg^U?W|GrI!Ap(1&~xH_NhifOyUS6 z#0-=zoOr=KqZzX~1h^B6W{k#yS4ntqN+2^3s)%$-Et7I`O-kfc5m}NAU!_4KrWFx_ zM&%Nd6;L3VgQ-!32pRGd1+l^(jVy|M6%4#|a!3kb;0(wVG*BW)kQ>v$ES-u#$SDUj zMKg|=3K`~9xdIoQ6PXlFVDJ$b9E_T!ZUlhx2*5c4Facmz(jGDHoDOiH0#G1Bus|lG zsZyQ5sL6zsPI2MlLb3@dqj==G?mc^DP!>>py&SxhDTEf<01Bx;(v_A0M(6Yd%18;M z(DhP4jdth^R5W{eKR}J7fa{F`IFbT4*Fa(6pj*~}q{dS?>4gU{8W7cvNP~iJ3j>mo zWdmvf5CnN}RGW&55S3uj19OxQ3@0y!ul)>X6a;cW6MzIhGRKkv??eeyFeTsxT?`6l zw@M;ja{l+ANT@k^B@$vlnN&ejP}YI$7HAnL{!RT%Z`r^CZ`srZmU}So_0eTvvkO9$ zTzzbFT8;$`O0S7+7At5HrvN*vgP4#75P$%IHyzub1nr`RHSn(2t3M9t(be3!+VaQAXGTgsElkZ10w4fHL(Js-R8PsiOd=x zDnMqohcqyJZ+C%=z;JvxDR)9sA)yiI{N)@F2MCmo@tSWIHiP2Cnib@ZI3&=tB*jfG z0x_+HCTC3AFw;%vr6I)8Ywfhvakd0{=Kx*ph#sa$dYb-S zp1*kZBrcTb_Yf89UKlwG9#0Seyqt5>dkpbC{2y|@#ddxuZq=%di z@USAu<3rnmp|x!j>zV9}q7`GzT-*Qvk%uc@ZIT@fB(-2P#zM#lqECvaSHYWqt9 z6t~ubQnH8aTN?nxFp85=Y{O8MU}r};#|?3%X2plI_UH|N^?t8|$qGMn1qC#nOlLb5 zK%9?QAiU60fm1;BSu2`);41NPaa;#gE1tSAT>)v6j

7ZPb3-y%;oUK=2g-wYxDP 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

    -%%
  • Request - An opaque data structure that is used by -%% the VNode to implement the specific coverage request.
  • -%%
  • VNodeSelector - Either the atom `all' to indicate that -%% enough VNodes must be available to achieve a minimal -%% covering set or `allup' to use whatever VNodes are -%% available even if they do not represent a fully covering -%% set.
  • -%%
  • NVal - Indicates the replication factor and is used to -%% accurately create a minimal covering set of VNodes.
  • -%%
  • PrimaryVNodeCoverage - The number of primary VNodes -%% from the preference list to use in creating the coverage -%% plan.
  • -%%
  • NodeCheckService - The service to use to check for available -%% nodes (e.g. riak_kv).
  • -%%
  • VNodeMaster - The atom to use to reach the vnode master module.
  • -%%
  • Timeout - The timeout interval for the coverage request.
  • -%%
  • State - The initial state for the module.
  • -%%
--module(riak_core_coverage_fsm). - --include("riak_core_vnode.hrl"). - --behaviour(gen_fsm). - --compile({nowarn_deprecated_function, - [{gen_fsm, start_link, 3}, - {gen_fsm, start_timer, 2}]}). - --export([start_link/3]). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). -%% Test API --export([test_link/5]). --endif. - -%% gen_fsm callbacks --export([init/1, - initialize/2, - waiting_results/2, - handle_event/3, - handle_sync_event/4, - handle_info/3, - terminate/3, - code_change/4]). - - --callback init(From :: from(), RequestArgs :: list(any())) -> - {Request :: tuple(), - VNodeSelector :: all | allup, - NVal :: pos_integer(), - PrimaryVNodeCoverage :: all | pos_integer(), - NodeCheckService :: module(), - VNodeMaster :: atom(), - Timeout :: pos_integer()|infinity, - ModState :: tuple()}. - --callback process_results(Results :: any(), ModState :: tuple()) -> - {ok, UpdModState :: tuple()} | - {done, UpModState :: tuple()} | - {error, Error :: any()}. - --callback process_results(Vnode :: from(), - Results :: any(), ModState :: tuple()) -> - {ok, UpdModState :: tuple()} | - {done, UpModState :: tuple()} | - {error, Error :: any()}. - --callback finish(clean | {error, Reason :: any()}, ModState :: tuple()) -> - {stop, normal, any()}. - --optional_callbacks([process_results/2, process_results/3]). - % must have one or the other - --define(DEFAULT_TIMEOUT, 60000*8). - --type req_id() :: non_neg_integer(). --type from() :: {atom(), req_id(), pid()}. - --record(state, {coverage_vnodes :: [{non_neg_integer(), node()}]|undefined, - mod :: atom(), - mod_state :: tuple(), - n_val :: pos_integer(), - node_check_service :: module(), - vnode_selector :: all | allup, - pvc :: all | pos_integer(), % primary vnode coverage - request :: tuple(), - req_id :: req_id(), - required_responses :: pos_integer()|undefined, - response_count=0 :: non_neg_integer(), - timeout :: timeout(), - vnode_master :: atom(), - plan_fun :: function(), - process_fun :: function() - }). - -%% =================================================================== -%% Public API -%% =================================================================== - -%% @doc Start a riak_core_coverage_fsm. --spec start_link(module(), from(), [term()]) -> - {ok, pid()} | ignore | {error, term()}. -start_link(Mod, From, RequestArgs) -> - gen_fsm:start_link(?MODULE, [Mod, From, RequestArgs], []). - -%% =================================================================== -%% Test API -%% =================================================================== - --ifdef(TEST). - -%% Create a coverage FSM for testing. -test_link(Mod, From, RequestArgs, _Options, StateProps) -> - Timeout = 60000, - gen_fsm:start_link(?MODULE, - {test, - [Mod, - From, - RequestArgs, - Timeout], - StateProps}, - []). - --endif. - -%% ==================================================================== -%% gen_fsm callbacks -%% ==================================================================== - -%% @private -init([Mod, - From={_, ReqId, _}, - RequestArgs]) -> - Exports = Mod:module_info(exports), - {Request, VNodeSelector, NVal, PrimaryVNodeCoverage, - NodeCheckService, VNodeMaster, Timeout, ModState} = - Mod:init(From, RequestArgs), - maybe_start_timeout_timer(Timeout), - PlanFun = plan_callback(Mod, Exports), - ProcessFun = process_results_callback(Mod, Exports), - StateData = #state{mod=Mod, - mod_state=ModState, - node_check_service=NodeCheckService, - vnode_selector=VNodeSelector, - n_val=NVal, - pvc = PrimaryVNodeCoverage, - request=Request, - req_id=ReqId, - timeout=infinity, - vnode_master=VNodeMaster, - plan_fun = PlanFun, - process_fun = ProcessFun}, - {ok, initialize, StateData, 0}; -init({test, Args, StateProps}) -> - %% Call normal init - {ok, initialize, StateData, 0} = init(Args), - %% Then tweak the state record with entries provided by StateProps - Fields = record_info(fields, state), - FieldPos = lists:zip(Fields, lists:seq(2, length(Fields)+1)), - F = fun({Field, Value}, State0) -> - Pos = proplists:get_value(Field, FieldPos), - setelement(Pos, State0, Value) - end, - TestStateData = lists:foldl(F, StateData, StateProps), - - %% Enter into the execute state, skipping any code that relies on the - %% state of the rest of the system - {ok, waiting_results, TestStateData, 0}. - -%% @private -maybe_start_timeout_timer(infinity) -> - ok; -maybe_start_timeout_timer(Bad) when not is_integer(Bad) -> - maybe_start_timeout_timer(?DEFAULT_TIMEOUT); -maybe_start_timeout_timer(Timeout) -> - gen_fsm:start_timer(Timeout, {timer_expired, Timeout}), - ok. - - -%% @private -initialize(timeout, StateData0=#state{mod=Mod, - mod_state=ModState, - n_val=NVal, - node_check_service=NodeCheckService, - vnode_selector=VNodeSelector, - pvc=PVC, - request=Request, - req_id=ReqId, - timeout=Timeout, - vnode_master=VNodeMaster, - plan_fun = PlanFun}) -> - CoveragePlan = riak_core_coverage_plan:create_plan(VNodeSelector, - NVal, - PVC, - ReqId, - NodeCheckService), - case CoveragePlan of - {error, Reason} -> - Mod:finish({error, Reason}, ModState); - {CoverageVNodes, FilterVNodes} -> - {ok, UpModState} = PlanFun(CoverageVNodes, ModState), - Sender = {fsm, ReqId, self()}, - riak_core_vnode_master:coverage(Request, - CoverageVNodes, - FilterVNodes, - Sender, - VNodeMaster), - StateData = StateData0#state{coverage_vnodes=CoverageVNodes, mod_state=UpModState}, - {next_state, waiting_results, StateData, Timeout} - end. - -%% @private -waiting_results({{ReqId, VNode}, Results}, - StateData=#state{coverage_vnodes=CoverageVNodes, - mod=Mod, - mod_state=ModState, - req_id=ReqId, - timeout=Timeout, - process_fun = ProcessFun}) -> - case ProcessFun(VNode, Results, ModState) of - {ok, UpdModState} -> - UpdStateData = StateData#state{mod_state=UpdModState}, - {next_state, waiting_results, UpdStateData, Timeout}; - {done, UpdModState} -> - UpdatedVNodes = lists:delete(VNode, CoverageVNodes), - case UpdatedVNodes of - [] -> - Mod:finish(clean, UpdModState); - _ -> - UpdStateData = - StateData#state{coverage_vnodes=UpdatedVNodes, - mod_state=UpdModState}, - {next_state, waiting_results, UpdStateData, Timeout} - end; - Error -> - Mod:finish(Error, ModState) - end; -waiting_results({timeout, _, _}, #state{mod=Mod, mod_state=ModState}) -> - Mod:finish({error, timeout}, ModState); -waiting_results(timeout, #state{mod=Mod, mod_state=ModState}) -> - Mod:finish({error, timeout}, ModState). - -%% @private -handle_event(_Event, _StateName, State) -> - {stop, badmsg, State}. - -%% @private -handle_sync_event(_Event, _From, StateName, State) -> - {next_state, StateName, State}. - -%% @private -handle_info({'EXIT', _Pid, Reason}, _StateName, #state{mod=Mod, - mod_state=ModState}) -> - Mod:finish({error, {node_failure, Reason}}, ModState); -handle_info({_ReqId, {ok, _Pid}}, - StateName, - StateData=#state{timeout=Timeout}) -> - %% Received a message from a coverage node that - %% did not start up within the timeout. Just ignore - %% the message and move on. - {next_state, StateName, StateData, Timeout}; -handle_info(_Info, _StateName, StateData) -> - {stop, badmsg, StateData}. - -%% @private -terminate(Reason, _StateName, _State) -> - Reason. - -%% @private -code_change(_OldVsn, StateName, State, _Extra) -> - {ok, StateName, State}. - -plan_callback(Mod, Exports) -> - case exports(plan, Exports) of - true -> - fun(CoverageVNodes, ModState) -> - Mod:plan(CoverageVNodes, ModState) end; - _ -> fun(_, ModState) -> - {ok, ModState} end - end. - -process_results_callback(Mod, Exports) -> - case exports_arity(process_results, 3, Exports) of - true -> - fun(VNode, Results, ModState) -> - Mod:process_results(VNode, Results, ModState) end; - false -> - fun(_VNode, Results, ModState) -> - Mod:process_results(Results, ModState) end - end. - -exports(Function, Exports) -> - proplists:is_defined(Function, Exports). - -exports_arity(Function, Arity, Exports) -> - lists:member(Arity, proplists:get_all_values(Function, Exports)). diff --git a/src/riak_core_coverage_plan.erl b/src/riak_core_coverage_plan.erl deleted file mode 100644 index aeebddd32..000000000 --- a/src/riak_core_coverage_plan.erl +++ /dev/null @@ -1,873 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core_coverage_plan: Create a plan to cover a minimal set of VNodes. -%% -%% 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 module to calculate a plan to cover a minimal set of VNodes. -%% There is also an option to specify a number of primary VNodes -%% from each preference list to use in the plan. - --module(riak_core_coverage_plan). - --ifdef(EQC). --include_lib("eqc/include/eqc.hrl"). --export([prop_cover_partitions/0, - prop_distribution/0, - prop_find_coverage_partitions/0, - prop_pvc/0]). --endif. --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - -%% API --export([create_plan/5]). - --type index() :: chash:index_as_int(). --type req_id() :: non_neg_integer(). --type coverage_vnodes() :: [{index(), node()}]. --type vnode_filters() :: [{node(), [{index(), [index()]}]}]. --type coverage_plan() :: {coverage_vnodes(), vnode_filters()}. - -%% =================================================================== -%% Public API -%% =================================================================== - -%% @doc Create a coverage plan to distribute work to a set -%% covering VNodes around the ring. --spec create_plan(all | allup, pos_integer(), pos_integer(), - req_id(), atom()) -> - {error, term()} | coverage_plan(). -create_plan(VNodeSelector, NVal, PVC, ReqId, Service) -> - {ok, CHBin} = riak_core_ring_manager:get_chash_bin(), - PartitionCount = chashbin:num_partitions(CHBin), - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - %% Create a coverage plan with the requested primary - %% preference list VNode coverage. - %% Get a list of the VNodes owned by any unavailble nodes - Members = riak_core_ring:all_members(Ring), - NonCoverageNodes = [Node || Node <- Members, - riak_core_ring:get_member_meta(Ring, Node, participate_in_coverage) == false], - - DownVNodes = [Index || - {Index, _Node} - <- riak_core_apl:offline_owners(Service, CHBin, NonCoverageNodes)], - - RingIndexInc = chash:ring_increment(PartitionCount), - UnavailableKeySpaces = [(DownVNode div RingIndexInc) || DownVNode <- DownVNodes], - %% Create function to map coverage keyspaces to - %% actual VNode indexes and determine which VNode - %% indexes should be filtered. - CoverageVNodeFun = - fun({Position, KeySpaces}, Acc) -> - %% Calculate the VNode index using the - %% ring position and the increment of - %% ring index values. - VNodeIndex = (Position rem PartitionCount) * RingIndexInc, - Node = chashbin:index_owner(VNodeIndex, CHBin), - CoverageVNode = {VNodeIndex, Node}, - case length(KeySpaces) < NVal of - true -> - %% Get the VNode index of each keyspace to - %% use to filter results from this VNode. - KeySpaceIndexes = [(((KeySpaceIndex+1) rem - PartitionCount) * RingIndexInc) || - KeySpaceIndex <- KeySpaces], - {CoverageVNode, [{VNodeIndex, KeySpaceIndexes} | Acc]}; - false -> - {CoverageVNode, Acc} - end - end, - - CoveragePlanFun = - case application:get_env(riak_core, legacy_coverage_planner, false) of - true -> - % Safety net for refactoring, we can still go back to old - % function if necessary. Note 35 x performance degradation - % with this function with ring_size of 1024 - fun find_coverage/5; - false -> - fun initiate_plan/5 - end, - - %% The ReqId value serves as a tiebreaker in the - %% compare_next_vnode function and is used to distribute - %% work to different sets of VNodes. - CoverageResult = - CoveragePlanFun(ReqId, - NVal, - PartitionCount, - UnavailableKeySpaces, - lists:min([PVC, NVal])), - case CoverageResult of - {ok, CoveragePlan} -> - %% Assemble the data structures required for - %% executing the coverage operation. - lists:mapfoldl(CoverageVNodeFun, [], CoveragePlan); - {insufficient_vnodes_available, _KeySpace, PartialCoverage} -> - case VNodeSelector of - allup -> - %% The allup indicator means generate a coverage plan - %% for any available VNodes. - lists:mapfoldl(CoverageVNodeFun, [], PartialCoverage); - all -> - {error, insufficient_vnodes_available} - end - end. - -%% ==================================================================== -%% Internal functions -%% ==================================================================== - --type vnode_covers() :: {non_neg_integer(), list(non_neg_integer())}. - -%% @doc Produce a coverage plan -%% The coverage plan should include all partitions at least PVC times -%% Inputs: -%% ReqId - a random integer identifier for the request which will be used to -%% provide a randomised input to vary the plans. -%% NVal - the n_val for the bucket used in the query -%% PartitionCount - ring_size, should be the length of AllVnodes -%% UnavailableVnodes - any primary vnodes not available, as either the node is -%% down, or set not to participate_in_coverage -%% PVC - Primary Vnode Count, in effect the r value for the query --spec initiate_plan(non_neg_integer(), - pos_integer(), - pos_integer(), - list(non_neg_integer()), - pos_integer()) -> - {ok, list(vnode_covers())} | - {insufficient_vnodes_available, - list(non_neg_integer()), - list(vnode_covers())}. -initiate_plan(ReqId, NVal, PartitionCount, UnavailableVnodes, PVC) -> - % Order the vnodes for the fold. Will number each vnode in turn between - % 0 and NVal - 1. Then sort by this Offset, so that by default we visit - % every NVal'th vnode first, then offset and repeat. - % - % The use of the offset will tend to give an optimal coverage plan in the - % happy-day scenario (when all vnodes are available). There is a balance - % between time of calculation, and how optimal the plan needs to be. The - % plan is not necessarily optimal (in terms of involving the fewest number - % of vnodes). Nor does it consider location (trying to query as a local - % to the planning node as possible). - % - % There does need to be an even spread of load across plans. To achieve - % this we don't treat the ring as a list always starting at 0, instead the - % ring is first split at a random place. Otherwise, if the planning were - % to always start at the front of the ring then those vnodes that cover the - % tail of the ring will be involved in a disproportionate number of - % queries. - {L1, L2} = - lists:split(ReqId rem PartitionCount, - lists:seq(0, PartitionCount - 1)), - % Use an array to hold a list for each offset, before flattening the array - % back to a list to rejoin together - A0 = array:new(NVal, {default, []}), - {A1, _} = - lists:foldl( - fun(I, {A, Offset}) -> - {array:set(Offset, [I|array:get(Offset, A)], A), - (Offset + 1) rem NVal} - end, - {A0, 0}, - L2 ++ L1 - ), - OrderedVnodes = lists:flatten(array:to_list(A1)), - - % Setup an array for tracking which partition has "Wants" left, starting - % with a value of PVC - PartitionWants = array:new(PartitionCount, {default, PVC}), - Countdown = PartitionCount * PVC, - - % Subtract any Unavailable vnodes. Must only assign available primary - % vnodes a role in the coverage plan - AvailableVnodes = lists:subtract(OrderedVnodes, UnavailableVnodes), - - develop_plan(AvailableVnodes, NVal, PartitionWants, Countdown, []). - - -develop_plan(_UnusedVnodes, _NVal, _PartitionWants, 0, VnodeCovers) -> - % Use the countdown to know when to stop, rather than having the cost of - % checking each entry in the PartitionWants array each loop - {ok, VnodeCovers}; -develop_plan([], _NVal, _PartitionWants, _N, VnodeCovers) -> - % The previous function coverage_plan/7 returns "KeySpaces" as the second - % element, which is then ignored - so we don't bother calculating this here - {insufficient_vnodes_available, [], VnodeCovers}; -develop_plan([HeadVnode|RestVnodes], NVal, - PartitionWants, PartitionCountdown, - VnodeCovers) -> - PartitionCount = array:size(PartitionWants), - % Need to find what partitions are covered by this vnode - LookBackFun = - fun(I) -> (PartitionCount + HeadVnode - I) rem PartitionCount end, - PartsCoveredByHeadNode = - lists:sort(lists:map(LookBackFun, lists:seq(1, NVal))), - % For these partitions covered by the vnode, are there any partitions with - % non-zero wants - PartsCoveredAndWanted = - lists:filter(fun(P) -> array:get(P, PartitionWants) > 0 end, - PartsCoveredByHeadNode), - % If there are partitions that are covered by the vnode and have wants, - % then we should include this vnode in the coverage plan for these - % partitions. Otherwise, skip the vnode. - case length(PartsCoveredAndWanted) of - L when L > 0 -> - % Add the vnode to the coverage plan - VnodeCovers0 = - lists:sort([{HeadVnode, PartsCoveredAndWanted}|VnodeCovers]), - % Update the wants, for each partition that has been added to the - % coverage plan - UpdateWantsFun = - fun(P, PWA) -> array:set(P, array:get(P, PWA) - 1, PWA) end, - PartitionWants0 = - lists:foldl(UpdateWantsFun, - PartitionWants, - PartsCoveredAndWanted), - % Now loop, to find use of the remaining vnodes - develop_plan(RestVnodes, NVal, - PartitionWants0, PartitionCountdown - L, - VnodeCovers0); - _L -> - develop_plan(RestVnodes, NVal, - PartitionWants, PartitionCountdown, - VnodeCovers) - end. - --spec find_coverage(non_neg_integer(), - pos_integer(), - pos_integer(), - list(non_neg_integer()), - pos_integer()) -> - {ok, list(vnode_covers())} | - {insufficient_vnodes_available, - list(non_neg_integer()), - list(vnode_covers())}. -find_coverage(ReqId, NVal, PartitionCount, UnavailableKeySpaces, PVC) -> - AllKeySpaces = lists:seq(0, PartitionCount - 1), - %% Calculate an offset based on the request id to offer - %% the possibility of different sets of VNodes being - %% used even when all nodes are available. - Offset = ReqId rem NVal, - find_coverage(AllKeySpaces, Offset, NVal, PartitionCount, - UnavailableKeySpaces, PVC, []). - -%% @private --spec find_coverage(list(non_neg_integer()), - non_neg_integer(), - pos_integer(), - pos_integer(), - list(non_neg_integer()), - pos_integer(), - list(vnode_covers())) -> - {ok, list(vnode_covers())} | - {insufficient_vnodes_available, - list(non_neg_integer()), - list(vnode_covers())}. -find_coverage(AllKeySpaces, Offset, NVal, PartitionCount, UnavailableKeySpaces, PVC, []) -> - %% Calculate the available keyspaces. - AvailableKeySpaces = [{((VNode+Offset) rem PartitionCount), - VNode, - n_keyspaces(VNode, NVal, PartitionCount)} - || VNode <- (AllKeySpaces -- UnavailableKeySpaces)], - case find_coverage_vnodes( - ordsets:from_list(AllKeySpaces), - AvailableKeySpaces, - []) of - {ok, CoverageResults} -> - case PVC of - 1 -> - {ok, CoverageResults}; - _ -> - find_coverage(AllKeySpaces, - Offset, - NVal, - PartitionCount, - UnavailableKeySpaces, - PVC-1, - CoverageResults) - end; - Error -> - Error - end; -find_coverage(AllKeySpaces, - Offset, - NVal, - PartitionCount, - UnavailableKeySpaces, - PVC, - ResultsAcc) -> - %% Calculate the available keyspaces. The list of - %% keyspaces for each vnode that have already been - %% covered by the plan are subtracted from the complete - %% list of keyspaces so that coverage plans that - %% want to cover more one preflist vnode work out - %% correctly. - AvailableKeySpaces = [{((VNode+Offset) rem PartitionCount), - VNode, - n_keyspaces(VNode, NVal, PartitionCount) -- - proplists:get_value(VNode, ResultsAcc, [])} - || VNode <- (AllKeySpaces -- UnavailableKeySpaces)], - case find_coverage_vnodes(ordsets:from_list(AllKeySpaces), - AvailableKeySpaces, - ResultsAcc) of - {ok, CoverageResults} -> - UpdateResultsFun = - fun({Key, NewValues}, Results) -> - case proplists:get_value(Key, Results) of - undefined -> - [{Key, NewValues} | Results]; - Values -> - UniqueValues = lists:usort(Values ++ NewValues), - [{Key, UniqueValues} | - proplists:delete(Key, Results)] - end - end, - UpdatedResults = - lists:foldl(UpdateResultsFun, ResultsAcc, CoverageResults), - case PVC of - 1 -> - {ok, UpdatedResults}; - _ -> - find_coverage(AllKeySpaces, - Offset, - NVal, - PartitionCount, - UnavailableKeySpaces, - PVC-1, - UpdatedResults) - end; - Error -> - Error - end. - -%% @private -%% @doc Find the N key spaces for a VNode -n_keyspaces(VNode, N, PartitionCount) -> - ordsets:from_list([X rem PartitionCount || - X <- lists:seq(PartitionCount + VNode - N, - PartitionCount + VNode - 1)]). - -%% @private -%% @doc Find a minimal set of covering VNodes -find_coverage_vnodes([], _, Coverage) -> - {ok, lists:sort(Coverage)}; -find_coverage_vnodes(KeySpace, [], Coverage) -> - {insufficient_vnodes_available, KeySpace, lists:sort(Coverage)}; -find_coverage_vnodes(KeySpace, Available, Coverage) -> - Res = next_vnode(KeySpace, Available), - case Res of - {0, _, _} -> % out of vnodes - find_coverage_vnodes(KeySpace, [], Coverage); - {_NumCovered, VNode, _} -> - {value, {_, VNode, Covers}, UpdAvailable} = lists:keytake(VNode, 2, Available), - UpdCoverage = [{VNode, ordsets:intersection(KeySpace, Covers)} | Coverage], - UpdKeySpace = ordsets:subtract(KeySpace, Covers), - find_coverage_vnodes(UpdKeySpace, UpdAvailable, UpdCoverage) - end. - -%% @private -%% @doc Find the next vnode that covers the most of the -%% remaining keyspace. Use VNode id as tie breaker. -next_vnode(KeySpace, Available) -> - CoverCount = [{covers(KeySpace, CoversKeys), VNode, TieBreaker} || - {TieBreaker, VNode, CoversKeys} <- Available], - hd(lists:sort(fun compare_next_vnode/2, CoverCount)). - -%% @private -%% There is a potential optimization here once -%% the partition claim logic has been changed -%% so that physical nodes claim partitions at -%% regular intervals around the ring. -%% The optimization is for the case -%% when the partition count is not evenly divisible -%% by the n_val and when the coverage counts of the -%% two arguments are equal and a tiebreaker is -%% required to determine the sort order. In this -%% case, choosing the lower node for the final -%% vnode to complete coverage will result -%% in an extra physical node being involved -%% in the coverage plan so the optimization is -%% to choose the upper node to minimize the number -%% of physical nodes. -compare_next_vnode({CA, _VA, TBA}, {CB, _VB, TBB}) -> - if - CA > CB -> %% Descending sort on coverage - true; - CA < CB -> - false; - true -> - TBA < TBB %% If equal coverage choose the lower node. - end. - -%% @private -%% @doc Count how many of CoversKeys appear in KeySpace -covers(KeySpace, CoversKeys) -> - ordsets:size(ordsets:intersection(KeySpace, CoversKeys)). - -%%%============================================================================ -%%% Test -%%%============================================================================ - --ifdef(EQC). - -pow(N, Gen) when not is_integer(Gen) -> - ?LET(Exp, Gen, pow(N, Exp)); -pow(_, 0) -> - 1; -pow(N, Exp) when is_integer(Exp), Exp > 0 -> - N * pow(N, Exp - 1). - -uniq_n_out_of_m(N, M) when N =< M -> - ?LET({Candidates, Split}, {shuffle(lists:seq(0, M - 1)), choose(0, N - 1)}, - begin - {L, _} = lists:split(Split, Candidates), L - end). - -prop_cover_partitions() -> - prop_cover_partitions(fun initiate_plan/5). - -prop_find_coverage_partitions() -> - prop_cover_partitions(fun find_coverage/5). - -%% A coverage plan should contain all partitions -%% and should not return an unavailable node -prop_cover_partitions(F) -> - ?FORALL({NVal, PartitionCount}, {choose(3,5), pow(2, choose(3, 10))}, - ?FORALL({ReqId, Unavailable}, {choose(0, PartitionCount - 1), uniq_n_out_of_m(NVal, PartitionCount)}, - begin - KeySpaces = lists:seq(0, PartitionCount - 1), - PVC = 1, - {ok, Plan} = F(ReqId, NVal, PartitionCount, Unavailable, PVC), - conjunction([{partitions, - equals(lists:sort([ P || {_, Ps} <- Plan, P <- Ps ]), - KeySpaces)}, - {no_unavailable, - equals(Unavailable -- [ N || {N, _} <- Plan ], - Unavailable)}]) - end)). - -prop_distribution() -> - % Test only on new function - % legacy function - find_coverage/5 - will consistently fail on this - % property - prop_distribution(fun initiate_plan/5). - -%% Compute all possible plans and check that there is no "hot" node that is -%% used more than all other nodes in the plan. -%% Also check that the resulting plans have approximately the same -%% number of nodes to select partitions from (not one plan that takes it from 3 -%% nodes and another taking it from 8. -%% If one of the plans fails, then they should all fail. Failing should not -%% depend on the choosen ReqId. -prop_distribution(F) -> - ?FORALL({NVal, PartitionCount}, {choose(3,5), pow(2, choose(3, 9))}, - ?FORALL(Unavailable, uniq_n_out_of_m(NVal, PartitionCount), - begin - PVC = 1, - Plans = [ F(ReqId, NVal, PartitionCount, Unavailable, PVC) - || ReqId <- lists:seq(0, PartitionCount -1) ], - Tags = lists:usort([ element(1, Plan) || Plan <- Plans ]), - ?WHENFAIL(eqc:format("Plans: ~p with distribution ~p\n", [Plans, distribution(Plans)]), - conjunction([{nok_all_nok, length(Tags) == 1}] ++ - [{similar_set, max_diff(length(Unavailable), [ length(Plan) || {_, Plan} <- Plans ])} - || Tags == [ok]] ++ - [{hot_node, same_count(distribution(Plans))} || Unavailable == []])) - end)). - -%% Computing with PVC larger than 1 takes a lot of time. -%% We take slightly smaller paertition size here to test more in same time -%% -%% If PVC is 2 then each partition should appear on two returned nodes -%% But, if nodes are unavailable, then this might not work out, then -%% a next best solution should be presented. -prop_pvc() -> - ?FORALL({NVal, PartitionCount}, {choose(3,5), pow(2, choose(3, 8))}, - ?FORALL({ReqId, Unavailable}, {choose(0, PartitionCount), - uniq_n_out_of_m(NVal, PartitionCount)}, - ?FORALL(PVC, choose(1, NVal), - collect({pvc, PVC}, - begin - PVCPlan = initiate_plan(ReqId, NVal, PartitionCount, Unavailable, PVC), - OnePlan = initiate_plan(ReqId, NVal, PartitionCount, Unavailable, 1), - case {OnePlan, PVCPlan} of - {{ok, _}, {ok, Plan}} -> - Distribution = distribution([ P || {_, Ps} <- Plan, P <- Ps ], []), - ?WHENFAIL(eqc:format("Plan: ~p with distribution ~p\n", [Plan, Distribution]), - conjunction([{partition_count, same_count([{x, PVC} | Distribution])}])); - {{ok, _}, {insufficient_vnodes_available, _, Plan}} -> - Distribution = distribution([ P || {_, Ps} <- Plan, P <- Ps ], []), - conjunction([{unavailable, PVC > NVal - length(Unavailable)}, - {partitions, - equals(lists:usort([ P || {_, Ps} <- Plan, P <- Ps ]), - lists:seq(0, PartitionCount - 1))}, - {no_unavailable, - equals(Unavailable -- [ N || {N, _} <- Plan ], - Unavailable)}, - {good_enough, equals([ Count || {_, Count} <- Distribution, - Count < NVal - length(Unavailable)], [])}]); - _ -> - equals(element(1, PVCPlan), insufficient_vnodes_available) - end - end)))). - -max_diff(N, List) -> - lists:max(List) - lists:min(List) =< N. - -distribution(Plans) -> - distribution([ Node || {_, Plan} <- Plans, {Node, _} <- Plan ], []). - -distribution([], Dist) -> - Dist; -distribution([N|Ns], Dist) -> - case lists:keyfind(N, 1, Dist) of - false -> - distribution(Ns, [{N, 1} | Dist]); - {_, Count} -> - distribution(Ns, lists:keyreplace(N, 1, Dist, {N, Count +1})) - end. - -same_count([]) -> - true; -same_count([{_, Count} | Rest]) -> - equals([ C || {_, C} <- Rest, C /= Count ], []). - - --endif. - --ifdef(TEST). - -%% Unit testing at moment, but there appear to be some obvious properties: -%% - The output of find_coverage is [{A, [B]}] - where accumulation of all [B] -%% should be equal to the KeySpaces -%% - The accumulation of [A] should not include any unavailable KeySpaces -%% - The length of the list should be optimal? - -eight_vnode_prefactor_test() -> - Offset = 0, - NVal = 3, - PartitionCount = 8, - UnavailableKeySpaces = [], - PVC = 1, - {ok, VnodeCovers0} = - find_coverage(Offset, NVal, PartitionCount, - UnavailableKeySpaces, - PVC), - R0 = [{0, [5, 6, 7]}, {3, [0, 1, 2]}, {5, [3, 4]}], - ?assertMatch(R0, VnodeCovers0), - - UnavailableKeySpaces1 = [3, 7], - {ok, VnodeCovers1} = - find_coverage(Offset, NVal, PartitionCount, - UnavailableKeySpaces1, - PVC), - % Is the result below the most efficient - still only 3 vnodes to be asked - % R1 = [{0, [5, 6, 7]}, {2, [0, 1]}, {5, [2, 3, 4]}], - % Actual result returned needs to cover 4 vnodes - R1 = [{0, [5, 6, 7]}, {1, [0]}, {4, [1, 2, 3]}, {5, [4]}], - ?assertMatch(R1, VnodeCovers1), - - Offset2 = 1, - {ok, VnodeCovers2} = - find_coverage(Offset2, NVal, PartitionCount, - UnavailableKeySpaces, - PVC), - % The result here is effective - as we want the use of offset to lead to - % distinct choices of cover vnodes, and [2, 4, 7] is distinct to [0, 3, 5] - R2 = [{2, [0, 1, 7]}, {4, [2, 3]}, {7, [4, 5, 6]}], - ?assertMatch(R2, VnodeCovers2), - - Offset3 = 2, - {ok, VnodeCovers3} = - find_coverage(Offset3, NVal, PartitionCount, - UnavailableKeySpaces, - PVC), - R3 = [{1, [0, 6, 7]}, {3, [1, 2]}, {6, [3, 4, 5]}], - ?assertMatch(R3, VnodeCovers3), - - %% The Primay Vnode Count- now set to 2 (effectively a r value of 2) - %% Each partition must be included twice in the result - PVC4 = 2, - {ok, VnodeCovers4} = - find_coverage(Offset, NVal, PartitionCount, - UnavailableKeySpaces, - PVC4), - R4 = [{0, [5, 6, 7]}, {1, [0, 6, 7]}, {3, [0, 1, 2]}, {4, [1, 2, 3]}, - {5, [3, 4]}, {6, [4, 5]}], - %% For r of 2 - need to check at n_val * 2 vnodes - so count is optimal - ?assertMatch(R4, lists:keysort(1, VnodeCovers4)). - - -changing_repeated_vnode_CODEFAIL_prefactor_test() -> - MaxCount = changing_repeated_vnode_tester(fun find_coverage/5, 200), - - % This assertion is bad! - % This demonstrates that the prefactored code fails the test of providing - % well distributed coverage plans - ?assertEqual(true, MaxCount > 100). - -changing_repeated_vnode_refactor_test() -> - MaxCount = changing_repeated_vnode_tester(fun initiate_plan/5, 200), - - ?assertEqual(true, MaxCount < 100). - - -changing_repeated_vnode_tester(CoverageFun, Runs) -> - % Confirm that the vnode that overlaps (i.e. appears in all the offsets) - % will change between runs - Partitions = lists:seq(0, 31), - GetVnodesUsedFun = - fun(_I) -> - R = rand:uniform(99999), - {Vnodes0, Coverage0} = - ring_tester(32, CoverageFun, R, 3, [], 1), - ?assertEqual(Partitions, Coverage0), - Vnodes0 - end, - AllVnodes = lists:flatten(lists:map(GetVnodesUsedFun, lists:seq(1, Runs))), - CountVnodesFun = - fun(V, Acc) -> - case lists:keyfind(V, 1, Acc) of - {V, C} -> - lists:ukeysort(1, [{V, C + 1}|Acc]); - false -> - lists:ukeysort(1, [{V, 1}|Acc]) - end - end, - [{Vnode, MaxCount}|_RestCounts] = - lists:reverse( - lists:keysort(2, lists:foldl(CountVnodesFun, [], AllVnodes))), - - io:format(user, - "~nVnode=~w MaxCount=~w out of ~w queries~n", - [Vnode, MaxCount, Runs]), - - MaxCount. - -all_refactor_1024ring_test_() -> - {timeout, 1200, fun all_refactor_1024_ring_tester/0}. - -all_refactor_1024_ring_tester() -> - PVC = 1, - TestFun = - fun(ReqId) -> - {ok, VnodeCovers} = initiate_plan(ReqId, 3, 1024, [], PVC), - PC = array:new(1024, {default, 0}), - PC1 = - lists:foldl( - fun({_I, L}, Acc) -> - lists:foldl(fun(P, IA) -> - array:set(P, - array:get(P, IA) + 1, - IA) - end, - Acc, - L) - end, - PC, - VnodeCovers), - lists:foreach(fun(C) -> ?assertEqual(PVC, C) end, array:to_list(PC1)) - end, - - lists:foreach(fun(I) -> TestFun(I) end, lists:seq(0, 1023)). - - -refactor_2048ring_test() -> - ring_tester(2048, fun initiate_plan/5). - -prefactor_1024ring_test() -> - ring_tester(1024, fun find_coverage/5). - -prefactor_ns1024ring_test() -> - nonstandardring_tester(1024, fun find_coverage/5). - -refactor_1024ring_test() -> - ring_tester(1024, fun initiate_plan/5). - -refactor_ns1024ring_test() -> - nonstandardring_tester(1024, fun initiate_plan/5). - -prefactor_512ring_test() -> - ring_tester(512, fun find_coverage/5). - -refactor_512ring_test() -> - ring_tester(512, fun initiate_plan/5). - -prefactor_256ring_test() -> - ring_tester(256, fun find_coverage/5). - -refactor_256ring_test() -> - ring_tester(256, fun initiate_plan/5). - -prefactor_128ring_test() -> - ring_tester(256, fun find_coverage/5). - -refactor_128ring_test() -> - ring_tester(256, fun initiate_plan/5). - -prefactor_64ring_test() -> - ring_tester(64, fun find_coverage/5). - -refactor_64ring_test() -> - ring_tester(64, fun initiate_plan/5). - -compare_vnodesused_test() -> - compare_tester(64), - compare_tester(128), - compare_tester(256). - -compare_tester(RingSize) -> - PFC = nonstandardring_tester(RingSize, fun find_coverage/5), - RFC = nonstandardring_tester(RingSize, fun initiate_plan/5), - % With a little wiggle room - we've not made the number of vnodes - % used worse - ?assertMatch(true, RFC =< (PFC + 1)). - - -ring_tester(PartitionCount, CoverageFun) -> - ring_tester(PartitionCount, CoverageFun, 0). - -ring_tester(PartitionCount, CoverageFun, ReqId) -> - NVal = 3, - UnavailableKeySpaces = [], - PVC = 1, - {Vnodes, CoveredKeySpaces} = - ring_tester(PartitionCount, CoverageFun, - ReqId, NVal, UnavailableKeySpaces, PVC), - ExpVnodeCount = (PartitionCount div NVal) + 2, - KeySpaces = lists:seq(0, PartitionCount - 1), - ?assertMatch(KeySpaces, CoveredKeySpaces), - ?assertMatch(true, length(Vnodes) =< ExpVnodeCount). - -ring_tester(PartitionCount, CoverageFun, - Offset, NVal, UnavailableKeySpaces, PVC) -> - {ok, VnodeCovers0} = - CoverageFun(Offset, NVal, PartitionCount, - UnavailableKeySpaces, - PVC), - AccFun = - fun({A, L}, {VnodeAcc, CoverAcc}) -> {[A|VnodeAcc], CoverAcc ++ L} end, - {Vnodes, Coverage} = lists:foldl(AccFun, {[], []}, VnodeCovers0), - {Vnodes, lists:sort(Coverage)}. - - -nonstandardring_tester(PartitionCount, CoverageFun) -> - Offset = 2, - NVal = 3, - OneDownVnode = rand:uniform(PartitionCount) - 1, - UnavailableKeySpaces = [OneDownVnode], - PVC = 2, - {ok, VnodeCovers} = - CoverageFun(Offset, NVal, PartitionCount, - UnavailableKeySpaces, - PVC), - - PC = array:new(PartitionCount, {default, 0}), - PC1 = - lists:foldl( - fun({I, L}, Acc) -> - ?assertNotEqual(OneDownVnode, I), - lists:foldl(fun(P, IA) -> - array:set(P, array:get(P, IA) + 1, IA) - end, - Acc, - L) - end, - PC, - VnodeCovers), - lists:foreach(fun(C) -> ?assertEqual(2, C) end, array:to_list(PC1)), - length(VnodeCovers). - -multifailure_r2_post_test() -> - multi_failure_tester(32, fun initiate_plan/5), - multi_failure_tester(64, fun initiate_plan/5), - multi_failure_tester(128, fun initiate_plan/5), - multi_failure_tester(256, fun initiate_plan/5), - multi_failure_tester(512, fun initiate_plan/5), - multi_failure_tester(1024, fun initiate_plan/5). - -multifailure_r2_pre_test() -> - multi_failure_tester(32, fun find_coverage/5), - multi_failure_tester(64, fun find_coverage/5), - multi_failure_tester(128, fun find_coverage/5), - multi_failure_tester(256, fun find_coverage/5), - multi_failure_tester(512, fun find_coverage/5). - -multi_failure_tester(PartitionCount, CoverageFun) when PartitionCount >= 32 -> - % If there are failures at least target_n_val appart, a r=2 coverage plan - % can still be produced - ReqId = rand:uniform(99999), - NVal = 3, - PVC = 2, - C = rand:uniform(PartitionCount div 8), - UnavailableKeySpaces = lists:map(fun(I) -> I * 4 - C end, lists:seq(1, 8)), - {ok, VnodeCovers} = - CoverageFun(ReqId, NVal, PartitionCount, - UnavailableKeySpaces, PVC), - PC = array:new(PartitionCount, {default, 0}), - PC0 = - lists:foldl( - fun({I, L}, Acc) -> - ?assertNotEqual(true, lists:member(I, UnavailableKeySpaces)), - lists:foldl(fun(P, IA) -> - array:set(P, array:get(P, IA) + 1, IA) - end, - Acc, - L) - end, - PC, - VnodeCovers), - lists:foreach(fun(Cnt) -> ?assertEqual(2, Cnt) end, array:to_list(PC0)), - - % Fail two vnodes together - now can only get partial coverage from a r=2 - % plan - RVN = rand:uniform(PartitionCount), - UnavailableKeySpaces1 = - case RVN of - 1 -> - [0, PartitionCount - 1]; - _ -> - [RVN - 1, RVN - 2] - end, - {insufficient_vnodes_available, _, VnodeCovers1} = - CoverageFun(ReqId, NVal, PartitionCount, - UnavailableKeySpaces1, PVC), - PC1 = - lists:foldl( - fun({I, L}, Acc) -> - ?assertNotEqual(true, lists:member(I, UnavailableKeySpaces1)), - lists:foldl(fun(P, IA) -> - array:set(P, array:get(P, IA) + 1, IA) - end, - Acc, - L) - end, - PC, - VnodeCovers1), - Covered = - length(lists:filter(fun(Cnt) -> Cnt == 2 end, array:to_list(PC1))), - PartiallyCovered = - length(lists:filter(fun(Cnt) -> Cnt == 1 end, array:to_list(PC1))), - ?assertEqual(2, PartiallyCovered), - ?assertEqual(2, PartitionCount - Covered). - - --endif. diff --git a/src/riak_core_dist_mon.erl b/src/riak_core_dist_mon.erl deleted file mode 100644 index 1b4db8c44..000000000 --- a/src/riak_core_dist_mon.erl +++ /dev/null @@ -1,106 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Disterl socket buffer size monitor -%% -%% 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_dist_mon). - --export([start_link/0, set_dist_buf_sizes/2, get_riak_env_vars/0]). - -%% gen_server callbacks --behavior(gen_server). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --record(state, { - sndbuf :: non_neg_integer(), - recbuf :: non_neg_integer() - }). - -%% provided for testing convenience and debugging. -set_dist_buf_sizes(SndBuf, RecBuf) - when (is_integer(SndBuf) andalso SndBuf > 0) andalso - (is_integer(RecBuf) andalso RecBuf > 0) -> - gen_server:call(?MODULE, {set_dist_buf_sizes, SndBuf, RecBuf}). - - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). - -init(_) -> - %% register for monitor events so we can adjust buffers on - %% new connections when they're started. - ok = net_kernel:monitor_nodes(true, [{node_type, visible}, nodedown_reason]), - {SndBuf, RecBuf} = get_riak_env_vars(), - DistCtrl = erlang:system_info(dist_ctrl), - %% make sure that buffers are correct on existing connections. - _ = [set_port_buffers(Port, SndBuf, RecBuf) - || {_Node, Port} <- DistCtrl], - {ok, #state{sndbuf=SndBuf, recbuf=RecBuf}}. - -get_riak_env_vars() -> - {ok, SndBuf} = application:get_env(riak_core, dist_send_buf_size), - {ok, RecBuf} = application:get_env(riak_core, dist_recv_buf_size), - {SndBuf, RecBuf}. - -handle_call({set_dist_buf_sizes, SndBuf, RecBuf}, _From, State) -> - _ = [set_port_buffers(Port, SndBuf, RecBuf) - || {_Node, Port} <- erlang:system_info(dist_ctrl)], - {reply, ok, State#state{sndbuf=SndBuf, recbuf=RecBuf}}; -handle_call(Msg, _From, State) -> - ?LOG_WARNING("unknown call message received: ~p", [Msg]), - {noreply, State}. - -handle_cast(Msg, State) -> - ?LOG_WARNING("unknown cast message received: ~p", [Msg]), - {noreply, State}. - - -handle_info({nodeup, Node, _InfoList}, #state{sndbuf=SndBuf, - recbuf=RecBuf} = State) -> - DistCtrl = erlang:system_info(dist_ctrl), - case proplists:get_value(Node, DistCtrl) of - undefined -> - ?LOG_ERROR("Could not get dist for ~p\n~p\n", [Node, DistCtrl]), - {noreply, State}; - Port -> - ok = set_port_buffers(Port, SndBuf, RecBuf), - {noreply, State} - end; -handle_info({nodedown, _Node, _InfoList}, State) -> - %% don't think we need to do anything here - {noreply, State}; -handle_info(Msg, State) -> - ?LOG_WARNING("unknown info message received: ~p", [Msg]), - {noreply, State}. - -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%% private - -set_port_buffers(Port, SndBuf, RecBuf) -> - inet:setopts(Port, [{sndbuf, SndBuf}, - {recbuf, RecBuf}]). diff --git a/src/riak_core_dtrace.erl b/src/riak_core_dtrace.erl deleted file mode 100644 index 3b7208fae..000000000 --- a/src/riak_core_dtrace.erl +++ /dev/null @@ -1,260 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2007-2012 Basho Technologies, Inc. All Rights Reserved. -%% -%% ------------------------------------------------------------------- -%% @doc Erlang-triggerable DTrace probe support -%% -%% In an ideal world, this module would live in a repo that would be -%% easily sharable across multiple Basho projects. The tricky bit for -%% this would be trying to make generic the -%% `application:get_env(riak_core, dtrace_support)' call that's -%% currently in the `riak_kv_dtrace:dtrace/1' function. But we'll -%% wait for another day, I think. -%% -%% The purpose of this module is to reduce the overhead of DTrace (and -%% SystemTap) probes when those probes are: 1. not supported by the VM, -%% or 2. disabled by application configuration. #1 is the bigger -%% problem: a single call to the code loader can take several -%% milliseconds. #2 is useful in the case that we want to try to reduce -%% the overhead of adding these probes even further by avoiding the NIF -%% call entirely. -%% -%% SLF's MacBook Pro tests -%% -%% without cover, with R14B04 + DTrace: -%% -%% timeit_naive average 2236.306 usec/call over 500.0 calls -%% timeit_mochiglobal average 0.509 usec/call over 225000.0 calls -%% timeit_best OFF (fastest) average 0.051 usec/call over 225000.0 calls -%% timeit_best ON -init average 1.027 usec/call over 225000.0 calls -%% timeit_best ON +init average 0.202 usec/call over 225000.0 calls -%% -%% with cover, with R14B04 + DTrace: -%% -%% timeit_naive average 2286.202 usec/call over 500.0 calls -%% timeit_mochiglobal average 1.255 usec/call over 225000.0 calls -%% timeit_best OFF (fastest) average 1.162 usec/call over 225000.0 calls -%% timeit_best ON -init average 2.207 usec/call over 225000.0 calls -%% timeit_best ON +init average 1.303 usec/call over 225000.0 calls - --module(riak_core_dtrace). - --export([dtrace/1, dtrace/3, dtrace/4, dtrace/6]). --export([enabled/0, put_tag/1]). --export([timeit0/1, timeit_mg/1, timeit_best/1]). % debugging/testing only - --define(MAGIC, '**DTRACE*SUPPORT**'). --define(DTRACE_TAG_KEY, '**DTRACE*TAG*KEY**'). - -dtrace(ArgList) -> - case get(?MAGIC) of - undefined -> - case application:get_env(riak_core, dtrace_support) of - {ok, true} -> - case string:to_float(erlang:system_info(version)) of - {5.8, _} -> - %% R14B04 - put(?MAGIC, dtrace), - if ArgList == enabled_check -> true; - true -> dtrace(ArgList) - end; - {Num, _} when Num > 5.8 -> - %% R15B or higher, though dyntrace option - %% was first available in R15B01. - put(?MAGIC, dyntrace), - if ArgList == enabled_check -> true; - true -> dtrace(ArgList) - end; - _ -> - put(?MAGIC, unsupported), - false - end; - _ -> - put(?MAGIC, unsupported), - false - end; - dyntrace -> - if ArgList == enabled_check -> true; - true -> erlang:apply(dyntrace, p, ArgList) - end; - dtrace -> - if ArgList == enabled_check -> true; - true -> erlang:apply(dtrace, p, ArgList) - end; - _ -> - false - end. - -%% NOTE: We do a get() first to avoid the list concat ++ if we don't need it. - -dtrace(Int0, Ints, Strings) when is_integer(Int0) -> - case get(?MAGIC) of - unsupported -> - false; - _ -> - dtrace([Int0] ++ Ints ++ Strings) - end. - -dtrace(Int0, Ints, String0, Strings) when is_integer(Int0) -> - case get(?MAGIC) of - unsupported -> - false; - _ -> - dtrace([Int0] ++ Ints ++ [String0] ++ Strings) - end. - -%% NOTE: Due to use of ?MODULE, we may have cases where the type -%% of String0 is an atom and not a string/iodata. - -dtrace(Int0, Int1, Ints, String0, String1, Strings) - when is_integer(Int0), is_integer(Int1) -> - case get(?MAGIC) of - unsupported -> - false; - _ -> - S0 = if is_atom(String0) -> erlang:atom_to_binary(String0, latin1); - true -> String0 - end, - dtrace([Int0, Int1] ++ Ints ++ [S0, String1] ++ Strings) - end. - -enabled() -> - dtrace(enabled_check). - -put_tag(Tag) -> - case enabled() of - true -> - FTag = iolist_to_binary(Tag), - put(?DTRACE_TAG_KEY, FTag), - dyntrace:put_tag(FTag); - false -> - ok - end. - -timeit0(ArgList) -> - try - erlang:apply(dyntrace, p, ArgList) - catch - error:undef -> - try - erlang:apply(dtrace, p, ArgList) - catch - error:undef -> - false - end - end. - -timeit_mg(ArgList) -> - case riak_core_mochiglobal:get(?MAGIC) of - undefined -> - case application:get_env(riak_core, dtrace_support) of - {ok, true} -> - case string:to_float(erlang:system_info(version)) of - {5.8, _} -> - %% R14B04 - riak_core_mochiglobal:put(?MAGIC, dtrace), - timeit_mg(ArgList); - {Num, _} when Num > 5.8 -> - %% R15B or higher, though dyntrace option - %% was first available in R15B01. - riak_core_mochiglobal:put(?MAGIC, dyntrace), - timeit_mg(ArgList); - _ -> - riak_core_mochiglobal:put(?MAGIC, unsupported), - false - end; - _ -> - riak_core_mochiglobal:put(?MAGIC, unsupported), - false - end; - dyntrace -> - erlang:apply(dyntrace, p, ArgList); - dtrace -> - erlang:apply(dtrace, p, ArgList); - unsupported -> - false - end. - -timeit_best(ArgList) -> - dtrace(ArgList). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - -timeit_naive_test() -> - test_common("timeit_naive", - fun() -> - [timer:tc(?MODULE, timeit0, [[42]]) || - _ <- lists:seq(1,501)] - end). - --define(REPS, 225000). - -timeit_mochiglobal_test() -> - riak_core_mochiglobal:delete(?MAGIC), - Reps = lists:seq(1, ?REPS), - test_common("timeit_mochiglobal", - fun() -> - Start = os:timestamp(), - [?MODULE:timeit_mg([42]) || _ <- Reps], - [unused, {timer:now_diff(os:timestamp(), Start), unused}] - end, - ?REPS), - riak_core_mochiglobal:delete(?MAGIC). - -timeit_best_off_test() -> - timeit_best_common("timeit_best OFF (fastest)", false). - -timeit_best_onfalse_test() -> - application:set_env(riak_core, dtrace_support, true), - timeit_best_common("timeit_best ON -init", false), - application:unset_env(riak_core, dtrace_support). - -timeit_best_ontrue_test() -> - %% NOTE: This test must be run *last* because it's really - %% difficult to undo the dtrace/dyntrace init. - application:set_env(riak_core, dtrace_support, true), - timeit_best_common("timeit_best ON +init", true), - application:unset_env(riak_core, dtrace_support). - -timeit_best_common(Label, InitTheDTraceStuff_p) -> - case re:run(erlang:system_info(system_version), "dtrace|systemtap") of - nomatch -> - io:format(user, "Skipping timeit_best_on test: no " - "DTrace/SystemTap is available\n", []); - _ -> - if InitTheDTraceStuff_p -> - catch dtrace:init(), - catch dyntrace:p(); - true -> - ok - end, - Reps = lists:seq(1, ?REPS), - test_common(Label, - fun() -> - Start = os:timestamp(), - [?MODULE:timeit_best([42]) || _ <- Reps], - %% X = lists:usort([?MODULE:timeit_best([42]) || _ <- Reps]), io:format(user, "Label ~s out ~p\n", [Label, X]), - [unused, {timer:now_diff(os:timestamp(), Start), unused}] - end, - ?REPS) - end. - -test_common(Label, Fun) -> - test_common(Label, Fun, 1). - -test_common(Label, Fun, Multiplier) -> - erase(?MAGIC), - [_|Xs] = Fun(), - NumXs = length(Xs) * Multiplier, - AvgUSec = lists:sum([X || {X, _} <- Xs]) / NumXs, - io:format(user, "~-28s average ~9.3f usec/call over ~9.1f calls\n", - [Label, AvgUSec, NumXs/1]). - -last_test() -> - %% THIS SHOULD BE THE LAST TEST. - io:format(user, "NOTE: cover analysis will skew results. Run without " - "cover for true timings.\n", []). - --endif. % TEST diff --git a/src/riak_core_exo_monitor.erl b/src/riak_core_exo_monitor.erl deleted file mode 100644 index 2ec2edda7..000000000 --- a/src/riak_core_exo_monitor.erl +++ /dev/null @@ -1,82 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2014 Basho Technologies, Inc. All Rights Reserved. -%% -%% This Source Code Form is subject to the terms of the Mozilla Public -%% License, v. 2.0. If a copy of the MPL was not distributed with this -%% file, You can obtain one at http://mozilla.org/MPL/2.0/. -%% -%% ------------------------------------------------------------------- -%% -%% @doc Legacy mapping module folsom metrics to exometer -%% -%% @end --module(riak_core_exo_monitor). --behaviour(exometer_folsom_monitor). --behaviour(exometer_entry). - --export([copy_folsom/3]). --export([behaviour/0, - delete/3, - get_datapoints/3, - get_value/4, - new/3, - reset/3, - sample/3, - setopts/3, - update/4]). - -behaviour() -> - entry. - -copy_folsom(Name, Type, Opts) when is_tuple(Name) -> - Prefix = riak_core_stat:prefix(), - {[Prefix|tuple_to_list(Name)], ad_hoc, [{folsom_name, Name}, - {module, ?MODULE}, - {type, Type} - | options(Type, Opts)]}; -copy_folsom(_, _, _) -> - false. - -new(N, _, Opts) -> - {ok, {proplists:get_value(type, Opts, unknown), - proplists:get_value(folsom_name, Opts, N)}}. - -update(_, Value, counter, {_, Name}) -> - folsom_metrics:notify_existing_metric(Name, {inc,Value}, counter); -update(_, Value, Type, {_, Name}) -> - folsom_metrics:notify_existing_metric(Name, Value, Type). - -reset(_, _, _) -> - {error, unsupported}. - -get_value(_, Type, {_, Name}, DPs) -> - exometer_folsom:get_value(Name, Type, [], DPs). - -sample(_, _, _) -> - {error, unsupported}. - -setopts(_, _, _) -> - ok. - -delete(_, _, _) -> - {error, unsupported}. - -get_datapoints(Name, Type, _) -> - exometer_folsom:get_datapoints(Name, Type, []). - -options(history, [Size]) -> - [{size, Size}]; -options(histogram, [SampleType, SampleSize, Alpha]) -> - [{sample_type, SampleType}, - {sample_size, SampleSize}, - {alpha, Alpha}]; -options(duration , [SampleType, SampleSize, Alpha]) -> - [{sample_type, SampleType}, - {sample_size, SampleSize}, - {alpha, Alpha}]; -options(meter_reader, []) -> []; -options(spiral , []) -> []; -options(meter , []) -> []; -options(gauge , []) -> []; -options(counter , []) -> []. diff --git a/src/riak_core_format.erl b/src/riak_core_format.erl deleted file mode 100644 index 2a6eaccd7..000000000 --- a/src/riak_core_format.erl +++ /dev/null @@ -1,108 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2007-2012 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 formatting data. - --module(riak_core_format). --export([fmt/2, - human_size_fmt/2, - human_time_fmt/2, - epoch_to_datetime/1]). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - -%% @doc Created a string `Str' based on the format string `FmtStr' and -%% list of args `Args'. --spec fmt(string(), list()) -> Str::string(). -fmt(FmtStr, Args) -> - lists:flatten(io_lib:format(FmtStr, Args)). - -%% @doc Create a human friendly string `Str' for number of bytes -%% `Bytes' and format based on format string `Fmt'. --spec human_size_fmt(string(), number()) -> string(). -human_size_fmt(Fmt, Bytes) -> - Fmt2 = Fmt ++ " ~s", - {Value, Units} = human_size(Bytes, ["B","KB","MB","GB","TB","PB"]), - fmt(Fmt2, [Value, Units]). - -%% @doc Create a human friendly string `Str' for the given time in -%% microseconds `Micros'. Format according to format string -%% `Fmt'. --spec human_time_fmt(string(), non_neg_integer()) -> Str::string(). -human_time_fmt(Fmt, Micros) -> - Fmt2 = Fmt ++ " ~s", - {Value, Units} = human_time(Micros), - fmt(Fmt2, [Value, Units]). - -%% @doc Convert a folsom_utils:now_epoch() to a universal datetime --spec epoch_to_datetime(non_neg_integer()) -> calendar:datetime(). -epoch_to_datetime(S) -> - Epoch = {{1970,1,1},{0,0,0}}, - Seconds = calendar:datetime_to_gregorian_seconds(Epoch) + S, - calendar:gregorian_seconds_to_datetime(Seconds). - -%%%=================================================================== -%%% Private -%%%=================================================================== - -%% @private -%% -%% @doc Formats a byte size into a human-readable size with units. -%% Thanks StackOverflow: -%% http://stackoverflow.com/questions/2163691/simpler-way-to-format-bytesize-in-a-human-readable-way --spec human_size(number(), list()) -> {float(), iolist()}. -human_size(S, [_|[_|_] = L]) when S >= 1024 -> human_size(S/1024, L); -human_size(S, [M|_]) -> - {float(S), M}. - -%% @private -%% -%% @doc Given a number of `Micros' returns a human friendly time -%% duration in the form of `{Value, Units}'. --spec human_time(non_neg_integer()) -> {Value::number(), Units::string()}. -human_time(Micros) -> - human_time(Micros, {1000, "us"}, [{1000, "ms"}, {60, "s"}, {60, "min"}, {24, "hr"}, {365, "d"}]). - --spec human_time(number(), {pos_integer(), string()}, - [{pos_integer(), string()}]) -> - {float(), string()}. -human_time(T, {Divisor, Unit}, Units) when T < Divisor orelse Units == [] -> - {float(T), Unit}; -human_time(T, {Divisor, _}, [Next|Units]) -> - human_time(T / Divisor, Next, Units). - --ifdef(TEST). -human_time_fmt_test() -> - FiveUS = 5, - FiveMS = 5000, - FiveS = 5000000, - FiveMin = FiveS * 60, - FiveHr = FiveMin * 60, - FiveDay = FiveHr * 24, - [?assertEqual(Expect, human_time_fmt("~.1f", T)) - || {T, Expect} <- [{FiveUS, "5.0 us"}, - {FiveMS, "5.0 ms"}, - {FiveS, "5.0 s"}, - {FiveMin, "5.0 min"}, - {FiveHr, "5.0 hr"}, - {FiveDay, "5.0 d"}]]. --endif. diff --git a/src/riak_core_gen_server.erl b/src/riak_core_gen_server.erl index ecbd4af78..145f136aa 100644 --- a/src/riak_core_gen_server.erl +++ b/src/riak_core_gen_server.erl @@ -1027,8 +1027,8 @@ format_status(Opt, StatusData) -> Name end, Header = lists:concat(["Status for generic server ", NameTag]), - Log = get_log(Debug), - Specfic = + 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 diff --git a/src/riak_core_gossip.erl b/src/riak_core_gossip.erl index 7ff3854f6..200e5003b 100644 --- a/src/riak_core_gossip.erl +++ b/src/riak_core_gossip.erl @@ -2,7 +2,7 @@ %% %% riak_core: Core Riak Application %% -%% Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved. +%% Copyright (c) 2007-2015 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 @@ -38,22 +38,14 @@ 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, - gossip_version/0]). + recursive_gossip/1, random_recursive_gossip/1, rejoin/2 +]). --include_lib("kernel/include/logger.hrl"). - --include("riak_core_ring.hrl"). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. %% Default gossip rate: allow at most 45 gossip messages every 10 seconds -define(DEFAULT_LIMIT, {45, 10000}). --record(state, {gossip_versions, - gossip_tokens}). +-record(state, {gossip_tokens}). %% =================================================================== %% Public API @@ -85,7 +77,6 @@ stop() -> rejoin(Node, Ring) -> gen_server:cast({?MODULE, Node}, {rejoin, Ring}). - %% @doc Gossip state to a random node in the ring. random_gossip(Ring) -> case riak_core_ring:random_other_active_node(Ring) of @@ -122,7 +113,7 @@ recursive_gossip(Ring) -> random_recursive_gossip(Ring) -> Active = riak_core_ring:active_members(Ring), - RNode = lists:nth(rand:uniform(length(Active)), Active), + RNode = lists:nth(riak_core_rand:uniform(length(Active)), Active), recursive_gossip(Ring, RNode). %% =================================================================== @@ -132,77 +123,19 @@ random_recursive_gossip(Ring) -> %% @private init(_State) -> schedule_next_reset(), - {ok, Ring} = riak_core_ring_manager:get_raw_ring(), - {Tokens, _} = app_helper:get_env(riak_core, gossip_limit, ?DEFAULT_LIMIT), - State = update_known_versions(Ring, - #state{gossip_versions=orddict:new(), - gossip_tokens=Tokens}), + {Tokens, _} = application:get_env(riak_core, gossip_limit, ?DEFAULT_LIMIT), + State = #state{gossip_tokens = Tokens}, {ok, State}. handle_call(_, _From, State) -> {reply, ok, State}. -update_gossip_version(Ring) -> - CurrentVsn = riak_core_ring:get_member_meta(Ring, node(), gossip_vsn), - DesiredVsn = gossip_version(), - case CurrentVsn of - DesiredVsn -> - Ring; - _ -> - Ring2 = riak_core_ring:update_member_meta(node(), Ring, node(), - gossip_vsn, DesiredVsn), - Ring2 - end. - - -update_known_version(Node, {OtherRing, GVsns}) -> - case riak_core_ring:get_member_meta(OtherRing, Node, gossip_vsn) of - undefined -> - case riak_core_ring:owner_node(OtherRing) of - Node -> - %% Ring owner defaults to legacy gossip if unspecified. - {OtherRing, orddict:store(Node, ?LEGACY_RING_VSN, GVsns)}; - _ -> - {OtherRing, GVsns} - end; - GossipVsn -> - {OtherRing, orddict:store(Node, GossipVsn, GVsns)} - end. - -update_known_versions(OtherRing, State=#state{gossip_versions=GVsns}) -> - {_, GVsns2} = lists:foldl(fun update_known_version/2, - {OtherRing, GVsns}, - riak_core_ring:all_members(OtherRing)), - State#state{gossip_versions=GVsns2}. - -gossip_version() -> - %% Now that we can safely assume all nodes support capabilities, this - %% should be replaced with a capability someday. - ?CURRENT_RING_VSN. - -rpc_gossip_version(Ring, Node) -> - GossipVsn = riak_core_ring:get_member_meta(Ring, Node, gossip_vsn), - case GossipVsn of - undefined -> - case riak_core_util:safe_rpc(Node, riak_core_gossip, gossip_version, [], 1000) of - {badrpc, _} -> - ?LEGACY_RING_VSN; - Vsn -> - Vsn - end; - _ -> - GossipVsn - end. - %% @private 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, MyRing0} = riak_core_ring_manager:get_raw_ring(), - MyRing = update_gossip_version(MyRing0), - GossipVsn = rpc_gossip_version(MyRing, Node), - RingOut = riak_core_ring:downgrade(GossipVsn, MyRing), + {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"), @@ -218,14 +151,13 @@ handle_cast({distribute_ring, Ring}, State) -> gen_server:abcast(Nodes, ?MODULE, {reconcile_ring, Ring}), {noreply, State}; -handle_cast({reconcile_ring, RingIn}, State) -> - OtherRing = riak_core_ring:upgrade(RingIn), - State2 = update_known_versions(OtherRing, State), +handle_cast({reconcile_ring, OtherRing}, State) -> %% Compare the two rings, see if there is anything that %% must be done to make them equal... - riak_core_stat:update(gossip_received), + %% STATS + % riak_core_stat:update(gossip_received), riak_core_ring_manager:ring_trans(fun reconcile/2, [OtherRing]), - {noreply, State2}; + {noreply, State}; handle_cast(gossip_ring, State) -> % Gossip the ring to some random other node... @@ -234,8 +166,7 @@ handle_cast(gossip_ring, State) -> random_gossip(MyRing), {noreply, State}; -handle_cast({rejoin, RingIn}, State) -> - OtherRing = riak_core_ring:upgrade(RingIn), +handle_cast({rejoin, OtherRing}, State) -> {ok, Ring} = riak_core_ring_manager:get_raw_ring(), SameCluster = (riak_core_ring:cluster_name(Ring) =:= @@ -243,14 +174,12 @@ handle_cast({rejoin, RingIn}, State) -> case SameCluster of true -> OtherNode = riak_core_ring:owner_node(OtherRing), - ok = - case riak_core:join(false, node(), OtherNode, true, true) of - ok -> - ok; - {error, Reason} -> - ?LOG_ERROR("Could not rejoin cluster: ~p", [Reason]), - ok - end, + 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} @@ -262,7 +191,7 @@ handle_cast(_, State) -> handle_info(reset_tokens, State) -> schedule_next_reset(), gen_server:cast(?MODULE, gossip_ring), - {Tokens, _} = app_helper:get_env(riak_core, gossip_limit, ?DEFAULT_LIMIT), + {Tokens, _} = application:get_env(riak_core, gossip_limit, ?DEFAULT_LIMIT), {noreply, State#state{gossip_tokens=Tokens}}; handle_info(_Info, State) -> {noreply, State}. @@ -281,12 +210,10 @@ code_change(_OldVsn, State, _Extra) -> %% =================================================================== schedule_next_reset() -> - {_, Reset} = app_helper: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). reconcile(Ring0, [OtherRing0]) -> - %% Due to rolling upgrades and legacy gossip, a ring's cluster name - %% may be temporarily undefined. This is eventually fixed by the claimant. {Ring, OtherRing} = riak_core_ring:reconcile_names(Ring0, OtherRing0), Node = node(), OtherNode = riak_core_ring:owner_node(OtherRing), @@ -308,7 +235,8 @@ reconcile(Ring0, [OtherRing0]) -> case {WrongCluster, OtherStatus, Changed} of {true, _OS, _C} -> %% TODO: Tell other node to stop gossiping to this node. - riak_core_stat:update(ignored_gossip), + %% STATS + % riak_core_stat:update(ignored_gossip), ignore; {false, down, _C} -> %% Tell other node to rejoin the cluster. @@ -321,7 +249,8 @@ reconcile(Ring0, [OtherRing0]) -> ignore; {false, _OS, new_ring} -> Ring3 = riak_core_ring:ring_changed(Node, Ring2), - riak_core_stat:update(rings_reconciled), + %% STATS + % riak_core_stat:update(rings_reconciled), log_membership_changes(Ring, Ring3), {reconciled_ring, Ring3}; {false, _OS, _C} -> @@ -361,16 +290,16 @@ do_log_membership_changes([], [{NewNode, NewStatus}|New]) -> do_log_membership_changes([], New). log_node_changed(Node, Old, New) -> - ?LOG_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) -> - ?LOG_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) -> - ?LOG_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, rand:seed(exrop, os:timestamp())). + remove_from_cluster(Ring, ExitingNode, riak_core_rand:rand_seed()). remove_from_cluster(Ring, ExitingNode, Seed) -> % Transfer indexes to other nodes... @@ -406,7 +335,7 @@ remove_from_cluster(Ring, ExitingNode, Seed) -> %% @doc Simple transfer of leaving node's vnodes to safe place %% Where safe place is any node that satisfies target_n_val for that vnode - -%% but with a preference to transfer to a node that has a lower number of +%% but with a preference to transfer to a node that has a lower number of %% vnodes currently allocated. %% If safe places cannot be found for all vnodes returns `target_n_fail` %% Simple transfer is not location aware, but generally this wll be an initial @@ -432,7 +361,7 @@ attempt_simple_transfer(Ring, ExitingNode, Seed, Owners, Members) -> TargetN = app_helper:get_env(riak_core, target_n_val), Counts = riak_core_claim:get_counts(Members, Owners), - RingFun = + RingFun = fun(Partition, Node, R) -> riak_core_ring:transfer_node(Partition, Node, R), R @@ -465,7 +394,7 @@ simple_transfer([{P, ExitingNode}|Rest], %% The ring is split into two parts: %% Rest - this is forward looking from the current partition, in partition %% order (ascending by partition number) - %% Prev - this is the part of the ring that has already been processed, + %% Prev - this is the part of the ring that has already been processed, %% which is also in partition order (but descending by index number) %% %% With a ring size of 8, having looped to partition 3: @@ -484,7 +413,7 @@ simple_transfer([{P, ExitingNode}|Rest], fun(ForwardL, BackL) -> Steps = TargetN - 1, UnsafeNodeTuples = - case length(ForwardL) of + case length(ForwardL) of L when L < Steps -> ForwardL ++ lists:sublist(lists:reverse(BackL), Steps - L); @@ -518,7 +447,7 @@ simple_transfer([{P, ExitingNode}|Rest], PreferredCandidates = [{Q0, BestCnt}| lists:takewhile(fun({_, C}) -> C == BestCnt end, Others)], - + %% Final selection of a node as a destination for this partition, %% The node Counts must be updated to reflect this allocation, and %% the RingFun applied to actually queue the transfer @@ -574,7 +503,7 @@ simple_transfer_simple_test() -> [], lists:keydelete(n4, 1, count_nodes(R0))}), ?assertMatch({4, n1}, lists:keyfind(4, 1, R1)), - + {ok, R2} = simple_transfer(R0, {fun test_ring_fun/3, 3, n5}, @@ -601,7 +530,7 @@ simple_transfer_simple_test() -> {FixedSeed, [], lists:keydelete(n3, 1, count_nodes(R0))}), - + target_n_fail = simple_transfer(R0, {fun test_ring_fun/3, 3, n2}, @@ -609,11 +538,11 @@ simple_transfer_simple_test() -> {FixedSeed, [], lists:keydelete(n2, 1, count_nodes(R0))}), - + %% Target n failures due to wrap-around tail violations R4 = [{0, n5}, {1, n1}, {2, n2}, {3, n3}, {4, n4}, {5, n2}, {6, n3}, {7, n4}], - + target_n_fail = simple_transfer(R4, {fun test_ring_fun/3, 3, n5}, @@ -621,7 +550,7 @@ simple_transfer_simple_test() -> {FixedSeed, [], lists:keydelete(n5, 1, count_nodes(R4))}), - + target_n_fail = simple_transfer(R4, {fun test_ring_fun/3, 3, n4}, @@ -647,20 +576,20 @@ transfer_needstobesorted_tester(I) -> ?assertMatch({13, n4}, lists:keyfind(13, 1, R1)). simple_transfer_evendistribution_test() -> - R0 = [{0, n1}, {1, n2}, {2, n3}, {3, n4}, {4, n5}, + R0 = [{0, n1}, {1, n2}, {2, n3}, {3, n4}, {4, n5}, {5, n6}, {6, n7}, {7, n8}, {8, n9}, {9, n10}, {10, n1}, {11, n2}, {12, n3}, {13, n4}, {14, n5}, {15, n6}, {16, n7}, {17, n8}, {18, n9}, {19, n10}, - {20, n1}, {21, n2}, {22, n3}, {23, n4}, {24, n5}, + {20, n1}, {21, n2}, {22, n3}, {23, n4}, {24, n5}, {25, n6}, {26, n7}, {27, n8}, {28, n9}, {29, n10}, {30, n1}, {31, n2}, {32, n3}, {33, n4}, {34, n5}, {35, n6}, {36, n7}, {37, n8}, {38, n9}, {39, n10}, - {40, n1}, {41, n2}, {42, n3}, {43, n4}, {44, n5}, + {40, n1}, {41, n2}, {42, n3}, {43, n4}, {44, n5}, {45, n6}, {46, n7}, {47, n8}, {48, n9}, {49, n10}, {50, n1}, {51, n2}, {52, n3}, {53, n4}, {54, n5}, {55, n6}, {56, n1}, {57, n2}, {58, n3}, {59, n10}, {60, n5}, {61, n6}, {62, n7}, {63, n8}], - + SomeTime = {1632,989499,279637}, FixedSeed = rand:seed(exrop, SomeTime), {ok, R1} = @@ -670,7 +599,7 @@ simple_transfer_evendistribution_test() -> {FixedSeed, [], lists:keydelete(n1, 1, count_nodes(R0))}), - + NodeCounts = lists:keysort(2, count_nodes(R1)), io:format("NodeCounts ~w~n", [NodeCounts]), [{_LN, LC}|Rest] = NodeCounts, diff --git a/src/riak_core_handoff_cli.erl b/src/riak_core_handoff_cli.erl deleted file mode 100644 index 1a19a868c..000000000 --- a/src/riak_core_handoff_cli.erl +++ /dev/null @@ -1,208 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2014 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_handoff_cli). - --behavior(clique_handler). - --export([register_cli/0]). - --spec register_cli() -> ok. -register_cli() -> - register_cli_usage(), - register_cli_cfg(), - register_cli_cmds(), - register_config_whitelist(), - ok. - -register_cli_cmds() -> - register_enable_disable_commands(), - ok = clique:register_command(["riak-admin", "handoff", "summary"], [], [], - fun riak_core_handoff_status:handoff_summary/3), - ok = clique:register_command(["riak-admin", "handoff", "details"], [], - node_and_all_flags(), fun riak_core_handoff_status:handoff_details/3), - ok = clique:register_command(["riak-admin", "handoff", "config"], [], - node_and_all_flags(), fun handoff_config/3). - -node_and_all_flags() -> - [{node, [{shortname, "n"}, {longname, "node"}, - {typecast, fun clique_typecast:to_node/1}]}, - {all, [{shortname, "a"}, {longname, "all"}]}]. - -register_enable_disable_commands() -> - CmdList = [handoff_cmd_spec(EnOrDis, Dir) || - EnOrDis <- [enable, disable], - Dir <- [inbound, outbound, both]], - lists:foreach(fun(Args) -> apply(clique, register_command, Args) end, - CmdList). - -register_cli_cfg() -> - lists:foreach(fun(K) -> - clique:register_config(K, fun handoff_cfg_change_callback/2) - end, [["handoff", "inbound"], ["handoff", "outbound"]]), - clique:register_config(["transfer_limit"], fun set_transfer_limit/2). - -register_config_whitelist() -> - ok = clique:register_config_whitelist(["transfer_limit", - "handoff.outbound", - "handoff.inbound"]). - -register_cli_usage() -> - clique:register_usage(["riak-admin", "handoff"], handoff_usage()), - clique:register_usage(["riak-admin", "handoff", "enable"], handoff_enable_disable_usage()), - clique:register_usage(["riak-admin", "handoff", "disable"], handoff_enable_disable_usage()), - clique:register_usage(["riak-admin", "handoff", "summary"], summary_usage()), - clique:register_usage(["riak-admin", "handoff", "details"], details_usage()), - clique:register_usage(["riak-admin", "handoff", "config"], config_usage()). - -handoff_usage() -> - [ - "riak-admin handoff \n\n", - " Display handoff-related status and settings.\n\n", - " Sub-commands:\n", - " enable Enable handoffs for the specified node(s)\n", - " disable Disable handoffs for the specified node(s)\n" - " summary Show cluster-wide handoff summary\n", - " details Show details of all active transfers (per-node or cluster wide)\n", - " config Show all configuration for handoff subsystem\n\n", - " Use --help after a sub-command for more details.\n" - ]. - -config_usage() -> - ["riak-admin handoff config\n\n", - " Display handoff related configuration variables\n\n", - "Options\n", - " -n , --node \n", - " Show the settings on the specified node.\n", - " This flag can currently take only one node and be used once\n" - " -a, --all\n", - " Show the settings on every node in the cluster\n" - ]. - -handoff_enable_disable_usage() -> - ["riak-admin handoff ", - "[-n |--all]\n\n", - " Enable or disable handoffs on the local or specified node(s).\n", - " If handoffs are disabled in a direction, any currently\n", - " running handoffs in that direction will be terminated.\n\n" - "Options\n", - " -n , --node \n", - " Modify the setting on the specified node.\n", - " This flag can currently take only one node and be used once\n" - " -a, --all\n", - " Modify the setting on every node in the cluster\n" - ]. - -handoff_cmd_spec(EnOrDis, Direction) -> - Cmd = ["riak-admin", "handoff", atom_to_list(EnOrDis), atom_to_list(Direction)], - Callback = fun(_, [], Flags) -> - handoff_change_enabled_setting(EnOrDis, Direction, Flags) - end, - [ - Cmd, - [], % KeySpecs - [{all, [{shortname, "a"}, - {longname, "all"}]}, - {node, [{shortname, "n"}, - {longname, "node"}]}], % FlagSpecs - Callback - ]. - -summary_usage() -> - [ - "riak-admin handoff summary\n\n", - " Display a summarized view of handoffs.\n" - ]. - -details_usage() -> - [ - "riak-admin handoff details [--node |--all]\n\n", - " Display a detailed list of handoffs. Defaults to local node.\n\n" - "Options\n", - " -n , --node \n", - " Display the handoffs on the specified node.\n", - " This flag can currently take only one node and be used once\n" - " -a, --all\n", - " Display the handoffs on every node in the cluster\n" - ]. - -handoff_config(_CmdBase, _Args, Flags) when length(Flags) > 1 -> - [clique_status:text("Can't specify both --all and --node flags")]; -handoff_config(_CmdBase, _Args, []) -> - clique_config:show(config_vars(), []); -handoff_config(_CmdBase, _Args, [{all, Val}]) -> - clique_config:show(config_vars(), [{all, Val}]); -handoff_config(_CmdBase, _Args, [{node, Node}]) -> - clique_config:show(config_vars(), [{node, Node}]). - -config_vars() -> - ["transfer_limit", "handoff.outbound", "handoff.inbound", "handoff.port"]. - -handoff_change_enabled_setting(_EnOrDis, _Direction, Flags) when length(Flags) > 1 -> - [clique_status:text("Can't specify both --all and --node flags")]; -handoff_change_enabled_setting(EnOrDis, Direction, [{all, _}]) -> - Nodes = clique_nodes:nodes(), - {_, Down} = rpc:multicall(Nodes, - riak_core_handoff_manager, - handoff_change_enabled_setting, - [EnOrDis, Direction], - 60000), - - case Down of - [] -> - [clique_status:text("All nodes successfully updated")]; - _ -> - Output = io_lib:format("Handoff ~s failed on nodes: ~p", [EnOrDis, Down]), - [clique_status:alert([clique_status:text(Output)])] - end; -handoff_change_enabled_setting(EnOrDis, Direction, [{node, NodeStr}]) -> - Node = clique_typecast:to_node(NodeStr), - Result = clique_nodes:safe_rpc(Node, - riak_core_handoff_manager, handoff_change_enabled_setting, - [EnOrDis, Direction]), - case Result of - {badrpc, Reason} -> - Output = io_lib:format("Failed to update handoff settings on node ~p. Reason: ~p", - [Node, Reason]), - [clique_status:alert([clique_status:text(Output)])]; - _ -> - [clique_status:text("Handoff setting successfully updated")] - end; - -handoff_change_enabled_setting(EnOrDis, Direction, []) -> - riak_core_handoff_manager:handoff_change_enabled_setting(EnOrDis, Direction), - [clique_status:text("Handoff setting successfully updated")]. - -handoff_cfg_change_callback(["handoff", Cmd], "off") -> - case Cmd of - "inbound" -> - riak_core_handoff_manager:kill_handoffs_in_direction(inbound), - "Inbound handoffs terminated"; - "outbound" -> - riak_core_handoff_manager:kill_handoffs_in_direction(outbound), - "Outbound handoffs terminated" - end; -handoff_cfg_change_callback(_, _) -> - "". - -set_transfer_limit(["transfer_limit"], LimitStr) -> - Limit = list_to_integer(LimitStr), - riak_core_handoff_manager:set_concurrency(Limit), - "". diff --git a/src/riak_core_handoff_listener.erl b/src/riak_core_handoff_listener.erl index 92783d955..18daf4887 100644 --- a/src/riak_core_handoff_listener.erl +++ b/src/riak_core_handoff_listener.erl @@ -30,32 +30,20 @@ -export([get_handoff_ip/0, sock_opts/0, new_connection/2]). -record(state, { ipaddr :: string(), - portnum :: integer(), - ssl_opts :: list() + portnum :: integer() }). start_link() -> - PortNum = app_helper:get_env(riak_core, handoff_port), - IpAddr = app_helper:get_env(riak_core, handoff_ip), - SslOpts = riak_core_handoff_sender:get_handoff_ssl_options(), - gen_nb_server:start_link(?MODULE, IpAddr, PortNum, [IpAddr, PortNum, SslOpts]). + 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). -init([IpAddr, PortNum, SslOpts]) -> +init([IpAddr, PortNum]) -> register(?MODULE, self()), - - %% This exit() call shouldn't be necessary, AFAICT the VM's EXIT - %% propagation via linking should do the right thing, but BZ 823 - %% suggests otherwise. However, the exit() call should fall into - %% the "shouldn't hurt", especially since the next line will - %% explicitly try to spawn a new proc that will try to register - %% the riak_kv_handoff_listener name. - catch exit(whereis(riak_kv_handoff_listener), kill), - process_proxy:start_link(riak_kv_handoff_listener, ?MODULE), - - {ok, #state{portnum=PortNum, ipaddr=IpAddr, ssl_opts = SslOpts}}. + {ok, #state{portnum=PortNum, ipaddr=IpAddr}}. sock_opts() -> [binary, {packet, 4}, {reuseaddr, true}, {backlog, 64}]. @@ -73,14 +61,15 @@ terminate(_Reason, _State) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. -new_connection(Socket, State = #state{ssl_opts = SslOpts}) -> - case riak_core_handoff_manager:add_inbound(SslOpts) of +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} -> - riak_core_stat:update(rejected_handoffs), + %% STATS +%% riak_core_stat:update(rejected_handoffs), gen_tcp:close(Socket), {ok, State} end. diff --git a/src/riak_core_handoff_manager.erl b/src/riak_core_handoff_manager.erl index 5da74e3c6..8103546f6 100644 --- a/src/riak_core_handoff_manager.erl +++ b/src/riak_core_handoff_manager.erl @@ -35,7 +35,7 @@ %% handoff api -export([add_outbound/6, add_outbound/7, - add_inbound/1, + add_inbound/0, xfer/3, kill_xfer/3, status/0, @@ -49,8 +49,6 @@ handoff_change_enabled_setting/2 ]). --include_lib("kernel/include/logger.hrl"). - -include("riak_core_handoff.hrl"). -export_type([ho_type/0]). @@ -93,12 +91,12 @@ add_outbound(HOType,Module,SrcIdx,TargetIdx,Node,VnodePid,Opts) -> infinity) end. -add_inbound(SSLOpts) -> +add_inbound() -> case application:get_env(riak_core, disable_inbound_handoff) of {ok, true} -> {error, max_concurrency}; _ -> - gen_server:call(?MODULE,{add_inbound,SSLOpts},infinity) + gen_server:call(?MODULE,{add_inbound},infinity) end. %% @doc Initiate a transfer from `SrcPartition' to `TargetPartition' @@ -175,8 +173,8 @@ handle_call({add_outbound,Type,Mod,SrcIdx,TargetIdx,Node,Pid,Opts},_From, Error -> {reply, Error, State} end; -handle_call({add_inbound,SSLOpts},_From,State=#state{handoffs=HS}) -> - case receive_handoff(SSLOpts) of +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}}; @@ -254,7 +252,7 @@ handle_cast({add_exclusion, {Mod, Idx}}, State=#state{excl=Excl}) -> handle_cast({status_update, ModSrcTgt, StatsUpdate}, State=#state{handoffs=HS}) -> case lists:keyfind(ModSrcTgt, #handoff_status.mod_src_tgt, HS) of false -> - ?LOG_ERROR("status_update for non-existing handoff ~p", [ModSrcTgt]), + logger:error("status_update for non-existing handoff ~p", [ModSrcTgt]), {noreply, State}; HO -> Stats2 = update_stats(StatsUpdate, HO#handoff_status.stats), @@ -299,10 +297,10 @@ handle_info({'DOWN', Ref, process, _Pid, Reason}, State=#state{handoffs=HS}) -> X when X == max_concurrency orelse (element(1, X) == shutdown andalso element(2, X) == max_concurrency) -> - ?LOG_INFO("An ~w handoff of partition ~w ~w was terminated for reason: ~w~n", [Dir,M,I,Reason]), + logger:info("An ~w handoff of partition ~w ~w was terminated for reason: ~w~n", [Dir,M,I,Reason]), true; _ -> - ?LOG_ERROR("An ~w handoff of partition ~w ~w was terminated for reason: ~w~n", [Dir,M,I,Reason]), + logger:error("An ~w handoff of partition ~w ~w was terminated for reason: ~w~n", [Dir,M,I,Reason]), true end, @@ -339,7 +337,7 @@ handle_info({'DOWN', Ref, process, _Pid, Reason}, State=#state{handoffs=HS}) -> NewHS} -> %% In this case the vnode died and the handoff %% sender must be killed. - ?LOG_ERROR("An ~w handoff of partition ~w ~w was " + logger:error("An ~w handoff of partition ~w ~w was " "terminated because the vnode died", [Dir, M, I]), demonitor(TransM), @@ -457,7 +455,7 @@ record_seen_index(Ring, Shrinking, NValMap, DefaultN, Mod, Src, Key, Seen) -> end. get_concurrency_limit () -> - app_helper:get_env(riak_core,handoff_concurrency,?HANDOFF_CONCURRENCY). + application:get_env(riak_core,handoff_concurrency,?HANDOFF_CONCURRENCY). %% true if handoff_concurrency (inbound + outbound) hasn't yet been reached handoff_concurrency_limit_reached () -> @@ -559,12 +557,12 @@ send_handoff(HOType, {Mod, Src, Target}, Node, Vnode, HS, {Filter, FilterModFun} end. %% spawn a receiver process -receive_handoff (SSLOpts) -> +receive_handoff () -> case handoff_concurrency_limit_reached() of true -> {error, max_concurrency}; false -> - {ok,Pid}=riak_core_handoff_receiver_sup:start_receiver(SSLOpts), + {ok,Pid}=riak_core_handoff_receiver_sup:start_receiver(), PidM = monitor(process, Pid), %% successfully started up a new receiver @@ -619,7 +617,7 @@ kill_xfer_i(ModSrcTarget, Reason, HS) -> undefined -> ok; _ -> - ?LOG_INFO(Msg, [Type, Mod, SrcNode, SrcPartition, + logger:info(Msg, [Type, Mod, SrcNode, SrcPartition, TargetNode, TargetPartition, Reason]) end, exit(TP, {kill_xfer, Reason}), @@ -682,9 +680,8 @@ simple_handoff () -> %% 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({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)), @@ -693,13 +690,16 @@ simple_handoff () -> ok. 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()), - Res = add_inbound([]), + Res = add_inbound(), ?assertMatch({ok, _}, Res), {ok, Pid} = Res, @@ -728,14 +728,16 @@ config_disable () -> Status0 = fun() -> length(status()) =:= 0 end, ?assertEqual(ok, wait_until(Status0, 500, 1)), - ?assertEqual({error, max_concurrency}, add_inbound([])), + + ?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())). + ?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 -> diff --git a/src/riak_core_handoff_receiver.erl b/src/riak_core_handoff_receiver.erl index 91922e4db..663a2b2c1 100644 --- a/src/riak_core_handoff_receiver.erl +++ b/src/riak_core_handoff_receiver.erl @@ -23,27 +23,18 @@ -module(riak_core_handoff_receiver). -include("riak_core_handoff.hrl"). -behaviour(riak_core_gen_server). - --compile({nowarn_deprecated_function, - [{gen_fsm, sync_send_all_state_event, 3}]}). - --export([start_link/0, % Don't use SSL - start_link/1, % SSL options list, empty=no SSL +-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]). --include_lib("kernel/include/logger.hrl"). - -record(state, {sock :: port() | undefined, - peer :: term() | undefined, - ssl_opts :: [] | list(), - tcp_mod :: atom(), + 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_mod = riak_kv_vnode:: module(), vnode :: pid() | undefined, count = 0 :: non_neg_integer()}). @@ -61,10 +52,7 @@ ssl_handshake(Socket, SslOpts, Timeout) -> -endif. start_link() -> - start_link([]). - -start_link(SslOpts) -> - riak_core_gen_server:start_link(?MODULE, [SslOpts], []). + riak_core_gen_server:start_link(?MODULE, [], []). set_socket(Pid, Socket) -> riak_core_gen_server:call(Pid, {set_socket, Socket}). @@ -72,67 +60,48 @@ set_socket(Pid, Socket) -> supports_batching() -> true. -init([SslOpts]) -> - {ok, #state{ssl_opts = SslOpts, - tcp_mod = if SslOpts /= [] -> ssl; - true -> gen_tcp - end, - recv_timeout_len = app_helper:get_env(riak_core, handoff_receive_timeout, ?RECV_TIMEOUT), - vnode_timeout_len = app_helper:get_env(riak_core, handoff_receive_vnode_timeout, ?VNODE_TIMEOUT)}}. +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)}}. -handle_call({set_socket, Socket0}, _From, State = #state{ssl_opts = SslOpts}) -> +handle_call({set_socket, Socket0}, _From, State) -> SockOpts = [{active, once}, {packet, 4}, {header, 1}], - Socket = if SslOpts /= [] -> - {ok, Skt} = ssl_handshake(Socket0, SslOpts, 30*1000), - ok = ssl:setopts(Skt, SockOpts), - Peer = safe_peername(Skt, ssl), - Skt; - true -> - ok = inet:setopts(Socket0, SockOpts), - Peer = safe_peername(Socket0, inet), - Socket0 - end, + 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}) -> - ?LOG_INFO("Handoff receiver for partition ~p exited after processing ~p" + 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}) -> - ?LOG_INFO("Handoff receiver for partition ~p exited after processing ~p" + 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} -> - ?LOG_ERROR("Handoff receiver for partition ~p exited abnormally after " + 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 = if NewState#state.ssl_opts /= [] -> ssl; - true -> inet - end, + InetMod = inet, InetMod:setopts(Socket, [{active, once}]), {noreply, NewState, State#state.recv_timeout_len} end; -handle_info({ssl_closed, Socket}, State) -> - handle_info({tcp_closed, Socket}, State); -handle_info({ssl_error, Socket, Reason}, State) -> - handle_info({tcp_error, Socket, Reason}, State); -handle_info({ssl, Socket, Data}, State) -> - handle_info({tcp, Socket, Data}, State); handle_info(timeout, State) -> - ?LOG_ERROR("Handoff receiver for partition ~p timed out after " + 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}) -> <> = MsgData, - ?LOG_INFO("Receiving handoff data for partition ~p:~p from ~p", [VNodeMod, Partition, Peer]), + 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}], @@ -157,23 +126,33 @@ process_message(?PT_MSG_OBJ, MsgData, State=#state{vnode=VNode, count=Count, 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, - tcp_mod=TcpMod}) -> - TcpMod:send(Socket, <>), +process_message(?PT_MSG_OLDSYNC, MsgData, State=#state{sock=Socket}) -> + gen_tcp:send(Socket, <>), <> = MsgData, VNodeMod = binary_to_atom(VNodeModBin, utf8), State#state{vnode_mod=VNodeMod}; -process_message(?PT_MSG_SYNC, _MsgData, State=#state{sock=Socket, - tcp_mod=TcpMod}) -> - TcpMod:send(Socket, <>), +process_message(?PT_MSG_SYNC, _MsgData, State=#state{sock=Socket}) -> + gen_tcp:send(Socket, <>), State; + +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}}) + 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, - tcp_mod=TcpMod}) -> - TcpMod:send(Socket, <<255:8,"unknown_msg">>), +process_message(_, _MsgData, State=#state{sock=Socket}) -> + gen_tcp:send(Socket, <>), State. handle_cast(_Msg, State) -> {noreply, State}. diff --git a/src/riak_core_handoff_receiver_sup.erl b/src/riak_core_handoff_receiver_sup.erl index 244563066..3f50f0e17 100644 --- a/src/riak_core_handoff_receiver_sup.erl +++ b/src/riak_core_handoff_receiver_sup.erl @@ -22,13 +22,10 @@ -behaviour(supervisor). %% beahvior functions --export([start_link/0, - init/1 - ]). +-export([start_link/0, init/1]). %% public functions --export([start_receiver/1 - ]). +-export([start_receiver/0]). -define(CHILD(I,Type), {I,{I,start_link,[]},temporary,brutal_kill,Type,[I]}). @@ -43,5 +40,5 @@ init ([]) -> ]}}. %% start a sender process -start_receiver (SSLOpts) -> - supervisor:start_child(?MODULE,[SSLOpts]). +start_receiver () -> + supervisor:start_child(?MODULE,[]). diff --git a/src/riak_core_handoff_sender.erl b/src/riak_core_handoff_sender.erl index ab8235c1b..f51012ea3 100644 --- a/src/riak_core_handoff_sender.erl +++ b/src/riak_core_handoff_sender.erl @@ -21,16 +21,10 @@ %% @doc send a partition's data via TCP-based handoff -module(riak_core_handoff_sender). --export([start_link/4, get_handoff_ssl_options/0]). - --compile({nowarn_deprecated_function, - [{gen_fsm, send_event, 2}]}). - --include_lib("kernel/include/logger.hrl"). - +-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). @@ -39,11 +33,11 @@ -define(STATUS_INTERVAL, 2). -define(log_info(Str, Args), - ?LOG_INFO("~p transfer of ~p from ~p ~p to ~p ~p failed " ++ Str, + 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), - ?LOG_ERROR("~p transfer of ~p from ~p ~p to ~p ~p failed " ++ Str, + logger:error("~p transfer of ~p from ~p ~p to ~p ~p failed " ++ Str, [Type, Module, SrcNode, SrcPartition, TargetNode, TargetPartition] ++ Args)). @@ -58,7 +52,6 @@ socket :: any(), src_target :: {non_neg_integer(), non_neg_integer()}, stats :: #ho_stats{}, - tcp_mod :: module(), total_objects :: non_neg_integer(), total_bytes :: non_neg_integer(), @@ -74,8 +67,8 @@ type :: ho_type(), - notsent_acc :: term() | undefined, - notsent_fun :: function()| undefined + notsent_acc :: term(), + notsent_fun :: function() | undefined }). %%%=================================================================== @@ -83,12 +76,11 @@ %%%=================================================================== start_link(TargetNode, Module, {Type, Opts}, Vnode) -> - SslOpts = get_handoff_ssl_options(), Pid = spawn_link(fun()->start_fold(TargetNode, Module, {Type, Opts}, - Vnode, - SslOpts) + Vnode + ) end), {ok, Pid}. @@ -96,186 +88,204 @@ start_link(TargetNode, Module, {Type, Opts}, Vnode) -> %%% Private %%%=================================================================== -start_fold(TargetNode, Module, {Type, Opts}, ParentPid, SslOpts) -> - SrcNode = node(), - SrcPartition = get_src_partition(Opts), - TargetPartition = get_target_partition(Opts), - try - %% Give workers one more chance to abort or get a lock or whatever. - FoldOpts = maybe_call_handoff_started(Module, SrcPartition), - - Filter = get_filter(Opts), - [_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}], - {Socket, TcpMod} = - if SslOpts /= [] -> - {ok, Skt} = ssl:connect(TNHandoffIP, Port, SslOpts ++ SockOpts, - 15000), - {Skt, ssl}; - true -> - {ok, Skt} = gen_tcp:connect(TNHandoffIP, Port, SockOpts, 15000), - {Skt, gen_tcp} - 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"), - ModBin = atom_to_binary(Module, utf8), - Msg = <>, - ok = TcpMod:send(Socket, Msg), - - RecvTimeout = get_handoff_receive_timeout(), - - AckSyncThreshold = app_helper: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. - %% In the future this will be part of the actual wire - %% protocol but for now the sender must assume that a closed - %% socket at this point is a rejection by the receiver to - %% enforce handoff_concurrency. - case TcpMod:recv(Socket, 0, RecvTimeout) of - {ok,[?PT_MSG_OLDSYNC|<<"sync">>]} -> ok; - {error, timeout} -> exit({shutdown, timeout}); - {error, closed} -> exit({shutdown, max_concurrency}) - end, - - RemoteSupportsBatching = remote_supports_batching(TargetNode), - - ?LOG_INFO("Starting ~p transfer of ~p from ~p ~p to ~p ~p", - [Type, Module, SrcNode, SrcPartition, - TargetNode, TargetPartition]), - - M = <>, - ok = TcpMod:send(Socket, M), - StartFoldTime = os:timestamp(), - 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, - tcp_mod=TcpMod, - - 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 = riak_core_vnode_master:sync_command({SrcPartition, SrcNode}, - Req, - VMaster, infinity), - - %% Send any straggler entries remaining in the buffer: - 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}); - true -> - ok % If not #ho_acc, get badmatch below - end, - #ho_acc{ - error=ErrStatus, - module=Module, - parent=ParentPid, - tcp_mod=TcpMod, - 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. - ?LOG_DEBUG("~p ~p Sending final sync", - [SrcPartition, Module]), - ok = TcpMod:send(Socket, <>), - - case TcpMod:recv(Socket, 0, RecvTimeout) of - {ok,[?PT_MSG_SYNC|<<"sync">>]} -> - ?LOG_DEBUG("~p ~p Final sync received", - [SrcPartition, Module]); - {error, timeout} -> exit({shutdown, timeout}) +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), + + Filter = get_filter(Opts), + [_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), + + + 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 + %% is the correct node or close the connection if not. + %% 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 = <>, + 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}) + 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"), + ModBin = atom_to_binary(Module, utf8), + Msg = <>, + ok = gen_tcp:send(Socket, Msg), + + 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. + %% In the future this will be part of the actual wire + %% protocol but for now the sender must assume that a closed + %% 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}) + 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 = <>, + ok = gen_tcp:send(Socket, M), + StartFoldTime = os:timestamp(), + 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), + %% 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 end, + %% Send any straggler entries remaining in the buffer: + 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}); + true -> + 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, + + _ = 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, + FoldTimeDiff = end_fold_time(StartFoldTime), + ThroughputBytes = TotalBytes/FoldTimeDiff, - ?LOG_INFO("~p transfer of ~p from ~p ~p to ~p ~p" - " completed: sent ~s bytes in ~p of ~p objects" - " in ~.2f seconds (~s/second)", + 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, - riak_core_format:human_size_fmt("~.2f", TotalBytes), + TotalBytes, FinalStats#ho_stats.objs, TotalObjects, FoldTimeDiff, - riak_core_format:human_size_fmt("~.2f", ThroughputBytes)]), - case Type of - repair -> ok; - resize -> gen_fsm:send_event(ParentPid, {resize_transfer_complete, - NotSentAcc}); - _ -> gen_fsm:send_event(ParentPid, handoff_complete) - end; - {error, ErrReason} -> - if ErrReason == timeout -> - exit({shutdown, timeout}); - true -> - exit({shutdown, {error, ErrReason}}) - end - end - catch - exit:{shutdown,max_concurrency} -> + 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 + end. +-ifndef('21.0'). +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) + 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 - riak_core_stat:update(handoff_timeouts), + %% STATS +%% riak_core_stat:update(handoff_timeouts), ?log_fail("because of TCP recv timeout", []), exit({shutdown, timeout}); exit:{shutdown, {error, Reason}} -> @@ -284,15 +294,44 @@ start_fold(TargetNode, Module, {Type, Opts}, ParentPid, SslOpts) -> fold_error, Reason}), exit({shutdown, {error, Reason}}); throw:{be_quiet, Err, Reason} -> - gen_fsm:send_event(ParentPid, {handoff_error, Err, Reason}); - Class:Reason:Stacktrace -> + gen_fsm_compat:send_event(ParentPid, {handoff_error, Err, Reason}); + Err:Reason:Stacktrace -> ?log_fail("because of ~p:~p ~p", - [Class, Reason, Stacktrace]), - gen_fsm:send_event(ParentPid, {handoff_error, Class, Reason}) + [Err, Reason, Stacktrace]), + gen_fsm_compat:send_event(ParentPid, {handoff_error, Err, Reason}) end. - +-else. +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) + 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_compat: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:Stack -> + ?log_fail("because of ~p:~p ~p", + [Err, Reason, Stack]), + gen_fsm_compat:send_event(ParentPid, {handoff_error, Err, Reason}) + end. +-endif. start_visit_item_timer() -> - Ival = case app_helper:get_env(riak_core, handoff_receive_timeout) of + Ival = case application:get_env(riak_core, handoff_receive_timeout, undefined) of TO when is_integer(TO) -> erlang:max(1000, TO div 3); _ -> @@ -323,16 +362,13 @@ visit_item(K, V, Acc0 = #ho_acc{acksync_threshold = AccSyncThreshold}) -> %% 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}}) -> - %% When a TCP/SSL error occurs, #ho_acc.error is set to {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 = Ack, - acksync_threshold = AckSyncThreshold}) when - Ack == AckSyncThreshold -> +visit_item2(K, V, Acc = #ho_acc{ack = _AccSyncThreshold, acksync_threshold = _AccSyncThreshold}) -> #ho_acc{module=Module, socket=Sock, src_target={SrcPartition, TargetPartition}, - stats=Stats, - tcp_mod=TcpMod + stats=Stats } = Acc, RecvTimeout = get_handoff_receive_timeout(), @@ -342,9 +378,9 @@ visit_item2(K, V, Acc = #ho_acc{ack = Ack, Stats2 = incr_bytes(Stats, NumBytes), Stats3 = maybe_send_status({Module, SrcPartition, TargetPartition}, Stats2), - case TcpMod:send(Sock, M) of + case gen_tcp:send(Sock, M) of ok -> - case TcpMod:recv(Sock, 0, RecvTimeout) of + 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); @@ -369,7 +405,7 @@ visit_item2(K, V, Acc) -> case Module:encode_handoff_item(K, V) of corrupted -> {Bucket, Key} = K, - ?LOG_WARNING("Unreadable object ~p/~p discarded", + logger:warning("Unreadable object ~p/~p discarded", [Bucket, Key]), Acc; BinObj -> @@ -384,7 +420,7 @@ visit_item2(K, V, Acc) -> item_queue_byte_size=ItemQueueByteSize2}, %% Unit size is bytes: - HandoffBatchThreshold = app_helper:get_env(riak_core, + HandoffBatchThreshold = application:get_env(riak_core, handoff_batch_threshold, 1024*1024), @@ -397,7 +433,6 @@ visit_item2(K, V, Acc) -> socket=Sock, src_target={SrcPartition, TargetPartition}, stats=Stats, - tcp_mod=TcpMod, total_objects=TotalObjects, total_bytes=TotalBytes} = Acc, M = <>, @@ -407,7 +442,7 @@ visit_item2(K, V, Acc) -> Stats3 = maybe_send_status({Module, SrcPartition, TargetPartition}, Stats2), - case TcpMod:send(Sock, M) of + case gen_tcp:send(Sock, M) of ok -> Acc#ho_acc{ack=Ack+1, error=ok, @@ -442,7 +477,6 @@ send_objects(ItemsReverseList, Acc) -> socket=Sock, src_target={SrcPartition, TargetPartition}, stats=Stats, - tcp_mod=TcpMod, total_objects=TotalObjects, total_bytes=TotalBytes, @@ -458,7 +492,7 @@ send_objects(ItemsReverseList, Acc) -> Stats2 = incr_bytes(incr_objs(Stats, NObjects), NumBytes), Stats3 = maybe_send_status({Module, SrcPartition, TargetPartition}, Stats2), - case TcpMod:send(Sock, M) of + case gen_tcp:send(Sock, M) of ok -> Acc#ho_acc{ack=Ack+1, error=ok, stats=Stats3, total_objects=TotalObjects+NObjects, @@ -487,36 +521,8 @@ get_handoff_port(Node) when is_atom(Node) -> Other -> Other end. -get_handoff_ssl_options() -> - case app_helper:get_env(riak_core, handoff_ssl_options, []) of - [] -> - []; - Props -> - try - %% We'll check if the file(s) exist but won't check - %% file contents' sanity. - ZZ = [{_, {ok, _}} = {ToCheck, file:read_file(Path)} || - ToCheck <- [certfile, keyfile, cacertfile, dhfile], - Path <- [proplists:get_value(ToCheck, Props)], - Path /= undefined], - spawn(fun() -> self() ! ZZ end), % Avoid term...never used err - %% Props are OK - Props - catch - error:{badmatch, {FailProp, BadMat}} -> - ?LOG_ERROR("SSL handoff config error: property ~p: ~p.", - [FailProp, BadMat]), - []; - X:Y -> - ?LOG_ERROR("Failure processing SSL handoff config " - "~p: ~p:~p", - [Props, X, Y]), - [] - end - end. - get_handoff_receive_timeout() -> - app_helper:get_env(riak_core, handoff_timeout, ?TCP_TIMEOUT). + application:get_env(riak_core, handoff_timeout, ?TCP_TIMEOUT). end_fold_time(StartFoldTime) -> EndFoldTime = os:timestamp(), @@ -574,7 +580,7 @@ maybe_send_status(ModSrcTgt, Stats=#ho_stats{interval_end=IntervalEnd}) -> end. get_status_interval() -> - app_helper: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). @@ -608,12 +614,12 @@ remote_supports_batching(Node) -> case catch rpc:call(Node, riak_core_handoff_receiver, supports_batching, []) of true -> - ?LOG_DEBUG("remote node supports batching, enabling"), + 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 - ?LOG_DEBUG("remote node doesn't support batching"), + logger:debug("remote node doesn't support batching"), false end. diff --git a/src/riak_core_handoff_status.erl b/src/riak_core_handoff_status.erl deleted file mode 100644 index 3578b7bdc..000000000 --- a/src/riak_core_handoff_status.erl +++ /dev/null @@ -1,411 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2014 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_handoff_status). - --include("riak_core_handoff.hrl"). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - --export([handoff_summary/3, - handoff_details/3, - collect_node_transfer_data/0]). - --define(ORDERED_TRANSFERS_FOR_DISPLAY, - [{ownership, "Ownership"}, {resize, "Resize"}, {hinted, "Hinted"}, {repair, "Repair"}]). - -%% This module's CLI callbacks and usage are registered with riak_core_handoff_cli -%%%%%% -%% clique callbacks - --spec handoff_summary([string()], [tuple()], [tuple()]) -> clique_status:status(). -handoff_summary(_CmdBase, [], []) -> - node_summary(). - --spec handoff_details([string()], [tuple()], [tuple()]) -> clique_status:status(). -handoff_details(_CmdBase, [], []) -> - build_handoff_details(node()); -handoff_details(_CmdBase, [], [{node, Node}]) -> - build_handoff_details(Node); -handoff_details(_CmdBase, [], [{all, _Value}]) -> - build_handoff_details(all); -handoff_details(_CmdBase, [], _) -> - [clique_status:alert([clique_status:text("Cannot use both --all and --node flags at the same time.")])]. - -%% end of clique callbacks -%%%%%% - -%%%%%% -%% RPC-exposed functions -collect_node_transfer_data() -> - ActiveTransfers = riak_core_handoff_manager:status({direction, outbound}), - KnownTransfers = riak_core_vnode_manager:all_handoffs(), - {ActiveTransfers, KnownTransfers}. - -%%%%%% -%% Private - -%%%%%% -%% Details View --spec build_handoff_details(node()|all) -> clique_status:status(). -build_handoff_details(NodeOrAll) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - {Active0, DownNodes} = collect_from_all({riak_core_handoff_manager, status, [{direction, outbound}]}, 5000), - Active = flatten_transfer_proplist(Active0), - AllNodes = riak_core_ring:all_members(Ring), - Nodes = case NodeOrAll of - all -> AllNodes -- DownNodes; - Node -> [Node] -- DownNodes %% Don't display row in table if requested node is down - end, - FilteredTransfers = - lists:filter(fun(T) -> - lists:member(transfer_info(T, src_node), Nodes) orelse - lists:member(transfer_info(T, target_node), Nodes) - end, - Active), - - Details = case length(FilteredTransfers) of - 0 -> [clique_status:text("No ongoing transfers.")]; - _ -> - Header = clique_status:text("Type Key: O = Ownership, H = Hinted, Rz = Resize, Rp = Repair"), - RingSize = riak_core_ring:num_partitions(Ring), - Table = clique_status:table( - [ row_details(Transfer, RingSize) || Transfer <- FilteredTransfers]), - [Header, Table] - end, - maybe_add_down_nodes(DownNodes, Details). - -row_details(T, RingSize) -> - SourceNode = transfer_info(T, src_node), - TargetNode = transfer_info(T, target_node), - SourceIdx = transfer_info(T, src_partition), - TargetIdx = transfer_info(T, target_partition), - Source = io_lib:format("~ts:~B", [SourceNode, riak_core_ring_util:hash_to_partition_id(SourceIdx, RingSize)]), - Target = io_lib:format("~ts:~B", [TargetNode, riak_core_ring_util:hash_to_partition_id(TargetIdx, RingSize)]), - - [ - {'Type', format_transfer_type(transfer_info(T, type))}, - {'Source:ID', Source}, - {'Target:ID', Target}, - {'Size', format_transfer_size(transfer_stat(T, size))}, - {'Rate (KB/s)', format_rate(transfer_stat(T, bytes_per_s))}, - {'%', format_percent(transfer_stat(T, pct_done_decimal))}, - {'Sender', transfer_info(T, sender_pid)} - ]. - -transfer_info({_Node, {status_v2, Status}}, Key) -> - case lists:keyfind(Key, 1, Status) of - {Key, Value} -> Value; - _ -> " " - end. - -transfer_stat(Transfer, Key) -> - case transfer_info(Transfer, stats) of - no_stats -> unknown; - Stats -> - {Key, Value} = lists:keyfind(Key, 1, Stats), - Value - end. - -format_transfer_type(ownership) -> - "O"; -format_transfer_type(hinted) -> - "H"; -format_transfer_type(resize) -> - "Rz"; -format_transfer_type(repair) -> - "Rp". - -format_transfer_size({Num, objects}) when is_integer(Num) -> - io_lib:format("~B Objs", [Num]); -format_transfer_size({Num, bytes}) when is_integer(Num) -> - riak_core_format:human_size_fmt("~.2f", Num); -format_transfer_size(_) -> - "--". - -format_rate(Rate) when is_number(Rate) -> - io_lib:format("~.2f", [Rate / 1024]); -format_rate(_) -> - "--". - -format_percent(PercentAsDecimal) when is_number(PercentAsDecimal) -> - io_lib:format("~6.2f", [PercentAsDecimal*100]); -format_percent(_) -> - "--". - -%%%%%% -%% Summary View --spec node_summary() -> clique_status:status(). -node_summary() -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - - %% Known and Active will be proplists with each node name showing - %% up 0 or more times; the value will be a `status_v2' structure - %% (see `riak_core_handoff_manager') for active transfers or a - %% custom handoff shorthand (see the spec for - %% `collect_known_transfers') for known transfers. - {ActiveAndKnown, DownNodes} = collect_transfer_data(), - {Active0, Known0} = split_active_and_known(ActiveAndKnown), - Known = correlate_known_transfers(Ring, Known0), - Active = correlate_active_transfers(Active0), - - KnownStats = count_known_transfers(Known), - ActiveStats = count_active_transfers(Active), - - %% Each stats structure is an orddict with - %% "Node:TransferType:Direction" and "TransferType" keys, values - %% are integers. Also ActiveStats will have a `nodes' key with a - %% ordset of nodes. - - Header = clique_status:text(["Each cell indicates active transfers and, in parenthesis, the number of all known transfers.\n", - "The 'Total' column is the sum of the active transfers."]), - AllNodes = riak_core_ring:all_members(Ring), - Nodes = AllNodes -- DownNodes, - Table = clique_status:table( - [ [ format_node_name(Node) | row_summary(Node, KnownStats, ActiveStats) ] || - Node <- Nodes]), - Summary = [Header, Table], - maybe_add_down_nodes(DownNodes, Summary). - -collect_transfer_data() -> - collect_from_all({riak_core_handoff_status, collect_node_transfer_data, []}, 5000). - -%% See riak_core_handoff_manager:build_status/1 for details on this structure --spec correlate_active_transfers([{node(),[{status_v2, list(tuple())}]}]) -> - [{node(),{status_v2, list(tuple())}}]. -correlate_active_transfers(Outbound) -> - Inbound = reverse_active_transfers(Outbound), - Outbound ++ Inbound. - -reverse_active_transfers(Outbound) -> - [ - begin - T0 = replace_transfer_info(T, direction, inbound), - Target = transfer_info(T, target_node), - {_OtherNode, TransferInfo} = T0, - {Target, TransferInfo} - end - || T <- Outbound, transfer_info(T, target_node) /= '$delete' ]. - -replace_transfer_info({Node, {status_v2, Status}}, Key, Value) -> - {Node, {status_v2, lists:keyreplace(Key, 1, Status, {Key, Value})}}. - -%%%%%% -replace_known_with_ring_transfers(Known, RingTransfers) -> - Known1 = lists:filter(fun({_Node, {{_Module, _Index}, - {ownership, _Dir, _Data}}}) -> - false; - ({_Node, {{_Module, _Index}, - {resize, _Dir, _Data}}}) -> - false; - (_) -> - true - end, - Known), - coalesce_known_transfers(Known1, RingTransfers). - -parse_ring_into_known(Ring) -> - Transitions = riak_core_ring:pending_changes(Ring), - [ - transform_ring_transition(T) || - {_,_,_,_,State } = T <- Transitions, (State =:= awaiting) - ]. - -%% Transform a single tuple with a list of modules (from ring.next) to -%% a list of tuples with one module each. -%% Special case to also transform '$resize' to resize -%% {_Idx, _Source,_Destination,_Modules, awaiting} -transform_ring_transition({_Index, _Source, '$resize', _Modules, _state} = T) -> - explode_ring_modules(resize, T); -transform_ring_transition({_Index, _Source, _Dest, _Modules, _state} = T) -> - explode_ring_modules(ownership, T). - -explode_ring_modules(Type, {Index, Source, Dest, Modules, _state}) -> - [{Source, {{M, Index}, {Type, outbound, Dest}}} || M <- Modules]. - -%% The ring has global visibility into incomplete ownership/resize -%% transfers, so we'll filter those out of what -%% `riak_core_vnode_manager' gives us and replace with the ring data --spec correlate_known_transfers(riak_core_ring:riak_core_ring(), - [{node(), known_handoff()}]) -> - [{node(), known_handoff()}]. -correlate_known_transfers(Ring, Known) -> - RingKnown = parse_ring_into_known(Ring), - TransfersUpdatedWithRing = - replace_known_with_ring_transfers(Known, RingKnown), - Unidirectional = - lists:flatten(TransfersUpdatedWithRing), - ReversedKnown = reverse_known_transfers(Ring, Unidirectional), - coalesce_known_transfers(ReversedKnown, Unidirectional). - -find_resize_target(Ring, Idx) -> - riak_core_ring:index_owner(Ring, Idx). - -flatten_transfer_proplist(List) -> - lists:flatten( - lists:map(fun({Node, NodeTransfers}) -> - lists:map(fun(T) -> {Node, T} end, NodeTransfers) - end, List)). - -coalesce_known_transfers(Proplist1, Proplist2) -> - lists:flatten(Proplist1, Proplist2). - -reverse_direction(inbound) -> - outbound; -reverse_direction(outbound) -> - inbound. - -reverse_known_transfers(Ring, Known) -> - lists:foldl(fun({_Node1, {{_Module, _Index}, - {delete, local, '$delete'}}}, Acc) -> - %% Don't reverse delete operations - Acc; - ({Node1, {{Module, Index}, - {resize =Type, - outbound=Dir, - '$resize'}}}, Acc) -> - Node2 = find_resize_target(Ring, Index), - [{Node2, {{Module, Index}, - {Type, reverse_direction(Dir), Node1}}} - | Acc]; - ({Node1, {{Module, Index}, {Type, Dir, Node2}}}, Acc) -> - [{Node2, {{Module, Index}, - {Type, reverse_direction(Dir), Node1}}} - | Acc] - end, - [], - Known). - -add_node_name(Node, Dict) -> - orddict:update(nodes, fun(Set) -> ordsets:add_element(Node, Set) end, - ordsets:from_list([Node]), Dict). - -count_active_transfers(Transfers) -> - lists:foldl(fun({Node, {status_v2, Props}}, Dict) -> - Type = proplists:get_value(type, Props), - Direction = proplists:get_value(direction, Props), - Dict1 = increment_counter(io_lib:format("~ts:~s:~s", - [Node, Type, - Direction]), - Dict), - Dict2 = increment_counter(Type, Dict1), - add_node_name(Node, Dict2) - end, - orddict:new(), - Transfers). - -%% -%% The ring has a complete view of all known ownership/resize -%% transfers, so rely on that for a tally instead of the data -%% collected from riak_core_vnode_manager. -count_known_transfers(Transfers) -> - lists:foldl(fun({Node, {{_Module, _Index}, - {Type, Direction, _Node2}}}, Dict) -> - Dict1 = increment_counter(io_lib:format("~ts:~s:~s", - [Node, Type, - Direction]), - Dict), - increment_counter(Type, Dict1) - end, - orddict:new(), - Transfers). - -increment_counter(Key, Dict) -> - orddict:update_counter(Key, 1, Dict). - -split_active_and_known(ActiveAndKnown) -> - ActiveList = lists:map(fun({Node, {NodeActive, _}}) -> - {Node, NodeActive} end, ActiveAndKnown), - KnownList = lists:map(fun({Node, {_, NodeKnown}}) -> - {Node, NodeKnown} end, ActiveAndKnown), - {flatten_transfer_proplist(ActiveList), flatten_transfer_proplist(KnownList)}. - -row_summary(Node, Known, Active) -> - {Cells, TotalActive} = - row_summary(Node, Known, Active, ?ORDERED_TRANSFERS_FOR_DISPLAY, [], {"Total", 0}), - [TotalActive | Cells]. - -row_summary(_Node, _Known, _Active, [], Accum, Total) -> - {lists:reverse(Accum), Total}; - -row_summary(Node, Known, Active, [{Type, Title}|Tail], Accum, {"Total", Total}) -> - KeyIn = io_lib:format("~ts:~s:~s", [Node, Type, inbound]), - KeyOut = io_lib:format("~ts:~s:~s", [Node, Type, outbound]), - ActiveCount = dict_count_helper(orddict:find(KeyIn, Active)) + - dict_count_helper(orddict:find(KeyOut, Active)), - KnownCount= dict_count_helper(orddict:find(KeyIn, Known)) + - dict_count_helper(orddict:find(KeyOut, Known)), - CellContents = format_cell_contents(Title, KnownCount, ActiveCount), - row_summary(Node, Known, Active, Tail, - [CellContents | Accum], {"Total", Total + ActiveCount}). - -format_cell_contents(Type, KnownCount, ActiveCount) -> - Content = case {KnownCount, ActiveCount} of - {0, 0} -> " "; - {0, _} -> io_lib:format("~B (Unknown)", [ActiveCount]); - _ -> io_lib:format("~B (~B)", [ActiveCount, KnownCount]) - end, - {Type, Content}. - -dict_count_helper({ok, Count}) -> - Count; -dict_count_helper(error) -> - 0. - --spec format_node_name(atom()) -> {nonempty_string(), nonempty_string()}. -format_node_name(Node) when is_atom(Node) -> - {"Node", " " ++ atom_to_list(Node) ++ " "}. - - -%% RPC Helper to make sure we don't get {node(), {badrpc, _}} in our results, which happens -%% occasionally when you call to a node that is up, but the particular gen_server/etc. -%% isn't loaded yet. -collect_from_all({M, F, A}, Timeout) -> - {Results, DownNodes} = riak_core_util:rpc_every_member_ann(M, F, A, Timeout), - {Good, Bad} = lists:partition(fun({_Node, {badrpc, _}}) -> false; - (_) -> true end, Results), - BadNodes = lists:map(fun({Node, _}) -> Node end, Bad), - {Good, DownNodes ++ BadNodes}. - -maybe_add_down_nodes(DownNodes, Output) -> - case DownNodes of - [] -> - Output; - _ -> - NodesDown = clique_status:alert([clique_status:list("(unreachable)", DownNodes)]), - Output ++ [NodesDown] - end. - - - -%% =================================================================== -%% EUnit tests -%% =================================================================== --ifdef(TEST). - -transfer_bytes_test() -> - ?assertMatch("1.00 B", format_transfer_size({1, bytes})), - ?assertMatch("976.56 KB", format_transfer_size({1000000, bytes})), - ?assertMatch("1.00 MB", format_transfer_size({1048576, bytes})), - ?assertMatch("1.86 GB", format_transfer_size({2000000000, bytes})), - ?assertMatch("--", format_transfer_size({23.4, bytes})). - --endif. diff --git a/src/riak_core_metadata.erl b/src/riak_core_metadata.erl deleted file mode 100644 index 34898f9bc..000000000 --- a/src/riak_core_metadata.erl +++ /dev/null @@ -1,389 +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_metadata). - --export([get/2, - get/3, - fold/3, - fold/4, - to_list/1, - to_list/2, - iterator/1, - iterator/2, - itr_next/1, - itr_close/1, - itr_done/1, - itr_key_values/1, - itr_key/1, - itr_values/1, - itr_value/1, - itr_default/1, - prefix_hash/1, - put/3, - put/4, - delete/2, - delete/3]). - --include("riak_core_metadata.hrl"). - --export_type([iterator/0]). - -%% Get Option Types --type get_opt_default_val() :: {default, metadata_value()}. --type get_opt_resolver() :: {resolver, metadata_resolver()}. --type get_opt_allow_put() :: {allow_put, boolean()}. --type get_opt() :: get_opt_default_val() | get_opt_resolver() | get_opt_allow_put(). --type get_opts() :: [get_opt()]. - -%% Iterator Types --type it_opt_resolver() :: {resolver, metadata_resolver() | lww}. --type it_opt_default_fun() :: fun((metadata_key()) -> metadata_value()). --type it_opt_default() :: {default, metadata_value() | it_opt_default_fun()}. --type it_opt_keymatch() :: {match, term()}. --type it_opt() :: it_opt_resolver() | it_opt_default() | it_opt_keymatch(). --type it_opts() :: [it_opt()]. --type fold_opts() :: it_opts(). --type iterator() :: {riak_core_metadata_manager:metadata_iterator(), it_opts()}. - -%% Put Option Types --type put_opts() :: []. - -%% Delete Option types --type delete_opts() :: []. - --define(TOMBSTONE, '$deleted'). - -%% @doc same as get(FullPrefix, Key, []) --spec get(metadata_prefix(), metadata_key()) -> metadata_value() | undefined. -get(FullPrefix, Key) -> - get(FullPrefix, Key, []). - -%% @doc Retrieves the local value stored at the given prefix and key. -%% -%% get/3 can take the following options: -%% * default: value to return if no value is found, `undefined' if not given. -%% * resolver: A function that resolves conflicts if they are encountered. If not given -%% last-write-wins is used to resolve the conflicts -%% * allow_put: whether or not to write and broadcast a resolved value. defaults to `true'. -%% -%% NOTE: an update will be broadcast if conflicts are resolved and -%% `allow_put' is `true'. any further conflicts generated by -%% concurrenct writes during resolution are not resolved --spec get(metadata_prefix(), metadata_key(), get_opts()) -> metadata_value(). -get({Prefix, SubPrefix}=FullPrefix, Key, Opts) - when (is_binary(Prefix) orelse is_atom(Prefix)) andalso - (is_binary(SubPrefix) orelse is_atom(SubPrefix)) -> - PKey = prefixed_key(FullPrefix, Key), - Default = get_option(default, Opts, undefined), - ResolveMethod = get_option(resolver, Opts, lww), - AllowPut = get_option(allow_put, Opts, true), - case riak_core_metadata_manager:get(PKey) of - undefined -> Default; - Existing -> - maybe_tombstone(maybe_resolve(PKey, Existing, ResolveMethod, AllowPut), Default) - end. - -%% @doc same as fold(Fun, Acc0, FullPrefix, []). --spec fold(fun(({metadata_key(), - [metadata_value() | metadata_tombstone()] | - metadata_value() | metadata_tombstone()}, any()) -> any()), - any(), - metadata_prefix()) -> any(). -fold(Fun, Acc0, FullPrefix) -> - fold(Fun, Acc0, FullPrefix, []). - -%% @doc Fold over all keys and values stored under a given prefix/subprefix. Available -%% options are the same as those provided to iterator/2. --spec fold(fun(({metadata_key(), - [metadata_value() | metadata_tombstone()] | - metadata_value() | metadata_tombstone()}, any()) -> any()), - any(), - metadata_prefix(), - fold_opts()) -> any(). -fold(Fun, Acc0, FullPrefix, Opts) -> - It = iterator(FullPrefix, Opts), - fold_it(Fun, Acc0, It). - -fold_it(Fun, Acc, It) -> - case itr_done(It) of - true -> - ok = itr_close(It), - Acc; - false -> - Next = Fun(itr_key_values(It), Acc), - fold_it(Fun, Next, itr_next(It)) - end. - -%% @doc same as to_list(FullPrefix, []) --spec to_list(metadata_prefix()) -> [{metadata_key(), - [metadata_value() | metadata_tombstone()] | - metadata_value() | metadata_tombstone()}]. -to_list(FullPrefix) -> - to_list(FullPrefix, []). - - -%% @doc Return a list of all keys and values stored under a given prefix/subprefix. Available -%% options are the same as those provided to iterator/2. --spec to_list(metadata_prefix(), fold_opts()) -> [{metadata_key(), - [metadata_value() | metadata_tombstone()] | - metadata_value() | metadata_tombstone()}]. -to_list(FullPrefix, Opts) -> - fold(fun({Key, ValOrVals}, Acc) -> - [{Key, ValOrVals} | Acc] - end, [], FullPrefix, Opts). - -%% @doc same as iterator(FullPrefix, []). --spec iterator(metadata_prefix()) -> iterator(). -iterator(FullPrefix) -> - iterator(FullPrefix, []). - -%% @doc Return an iterator pointing to the first key stored under a prefix -%% -%% iterator/2 can take the following options: -%% * resolver: either the atom `lww' or a function that resolves conflicts if they -%% are encounted (see get/3 for more details). Conflict resolution -%% is performed when values are retrieved (see itr_value/1 and itr_key_values/1). -%% If no resolver is provided no resolution is performed. The default is to -%% not provide a resolver. -%% * allow_put: whether or not to write and broadcast a resolved value. defaults to `true'. -%% * default: Used when the value an iterator points to is a tombstone. default is -%% either an arity-1 function or a value. If a function, the key the iterator -%% points to is passed as the argument and the result is returned in place -%% of the tombstone. If default is a value, the value is returned in place of -%% the tombstone. This applies when using functions such as itr_values/1 and -%% itr_key_values/1. -%% * match: A tuple containing erlang terms and '_'s. Match can be used to iterate -%% over a subset of keys -- assuming the keys stored are tuples --spec iterator(metadata_prefix(), it_opts()) -> iterator(). -iterator({Prefix, SubPrefix}=FullPrefix, Opts) - when (is_binary(Prefix) orelse is_atom(Prefix)) andalso - (is_binary(SubPrefix) orelse is_atom(SubPrefix)) -> - KeyMatch = proplists:get_value(match, Opts), - It = riak_core_metadata_manager:iterator(FullPrefix, KeyMatch), - {It, Opts}. - -%% @doc Advances the iterator --spec itr_next(iterator()) -> iterator(). -itr_next({It, Opts}) -> - It1 = riak_core_metadata_manager:iterate(It), - {It1, Opts}. - -%% @doc Closes the iterator --spec itr_close(iterator()) -> ok. -itr_close({It, _Ots}) -> - riak_core_metadata_manager:iterator_close(It). - -%% @doc Returns true if there is nothing more to iterate over --spec itr_done(iterator()) -> boolean(). -itr_done({It, _Opts}) -> - riak_core_metadata_manager:iterator_done(It). - -%% @doc Return the key and value(s) pointed at by the iterator. Before -%% calling this function, check the iterator is not complete w/ itr_done/1. If a resolver -%% was passed to iterator/0 when creating the given iterator, siblings will be resolved -%% using the given function or last-write-wins (if `lww' is passed as the resolver). If -%% no resolver was used then no conflict resolution will take place. If conflicts are -%% resolved, the resolved value is written to local metadata and a broadcast is submitted -%% to update other nodes in the cluster if `allow_put' is `true'. If `allow_put' is `false' -%% the values are resolved but are not written or broadcast. A single value is returned as the second -%% element of the tuple in the case values are resolved. If no resolution takes place then a list of -%% values will be returned as the second element (even if there is only a single sibling). -%% -%% NOTE: if resolution may be performed this function must be called at most once -%% before calling itr_next/1 on the iterator (at which point the function can be called -%% once more). --spec itr_key_values(iterator()) -> {metadata_key(), - [metadata_value() | metadata_tombstone()] | - metadata_value() | - metadata_tombstone()}. -itr_key_values({It, Opts}) -> - Default = itr_default({It, Opts}), - {Key, Obj} = riak_core_metadata_manager:iterator_value(It), - AllowPut = get_option(allow_put, Opts, true), - case get_option(resolver, Opts, undefined) of - undefined -> - {Key, maybe_tombstones(riak_core_metadata_object:values(Obj), Default)}; - Resolver -> - Prefix = riak_core_metadata_manager:iterator_prefix(It), - PKey = prefixed_key(Prefix, Key), - Value = maybe_tombstone(maybe_resolve(PKey, Obj, Resolver, AllowPut), Default), - {Key, Value} - end. - -%% @doc Return the key pointed at by the iterator. Before -%% calling this function, check the iterator is not complete w/ itr_done/1. -%% No conflict resolution will be performed as a result of calling this function. --spec itr_key(iterator()) -> metadata_key(). -itr_key({It, _Opts}) -> - {Key, _} = riak_core_metadata_manager:iterator_value(It), - Key. - -%% @doc Return all sibling values pointed at by the iterator. Before -%% calling this function, check the iterator is not complete w/ itr_done/1. -%% No conflict resolution will be performed as a result of calling this function. --spec itr_values(iterator()) -> [metadata_value() | metadata_tombstone()]. -itr_values({It, Opts}) -> - Default = itr_default({It, Opts}), - {_, Obj} = riak_core_metadata_manager:iterator_value(It), - maybe_tombstones(riak_core_metadata_object:values(Obj), Default). - -%% @doc Return a single value pointed at by the iterator. If there are conflicts and -%% a resolver was specified in the options when creating this iterator, they will be -%% resolved. Otherwise, and error is returned. If conflicts are resolved, the resolved -%% value is written locally and a broadcast is performed to update other nodes -%% in the cluster if `allow_put' is `true' (the default value). If `allow_put' is `false', -%% values are resolved but not written or broadcast. -%% -%% NOTE: if resolution may be performed this function must be called at most once -%% before calling itr_next/1 on the iterator (at which point the function can be called -%% once more). --spec itr_value(iterator()) -> metadata_value() | metadata_tombstone() | {error, conflict}. -itr_value({It, Opts}) -> - Default = itr_default({It, Opts}), - {Key, Obj} = riak_core_metadata_manager:iterator_value(It), - AllowPut = get_option(allow_put, Opts, true), - case get_option(resolver, Opts, undefined) of - undefined -> - case riak_core_metadata_object:value_count(Obj) of - 1 -> - maybe_tombstone(riak_core_metadata_object:value(Obj), Default); - _ -> - {error, conflict} - end; - Resolver -> - Prefix = riak_core_metadata_manager:iterator_prefix(It), - PKey = prefixed_key(Prefix, Key), - maybe_tombstone(maybe_resolve(PKey, Obj, Resolver, AllowPut), Default) - end. - -%% @doc Returns the value returned when an iterator points to a tombstone. If the default -%% used when creating the given iterator is a function it will be applied to the current -%% key the iterator points at. If no default was provided the tombstone value was returned. -%% This function should only be called after checking itr_done/1. --spec itr_default(iterator()) -> metadata_tombstone() | metadata_value() | it_opt_default_fun(). -itr_default({_, Opts}=It) -> - case proplists:get_value(default, Opts, ?TOMBSTONE) of - Fun when is_function(Fun) -> - Fun(itr_key(It)); - Val -> Val - end. - -%% @doc Return the local hash associated with a full-prefix or prefix. The hash value is -%% updated periodically and does not always reflect the most recent value. This function -%% can be used to determine when keys stored under a full-prefix or prefix have changed. -%% If the tree has not yet been updated or there are no keys stored the given -%% (full-)prefix. `undefined' is returned. --spec prefix_hash(metadata_prefix() | binary() | atom()) -> binary() | undefined. -prefix_hash(Prefix) when is_tuple(Prefix) or is_atom(Prefix) or is_binary(Prefix) -> - riak_core_metadata_hashtree:prefix_hash(Prefix). - -%% @doc same as put(FullPrefix, Key, Value, []) --spec put(metadata_prefix(), metadata_key(), metadata_value() | metadata_modifier()) -> ok. -put(FullPrefix, Key, ValueOrFun) -> - put(FullPrefix, Key, ValueOrFun, []). - -%% @doc Stores or updates the value at the given prefix and key locally and then -%% triggers a broadcast to notify other nodes in the cluster. Currently, there -%% are no put options -%% -%% NOTE: because the third argument to this function can be a metadata_modifier(), -%% used to resolve conflicts on write, metadata values cannot be functions. -%% To store functions in metadata wrap them in another type like a tuple. --spec put(metadata_prefix(), - metadata_key(), - metadata_value() | metadata_modifier(), - put_opts()) -> ok. -put({Prefix, SubPrefix}=FullPrefix, Key, ValueOrFun, _Opts) - when (is_binary(Prefix) orelse is_atom(Prefix)) andalso - (is_binary(SubPrefix) orelse is_atom(SubPrefix)) -> - PKey = prefixed_key(FullPrefix, Key), - CurrentContext = current_context(PKey), - Updated = riak_core_metadata_manager:put(PKey, CurrentContext, ValueOrFun), - broadcast(PKey, Updated). - -%% @doc same as delete(FullPrefix, Key, []) --spec delete(metadata_prefix(), metadata_key()) -> ok. -delete(FullPrefix, Key) -> - delete(FullPrefix, Key, []). - -%% @doc Removes the value associated with the given prefix and key locally and then -%% triggers a broradcast to notify other nodes in the cluster. Currently there are -%% no delete options -%% -%% NOTE: currently deletion is logical and no GC is performed. --spec delete(metadata_prefix(), metadata_key(), delete_opts()) -> ok. -delete(FullPrefix, Key, _Opts) -> - put(FullPrefix, Key, ?TOMBSTONE, []). - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -%% @private -current_context(PKey) -> - case riak_core_metadata_manager:get(PKey) of - undefined -> riak_core_metadata_object:empty_context(); - CurrentMeta -> riak_core_metadata_object:context(CurrentMeta) - end. - -%% @private -maybe_resolve(PKey, Existing, Method, AllowPut) -> - SibCount = riak_core_metadata_object:value_count(Existing), - maybe_resolve(PKey, Existing, SibCount, Method, AllowPut). - -%% @private -maybe_resolve(_PKey, Existing, 1, _Method, _AllowPut) -> - riak_core_metadata_object:value(Existing); -maybe_resolve(PKey, Existing, _, Method, AllowPut) -> - Reconciled = riak_core_metadata_object:resolve(Existing, Method), - RContext = riak_core_metadata_object:context(Reconciled), - RValue = riak_core_metadata_object:value(Reconciled), - case AllowPut of - false -> - ok; - true -> - Stored = riak_core_metadata_manager:put(PKey, RContext, RValue), - broadcast(PKey, Stored) - end, - RValue. - -%% @private -maybe_tombstones(Values, Default) -> - [maybe_tombstone(Value, Default) || Value <- Values]. - -%% @private -maybe_tombstone(?TOMBSTONE, Default) -> - Default; -maybe_tombstone(Value, _Default) -> - Value. - -%% @private -broadcast(PKey, Obj) -> - Broadcast = #metadata_broadcast{pkey = PKey, - obj = Obj}, - riak_core_broadcast:broadcast(Broadcast, riak_core_metadata_manager). - -%% @private --spec prefixed_key(metadata_prefix(), metadata_key()) -> metadata_pkey(). -prefixed_key(FullPrefix, Key) -> - {FullPrefix, Key}. - -get_option(Key, Opts, Default) -> - proplists:get_value(Key, Opts, Default). diff --git a/src/riak_core_metadata_exchange_fsm.erl b/src/riak_core_metadata_exchange_fsm.erl deleted file mode 100644 index 28320a938..000000000 --- a/src/riak_core_metadata_exchange_fsm.erl +++ /dev/null @@ -1,307 +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_metadata_exchange_fsm). - --behaviour(gen_fsm). - --compile({nowarn_deprecated_function, - [{gen_fsm, start, 3}, - {gen_fsm, send_event, 2}]}). - -%% API --export([start/2]). - -%% gen_fsm callbacks --export([init/1, handle_event/3, handle_sync_event/4, - handle_info/3, terminate/3, code_change/4]). - -%% gen_fsm states --export([prepare/2, - prepare/3, - update/2, - update/3, - exchange/2, - exchange/3]). - --include_lib("kernel/include/logger.hrl"). - --define(SERVER, ?MODULE). - --record(state, { - %% node the exchange is taking place with - peer :: node(), - - %% count of trees that have been buit - built :: non_neg_integer(), - - %% length of time waited to aqcuire remote lock or - %% update trees - timeout :: pos_integer() - }). - --record(exchange, { - %% number of local prefixes repaired - local :: non_neg_integer(), - - %% number of remote prefixes repaired - remote :: non_neg_integer(), - - %% number of keys (missing, local, different) repaired, - %% excluding those in prefixes counted by local/remote - keys :: non_neg_integer() - }). - -%%%=================================================================== -%%% API -%%%=================================================================== - -%% @doc Start an exchange of Cluster Metadata hashtrees between this node -%% and `Peer'. `Timeout' is the number of milliseconds the process will wait -%% to aqcuire the remote lock or to upate both trees. --spec start(node(), pos_integer()) -> {ok, pid()} | ignore | {error, term()}. -start(Peer, Timeout) -> - gen_fsm:start(?MODULE, [Peer, Timeout], []). - -%%%=================================================================== -%%% gen_fsm callbacks -%%%=================================================================== - -init([Peer, Timeout]) -> - gen_fsm:send_event(self(), start), - {ok, prepare, #state{peer=Peer,built=0,timeout=Timeout}}. - -handle_event(_Event, StateName, State) -> - {next_state, StateName, State}. - -handle_sync_event(_Event, _From, StateName, State) -> - Reply = ok, - {reply, Reply, StateName, State}. - -handle_info(_Info, StateName, State) -> - {next_state, StateName, State}. - -terminate(_Reason, _StateName, _State) -> - ok. - -code_change(_OldVsn, StateName, State, _Extra) -> - {ok, StateName, State}. - -%%%=================================================================== -%%% gen_fsm states -%%%=================================================================== -prepare(start, State) -> - %% get local lock - case riak_core_metadata_hashtree:lock() of - ok -> - %% get remote lock - remote_lock_request(State#state.peer), - {next_state, prepare, State, State#state.timeout}; - _Error -> - {stop, normal, State} - end; -prepare(timeout, State=#state{peer=Peer}) -> - %% getting remote lock timed out - ?LOG_ERROR("metadata exchange with ~p timed out aquiring locks", [Peer]), - {stop, normal, State}; -prepare({remote_lock, ok}, State) -> - %% getting remote lock succeeded - update(start, State); -prepare({remote_lock, _Error}, State) -> - %% failed to get remote lock - {stop, normal, State}. - -update(start, State) -> - update_request(node()), - update_request(State#state.peer), - {next_state, update, State, State#state.timeout}; -update(timeout, State=#state{peer=Peer}) -> - ?LOG_ERROR("metadata exchange with ~p timed out updating trees", [Peer]), - {stop, normal, State}; -update(tree_updated, State) -> - Built = State#state.built + 1, - case Built of - 2 -> - {next_state, exchange, State, 0}; - _ -> - {next_state, update, State#state{built=Built}} - end; -update({update_error, _Error}, State) -> - {stop, normal, State}. - -exchange(timeout, State=#state{peer=Peer}) -> - RemoteFun = fun(Prefixes, {get_bucket, {Level, Bucket}}) -> - riak_core_metadata_hashtree:get_bucket(Peer, Prefixes, Level, Bucket); - (Prefixes, {key_hashes, Segment}) -> - riak_core_metadata_hashtree:key_hashes(Peer, Prefixes, Segment) - end, - HandlerFun = fun(Diff, Acc) -> - repair(Peer, Diff), - track_repair(Diff, Acc) - end, - Res = riak_core_metadata_hashtree:compare(RemoteFun, HandlerFun, - #exchange{local=0,remote=0,keys=0}), - #exchange{local=LocalPrefixes, - remote=RemotePrefixes, - keys=Keys} = Res, - Total = LocalPrefixes + RemotePrefixes + Keys, - case Total > 0 of - true -> - ?LOG_INFO("completed metadata exchange with ~p. repaired ~p missing local prefixes, " - "~p missing remote prefixes, and ~p keys", [Peer, LocalPrefixes, RemotePrefixes, Keys]); - false -> - ?LOG_DEBUG("completed metadata exchange with ~p. nothing repaired", [Peer]) - end, - {stop, normal, State}. - -prepare(_Event, _From, State) -> - {reply, ok, prepare, State}. - -update(_Event, _From, State) -> - {reply, ok, update, State}. - -exchange(_Event, _From, State) -> - {reply, ok, exchange, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -%% @private -repair(Peer, {missing_prefix, Type, Prefix}) -> - repair_prefix(Peer, Type, Prefix); -repair(Peer, {key_diffs, Prefix, Diffs}) -> - _ = [repair_keys(Peer, Prefix, Diff) || Diff <- Diffs], - ok. - -%% @private -repair_prefix(Peer, Type, [Prefix]) -> - ItType = repair_iterator_type(Type), - repair_sub_prefixes(Type, Peer, Prefix, repair_iterator(ItType, Peer, Prefix)); -repair_prefix(Peer, Type, [Prefix, SubPrefix]) -> - FullPrefix = {Prefix, SubPrefix}, - ItType = repair_iterator_type(Type), - repair_full_prefix(Type, Peer, FullPrefix, repair_iterator(ItType, Peer, FullPrefix)). - -%% @private -repair_sub_prefixes(Type, Peer, Prefix, It) -> - case riak_core_metadata_manager:iterator_done(It) of - true -> - riak_core_metadata_manager:iterator_close(It); - false -> - SubPrefix = riak_core_metadata_manager:iterator_value(It), - FullPrefix = {Prefix, SubPrefix}, - - ItType = repair_iterator_type(Type), - ObjIt = repair_iterator(ItType, Peer, FullPrefix), - repair_full_prefix(Type, Peer, FullPrefix, ObjIt), - repair_sub_prefixes(Type, Peer, Prefix, - riak_core_metadata_manager:iterate(It)) - end. - -%% @private -repair_full_prefix(Type, Peer, FullPrefix, ObjIt) -> - case riak_core_metadata_manager:iterator_done(ObjIt) of - true -> - riak_core_metadata_manager:iterator_close(ObjIt); - false -> - {Key, Obj} = riak_core_metadata_manager:iterator_value(ObjIt), - repair_other(Type, Peer, {FullPrefix, Key}, Obj), - repair_full_prefix(Type, Peer, FullPrefix, - riak_core_metadata_manager:iterate(ObjIt)) - end. - -%% @private -repair_other(local, _Peer, PKey, Obj) -> - %% local missing data, merge remote data locally - merge(undefined, PKey, Obj); -repair_other(remote, Peer, PKey, Obj) -> - %% remote missing data, merge local data into remote node - merge(Peer, PKey, Obj). - -%% @private -repair_keys(Peer, PrefixList, {_Type, KeyBin}) -> - Key = binary_to_term(KeyBin), - Prefix = list_to_tuple(PrefixList), - PKey = {Prefix, Key}, - LocalObj = riak_core_metadata_manager:get(PKey), - RemoteObj = riak_core_metadata_manager:get(Peer, PKey), - merge(undefined, PKey, RemoteObj), - merge(Peer, PKey, LocalObj), - ok. - -%% @private -%% context is ignored since its in object, so pass undefined -merge(undefined, PKey, RemoteObj) -> - riak_core_metadata_manager:merge({PKey, undefined}, RemoteObj); -merge(Peer, PKey, LocalObj) -> - riak_core_metadata_manager:merge(Peer, {PKey, undefined}, LocalObj). - - -%% @private -repair_iterator(local, _, Prefix) when is_atom(Prefix) orelse is_binary(Prefix) -> - riak_core_metadata_manager:iterator(Prefix); -repair_iterator(local, _, Prefix) when is_tuple(Prefix) -> - riak_core_metadata_manager:iterator(Prefix, undefined); -repair_iterator(remote, Peer, PrefixOrFull) -> - riak_core_metadata_manager:remote_iterator(Peer, PrefixOrFull). - -%% @private -repair_iterator_type(local) -> - %% local node missing prefix, need to iterate remote - remote; -repair_iterator_type(remote) -> - %% remote node missing prefix, need to iterate local - local. - -%% @private -track_repair({missing_prefix, local, _}, Acc=#exchange{local=Local}) -> - Acc#exchange{local=Local+1}; -track_repair({missing_prefix, remote, _}, Acc=#exchange{remote=Remote}) -> - Acc#exchange{remote=Remote+1}; -track_repair({key_diffs, _, Diffs}, Acc=#exchange{keys=Keys}) -> - Acc#exchange{keys=Keys+length(Diffs)}. -%% @private -remote_lock_request(Peer) -> - Self = self(), - as_event(fun() -> - Res = riak_core_metadata_hashtree:lock(Peer, Self), - {remote_lock, Res} - end). - -%% @private -update_request(Node) -> - as_event(fun() -> - %% acquired lock so we know there is no other update - %% and tree is built - case riak_core_metadata_hashtree:update(Node) of - ok -> tree_updated; - Error -> {update_error, Error} - end - end). - -%% @private -%% "borrowed" from riak_kv_exchange_fsm -as_event(F) -> - Self = self(), - spawn_link(fun() -> - Result = F(), - gen_fsm:send_event(Self, Result) - end), - ok. diff --git a/src/riak_core_metadata_hashtree.erl b/src/riak_core_metadata_hashtree.erl deleted file mode 100644 index dbefcc172..000000000 --- a/src/riak_core_metadata_hashtree.erl +++ /dev/null @@ -1,369 +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_metadata_hashtree). - --behaviour(gen_server). - -%% API --export([start_link/0, - start_link/1, - insert/2, - insert/3, - prefix_hash/1, - get_bucket/4, - key_hashes/3, - lock/0, - lock/1, - lock/2, - update/0, - update/1, - compare/3]). -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --include("riak_core_metadata.hrl"). - --define(SERVER, ?MODULE). - --record(state, { - %% the tree managed by this process - tree :: hashtree_tree:tree(), - - %% whether or not the tree has been built or a monitor ref - %% if the tree is being built - built :: boolean() | reference(), - - %% a monitor reference for a process that currently holds a - %% lock on the tree. undefined otherwise - lock :: {internal | external, reference()} | undefined - }). - -%%%=================================================================== -%%% API -%%%=================================================================== - -%% @doc Starts the process using {@link start_link/1}, passing in the -%% directory where other cluster metadata is stored in `platform_data_dir' -%% as the data root. --spec start_link() -> {ok, pid()} | ignore | {error, term()}. -start_link() -> - PRoot = app_helper:get_env(riak_core, platform_data_dir), - DataRoot = filename:join(PRoot, "cluster_meta/trees"), - start_link(DataRoot). - -%% @doc Starts a registered process that manages a {@link -%% hashtree_tree} for Cluster Metadata. Data for the tree is stored, -%% for the lifetime of the process (assuming it shutdowns gracefully), -%% in the directory `DataRoot'. --spec start_link(file:filename()) -> {ok, pid()} | ignore | {error, term()}. -start_link(DataRoot) -> - gen_server:start_link({local, ?SERVER}, ?MODULE, [DataRoot], []). - -%% @doc Same as insert(PKey, Hash, false). --spec insert(metadata_pkey(), binary()) -> ok. -insert(PKey, Hash) -> - insert(PKey, Hash, false). - -%% @doc Insert a hash for a full-prefix and key into the tree -%% managed by the process. If `IfMissing' is `true' the hash is only -%% inserted into the tree if the key is not already present. --spec insert(metadata_pkey(), binary(), boolean()) -> ok. -insert(PKey, Hash, IfMissing) -> - gen_server:call(?SERVER, {insert, PKey, Hash, IfMissing}, infinity). - -%% @doc Return the hash for the given prefix or full-prefix --spec prefix_hash(metadata_prefix() | binary() | atom()) -> undefined | binary(). -prefix_hash(Prefix) -> - gen_server:call(?SERVER, {prefix_hash, Prefix}, infinity). - -%% @doc Return the bucket for a node in the tree managed by this -%% process running on `Node'. --spec get_bucket(node(), hashtree_tree:tree_node(), - non_neg_integer(), non_neg_integer()) -> orddict:orddict(). -get_bucket(Node, Prefixes, Level, Bucket) -> - gen_server:call({?SERVER, Node}, {get_bucket, Prefixes, Level, Bucket}, infinity). - -%% @doc Return the key hashes for a node in the tree managed by this -%% process running on `Node'. --spec key_hashes(node(), hashtree_tree:tree_node(), non_neg_integer()) -> orddict:orddict(). -key_hashes(Node, Prefixes, Segment) -> - gen_server:call({?SERVER, Node}, {key_hashes, Prefixes, Segment}, infinity). - -%% @doc Locks the tree on this node for updating on behalf of the -%% calling process. -%% @see lock/2 --spec lock() -> ok | not_built | locked. -lock() -> - lock(node()). - -%% @doc Locks the tree on `Node' for updating on behalf of the calling -%% process. -%% @see lock/2 --spec lock(node()) -> ok | not_built | locked. -lock(Node) -> - lock(Node, self()). - -%% @doc Lock the tree for updating. This function must be called -%% before updating the tree with {@link update/0} or {@link -%% update/1}. If the tree is not built or already locked then the call -%% will fail and the appropriate atom is returned. Otherwise, -%% aqcuiring the lock succeeds and `ok' is returned. --spec lock(node(), pid()) -> ok | not_built | locked. -lock(Node, Pid) -> - gen_server:call({?SERVER, Node}, {lock, Pid}, infinity). - -%% @doc Updates the tree on this node. -%% @see update/1 --spec update() -> ok | not_locked | not_built | ongoing_update. -update() -> - update(node()). - -%% @doc Updates the tree on `Node'. The tree must be locked using one -%% of the lock functions. If the tree is not locked or built the -%% update will not be started and the appropriate atom is -%% returned. Although this function should not be called without a -%% lock, if it is and the tree is being updated by the background tick -%% then `ongoing_update' is returned. If the tree is built and a lock -%% has been acquired then the update is started and `ok' is -%% returned. The update is performed asynchronously and does not block -%% the process that manages the tree (e.g. future inserts). --spec update(node()) -> ok | not_locked | not_built | ongoing_update. -update(Node) -> - gen_server:call({?SERVER, Node}, update, infinity). - -%% @doc Compare the local tree managed by this process with the remote -%% tree also managed by a metadata hashtree process. `RemoteFun' is -%% used to access the buckets and segments of nodes in the remote tree -%% and should usually call {@link get_bucket/4} and {@link -%% key_hashes/3}. `HandlerFun' is used to process the differences -%% found between the two trees. `HandlerAcc' is passed to the first -%% invocation of `HandlerFun'. Subsequent calls are passed the return -%% value from the previous call. This function returns the return -%% value from the last call to `HandlerFun'. {@link hashtree_tree} for -%% more details on `RemoteFun', `HandlerFun' and `HandlerAcc'. --spec compare(hashtree_tree:remote_fun(), hashtree_tree:handler_fun(X), X) -> X. -compare(RemoteFun, HandlerFun, HandlerAcc) -> - gen_server:call(?SERVER, {compare, RemoteFun, HandlerFun, HandlerAcc}, infinity). - -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== - -init([DataRoot]) -> - schedule_tick(), - Tree = hashtree_tree:new(cluster_meta, [{data_dir, DataRoot}, {num_levels, 2}]), - State = #state{tree=Tree, - built=false, - lock=undefined}, - State1 = build_async(State), - {ok, State1}. - -handle_call({compare, RemoteFun, HandlerFun, HandlerAcc}, From, State) -> - maybe_compare_async(From, RemoteFun, HandlerFun, HandlerAcc, State), - {noreply, State}; -handle_call(update, From, State) -> - State1 = maybe_external_update(From, State), - {noreply, State1}; -handle_call({lock, Pid}, _From, State) -> - {Reply, State1} = maybe_external_lock(Pid, State), - {reply, Reply, State1}; -handle_call({get_bucket, Prefixes, Level, Bucket}, _From, State) -> - Res = hashtree_tree:get_bucket(Prefixes, Level, Bucket, State#state.tree), - {reply, Res, State}; -handle_call({key_hashes, Prefixes, Segment}, _From, State) -> - [{_, Res}] = hashtree_tree:key_hashes(Prefixes, Segment, State#state.tree), - {reply, Res, State}; -handle_call({prefix_hash, Prefix}, _From, State=#state{tree=Tree}) -> - PrefixList = prefix_to_prefix_list(Prefix), - PrefixHash = hashtree_tree:prefix_hash(PrefixList, Tree), - {reply, PrefixHash, State}; -handle_call({insert, PKey, Hash, IfMissing}, _From, State=#state{tree=Tree}) -> - {Prefixes, Key} = prepare_pkey(PKey), - Tree1 = hashtree_tree:insert(Prefixes, Key, Hash, [{if_missing, IfMissing}], Tree), - {reply, ok, State#state{tree=Tree1}}. - -handle_cast(_Msg, State) -> - {noreply, State}. - -handle_info({'DOWN', BuildRef, process, _Pid, normal}, State=#state{built=BuildRef}) -> - State1 = build_done(State), - {noreply, State1}; -handle_info({'DOWN', BuildRef, process, _Pid, Reason}, State=#state{built=BuildRef}) -> - ?LOG_ERROR("building tree failed: ~p", [Reason]), - State1 = build_error(State), - {noreply, State1}; -handle_info({'DOWN', LockRef, process, _Pid, _Reason}, State=#state{lock={_, LockRef}}) -> - State1 = release_lock(State), - {noreply, State1}; -handle_info(tick, State) -> - schedule_tick(), - State1 = maybe_build_async(State), - State2 = maybe_update_async(State1), - {noreply, State2}. - -terminate(_Reason, State) -> - hashtree_tree:destroy(State#state.tree), - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -%% @private -maybe_compare_async(From, RemoteFun, HandlerFun, HandlerAcc, - State=#state{built=true,lock={external,_}}) -> - compare_async(From, RemoteFun, HandlerFun, HandlerAcc, State); -maybe_compare_async(From, _, _, HandlerAcc, _State) -> - gen_server:reply(From, HandlerAcc). - -%% @private -compare_async(From, RemoteFun, HandlerFun, HandlerAcc, #state{tree=Tree}) -> - spawn_link(fun() -> - Res = hashtree_tree:compare(Tree, RemoteFun, - HandlerFun, HandlerAcc), - gen_server:reply(From, Res) - end). - -%% @private -maybe_external_update(From, State=#state{built=true,lock=undefined}) -> - gen_server:reply(From, not_locked), - State; -maybe_external_update(From, State=#state{built=true,lock={internal,_}}) -> - gen_server:reply(From, ongoing_update), - State; -maybe_external_update(From, State=#state{built=true,lock={external,_}}) -> - update_async(From, false, State); -maybe_external_update(From, State) -> - gen_server:reply(From, not_built), - State. - -%% @private -maybe_update_async(State=#state{built=true,lock=undefined}) -> - update_async(State); -maybe_update_async(State) -> - State. - -%% @private -update_async(State) -> - update_async(undefined, true, State). - -%% @private -update_async(From, Lock, State=#state{tree=Tree}) -> - Tree2 = hashtree_tree:update_snapshot(Tree), - Pid = spawn_link(fun() -> - hashtree_tree:update_perform(Tree2), - case From of - undefined -> ok; - _ -> gen_server:reply(From, ok) - end - end), - State1 = case Lock of - true -> lock(Pid, internal, State); - false -> State - end, - State1#state{tree=Tree2}. - -%% @private -maybe_build_async(State=#state{built=false}) -> - build_async(State); -maybe_build_async(State) -> - State. - -%% @private -build_async(State) -> - {_Pid, Ref} = spawn_monitor(fun build/0), - State#state{built=Ref}. - -%% @private -build() -> - PrefixIt = riak_core_metadata_manager:iterator(), - build(PrefixIt). - -%% @private -build(PrefixIt) -> - case riak_core_metadata_manager:iterator_done(PrefixIt) of - true -> - riak_core_metadata_manager:iterator_close(PrefixIt); - false -> - Prefix = riak_core_metadata_manager:iterator_value(PrefixIt), - ObjIt = riak_core_metadata_manager:iterator(Prefix, undefined), - build(PrefixIt, ObjIt) - end. - -%% @private -build(PrefixIt, ObjIt) -> - case riak_core_metadata_manager:iterator_done(ObjIt) of - true -> - riak_core_metadata_manager:iterator_close(ObjIt), - build(riak_core_metadata_manager:iterate(PrefixIt)); - false -> - FullPrefix = riak_core_metadata_manager:iterator_prefix(ObjIt), - {Key, Obj} = riak_core_metadata_manager:iterator_value(ObjIt), - Hash = riak_core_metadata_object:hash(Obj), - %% insert only if missing to not clash w/ newer writes during build - ?MODULE:insert({FullPrefix, Key}, Hash, true), - build(PrefixIt, riak_core_metadata_manager:iterate(ObjIt)) - end. - -%% @private -build_done(State) -> - State#state{built=true}. - -%% @private -build_error(State) -> - State#state{built=false}. - -%% @private -maybe_external_lock(Pid, State=#state{lock=undefined,built=true}) -> - {ok, lock(Pid, external, State)}; -maybe_external_lock(_Pid, State=#state{built=true}) -> - {locked, State}; -maybe_external_lock(_Pid, State) -> - {not_built, State}. - -%% @private -lock(Pid, Type, State) -> - LockRef = monitor(process, Pid), - State#state{lock={Type, LockRef}}. - -%% @private -release_lock(State) -> - State#state{lock=undefined}. - -%% @private -prefix_to_prefix_list(Prefix) when is_binary(Prefix) or is_atom(Prefix) -> - [Prefix]; -prefix_to_prefix_list({Prefix, SubPrefix}) -> - [Prefix,SubPrefix]. - -%% @private -prepare_pkey({FullPrefix, Key}) -> - {prefix_to_prefix_list(FullPrefix), term_to_binary(Key)}. - -%% @private -schedule_tick() -> - TickMs = app_helper:get_env(riak_core, metadata_hashtree_timer, 10000), - erlang:send_after(TickMs, ?MODULE, tick). diff --git a/src/riak_core_metadata_manager.erl b/src/riak_core_metadata_manager.erl deleted file mode 100644 index 83053c27f..000000000 --- a/src/riak_core_metadata_manager.erl +++ /dev/null @@ -1,687 +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_metadata_manager). - --behaviour(gen_server). --behaviour(riak_core_broadcast_handler). - -%% API --export([start_link/0, - start_link/1, - get/1, - get/2, - iterator/0, - iterator/1, - iterator/2, - remote_iterator/1, - remote_iterator/2, - iterate/1, - iterator_prefix/1, - iterator_value/1, - iterator_done/1, - iterator_close/1, - put/3, - merge/3]). - -%% riak_core_broadcast_handler callbacks --export([broadcast_data/1, - merge/2, - is_stale/1, - graft/1, - exchange/1]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --export_type([metadata_iterator/0]). - --include("riak_core_metadata.hrl"). - --define(SERVER, ?MODULE). --define(MANIFEST, cluster_meta_manifest). --define(MANIFEST_FILENAME, "manifest.dets"). --define(ETS, metadata_manager_prefixes_ets). - --record(state, { - %% identifier used in logical clocks - serverid :: term(), - - %% where data files are stored - data_root :: file:filename(), - - %% an ets table to hold iterators opened - %% by other nodes - iterators :: ets:tab() - }). - --record(metadata_iterator, { - prefix :: metadata_prefix() | undefined, - match :: term() | undefined, - pos :: term() |undefined, - obj :: {metadata_key(), metadata_object()} | undefined, - done :: boolean(), - tab :: ets:tab() - }). - --record(remote_iterator, { - node :: node(), - ref :: reference(), - prefix :: metadata_prefix() | atom() | binary() - }). - --opaque metadata_iterator() :: #metadata_iterator{}. --type remote_iterator() :: #remote_iterator{}. - --type mm_path_opt() :: {data_dir, file:name_all()}. --type mm_nodename_opt() :: {nodename, term()}. --type mm_opt() :: mm_path_opt() | mm_nodename_opt(). --type mm_opts() :: [mm_opt()]. - -%%%=================================================================== -%%% API -%%%=================================================================== - -%% @doc Same as start_link([]). --spec start_link() -> {ok, pid()} | ignore | {error, term()}. -start_link() -> - start_link([]). - -%% @doc Start riak_core_metadadata_manager and link to calling process. -%% -%% The following options can be provided: -%% * data_dir: the root directory to place cluster metadata files. -%% if not provided this defaults to the `cluster_meta' directory in -%% riak_core's `platform_data_dir'. -%% * nodename: the node identifier (for use in logical clocks). defaults to node() --spec start_link(mm_opts()) -> {ok, pid()} | ignore | {error, term()}. -start_link(Opts) -> - gen_server:start_link({local, ?SERVER}, ?MODULE, [Opts], []). - -%% @doc Reads the value for a prefixed key. If the value does not exist `undefined' is -%% returned. otherwise a Dotted Version Vector Set is returned. When reading the value -%% for a subsequent call to put/3 the context can be obtained using -%% riak_core_metadata_object:context/1. Values can obtained w/ riak_core_metadata_object:values/1. --spec get(metadata_pkey()) -> metadata_object() | undefined. -get({{Prefix, SubPrefix}, _Key}=PKey) when (is_binary(Prefix) orelse is_atom(Prefix)) andalso - (is_binary(SubPrefix) orelse is_atom(SubPrefix)) -> - read(PKey). - -%% @doc Same as get/1 but reads the value from `Node' --spec get(node(), metadata_pkey()) -> metadata_object() | undefined. -get(Node, PKey) when node() =:= Node -> - ?MODULE:get(PKey); -get(Node, {{Prefix, SubPrefix}, _Key}=PKey) - when (is_binary(Prefix) orelse is_atom(Prefix)) andalso - (is_binary(SubPrefix) orelse is_atom(SubPrefix)) -> - gen_server:call({?SERVER, Node}, {get, PKey}, infinity). - - -%% @doc Returns a full-prefix iterator: an iterator for all full-prefixes that have keys stored under them -%% When done with the iterator, iterator_close/1 must be called --spec iterator() -> metadata_iterator(). -iterator() -> - iterator(undefined). - -%% @doc Returns a sub-prefix iterator for a given prefix. -%% When done with the iterator, iterator_close/1 must be called --spec iterator(binary() | atom()) -> metadata_iterator(). -iterator(Prefix) when is_binary(Prefix) or is_atom(Prefix) -> - open_iterator(undefined, Prefix). - -%% @doc Return an iterator for keys stored under a prefix. If KeyMatch is undefined then -%% all keys will may be visted by the iterator. Otherwise only keys matching KeyMatch will be -%% visited. -%% -%% KeyMatch can be either: -%% * an erlang term - which will be matched exactly against a key -%% * '_' - which is equivalent to undefined -%% * an erlang tuple containing terms and '_' - if tuples are used as keys -%% * this can be used to iterate over some subset of keys -%% -%% When done with the iterator, iterator_close/1 must be called --spec iterator(metadata_prefix() , term()) -> metadata_iterator(). -iterator({Prefix, SubPrefix}=FullPrefix, KeyMatch) - when (is_binary(Prefix) orelse is_atom(Prefix)) andalso - (is_binary(SubPrefix) orelse is_atom(SubPrefix)) -> - open_iterator(FullPrefix, KeyMatch). - -%% @doc Create an iterator on `Node'. This allows for remote iteration by having -%% the metadata manager keep track of the actual iterator (since ets continuations cannot -%% cross node boundaries). The iterator created iterates all full-prefixes. Once created -%% the rest of the iterator API may be used as usual. When done with the iterator, -%% iterator_close/1 must be called --spec remote_iterator(node()) -> remote_iterator(). -remote_iterator(Node) -> - remote_iterator(Node, undefined). - -%% @doc Create an iterator on `Node'. This allows for remote iteration -%% by having the metadata manager keep track of the actual iterator -%% (since ets continuations cannot cross node boundaries). When -%% `Perfix' is not a full prefix, the iterator created iterates all -%% sub-prefixes under `Prefix'. Otherse, the iterator iterates all keys -%% under a prefix. Once created the rest of the iterator API may be used as usual. -%% When done with the iterator, iterator_close/1 must be called --spec remote_iterator(node(), metadata_prefix() | binary() | atom() | undefined) -> remote_iterator(). -remote_iterator(Node, Prefix) when is_atom(Prefix) or is_binary(Prefix) -> - Ref = gen_server:call({?SERVER, Node}, {open_remote_iterator, self(), undefined, Prefix}, infinity), - #remote_iterator{ref=Ref,prefix=Prefix,node=Node}; -remote_iterator(Node, FullPrefix) when is_tuple(FullPrefix) -> - Ref = gen_server:call({?SERVER, Node}, {open_remote_iterator, self(), FullPrefix, undefined}, infinity), - #remote_iterator{ref=Ref,prefix=FullPrefix,node=Node}. - -%% @doc advance the iterator by one key, full-prefix or sub-prefix --spec iterate(metadata_iterator() | remote_iterator()) -> metadata_iterator() | remote_iterator(). -iterate(It=#remote_iterator{ref=Ref,node=Node}) -> - gen_server:call({?SERVER, Node}, {iterate, Ref}, infinity), - It; -iterate(Iterator) -> - next_iterator(Iterator). - -%% @doc return the full-prefix or prefix being iterated by this iterator. If the iterator is a -%% full-prefix iterator undefined is returned. --spec iterator_prefix(metadata_iterator() | remote_iterator()) -> - metadata_prefix() | undefined | binary() | atom(). -iterator_prefix(#remote_iterator{prefix=Prefix}) -> Prefix; -iterator_prefix(#metadata_iterator{prefix=undefined,match=undefined}) -> undefined; -iterator_prefix(#metadata_iterator{prefix=undefined,match=Prefix}) -> Prefix; -iterator_prefix(#metadata_iterator{prefix=Prefix}) -> Prefix. - -%% @doc return the key and object or the prefix pointed to by the iterator --spec iterator_value(metadata_iterator() | remote_iterator()) -> - {metadata_key(), metadata_object()} | - metadata_prefix() | binary() | atom(). -iterator_value(#remote_iterator{ref=Ref,node=Node}) -> - gen_server:call({?SERVER, Node}, {iterator_value, Ref}, infinity); -iterator_value(#metadata_iterator{prefix=undefined,match=undefined,pos=Pos}) -> Pos; -iterator_value(#metadata_iterator{obj=Obj}) -> Obj. - -%% @doc returns true if there are no more keys or prefixes to iterate over --spec iterator_done(metadata_iterator() | remote_iterator()) -> boolean(). -iterator_done(#remote_iterator{ref=Ref,node=Node}) -> - gen_server:call({?SERVER, Node}, {iterator_done, Ref}, infinity); -iterator_done(#metadata_iterator{done=Done}) -> Done. - -%% @doc Closes the iterator. This function must be called on all open iterators --spec iterator_close(metadata_iterator() | remote_iterator()) -> ok. -iterator_close(#remote_iterator{ref=Ref,node=Node}) -> - gen_server:call({?SERVER, Node}, {iterator_close, Ref}, infinity); -iterator_close(#metadata_iterator{prefix=undefined,match=undefined,tab=Tab}) -> - ets:safe_fixtable(Tab, false), - ok; -iterator_close(It) -> finish_iterator(It). - -%% @doc Sets the value of a prefixed key. The most recently read context (see get/1) -%% should be passed as the second argument to prevent unneccessary siblings. --spec put(metadata_pkey(), - metadata_context() | undefined, - metadata_value() | metadata_modifier()) -> metadata_object(). -put(PKey, undefined, ValueOrFun) -> - %% nil is an empty version vector for dvvset - put(PKey, [], ValueOrFun); -put({{Prefix, SubPrefix}, _Key}=PKey, Context, ValueOrFun) - when (is_binary(Prefix) orelse is_atom(Prefix)) andalso - (is_binary(SubPrefix) orelse is_atom(SubPrefix)) -> - gen_server:call(?SERVER, {put, PKey, Context, ValueOrFun}, infinity). - -%% @doc same as merge/2 but merges the object on `Node' --spec merge(node(), {metadata_pkey(), undefined | metadata_context()}, metadata_object()) -> boolean(). -merge(Node, {PKey, _Context}, Obj) -> - gen_server:call({?SERVER, Node}, {merge, PKey, Obj}, infinity). - -%%%=================================================================== -%%% riak_core_broadcast_handler callbacks -%%%=================================================================== - -%% @doc Deconstructs are broadcast that is sent using `riak_core_metadata_manager' as the -%% handling module returning the message id and payload. --spec broadcast_data(metadata_broadcast()) -> {{metadata_pkey(), metadata_context()}, - metadata_object()}. -broadcast_data(#metadata_broadcast{pkey=Key, obj=Obj}) -> - Context = riak_core_metadata_object:context(Obj), - {{Key, Context}, Obj}. - -%% @doc Merges a remote copy of a metadata record sent via broadcast w/ the local view -%% for the key contained in the message id. If the remote copy is causally older than -%% the current data stored then `false' is returned and no updates are merged. Otherwise, -%% the remote copy is merged (possibly generating siblings) and `true' is returned. --spec merge({metadata_pkey(), undefined | metadata_context()}, undefined | metadata_object()) -> boolean(). -merge({PKey, _Context}, Obj) -> - gen_server:call(?SERVER, {merge, PKey, Obj}, infinity). - -%% @doc Returns false if the update (or a causally newer update) has already been -%% received (stored locally). --spec is_stale({metadata_pkey(), metadata_context()}) -> boolean(). -is_stale({PKey, Context}) -> - gen_server:call(?SERVER, {is_stale, PKey, Context}, infinity). - -%% @doc returns the object associated with the given key and context (message id) if -%% the currently stored version has an equal context. otherwise stale is returned. -%% because it assumed that a grafted context can only be causally older than the local view -%% a stale response means there is another message that subsumes the grafted one --spec graft({metadata_pkey(), metadata_context()}) -> - stale | {ok, metadata_object()} | {error, term()}. -graft({PKey, Context}) -> - case ?MODULE:get(PKey) of - undefined -> - %% There would have to be a serious error in implementation to hit this case. - %% Catch if here b/c it would be much harder to detect - ?LOG_ERROR("object not found during graft for key: ~p", [PKey]), - {error, {not_found, PKey}}; - Obj -> - graft(Context, Obj) - end. - -graft(Context, Obj) -> - case riak_core_metadata_object:equal_context(Context, Obj) of - false -> - %% when grafting the context will never be causally newer - %% than what we have locally. Since its not equal, it must be - %% an ancestor. Thus we've sent another, newer update that contains - %% this context's information in addition to its own. This graft - %% is deemed stale - stale; - true -> - {ok, Obj} - end. - -%% @doc Trigger an exchange --spec exchange(node()) -> {ok, pid()} | {error, term()}. -exchange(Peer) -> - Timeout = app_helper:get_env(riak_core, metadata_exchange_timeout, 60000), - case riak_core_metadata_exchange_fsm:start(Peer, Timeout) of - {ok, Pid} -> - {ok, Pid}; - {error, Reason} -> - {error, Reason}; - ignore -> - {error, ignore} - end. - -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== - -%% @private --spec init([mm_opts()]) -> {ok, #state{}} | - {ok, #state{}, non_neg_integer() | infinity} | - ignore | - {stop, term()}. -init([Opts]) -> - case data_root(Opts) of - undefined -> - {stop, no_data_dir}; - DataRoot -> - ?ETS = ets:new(?ETS, [named_table, - {read_concurrency, true}, {write_concurrency, true}]), - Nodename = proplists:get_value(nodename, Opts, node()), - State = #state{serverid=Nodename, - data_root=DataRoot, - iterators=new_ets_tab()}, - {ok, _} = init_manifest(State), - %% TODO: should do this out-of-band from startup so we don't block - init_from_files(State), - {ok, State} - end. - -%% @private --spec handle_call(term(), {pid(), term()}, #state{}) -> - {reply, term(), #state{}} | - {reply, term(), #state{}, non_neg_integer()} | - {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), term(), #state{}} | - {stop, term(), #state{}}. -handle_call({put, PKey, Context, ValueOrFun}, _From, State) -> - {Result, NewState} = read_modify_write(PKey, Context, ValueOrFun, State), - {reply, Result, NewState}; -handle_call({merge, PKey, Obj}, _From, State) -> - {Result, NewState} = read_merge_write(PKey, Obj, State), - {reply, Result, NewState}; -handle_call({get, PKey}, _From, State) -> - Result = read(PKey), - {reply, Result, State}; -handle_call({open_remote_iterator, Pid, FullPrefix, KeyMatch}, _From, State) -> - Iterator = new_remote_iterator(Pid, FullPrefix, KeyMatch, State), - {reply, Iterator, State}; -handle_call({iterate, RemoteRef}, _From, State) -> - Next = next_iterator(RemoteRef, State), - {reply, Next, State}; -handle_call({iterator_value, RemoteRef}, _From, State) -> - Res = from_remote_iterator(fun iterator_value/1, RemoteRef, State), - {reply, Res, State}; -handle_call({iterator_done, RemoteRef}, _From, State) -> - Res = case from_remote_iterator(fun iterator_done/1, RemoteRef, State) of - undefined -> true; %% if we don't know about iterator, treat it as done - Other -> Other - end, - {reply, Res, State}; -handle_call({iterator_close, RemoteRef}, _From, State) -> - close_remote_iterator(RemoteRef, State), - {reply, ok, State}; -handle_call({is_stale, PKey, Context}, _From, State) -> - Existing = read(PKey), - IsStale = riak_core_metadata_object:is_stale(Context, Existing), - {reply, IsStale, State}. - -%% @private --spec handle_cast(term(), #state{}) -> {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), #state{}}. -handle_cast(_Msg, State) -> - {noreply, State}. - -%% @private --spec handle_info(term(), #state{}) -> {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), #state{}}. -handle_info({'DOWN', ItRef, process, _Pid, _Reason}, State) -> - close_remote_iterator(ItRef, State), - {noreply, State}. - -%% @private --spec terminate(term(), #state{}) -> term(). -terminate(_Reason, _State) -> - close_dets_tabs(), - ok = close_manifest(). - -%% @private --spec code_change(term() | {down, term()}, #state{}, term()) -> {ok, #state{}}. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -new_remote_iterator(Pid, FullPrefix, KeyMatch, #state{iterators=Iterators}) -> - Ref = monitor(process, Pid), - Iterator = open_iterator(FullPrefix, KeyMatch), - ets:insert(Iterators, [{Ref, Iterator}]), - Ref. - - -from_remote_iterator(Fun, RemoteRef, State) -> - case ets:lookup(State#state.iterators, RemoteRef) of - [] -> undefined; - [{RemoteRef, It}] -> Fun(It) - end. - -close_remote_iterator(Ref, State=#state{iterators=Iterators}) -> - from_remote_iterator(fun iterator_close/1, Ref, State), - ets:delete(Iterators, Ref). - -open_iterator(undefined, KeyMatch) -> - %% full or sub-prefix iterator - new_iterator(undefined, KeyMatch, ?ETS); -open_iterator(FullPrefix, KeyMatch) -> - %% key/value iterator - case ets_tab(FullPrefix) of - undefined -> empty_iterator(FullPrefix, KeyMatch, undefined); - Tab -> new_iterator(FullPrefix, KeyMatch, Tab) - end. - -next_iterator(It=#metadata_iterator{done=true}) -> - %% general catch-all for all iterators - It; -next_iterator(It=#metadata_iterator{prefix=undefined,match=undefined,tab=Tab,pos=Pos}) -> - %% full-prefix iterator - next_iterator(It, ets:next(Tab, Pos)); -next_iterator(It=#metadata_iterator{prefix=undefined,pos=Pos}) -> - %% sub-prefix iterator - next_iterator(It, ets:select(Pos)); -next_iterator(It=#metadata_iterator{pos=Pos}) -> - %% key/value iterator - next_iterator(It, ets:match_object(Pos)). - -next_iterator(Ref, #state{iterators=Iterators}) when is_reference(Ref) -> - %% remote iterator - case ets:lookup(Iterators, Ref) of - [] -> ok; - [{Ref, It}] -> - Next = next_iterator(It), - ets:insert(Iterators, [{Ref, Next}]) - end, - Ref; -next_iterator(It, '$end_of_table') -> - %% general catch-all for all iterators - It#metadata_iterator{done=true, - pos=undefined, - obj=undefined}; -next_iterator(It=#metadata_iterator{prefix=undefined,match=undefined},Next) -> - %% full-prefix iterator - It#metadata_iterator{pos=Next}; -next_iterator(It, {[Next], Cont}) -> - %% sub-prefix or key/value iterator - It#metadata_iterator{pos=Cont, - obj=Next}. - -%% universal empty iterator -empty_iterator(FullPrefix, KeyMatch, Tab) -> - #metadata_iterator{ - prefix=FullPrefix, - match=KeyMatch, - pos=undefined, - obj=undefined, - done=true, - tab=Tab - }. - -new_iterator(undefined, undefined, Tab) -> - %% full-prefix iterator - ets:safe_fixtable(Tab, true), - new_iterator(undefined, undefined, Tab, ets:first(Tab)); -new_iterator(undefined, Prefix, Tab) -> - %% sub-prefix iterator - new_iterator(undefined, Prefix, Tab, - ets:select(Tab, [{{{Prefix,'$1'},'_'},[],['$1']}], 1)); -new_iterator(FullPrefix, KeyMatch, Tab) -> - %% key/value iterator - ObjectMatch = iterator_match(KeyMatch), - new_iterator(FullPrefix, KeyMatch, Tab, ets:match_object(Tab, ObjectMatch, 1)). - -new_iterator(FullPrefix, KeyMatch, Tab, '$end_of_table') -> - %% catch-all for empty iterator of all types - empty_iterator(FullPrefix, KeyMatch, Tab); -new_iterator(undefined, undefined, Tab, First) -> - %% full-prefix iterator - #metadata_iterator{ - prefix=undefined, - match=undefined, - pos=First, - obj=undefined, - done=false, - tab=Tab - }; -new_iterator(undefined, Prefix, Tab, {[First], Cont}) -> - %% sub-prefix iterator - #metadata_iterator{ - prefix=undefined, - match=Prefix, - pos=Cont, - obj=First, - done=false, - tab=Tab - }; -new_iterator(FullPrefix, KeyMatch, Tab, {[First], Cont}) -> - %% key/value iterator - #metadata_iterator{ - prefix=FullPrefix, - match=KeyMatch, - pos=Cont, - obj=First, - done=false, - tab=Tab - }. - -finish_iterator(#metadata_iterator{done=true}) -> - ok; -finish_iterator(It) -> - Next = next_iterator(It), - finish_iterator(Next). - -iterator_match(undefined) -> - '_'; -iterator_match(KeyMatch) -> - {KeyMatch, '_'}. - -read_modify_write(PKey, Context, ValueOrFun, State=#state{serverid=ServerId}) -> - Existing = read(PKey), - Modified = riak_core_metadata_object:modify(Existing, Context, ValueOrFun, ServerId), - store(PKey, Modified, State). - -read_merge_write(PKey, Obj, State) -> - Existing = read(PKey), - case riak_core_metadata_object:reconcile(Obj, Existing) of - false -> {false, State}; - {true, Reconciled} -> - {_, NewState} = store(PKey, Reconciled, State), - {true, NewState} - end. - -store({FullPrefix, Key}=PKey, Metadata, State) -> - _ = maybe_init_ets(FullPrefix), - maybe_init_dets(FullPrefix, State#state.data_root), - - Objs = [{Key, Metadata}], - Hash = riak_core_metadata_object:hash(Metadata), - ets:insert(ets_tab(FullPrefix), Objs), - riak_core_metadata_hashtree:insert(PKey, Hash), - ok = dets_insert(dets_tabname(FullPrefix), Objs), - {Metadata, State}. - -read({FullPrefix, Key}) -> - case ets_tab(FullPrefix) of - undefined -> undefined; - TabId -> read(Key, TabId) - end. - -read(Key, TabId) -> - case ets:lookup(TabId, Key) of - [] -> undefined; - [{Key, MetaRec}] -> MetaRec - end. - -init_manifest(State) -> - ManifestFile = filename:join(State#state.data_root, ?MANIFEST_FILENAME), - ok = filelib:ensure_dir(ManifestFile), - {ok, ?MANIFEST} = dets:open_file(?MANIFEST, [{file, ManifestFile}]). - -close_manifest() -> - dets:close(?MANIFEST). - -init_from_files(State) -> - %% TODO: do this in parallel - dets_fold_tabnames(fun init_from_file/2, State). - -init_from_file(TabName, State) -> - FullPrefix = dets_tabname_to_prefix(TabName), - FileName = dets_file(State#state.data_root, FullPrefix), - {ok, TabName} = dets:open_file(TabName, [{file, FileName}]), - TabId = init_ets(FullPrefix), - TabId = dets:to_ets(TabName, TabId), - State. - -ets_tab(FullPrefix) -> - case ets:lookup(?ETS, FullPrefix) of - [] -> undefined; - [{FullPrefix, TabId}] -> TabId - end. - -maybe_init_ets(FullPrefix) -> - case ets_tab(FullPrefix) of - undefined -> init_ets(FullPrefix); - _TabId -> ok - end. - -init_ets(FullPrefix) -> - TabId = new_ets_tab(), - ets:insert(?ETS, [{FullPrefix, TabId}]), - TabId. - -new_ets_tab() -> - ets:new(undefined, [{read_concurrency, true}, {write_concurrency, true}]). - -maybe_init_dets(FullPrefix, DataRoot) -> - case dets:info(dets_tabname(FullPrefix)) of - undefined -> init_dets(FullPrefix, DataRoot); - _ -> ok - end. - -init_dets(FullPrefix, DataRoot) -> - TabName = dets_tabname(FullPrefix), - FileName = dets_file(DataRoot, FullPrefix), - {ok, TabName} = dets:open_file(TabName, [{file, FileName}]), - dets_insert(?MANIFEST, [{FullPrefix, TabName, FileName}]). - -close_dets_tabs() -> - dets_fold_tabnames(fun close_dets_tab/2, undefined). - -close_dets_tab(TabName, _Acc) -> - dets:close(TabName). - -dets_insert(TabName, Objs) -> - ok = dets:insert(TabName, Objs), - ok = dets:sync(TabName). - -dets_tabname(FullPrefix) -> {?MODULE, FullPrefix}. -dets_tabname_to_prefix({?MODULE, FullPrefix}) -> FullPrefix. - -dets_file(DataRoot, FullPrefix) -> - filename:join(DataRoot, dets_filename(FullPrefix)). - -dets_filename({Prefix, SubPrefix}=FullPrefix) -> - MD5Prefix = dets_filename_part(Prefix), - MD5SubPrefix = dets_filename_part(SubPrefix), - Trailer = dets_filename_trailer(FullPrefix), - io_lib:format("~s-~s-~s.dets", [MD5Prefix, MD5SubPrefix, Trailer]). - -dets_filename_part(Part) when is_atom(Part) -> - dets_filename_part(list_to_binary(atom_to_list(Part))); -dets_filename_part(Part) when is_binary(Part) -> - <> = riak_core_util:md5(Part), - riak_core_util:integer_to_list(MD5Int, 16). - -dets_filename_trailer(FullPrefix) -> - [dets_filename_trailer_part(Part) || Part <- tuple_to_list(FullPrefix)]. - -dets_filename_trailer_part(Part) when is_atom(Part) -> - "1"; -dets_filename_trailer_part(Part) when is_binary(Part)-> - "0". - -dets_fold_tabnames(Fun, Acc0) -> - dets:foldl(fun({_FullPrefix, TabName, _FileName}, Acc) -> - Fun(TabName, Acc) - end, Acc0, ?MANIFEST). - -data_root(Opts) -> - case proplists:get_value(data_dir, Opts) of - undefined -> default_data_root(); - Root -> Root - end. - -default_data_root() -> - case application:get_env(riak_core, platform_data_dir) of - {ok, PRoot} -> filename:join(PRoot, "cluster_meta"); - undefined -> undefined - end. diff --git a/src/riak_core_metadata_object.erl b/src/riak_core_metadata_object.erl deleted file mode 100644 index 13b1b380a..000000000 --- a/src/riak_core_metadata_object.erl +++ /dev/null @@ -1,149 +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_metadata_object). - --export([value/1, - values/1, - value_count/1, - context/1, - empty_context/0, - hash/1, - modify/4, - reconcile/2, - resolve/2, - is_stale/2, - equal_context/2]). - --include("riak_core_metadata.hrl"). - -%% @doc returns a single value. if the object holds more than one value an error is generated -%% @see values/2 --spec value(metadata_object()) -> metadata_value(). -value(Metadata) -> - [Value] = values(Metadata), - Value. - -%% @doc returns a list of values held in the object --spec values(metadata_object()) -> [metadata_value()]. -values({metadata, Object}) -> - [Value || {Value, _Ts} <- dvvset:values(Object)]. - -%% @doc returns the number of siblings in the given object --spec value_count(metadata_object()) -> non_neg_integer(). -value_count({metadata, Object}) -> - dvvset:size(Object). - -%% @doc returns the context (opaque causal history) for the given object --spec context(metadata_object()) -> metadata_context(). -context({metadata, Object}) -> - dvvset:join(Object). - -%% @doc returns the representation for an empty context (opaque causal history) --spec empty_context() -> metadata_context(). -empty_context() -> []. - -%% @doc returns a hash representing the metadata objects contents --spec hash(metadata_object()) -> binary(). -hash({metadata, Object}) -> - riak_core_util:sha(term_to_binary(Object)). - -%% @doc modifies a potentially existing object, setting its value and updating -%% the causual history. If a function is provided as the third argument -%% then this function also is used for conflict resolution. The difference -%% between this function and resolve/2 is that the logical clock is advanced in the -%% case of this function. Additionally, the resolution functions are slightly different. --spec modify(metadata_object() | undefined, - metadata_context(), - metadata_value() | metadata_modifier(), - term()) -> metadata_object(). -modify(undefined, Context, Fun, ServerId) when is_function(Fun) -> - modify(undefined, Context, Fun(undefined), ServerId); -modify(Obj, Context, Fun, ServerId) when is_function(Fun) -> - modify(Obj, Context, Fun(values(Obj)), ServerId); -modify(undefined, _Context, Value, ServerId) -> - %% Ignore the context since we dont have a value, its invalid if not - %% empty anyways, so give it a valid one - NewRecord = dvvset:new(timestamped_value(Value)), - {metadata, dvvset:update(NewRecord, ServerId)}; -modify({metadata, Existing}, Context, Value, ServerId) -> - InsertRec = dvvset:new(Context, timestamped_value(Value)), - {metadata, dvvset:update(InsertRec, Existing, ServerId)}. - -%% @doc Reconciles a remote object received during replication or anti-entropy -%% with a local object. If the remote object is an anscestor of or is equal to the local one -%% `false' is returned, otherwise the reconciled object is returned as the second -%% element of the two-tuple --spec reconcile(metadata_object(), metadata_object() | undefined) -> - false | {true, metadata_object()}. -reconcile(undefined, _LocalObj) -> - false; -reconcile(RemoteObj, undefined) -> - {true, RemoteObj}; -reconcile({metadata, RemoteObj}, {metadata, LocalObj}) -> - Less = dvvset:less(RemoteObj, LocalObj), - Equal = dvvset:equal(RemoteObj, LocalObj), - case not (Equal or Less) of - false -> false; - true -> - {true, {metadata, dvvset:sync([LocalObj, RemoteObj])}} - end. - -%% @doc Resolves siblings using either last-write-wins or the provided function and returns -%% an object containing a single value. The causal history is not updated --spec resolve(metadata_object(), lww | fun(([metadata_value()]) -> metadata_value())) -> - metadata_object(). -resolve({metadata, Object}, lww) -> - LWW = fun ({_,TS1}, {_,TS2}) -> TS1 =< TS2 end, - {metadata, dvvset:lww(LWW, Object)}; -resolve({metadata, Existing}, Reconcile) when is_function(Reconcile) -> - ResolveFun = fun({A, _}, {B, _}) -> timestamped_value(Reconcile(A, B)) end, - F = fun([Value | Rest]) -> lists:foldl(ResolveFun, Value, Rest) end, - {metadata, dvvset:reconcile(F, Existing)}. - -%% @doc Determines if the given context (version vector) is causually newer than -%% an existing object. If the object missing or if the context does not represent -%% an anscestor of the current key, false is returned. Otherwise, when the context -%% does represent an ancestor of the existing object or the existing object itself, -%% true is returned --spec is_stale(metadata_context(), metadata_object()) -> boolean(). -is_stale(_, undefined) -> - false; -is_stale(RemoteContext, {metadata, Obj}) -> - LocalContext = dvvset:join(Obj), - %% returns true (stale) when local context is causally newer or equal to remote context - descends(LocalContext, RemoteContext). - -descends(_, []) -> - true; -descends(Ca, Cb) -> - [{NodeB, CtrB} | RestB] = Cb, - case lists:keyfind(NodeB, 1, Ca) of - false -> false; - {_, CtrA} -> - (CtrA >= CtrB) andalso descends(Ca, RestB) - end. - -%% @doc Returns true if the given context and the context of the existing object are equal --spec equal_context(metadata_context(), metadata_object()) -> boolean(). -equal_context(Context, {metadata, Obj}) -> - Context =:= dvvset:join(Obj). - -timestamped_value(Value) -> - {Value, os:timestamp()}. diff --git a/src/riak_core_net_ticktime.erl b/src/riak_core_net_ticktime.erl deleted file mode 100644 index 6051d9922..000000000 --- a/src/riak_core_net_ticktime.erl +++ /dev/null @@ -1,156 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core: Core Riak Application -%% -%% Copyright (c) 2007-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. -%% -%% ------------------------------------------------------------------- - -%% @doc Change net_kernel's ticktime on-the-fly. - --module(riak_core_net_ticktime). --export([enable/0, - start_set_net_ticktime_daemon/2, - stop_set_net_ticktime_daemon/1]). - --include_lib("kernel/include/logger.hrl"). - --define(REGNAME, net_kernel_net_ticktime_change_daemon). - --spec enable() -> ok. -enable() -> - riak_core_capability:register({riak_core, net_ticktime}, - [true, false], - false). - -start_set_net_ticktime_daemon(Node, Time) -> - start_set_net_ticktime_daemon(Node, Time, net_ticktime_active()). - -start_set_net_ticktime_daemon(Node, Time, true) -> - EbinDir = filename:dirname(code:which(?MODULE)), - try - Dirs = rpc:call(Node, code, get_path, []), - case lists:member(EbinDir, Dirs) of - false -> - ?LOG_INFO("start_set_net_ticktime_daemon: adding to code path " - "for node ~p\n", [Node]), - rpc:call(Node, code, add_pathz, [EbinDir]); - true -> - ok - end - catch _:_ -> - %% Network problems or timeouts here, spawn will fail, no - %% worries, we'll try again soon. - ok - end, - spawn(Node, fun() -> - try - register(?REGNAME, self()), - %% If we get here, we are the one daemon process - ?LOG_INFO("start_set_net_ticktime_daemon: started " - "changing net_ticktime on ~p to ~p\n", - [Node, Time]), - _ = rand:seed(exs64, os:timestamp()), - set_net_ticktime_daemon_loop(Time, 1) - catch _:_ -> - ok - end - end); -start_set_net_ticktime_daemon(Node, _Time, false) -> - ?LOG_INFO("Not starting tick daemon on ~p. Capability unsupported. " - "Some nodes in the Riak cluster do not have ~p loaded\n", - [Node, ?MODULE]), - ok. - -stop_set_net_ticktime_daemon(Node) -> - Capability = riak_core_capability:get({riak_core, net_ticktime}), - stop_set_net_ticktime_daemon(Node, Capability). - -stop_set_net_ticktime_daemon(Node, true) -> - try - case rpc:call(Node, erlang, whereis, [?REGNAME]) of - Pid when is_pid(Pid) -> - io:format("Stopping tick daemon ~p on ~p\n", [Pid, Node]), - exit(Pid, stop_now), - ok; - undefined -> - io:format("Stopping tick daemon on ~p but not running\n", [Node]), - ok - end - catch _:_ -> - %% Network problems or timeouts, we don't try too hard - error - end; -stop_set_net_ticktime_daemon(Node, false) -> - ?LOG_INFO("Not stopping tick daemon on ~p. Capability unsupported\n", [Node]), - ok. - -async_start_set_net_ticktime_daemons(Time, Nodes) -> - Pids = [spawn(fun() -> - start_set_net_ticktime_daemon(Node, Time, true) - end) || Node <- Nodes], - spawn(fun() -> - %% If a daemon cannot finish in 5 seconds, no worries. - %% We want to avoid leaving lots of pids around due to - %% network/net_kernel instability. - timer:sleep(5000), - [exit(Pid, kill) || Pid <- Pids] - end). - -set_net_ticktime_daemon_loop(Time, Count) -> - case set_net_ticktime(Time) of - unchanged -> - ?LOG_INFO("start_set_net_ticktime_daemon: finished " - "changing net_ticktime on ~p to ~p\n", [node(), Time]), - exit(normal); - _ -> - timer:sleep(rand:uniform(1*1000)), - %% Here is an uncommon use the erlang:nodes/1 BIF. - %% Hidden nodes (e.g. administrative escripts) may have - %% connected to us. Force them to change their tick time, - %% in case they're using something different. And pick up - %% any regular nodes that have connected since we started. - if - Count rem 5 == 0 -> - async_start_set_net_ticktime_daemons( - Time, da_nodes(nodes(connected))), - ok; - true -> - ok - end, - set_net_ticktime_daemon_loop(Time, Count + 1) - end. - -da_nodes(Nodes) -> - lists:sort([node()|Nodes]). % Always include myself - -set_net_ticktime(Time) -> - case net_kernel:set_net_ticktime(Time) of - {Status, _} -> - Status; - A when is_atom(A) -> - A - end. - --spec net_ticktime_active() -> boolean(). -net_ticktime_active() -> - case catch riak_core_capability:get({riak_core, net_ticktime}) of - true -> - true; - _ -> - false - end. diff --git a/src/riak_core_new_claim.erl b/src/riak_core_new_claim.erl deleted file mode 100644 index c77a0e299..000000000 --- a/src/riak_core_new_claim.erl +++ /dev/null @@ -1,39 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core: Core Riak Application -%% -%% 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 This module is a pass-thru to `riak_core_claim' for backwards -%% compatability. - --module(riak_core_new_claim). --export([new_wants_claim/2, new_choose_claim/2]). - -%% @deprecated -%% -%% @doc This exists for the sole purpose of backwards compatability. -new_wants_claim(Ring, Node) -> - riak_core_claim:wants_claim_v2(Ring, Node). - -%% @deprecated -%% -%% @doc This exists for the sole purpose of backwards compatability. -new_choose_claim(Ring, Node) -> - riak_core_claim:choose_claim_v2(Ring, Node). diff --git a/src/riak_core_node_watcher.erl b/src/riak_core_node_watcher.erl index 2d6b979f0..21c4fc46e 100644 --- a/src/riak_core_node_watcher.erl +++ b/src/riak_core_node_watcher.erl @@ -37,15 +37,19 @@ node_up/0, node_down/0, services/0, services/1, - nodes/1, - avsn/0]). + nodes/1]). +%% TEST API +-ifdef(TEST). + +-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]). --include_lib("kernel/include/logger.hrl"). - -record(state, { status = up, services = [], health_checks = [], @@ -149,7 +153,12 @@ services() -> gen_server:call(?MODULE, services, infinity). services(Node) -> - internal_get_services(Node). + case check_node_valid(Node) of + true -> + internal_get_services(Node); + _ -> + invalid_node + end. nodes(Service) -> internal_get_nodes(Service). @@ -159,9 +168,15 @@ nodes(Service) -> %% Test API %% =================================================================== +-ifdef(TEST). + avsn() -> gen_server:call(?MODULE, get_avsn, infinity). +set_broadcast_module(Module, Fn) -> + gen_server:call(?MODULE, {set_bcast_mod, Module, Fn}, infinity). + +-endif. %% ==================================================================== %% gen_server callbacks @@ -205,7 +220,7 @@ handle_call({service_up, Id, Pid, MFA, Options}, From, State) -> State2 = remove_health_check(Id, State1), - case app_helper:get_env(riak_core, enable_health_checks, true) of + case application:get_env(riak_core, enable_health_checks, true) of true -> %% install the health check CheckInterval = proplists:get_value(check_interval, Options, @@ -269,13 +284,13 @@ handle_call(services, _From, State) -> handle_call(suspend_healths, _From, State = #state{healths_enabled=false}) -> {reply, already_disabled, State}; handle_call(suspend_healths, _From, State = #state{healths_enabled=true}) -> - ?LOG_INFO("suspending all health checks"), + 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}) -> {reply, already_enabled, State}; handle_call(resume_healths, _From, State = #state{healths_enabled=false}) -> - ?LOG_INFO("resuming all health checks"), + 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})}. @@ -364,6 +379,11 @@ code_change(_OldVsn, State, _Extra) -> %% Internal functions %% ==================================================================== +check_node_valid(Node) -> + {ok, Ring} = riak_core_ring_manager:get_my_ring(), + Members = riak_core_ring:all_members(Ring), + lists:member(Node, Members). + update_avsn(State) -> State#state { avsn = State#state.avsn + 1 }. @@ -405,7 +425,7 @@ schedule_broadcast(State) -> _ = erlang:cancel_timer(OldTref), ok end, - Interval = app_helper: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 }. @@ -688,11 +708,11 @@ health_fsm(checking, {result, Pid, Cause}, Service, #health_check{checking_pid = health_fsm(checking, {'EXIT', Pid, Cause}, Service, #health_check{checking_pid = Pid} = InCheck) when Cause =/= normal -> - ?LOG_ERROR("health check process for ~p error'ed: ~p", [Service, Cause]), + 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 -> - ?LOG_ERROR("health check callback for ~p failed too " + logger:error("health check callback for ~p failed too " "many times, disabling.", [Service]), {down, suspend, InCheck#health_check{checking_pid = undefined, callback_failures = Fails}}; diff --git a/src/riak_core_node_worker_pool.erl b/src/riak_core_node_worker_pool.erl deleted file mode 100644 index a6a8df1ae..000000000 --- a/src/riak_core_node_worker_pool.erl +++ /dev/null @@ -1,118 +0,0 @@ -%% -%% 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. -%% -%% ------------------------------------------------------------------- - --module(riak_core_node_worker_pool). - --behaviour(riak_core_worker_pool). - --export([do_init/1, reply/2, do_work/3]). -%% export the names of the pools as functions --export([af1/0, af2/0, af3/0, af4/0, be/0, nwp/0, dscp_pools/0, pools/0]). - -%% API --export([start_link/5, stop/2, shutdown_pool/2, handle_work/3]). - --include_lib("kernel/include/logger.hrl"). - --type worker_pool() - % Allows you to set up a DSCP-style set of pools (assuming the - % vnode_worker_pool counts as ef. Otherwise can just have a - % single node_worker_pool - :: be_pool|af1_pool|af2_pool|af3_pool|af4_pool|node_worker_pool. - --export_type([worker_pool/0]). - --spec af1() -> af1_pool. -af1() -> af1_pool. - --spec af2() -> af2_pool. -af2() -> af2_pool. - --spec af3() -> af3_pool. -af3() -> af3_pool. - --spec af4() -> af4_pool. -af4() -> af4_pool. - --spec be() -> be_pool. -be() -> be_pool. - --spec nwp() -> node_worker_pool. -nwp() -> node_worker_pool. - --spec pools() -> [worker_pool()]. -pools() -> - [af1(), af2(), af3(), af4(), be(), nwp()]. - --spec dscp_pools() -> [worker_pool()]. -dscp_pools() -> - [af1(), af2(), af3(), af4(), be()]. - --spec start_link(atom(), pos_integer(), list(), list(), worker_pool()) - -> {ok, pid()}. -%% @doc -%% Start a worker pool, and register under the name PoolType, which should be -%% a recognised name from type worker_pool() -start_link(WorkerMod, PoolSize, WorkerArgs, WorkerProps, PoolType) - when PoolType == be_pool; - PoolType == af1_pool; - PoolType == af2_pool; - PoolType == af3_pool; - PoolType == af4_pool; - PoolType == node_worker_pool -> - {ok, Pid} = - riak_core_worker_pool:start_link( - [WorkerMod, PoolSize, WorkerArgs, WorkerProps], - ?MODULE, - PoolType), - register(PoolType, Pid), - ?LOG_INFO("Registered worker pool of type ~w and size ~w", - [PoolType, PoolSize]), - {ok, Pid}. - -do_init([WorkerMod, PoolSize, WorkerArgs, WorkerProps]) -> - process_flag(trap_exit, true), - poolboy:start_link([{worker_module, riak_core_vnode_worker}, - {worker_args, - [node, WorkerArgs, WorkerProps, self()]}, - {worker_callback_mod, WorkerMod}, - {size, PoolSize}, {max_overflow, 0}]). - -handle_work(PoolName, Work, From) when - PoolName == be_pool; - PoolName == af1_pool; - PoolName == af2_pool; - PoolName == af3_pool; - PoolName == af4_pool; - PoolName == node_worker_pool -> - riak_core_stat:update({worker_pool, PoolName}), - riak_core_worker_pool:handle_work(PoolName, Work, From). - -stop(Pid, Reason) -> - riak_core_worker_pool:stop(Pid, Reason). - -%% wait for all the workers to finish any current work -shutdown_pool(Pid, Wait) -> - riak_core_worker_pool:shutdown_pool(Pid, Wait). - -reply(From, Msg) -> - riak_core_vnode:reply(From, Msg). - -do_work(Pid, Work, From) -> - riak_core_vnode_worker:handle_work(Pid, Work, From). diff --git a/src/riak_core_node_worker_pool_sup.erl b/src/riak_core_node_worker_pool_sup.erl deleted file mode 100644 index 46e0abbe9..000000000 --- a/src/riak_core_node_worker_pool_sup.erl +++ /dev/null @@ -1,60 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% 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_node_worker_pool_sup). --behaviour(supervisor). --export([start_link/0, init/1]). --export([start_pool/5]). - -%% Helper macro for declaring children of supervisor --define(CHILD(I, PoolType, Args, Type, Timeout), - {PoolType, - {I, start_link, Args}, - permanent, Timeout, Type, [I]}). --define(CHILD(I, PoolType, Args, Type), - ?CHILD(I, PoolType, Args, Type, 5000)). - --type worker_pool() :: riak_core_node_worker_pool:worker_pool(). - -start_link() -> - supervisor:start_link({local, ?MODULE}, ?MODULE, []). - -init([]) -> - {ok, {{one_for_one, 5, 10}, []}}. - -%% @doc -%% Start a node_worker_pool - can be either assuredforwardng_pool or -%% a besteffort_pool (which will also be registered as a node_worker_pool for -%% backwards compatability) --spec start_pool(atom(), pos_integer(), list(), list(), worker_pool()) -> - ok | {error, Reason::term()}. -start_pool(WorkerMod, PoolSize, WorkerArgs, WorkerProps, QueueType) -> - Ref = pool(WorkerMod, PoolSize, WorkerArgs, WorkerProps, QueueType), - case supervisor:start_child(?MODULE, Ref) of - {ok, _} -> ok; - {ok, _, _} -> ok; - {error, already_present} -> ok; - {error, {already_started, _}} -> ok; - {error, OtherErr} -> {error, OtherErr} - end. - -pool(WorkerMod, PoolSize, WorkerArgs, WorkerProps, QueueType) -> - ?CHILD(riak_core_node_worker_pool, - QueueType, - [WorkerMod, PoolSize, WorkerArgs, WorkerProps, QueueType], - worker). - diff --git a/src/riak_core_nodeid.erl b/src/riak_core_nodeid.erl deleted file mode 100644 index 0be344fbb..000000000 --- a/src/riak_core_nodeid.erl +++ /dev/null @@ -1,31 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core: Core Node Id -%% -%% 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. -%% -%% ------------------------------------------------------------------- -%% Return a binary to use as an identifier for this node. -%% Initially this is just hash the node name, so there is a small -%% chance of collisions. -%% ------------------------------------------------------------------- --module(riak_core_nodeid). --export([get/0]). - -get() -> - Id = erlang:crc32(term_to_binary(node())), - <>. diff --git a/src/riak_core_pw_auth.erl b/src/riak_core_pw_auth.erl deleted file mode 100644 index 523bd67e4..000000000 --- a/src/riak_core_pw_auth.erl +++ /dev/null @@ -1,50 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2013 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(riak_core_pw_auth). - --export([hash_password/1, check_password/5]). - -%% TOOD should make these configurable in app.config --define(SALT_LENGTH, 16). --define(HASH_ITERATIONS, 65536). -%% TODO this should call a default_hash_func() function to get default based on erlang version --define(HASH_FUNCTION, sha). --define(AUTH_NAME, pbkdf2). - -%% @doc Hash a plaintext password, returning hashed password and algorithm details -hash_password(BinaryPass) when is_binary(BinaryPass) -> - % TODO: Do something more with the salt? - % Generate salt the simple way - Salt = crypto:strong_rand_bytes(?SALT_LENGTH), - - % Hash the original password and store as hex - {ok, HashedPass} = pbkdf2:pbkdf2(?HASH_FUNCTION, BinaryPass, Salt, ?HASH_ITERATIONS), - HexPass = pbkdf2:to_hex(HashedPass), - {ok, HexPass, ?AUTH_NAME, ?HASH_FUNCTION, Salt, ?HASH_ITERATIONS}. - - -%% @doc Check a plaintext password with a hashed password -check_password(BinaryPass, HashedPassword, HashFunction, Salt, HashIterations) when is_binary(BinaryPass) -> - - % Hash EnteredPassword to compare to HashedPassword - {ok, HashedPass} = pbkdf2:pbkdf2(HashFunction, BinaryPass, Salt, HashIterations), - HexPass = pbkdf2:to_hex(HashedPass), - pbkdf2:compare_secure(HexPass, HashedPassword). diff --git a/src/riak_core_rand.erl b/src/riak_core_rand.erl new file mode 100644 index 000000000..277259fa3 --- /dev/null +++ b/src/riak_core_rand.erl @@ -0,0 +1,65 @@ +%% 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_repair.erl b/src/riak_core_repair.erl deleted file mode 100644 index 21077e1da..000000000 --- a/src/riak_core_repair.erl +++ /dev/null @@ -1,150 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2012 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_repair). --export([gen_filter/5, - gen_range/3, - gen_range_fun/2, - gen_range_map/3]). - --include("riak_core_vnode.hrl"). - -%% GTE = Greater Than or Equal -%% LTE = Less Than or Equal --type range_wrap() :: {wrap, GTE::binary(), LTE::binary()}. --type range_nowrap() :: {nowrap, GTE::binary(), LTE::binary()}. --type hash_range() :: range_wrap() | range_nowrap(). - -%% =================================================================== -%% Public API -%% =================================================================== - -%% @doc Generate a `Filter' fun to use during partition repair. -%% -%% `Target' - Partition under repair. -%% -%% `Ring' - The ring to use for repair. -%% -%% `NValMap' - A map from bucket to `n_val', only custom buckets -%% have entries, everything else uses default. -%% -%% `DefaultN' - The default `n_val'. -%% -%% `InfoFun' - A function which returns information about the key -%% used to determine if it should be repaired or not. -gen_filter(Target, Ring, NValMap, DefaultN, InfoFun) -> - RangeMap = riak_core_repair:gen_range_map(Target, Ring, NValMap), - Default = riak_core_repair:gen_range(Target, Ring, DefaultN), - RangeFun = riak_core_repair:gen_range_fun(RangeMap, Default), - fun(BKey) -> - {Bucket, Hash} = InfoFun(BKey), - case RangeFun(Bucket) of - {nowrap, GTE, LTE} -> - Hash >= GTE andalso Hash =< LTE; - {wrap, GTE, LTE} -> - Hash >= GTE orelse Hash =< LTE - end - end. - -%% @doc Generate the hash `Range' for a given `Target' partition and -%% `NVal'. -%% -%% Note: The type of NVal should be pos_integer() but dialyzer says -%% success typing is integer() and I don't have time for games. --spec gen_range(partition(), riak_core_ring:riak_core_ring(), integer()) -> - hash_range(). -gen_range(Target, Ring, NVal) -> - CH = riak_core_ring:chash(Ring), - Predecessors = chash:predecessors(<>, CH, NVal+1), - [{FirstIdx, Node}|Rest] = Predecessors, - Predecessors2 = [{FirstIdx-1, Node}|Rest], - Predecessors3 = [<> || {I,_} <- Predecessors2], - {A,B} = lists:splitwith(fun(E) -> E > <<0:160/integer>> end, Predecessors3), - case B of - [] -> - %% In this case there is no "wrap" around the end of the - %% ring so the range check it simply an inclusive - %% inbetween. - make_nowrap(A); - - [<<0:160/integer>>] -> - %% In this case the 0th partition is first so no wrap - %% actually occurred. - make_nowrap(A ++ B); - - _ -> - %% In this case there is a "wrap" around the end of the - %% ring. Either the key is greater than or equal the - %% largest or smaller than or equal to the smallest. - make_wrap(A, B) - end. - - -%% @doc Generate the function that will return the hash range for a -%% given `Bucket'. --spec gen_range_fun(list(), hash_range()) -> function(). -gen_range_fun(RangeMap, Default) -> - fun(Bucket) -> - case lists:keyfind(Bucket, 1, RangeMap) of - false -> Default; - {_, Val} -> Val - end - end. - -%% @doc Generate the map from bucket `B' to hash `Range' that a key -%% must fall into to be included for repair on the `Target' -%% partition. --spec gen_range_map(partition(), riak_core_ring:riak_core_ring(), list()) -> - [{Bucket::binary(), Range::hash_range()}]. -gen_range_map(Target, Ring, NValMap) -> - [{I, gen_range(Target, Ring, N)} || {I, N} <- NValMap, N > 1]. - - -%% =================================================================== -%% Internal -%% =================================================================== - -%% @private -%% -%% @doc Make the `nowrap' tuple representing the range a key hash must -%% fall into. --spec make_nowrap(list()) -> range_nowrap(). -make_nowrap(RingSlice) -> - Slice2 = lists:sort(RingSlice), - GTE = hd(Slice2), - LTE = lists:last(Slice2), - {nowrap, GTE, LTE}. - -%% @private -%% -%% @doc Make `wrap' tuple representing the two ranges, relative to 0, -%% that a key hash must fall into. -%% -%% `RingSliceAfter' contains entries after the wrap around the 0th -%% partition. `RingSliceBefore' are entries before wrap and the -%% including the wrap at partition 0. --spec make_wrap(list(), list()) -> range_wrap(). -make_wrap(RingSliceAfter, RingSliceBefore) -> - LTE = hd(RingSliceAfter), - %% know first element of RingSliceBefore is 0 - Before2 = tl(RingSliceBefore), - GTE = lists:last(Before2), - {wrap, GTE, LTE}. - diff --git a/src/riak_core_ring.erl b/src/riak_core_ring.erl index c2970061e..d411150bd 100644 --- a/src/riak_core_ring.erl +++ b/src/riak_core_ring.erl @@ -2,7 +2,7 @@ %% %% riak_core: Core Riak Application %% -%% Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved. +%% Copyright (c) 2007-2015 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 @@ -55,10 +55,8 @@ remove_meta/2]). -export([cluster_name/1, - legacy_ring/1, - legacy_reconcile/2, - upgrade/1, - downgrade/2, +%% upgrade/1, +%% downgrade/2, set_tainted/1, check_tainted/2, unset_tainted/1, @@ -143,41 +141,28 @@ vnode_type/2, deletion_complete/3]). --include_lib("kernel/include/logger.hrl"). - -export_type([riak_core_ring/0, ring_size/0, partition_id/0]). --include("riak_core.hrl"). - -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). -endif. --define(CHSTATE, #chstate_v2). --record(chstate_v2, { - nodename :: term(), % the Node responsible for this chstate - vclock :: vclock:vclock() | undefined, % for this chstate object, entries are - % {Node, Ctr} - chring :: chash:chash(), % chash ring of {IndexAsInt, Node} mappings - meta :: riak_core_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()}]}}], - claimant :: term()|undefined, - seen :: [{term(), vclock:vclock()}], - rvsn :: vclock:vclock() -}). - -%% Legacy chstate -record(chstate, { - nodename :: node(), % the Node responsible for this chstate - vclock, % for this chstate object, entries are {Node, Ctr} - chring :: chash:chash(), % chash ring of {IndexAsInt, Node} mappings - meta % dict of cluster-wide other data (primarily bucket N-value, etc) -}). + 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. @@ -190,7 +175,7 @@ }). %% @type riak_core_ring(). Opaque data type used for partition ownership --type riak_core_ring() :: ?CHSTATE{}. +-type riak_core_ring() :: #chstate{}. -type chstate() :: riak_core_ring(). -type pending_change() :: {Owner :: node(), @@ -208,69 +193,17 @@ %% Public API %% =================================================================== -%% @doc Returns true if the given ring is a legacy ring. -legacy_ring(#chstate{}) -> - true; -legacy_ring(_) -> - false. - -%% @doc Upgrade old ring structures to the latest format. -upgrade(Old=?CHSTATE{}) -> - Old; -upgrade(Old=#chstate{}) -> - #chstate{nodename=Node, - vclock=VC, - chring=Ring, - meta=Meta} = Old, - New1 = ?CHSTATE{nodename=Node, - vclock=VC, - chring=Ring, - meta=Meta, - clustername=undefined, - next=[], - members=[], - claimant=undefined, - seen=[], - rvsn=VC}, - MemberVC = vclock:increment(Node, vclock:fresh()), - Members = [{Member, {valid, MemberVC, []}} - || Member <- chash:members(Ring)], - New2 = New1?CHSTATE{members=Members}, - case node() of - Node -> - GVsn = riak_core_gossip:gossip_version(), - update_member_meta(Node, New2, Node, - gossip_vsn, GVsn, same_vclock); - _ -> - New2 - end. - -%% @doc Downgrade the latest ring structure to a specified version. -downgrade(1,?CHSTATE{nodename=Node, - vclock=VC, - chring=Ring, - meta=Meta}) -> - #chstate{nodename=Node, - vclock=VC, - chring=Ring, - meta=Meta}; -downgrade(2,State=?CHSTATE{}) -> - State. - set_tainted(Ring) -> update_meta(riak_core_ring_tainted, true, Ring). -check_tainted(#chstate{}, _Msg) -> - %% Legacy ring is never tainted - ok; -check_tainted(Ring=?CHSTATE{}, Msg) -> - Exit = app_helper: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} -> - ?LOG_ERROR(Msg), + logger:error(Msg), ok; _ -> ok @@ -303,9 +236,9 @@ unset_lastgasp(Ring) -> %% 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}, + 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. @@ -318,18 +251,18 @@ is_primary(Ring, IdxNode) -> %% @doc Return the `CHash' of the ring. -spec chash(chstate()) -> CHash::chash:chash(). -chash(?CHSTATE{chring=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}) -> +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(). @@ -355,17 +288,17 @@ 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}) -> +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). + chash:nodes(State#chstate.chring). %% @doc Provide every preflist in the ring, truncated at N. -spec all_preflists(State :: chstate(), N :: integer()) -> @@ -383,7 +316,7 @@ diff_nodes(State1,State2) -> 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 @@ -401,17 +334,16 @@ fresh() -> %% Called by fresh/0, and otherwise only intended for testing purposes. -spec fresh(NodeName :: term()) -> chstate(). fresh(NodeName) -> - fresh(app_helper:get_env(riak_core, ring_creation_size), 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(). fresh(RingSize, NodeName) -> VClock=vclock:increment(NodeName, vclock:fresh()), - GossipVsn = riak_core_gossip:gossip_version(), - ?CHSTATE{nodename=NodeName, - clustername={NodeName, os:timestamp()}, - members=[{NodeName, {valid, VClock, [{gossip_vsn, GossipVsn}]}}], + #chstate{nodename=NodeName, + clustername={NodeName, erlang:timestamp()}, + members=[{NodeName, {valid, VClock, [{gossip_vsn, 2}]}}], chring=chash:fresh(RingSize, NodeName), next=[], claimant=NodeName, @@ -436,7 +368,7 @@ resize(State, NewRingSize) -> -spec get_meta(Key :: term(), State :: chstate()) -> {ok, term()} | undefined. get_meta(Key, State) -> - case dict:find(Key, State?CHSTATE.meta) of + case dict:find(Key, State#chstate.meta) of error -> undefined; {ok, '$removed'} -> undefined; {ok, M} when M#meta_entry.value =:= '$removed' -> undefined; @@ -453,7 +385,7 @@ get_meta(Key, Default, State) -> %% @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), + Keys = dict:fetch_keys(State#chstate.meta), lists:foldl( fun({bucket, Bucket}, Acc) -> [Bucket|Acc]; @@ -482,10 +414,10 @@ my_indices(State) -> %% @doc Return the number of partitions in this Riak ring. -spec num_partitions(State :: chstate()) -> pos_integer(). num_partitions(State) -> - chash:size(State?CHSTATE.chring). + 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) @@ -494,19 +426,19 @@ future_num_partitions(State=?CHSTATE{chring=CHRing}) -> %% @doc Return the node that is responsible for a given chstate. -spec owner_node(State :: chstate()) -> Node :: term(). owner_node(State) -> - State?CHSTATE.nodename. + 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). +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(rand:uniform(length(L)), L). + lists:nth(riak_core_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. @@ -515,7 +447,7 @@ random_other_index(State) -> L = [I || {I,Owner} <- ?MODULE:all_owners(State), Owner =/= node()], case L of [] -> hd(my_indices(State)); - _ -> lists:nth(rand:uniform(length(L)), L) + _ -> lists:nth(riak_core_rand:uniform(length(L)), L) end. -spec random_other_index(State :: chstate(), Exclude :: [term()]) -> chash:index_as_int() | no_indices. @@ -525,7 +457,7 @@ random_other_index(State, Exclude) when is_list(Exclude) -> not lists:member(I, Exclude)], case L of [] -> no_indices; - _ -> lists:nth(rand:uniform(length(L)), L) + _ -> lists:nth(riak_core_rand:uniform(length(L)), L) end. %% @doc Return a randomly-chosen node from amongst the owners other than this one. @@ -535,7 +467,7 @@ random_other_node(State) -> [] -> no_node; L -> - lists:nth(rand:uniform(length(L)), L) + lists:nth(riak_core_rand:uniform(length(L)), L) end. %% @doc Return a randomly-chosen active node other than this one. @@ -545,7 +477,7 @@ random_other_active_node(State) -> [] -> no_node; L -> - lists:nth(rand:uniform(length(L)), L) + lists:nth(riak_core_rand:uniform(length(L)), L) end. %% @doc Incorporate another node's state into our view of the Riak world. @@ -573,10 +505,10 @@ reconcile(ExternState, MyState) -> %% @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, +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{ + State#chstate{ chring=lists:foldl( fun({Idx, Owner}, AccIn) -> case Owner of @@ -589,12 +521,12 @@ rename_node(State=?CHSTATE{chring=Ring, nodename=ThisNode, members=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)}. + 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}) -> +responsible_index(ChashKey, #chstate{chring=Ring}) -> <> = ChashKey, chash:next_index(IndexAsInt, Ring). @@ -684,20 +616,20 @@ is_future_index(CHashKey, OrigIdx, TargetIdx, State) -> -spec transfer_node(Idx :: integer(), Node :: term(), MyState :: chstate()) -> chstate(). transfer_node(Idx, Node, MyState) -> - case chash:lookup(Idx, MyState?CHSTATE.chring) of + 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} + 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(). update_meta(Key, Val, State) -> - Change = case dict:find(Key, State?CHSTATE.meta) of + Change = case dict:find(Key, State#chstate.meta) of {ok, OldM} -> Val /= OldM#meta_entry.value; error -> @@ -709,10 +641,10 @@ update_meta(Key, Val, State) -> 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)}; + VClock = vclock:increment(State#chstate.nodename, + State#chstate.vclock), + State#chstate{vclock=VClock, + meta=dict:store(Key, M, State#chstate.meta)}; true -> State end. @@ -720,52 +652,52 @@ update_meta(Key, Val, State) -> %% @doc Logical delete of a key in the cluster metadata dict -spec remove_meta(Key :: term(), State :: chstate()) -> chstate(). remove_meta(Key, State) -> - case dict:find(Key, State?CHSTATE.meta) of + case dict:find(Key, State#chstate.meta) of {ok, _} -> update_meta(Key, '$removed', State); error -> State end. %% @doc Return the current claimant. -spec claimant(State :: chstate()) -> node(). -claimant(?CHSTATE{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. + 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}}; + {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}. + VClock = vclock:increment(Node, State#chstate.vclock), + State#chstate{vclock=VClock}. -ring_version(?CHSTATE{rvsn=RVsn}) -> +ring_version(#chstate{rvsn=RVsn}) -> RVsn. increment_ring_version(Node, State) -> - RVsn = vclock:increment(Node, State?CHSTATE.rvsn), - State?CHSTATE{rvsn=RVsn}. + RVsn = vclock:increment(Node, State#chstate.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) -> +member_status(#chstate{members=Members}, Node) -> member_status(Members, Node); member_status(Members, Node) -> case orddict:find(Node, Members) of @@ -777,11 +709,11 @@ member_status(Members, Node) -> %% @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}) -> +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 + case orddict:find(Member, State#chstate.members) of error -> undefined; {ok, {_, _, Meta}} -> case orddict:find(Key, Meta) of @@ -794,12 +726,12 @@ get_member_meta(State, Member, Key) -> %% @doc Set a key in the member metadata orddict update_member_meta(Node, State, Member, Key, Val) -> - VClock = vclock:increment(Node, State?CHSTATE.vclock), + VClock = vclock:increment(Node, State#chstate.vclock), State2 = update_member_meta(Node, State, Member, Key, Val, same_vclock), - State2?CHSTATE{vclock=VClock}. + State2#chstate{vclock=VClock}. update_member_meta(Node, State, Member, Key, Val, same_vclock) -> - Members = State?CHSTATE.members, + Members = State#chstate.members, case orddict:is_key(Member, Members) of true -> Members2 = orddict:update(Member, @@ -809,13 +741,13 @@ update_member_meta(Node, State, Member, Key, Val, same_vclock) -> orddict:store(Key, Val, MD)} end, Members), - State?CHSTATE{members=Members2}; + State#chstate{members=Members2}; false -> State end. clear_member_meta(Node, State, Member) -> - Members = State?CHSTATE.members, + Members = State#chstate.members, case orddict:is_key(Member, Members) of true -> Members2 = orddict:update(Member, @@ -825,7 +757,7 @@ clear_member_meta(Node, State, Member) -> orddict:new()} end, Members), - State?CHSTATE{members=Members2}; + State#chstate{members=Members2}; false -> State end. @@ -847,9 +779,9 @@ down_member(PNode, State, Node) -> set_member(PNode, State, Node, down). set_member(Node, CState, Member, Status) -> - VClock = vclock:increment(Node, CState?CHSTATE.vclock), + VClock = vclock:increment(Node, CState#chstate.vclock), CState2 = set_member(Node, CState, Member, Status, same_vclock), - CState2?CHSTATE{vclock=VClock}. + CState2#chstate{vclock=VClock}. set_member(Node, CState, Member, Status, same_vclock) -> Members2 = orddict:update(Member, @@ -858,24 +790,24 @@ set_member(Node, CState, Member, Status, same_vclock) -> end, {Status, vclock:increment(Node, vclock:fresh()), []}, - CState?CHSTATE.members), - CState?CHSTATE{members=Members2}. + CState#chstate.members), + 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}) -> +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}) -> +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(). 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()]. @@ -909,7 +841,7 @@ change_owners(CState, Reassign) -> disowning_indices(State, Node) -> case is_resizing(State) of false -> - [Idx || {Idx, Owner, _NextOwner, _Mods, _Status} <- State?CHSTATE.next, + [Idx || {Idx, Owner, _NextOwner, _Mods, _Status} <- State#chstate.next, Owner =:= Node]; true -> [Idx || {Idx, Owner} <- all_owners(State), @@ -930,10 +862,10 @@ disowned_during_resize(CState, Idx, Owner) -> %% @doc Returns a list of all pending ownership transfers. pending_changes(State) -> %% For now, just return next directly. - State?CHSTATE.next. + 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'. @@ -975,7 +907,7 @@ maybe_abort_resize(State) -> PendingAbort = is_resize_aborted(State), case PendingAbort andalso Resizing andalso not PostResize of true -> - State1 = State?CHSTATE{next=[]}, + State1 = State#chstate{next=[]}, State2 = clear_all_resize_transfers(State1), State3 = remove_meta('$resized_ring_abort', State2), {true, remove_meta('$resized_ring', State3)}; @@ -1009,13 +941,13 @@ schedule_resize_transfer(State, Source, Target) -> %% @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) -> +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}. + NewState#chstate{next=NewNext}. reschedule_resize_operation(N, NewNode, {Idx, N, '$resize', _Mods, _Status}, State) -> NewEntry = {Idx, NewNode, '$resize', ordsets:new(), awaiting}, @@ -1148,7 +1080,7 @@ is_resize_aborted(State) -> end. -spec is_resize_complete(chstate()) -> boolean(). -is_resize_complete(?CHSTATE{next=Next}) -> +is_resize_complete(#chstate{next=Next}) -> not lists:any(fun({_, _, _, _, awaiting}) -> true; ({_, _, _, _, complete}) -> false end, @@ -1184,7 +1116,7 @@ clear_resize_transfers(Source, State) -> -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, '$cleanup'} -> {ok, State#chstate.chring}; {ok, CHRing} -> {ok, CHRing}; _ -> undefined end. @@ -1224,7 +1156,7 @@ vnode_type(State, Idx, Node) -> %% @doc Return details for a pending partition ownership change. -spec next_owner(State :: chstate(), Idx :: integer()) -> pending_change(). next_owner(State, Idx) -> - case lists:keyfind(Idx, 1, State?CHSTATE.next) of + case lists:keyfind(Idx, 1, State#chstate.next) of false -> {undefined, undefined, undefined}; NInfo -> @@ -1235,7 +1167,7 @@ next_owner(State, Idx) -> -spec next_owner(State :: chstate(), Idx :: integer(), Mod :: module()) -> pending_change(). next_owner(State, Idx, Mod) -> - NInfo = lists:keyfind(Idx, 1, State?CHSTATE.next), + NInfo = lists:keyfind(Idx, 1, State#chstate.next), next_owner_status(NInfo, Mod). next_owner_status(NInfo, Mod) -> @@ -1257,7 +1189,7 @@ next_owner_status(NInfo, Mod) -> next_owner({_, Owner, NextOwner, _Transfers, Status}) -> {Owner, NextOwner, Status}. -completed_next_owners(Mod, ?CHSTATE{next=Next}) -> +completed_next_owners(Mod, #chstate{next=Next}) -> [{Idx, O, NO} || NInfo={Idx, _, _, _, _} <- Next, {O, NO, complete} <- [next_owner_status(NInfo, Mod)]]. @@ -1268,9 +1200,9 @@ ring_ready(State0) -> "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]), - VClock = State?CHSTATE.vclock, + Seen = State#chstate.seen, + Members = get_members(State#chstate.members, [valid, leaving, exiting]), + VClock = State#chstate.vclock, R = [begin case orddict:find(Node, Seen) of error -> @@ -1289,8 +1221,8 @@ ring_ready() -> 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]), + 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 @@ -1299,7 +1231,7 @@ ring_ready_info(State0) -> false -> Recent end - end, State?CHSTATE.vclock, Seen), + end, State#chstate.vclock, Seen), Outdated = orddict:filter(fun(Node, VC) -> (not vclock:equal(VC, RecentVC)) @@ -1329,7 +1261,7 @@ future_ring(State, false) -> %% 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]), + Leaving = get_members(FutureState#chstate.members, [leaving]), FutureState2 = lists:foldl(fun(Node, StateAcc) -> case indices(StateAcc, Node) of @@ -1339,14 +1271,14 @@ future_ring(State, false) -> StateAcc end end, FutureState, Leaving), - FutureState2?CHSTATE{next=[]}; -future_ring(State0=?CHSTATE{next=OldNext}, true) -> + 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}, + 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 @@ -1359,10 +1291,10 @@ future_ring(State0=?CHSTATE{next=OldNext}, true) -> end, [], OldNext), - Resized?CHSTATE{next=Next}; + Resized#chstate{next=Next}; true -> State1 = remove_meta('$resized_ring', State0), - State1?CHSTATE{next=[]} + State1#chstate{next=[]} end. pretty_print(Ring, Opts) -> @@ -1370,7 +1302,7 @@ pretty_print(Ring, Opts) -> OptLegend = lists:member(legend, Opts), Out = proplists:get_value(out, Opts, standard_io), TargetN = proplists:get_value(target_n, Opts, - app_helper:get_env(riak_core, target_n_val)), + application:get_env(riak_core, target_n_val, undefined)), Owners = riak_core_ring:all_members(Ring), Indices = riak_core_ring:all_owners(Ring), @@ -1419,79 +1351,7 @@ pretty_print(Ring, Opts) -> %% @doc Return a ring with all transfers cancelled - for claim sim cancel_transfers(Ring) -> - Ring?CHSTATE{next=[]}. - -%% =================================================================== -%% Legacy reconciliation -%% =================================================================== - -%% @doc Incorporate another node's state into our view of the Riak world. -legacy_reconcile(ExternState, MyState) -> - case vclock:equal(MyState#chstate.vclock, vclock:fresh()) of - true -> - {new_ring, #chstate{nodename=MyState#chstate.nodename, - vclock=ExternState#chstate.vclock, - chring=ExternState#chstate.chring, - meta=ExternState#chstate.meta}}; - false -> - case ancestors([ExternState, MyState]) of - [OlderState] -> - case vclock:equal(OlderState#chstate.vclock, - MyState#chstate.vclock) of - true -> - {new_ring, - #chstate{nodename=MyState#chstate.nodename, - vclock=ExternState#chstate.vclock, - chring=ExternState#chstate.chring, - meta=ExternState#chstate.meta}}; - false -> {no_change, MyState} - end; - [] -> - case legacy_equal_rings(ExternState,MyState) of - true -> {no_change, MyState}; - false -> {new_ring, - legacy_reconcile(MyState#chstate.nodename, - ExternState, MyState)} - end - end - end. - -%% @private -ancestors(RingStates) -> - Ancest = [[O2 || O2 <- RingStates, - vclock:descends(O1#chstate.vclock,O2#chstate.vclock), - (vclock:descends(O2#chstate.vclock,O1#chstate.vclock) == false)] - || O1 <- RingStates], - lists:flatten(Ancest). - -%% @private -legacy_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 - end. - -%% @private -% @doc If two states are mutually non-descendant, merge them anyway. -% This can cause a bit of churn, but should converge. -% @spec legacy_reconcile(MyNodeName :: term(), -% StateA :: chstate(), StateB :: chstate()) -% -> chstate() -legacy_reconcile(MyNodeName, StateA, StateB) -> - % take two states (non-descendant) and merge them - VClock = vclock:increment(MyNodeName, - vclock:merge([StateA#chstate.vclock, - StateB#chstate.vclock])), - CHRing = chash:merge_rings(StateA#chstate.chring,StateB#chstate.chring), - log_ring_result(CHRing), - Meta = merge_meta({StateA#chstate.nodename, StateA#chstate.meta}, {StateB#chstate.nodename, StateB#chstate.meta}), - #chstate{nodename=MyNodeName, - vclock=VClock, - chring=CHRing, - meta=Meta}. + Ring#chstate{next=[]}. %% ==================================================================== %% Internal functions @@ -1523,19 +1383,17 @@ pick_val({N1,M1}, {N2,M2}) -> %% @private %% Log ring metadata input and result for debug purposes log_meta_merge(M1, M2, Meta) -> - ?LOG_DEBUG("Meta A: ~p", [M1]), - ?LOG_DEBUG("Meta B: ~p", [M2]), - ?LOG_DEBUG("Meta result: ~p", [Meta]). + logger:debug("Meta A: ~p", [M1]), + logger:debug("Meta B: ~p", [M2]), + logger:debug("Meta result: ~p", [Meta]). %% @private %% 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_v2{vclock=V,members=Members,next=Next}) -> - ?LOG_DEBUG("Updated ring vclock: ~p, Members: ~p, Next: ~p", - [V, Members, Next]); -log_ring_result(Ring) -> - ?LOG_DEBUG("Ring: ~p", [Ring]). +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) -> @@ -1543,13 +1401,13 @@ 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, + VC1 = State3#chstate.vclock, + VC2 = OtherState3#chstate.vclock, %% vclock:merge has different results depending on order of input vclocks %% when input vclocks have same counter but different timestamps. We need %% merge to be deterministic here, hence the additional logic. @@ -1569,31 +1427,31 @@ internal_reconcile(State, OtherState) -> Equal = equal_cstate(State3, OtherState3), case {Equal, Newer, Older} of {_, true, false} -> - {SeenChanged, State3?CHSTATE{vclock=VC3}}; + {SeenChanged, State3#chstate{vclock=VC3}}; {_, false, true} -> - {true, OtherState3?CHSTATE{nodename=VNode, vclock=VC3}}; + {true, OtherState3#chstate{nodename=VNode, vclock=VC3}}; {true, _, _} -> - {SeenChanged, State3?CHSTATE{vclock=VC3}}; + {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}}; + {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, 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}), + 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}, + NewState1 = NewState#chstate{vclock=VClock, members=Members, meta=Meta}, log_ring_result(NewState1), NewState1. @@ -1618,14 +1476,14 @@ reconcile_members(StateA, StateB) -> {merge_status(Valid1, Valid2), MergeVC, MergeMeta} end end, - StateA?CHSTATE.members, - StateB?CHSTATE.members). + StateA#chstate.members, + StateB#chstate.members). %% @private reconcile_seen(StateA, StateB) -> 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, _) -> @@ -1679,8 +1537,8 @@ substitute(Idx, TL1, TL2) -> 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), @@ -1689,13 +1547,13 @@ reconcile_ring(StateA=?CHSTATE{claimant=Claimant1, rvsn=VC1, next=Next1}, case {EqualVC, V1Newer, V2Newer} of {true, _, _} -> Next = reconcile_next(Next1, Next2), - StateA?CHSTATE{next=Next}; + StateA#chstate{next=Next}; {_, true, false} -> Next = reconcile_divergent_next(Next1, Next2), - StateA?CHSTATE{next=Next}; + StateA#chstate{next=Next}; {_, false, true} -> Next = reconcile_divergent_next(Next2, Next1), - StateB?CHSTATE{next=Next}; + StateB#chstate{next=Next}; {_, _, _} -> %% Ring versions were divergent, so fall back to reconciling based %% on claimant. Under normal operation, divergent ring versions @@ -1708,10 +1566,10 @@ reconcile_ring(StateA=?CHSTATE{claimant=Claimant1, rvsn=VC1, next=Next1}, case {CValid1, CValid2} of {true, false} -> Next = reconcile_divergent_next(Next1, Next2), - StateA?CHSTATE{next=Next}; + StateA#chstate{next=Next}; {false, true} -> Next = reconcile_divergent_next(Next2, Next1), - StateB?CHSTATE{next=Next}; + 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 @@ -1721,10 +1579,10 @@ reconcile_ring(StateA=?CHSTATE{claimant=Claimant1, rvsn=VC1, next=Next1}, case Claimant1 < Claimant2 of true -> Next = reconcile_divergent_next(Next1, Next2), - StateA?CHSTATE{next=Next}; + StateA#chstate{next=Next}; false -> Next = reconcile_divergent_next(Next2, Next1), - StateB?CHSTATE{next=Next} + StateB#chstate{next=Next} end; {true, true} -> %% This should never happen in normal practice. @@ -1732,10 +1590,10 @@ reconcile_ring(StateA=?CHSTATE{claimant=Claimant1, rvsn=VC1, next=Next1}, case Claimant1 < Claimant2 of true -> Next = reconcile_divergent_next(Next1, Next2), - StateA?CHSTATE{next=Next}; + StateA#chstate{next=Next}; false -> Next = reconcile_divergent_next(Next2, Next1), - StateB?CHSTATE{next=Next} + StateB#chstate{next=Next} end end end. @@ -1769,7 +1627,7 @@ merge_status(_, _) -> invalid. %% @private -transfer_complete(CState=?CHSTATE{next=Next, vclock=VClock}, Idx, Mod) -> +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 = @@ -1785,7 +1643,7 @@ transfer_complete(CState=?CHSTATE{next=Next, vclock=VClock}, Idx, Mod) -> 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) -> @@ -1796,27 +1654,33 @@ get_members(Members, 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, 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. - T5 = (remaining_fields(StateA) =:= remaining_fields(StateB)), + 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. @@ -1844,8 +1708,8 @@ equal_seen(StateA, StateB) -> lists:all(fun(X) -> X =:= true end, R). %% @private -filtered_seen(State=?CHSTATE{seen=Seen}) -> - case get_members(State?CHSTATE.members) of +filtered_seen(State=#chstate{seen=Seen}) -> + case get_members(State#chstate.members) of [] -> Seen; Members -> @@ -1861,11 +1725,11 @@ sequence_test() -> I1 = 365375409332725729550921208179070754913983135744, I2 = 730750818665451459101842416358141509827966271488, A = fresh(4,a), - B1 = A?CHSTATE{nodename=b}, + 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}, + C1 = A#chstate{nodename=c}, C2 = transfer_node(I1, c, C1), {new_ring, A2} = reconcile(C2,A1), {new_ring, A3} = reconcile(B2,A2), @@ -1873,8 +1737,8 @@ sequence_test() -> {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). + ?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), @@ -1898,7 +1762,7 @@ reconcile_test() -> ?assertNot(equal_cstate(Ring1, Ring2, false)), RingB0 = fresh(2,node()), RingB1 = transfer_node(0,x,RingB0), - RingB2 = RingB1?CHSTATE{nodename=b}, + RingB2 = RingB1#chstate{nodename=b}, ?assertMatch({no_change,_},reconcile(Ring1,RingB2)), {no_change, RingB3} = reconcile(Ring1,RingB2), ?assert(equal_cstate(RingB2, RingB3)). @@ -1907,18 +1771,18 @@ 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})), + ?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})})), + 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})})). + get_meta(key,#chstate{meta= + merge_meta({'node2',Ring2#chstate.meta}, + {'node1',Ring1#chstate.meta})})). metadata_remove_test() -> Ring0 = fresh(2, node()), @@ -1927,8 +1791,8 @@ metadata_remove_test() -> 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})})). + ?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()), @@ -2016,38 +1880,38 @@ ring_version_test() -> Ring2 = add_member(node(), Ring1, nodeA), Ring3 = add_member(node(), Ring2, nodeB), ?assertEqual(nodeA, claimant(Ring3)), - ?CHSTATE{rvsn=RVsn, vclock=VClock} = 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)), %% RingB1 has most recent ring version {_, RingT2} = reconcile(RingA2, - RingB2?CHSTATE{rvsn=vclock:increment(nodeB, RVsn)}), + 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)}), + {_, 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)}), + {_, 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)}), + {_, 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() -> @@ -2106,11 +1970,12 @@ lasgasp_test() -> resize_xfer_test_() -> {setup, fun() -> + meck:unload(), meck:new(riak_core, [passthrough]), meck:expect(riak_core, vnode_modules, fun() -> [{some_app, fake_vnode}, {other_app, other_vnode}] end) end, - fun(_) -> meck:unload(riak_core) end, + fun(_) -> meck:unload() end, fun test_resize_xfers/0}. test_resize_xfers() -> diff --git a/src/riak_core_ring_handler.erl b/src/riak_core_ring_handler.erl index a13a4af61..f675164c5 100644 --- a/src/riak_core_ring_handler.erl +++ b/src/riak_core_ring_handler.erl @@ -12,7 +12,7 @@ %% specific language governing permissions and limitations %% under the License. -%% Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved. +%% Copyright (c) 2007-2015 Basho Technologies, Inc. All Rights Reserved. -module(riak_core_ring_handler). -behaviour(gen_event). diff --git a/src/riak_core_ring_manager.erl b/src/riak_core_ring_manager.erl index 115d0692b..737a88499 100644 --- a/src/riak_core_ring_manager.erl +++ b/src/riak_core_ring_manager.erl @@ -2,7 +2,7 @@ %% %% riak_core: Core Riak Application %% -%% Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved. +%% Copyright (c) 2007-2015 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 @@ -84,13 +84,17 @@ ring_trans/2, run_fixups/3, set_cluster_name/1, - stop/0, is_stable_ring/0]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). --include_lib("kernel/include/logger.hrl"). +-ifdef(TEST). + +-export([stop/0]). + +-endif. + -record(state, { mode, @@ -224,7 +228,7 @@ force_update() -> ring_trans( fun(Ring, _) -> NewRing = riak_core_ring:update_member_meta(node(), Ring, node(), - unused, os:timestamp()), %% normally, should be a vclock. + unused, erlang:timestamp()), {new_ring, NewRing} end, []), ok. @@ -236,7 +240,7 @@ do_write_ringfile(Ring) -> {{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 = app_helper:get_env(riak_core, cluster_name), + Cluster = application:get_env(riak_core, cluster_name, undefined), FN = Dir ++ "/riak_core_ring." ++ Cluster ++ TS, do_write_ringfile(Ring, FN) end. @@ -248,7 +252,7 @@ do_write_ringfile(Ring, FN) -> ok = riak_core_util:replace_file(FN, term_to_binary(Ring)) catch _:Err -> - ?LOG_ERROR("Unable to write ring to \"~s\" - ~p\n", [FN, Err]), + logger:error("Unable to write ring to \"~s\" - ~p\n", [FN, Err]), {error,Err} end. @@ -258,7 +262,7 @@ find_latest_ringfile() -> Dir = ring_dir(), case file:list_dir(Dir) of {ok, Filenames} -> - Cluster = app_helper:get_env(riak_core, cluster_name), + 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], @@ -289,7 +293,7 @@ prune_ringfiles() -> case ring_dir() of "" -> ok; Dir -> - Cluster = app_helper:get_env(riak_core, cluster_name), + Cluster = application:get_env(riak_core, cluster_name, undefined), case file:list_dir(Dir) of {error,enoent} -> ok; {error, Reason} -> @@ -324,10 +328,15 @@ prune_ringfiles() -> end end. - +-ifdef(TEST). %% @private (only used for test instances) stop() -> - gen_server:cast(?MODULE, stop). + try + gen_server:call(?MODULE, stop) + catch + exit:{noproc, _} -> ok + end. +-endif. %% =================================================================== @@ -337,9 +346,8 @@ stop() -> init([Mode]) -> setup_ets(Mode), Ring = reload_ring(Mode), - Ring2 = node_level_config(Ring), - State = set_ring(Ring2, #state{mode = Mode}), - riak_core_ring_events:ring_update(Ring2), + State = set_ring(Ring, #state{mode = Mode}), + riak_core_ring_events:ring_update(Ring), {ok, State}. reload_ring(test) -> @@ -349,25 +357,18 @@ reload_ring(live) -> {ok, RingFile} -> case riak_core_ring_manager:read_ringfile(RingFile) of {error, Reason} -> - ?LOG_CRITICAL("Failed to read ring file: ~p", - [Reason]), + logger:critical("Failed to read ring file: ~p", + [riak_core_util:posix_error(Reason)]), throw({error, Reason}); Ring -> - %% Upgrade the ring data structure if necessary. - case riak_core_ring:legacy_ring(Ring) of - true -> - ?LOG_INFO("Upgrading legacy ring"), - riak_core_ring:upgrade(Ring); - false -> - Ring - end + Ring end; {error, not_found} -> - ?LOG_WARNING("No ring file available."), + logger:warning("No ring file available."), riak_core_ring:fresh(); {error, Reason} -> - ?LOG_CRITICAL("Failed to load ring file: ~p", - [Reason]), + logger:critical("Failed to load ring file: ~p", + [riak_core_util:posix_error(Reason)]), throw({error, Reason}) end. @@ -376,8 +377,7 @@ handle_call(get_raw_ring, _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, RingIn}, _From, State) -> - Ring = riak_core_ring:upgrade(RingIn), +handle_call({set_my_ring, Ring}, _From, State) -> State2 = prune_write_notify_ring(Ring, State), {reply,ok,State2}; handle_call(refresh_my_ring, _From, State) -> @@ -417,7 +417,7 @@ handle_call({ring_trans, Fun, Args}, _From, State=#state{raw_ring=Ring}) -> {ignore, Reason} -> {reply, {not_changed, Reason}, State}; Other -> - ?LOG_ERROR("ring_trans: invalid return value: ~p", + logger:error("ring_trans: invalid return value: ~p", [Other]), {reply, not_changed, State} end; @@ -427,10 +427,10 @@ handle_call({set_cluster_name, Name}, _From, State=#state{raw_ring=Ring}) -> {reply, ok, State2}; handle_call(is_stable_ring, _From, State) -> {IsStable, _DeltaMS} = is_stable_ring(State), - {reply, IsStable, State}. + {reply, IsStable, State}; -handle_cast(stop, State) -> - {stop,normal,State}; +handle_call(stop, _From, State) -> + {stop,normal, ok, State}. handle_cast({refresh_my_ring, ClusterName}, State) -> {ok, Ring} = get_my_ring(), @@ -455,7 +455,7 @@ handle_cast(write_ringfile, State=#state{raw_ring=Ring}) -> handle_info(inactivity_timeout, State) -> case is_stable_ring(State) of {true,DeltaMS} -> - ?LOG_DEBUG("Promoting ring after ~p", [DeltaMS]), + logger:debug("Promoting ring after ~p", [DeltaMS]), promote_ring(), State2 = State#state{inactivity_timer=undefined}, {noreply, State2}; @@ -483,9 +483,9 @@ code_change(_OldVsn, State, _Extra) -> %% =================================================================== ring_dir() -> - case app_helper:get_env(riak_core, ring_state_dir) of + case application:get_env(riak_core, ring_state_dir, undefined) of undefined -> - filename:join(app_helper:get_env(riak_core, platform_data_dir, "data"), "ring"); + filename:join(application:get_env(riak_core, platform_data_dir, "data"), "ring"); D -> D end. @@ -508,27 +508,19 @@ run_fixups([{App, Fixup}|T], BucketName, BucketProps) -> {ok, NewBucketProps} -> NewBucketProps; {error, Reason} -> - ?LOG_ERROR("Error while running bucket fixup module " + logger:error("Error while running bucket fixup module " "~p from application ~p on bucket ~p: ~p", [Fixup, App, BucketName, Reason]), BucketProps catch What:Why -> - ?LOG_ERROR("Crash while running bucket fixup module " + 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). -%% Add node level configs to ring --spec node_level_config(riak_core_ring:riak_core_ring()) -> riak_core_ring:riak_core_ring(). -node_level_config(Ring) -> - %% Check node participation in coverage queries and update ring - Node = node(), - ParticipateInCoverage = app_helper:get_env(riak_core,participate_in_coverage), - riak_core_ring:update_member_meta(Node, Ring, Node, participate_in_coverage, ParticipateInCoverage). - set_ring(Ring, State) -> set_ring_global(Ring), Now = os:timestamp(), @@ -706,46 +698,54 @@ set_my_ring_test() -> cleanup_ets(test). refresh_my_ring_test() -> - setup_ets(test), - Core_Settings = [{ring_creation_size, 4}, - {ring_state_dir, "/tmp"}, - {cluster_name, "test"}], - [begin - put({?MODULE,AppKey}, app_helper:get_env(riak_core, AppKey)), - ok = application:set_env(riak_core, AppKey, Val) - end || {AppKey, Val} <- Core_Settings], - riak_core_ring_events:start_link(), - riak_core_ring_manager:start_link(test), - riak_core_claimant:start_link(), - 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()), - riak_core_ring_manager:stop(), - riak_core_claimant:stop(), - %% 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. - --ifndef(GITHUBEXCLUDE). - --define(TEST_RINGDIR, "ring_manager_eunit"). --define(TEST_RINGFILE, (?TEST_RINGDIR ++ "/test.ring")). + {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), + riak_core_test_util:stop_pid(riak_core_ring_manager), + riak_core_test_util:stop_pid(riak_core_vnode_sup), + 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")). + do_write_ringfile_test() -> %% Make sure no data exists from previous runs file:change_mode(?TMP_RINGFILE, 8#00644), file:delete(?TMP_RINGFILE), - file:change_mode(?TEST_RINGFILE, 8#00644), - file:delete(?TEST_RINGFILE), %% Check happy path GenR = fun(Name) -> riak_core_ring:fresh(64, Name) end, ?assertEqual(ok, do_write_ringfile(GenR(happy), ?TEST_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:change_mode(?TMP_RINGFILE, 8#00444), @@ -757,10 +757,12 @@ do_write_ringfile_test() -> ok = file:change_mode(?TEST_RINGDIR, 8#00444), ?assertMatch({error,_}, do_write_ringfile(GenR(ring_perms), ?TEST_RINGFILE)), ok = file:change_mode(?TEST_RINGDIR, 8#00755), - ok = file:change_mode(?TEST_RINGFILE, 8#00644), - ok = file:delete(?TEST_RINGFILE). --endif. + error_logger:tty(true), + + %% Cleanup the ring file created for this test + {ok, RingFile} = find_latest_ringfile(), + file:delete(RingFile). is_stable_ring_test() -> {A,B,C} = Now = os:timestamp(), diff --git a/src/riak_core_ring_util.erl b/src/riak_core_ring_util.erl index 50693a1ec..5b27783e4 100644 --- a/src/riak_core_ring_util.erl +++ b/src/riak_core_ring_util.erl @@ -146,6 +146,47 @@ boundary_test() -> -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), diff --git a/src/riak_core_security.erl b/src/riak_core_security.erl deleted file mode 100644 index 610669e90..000000000 --- a/src/riak_core_security.erl +++ /dev/null @@ -1,1328 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2013 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(riak_core_security). - -%% printing functions --export([print_users/0, print_sources/0, print_user/1, - print_groups/0, print_group/1, print_grants/1]). - -%% type exports --export_type([context/0]). - -%% API --export([authenticate/3, add_user/2, alter_user/2, del_user/1, - add_group/2, alter_group/2, del_group/1, - add_source/4, del_source/2, - add_grant/3, add_revoke/3, check_permission/2, check_permissions/2, - get_username/1, is_enabled/0, enable/0, disable/0, status/0, - get_ciphers/0, set_ciphers/1, print_ciphers/0]). - --include_lib("kernel/include/logger.hrl"). - --define(DEFAULT_CIPHER_LIST, -":DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256" -":DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384" -":ADH-AES256-GCM-SHA384:ADH-AES128-GCM-SHA256" -":DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256" -":DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA" -":AES128-GCM-SHA256:AES256-GCM-SHA384" -":SRP-DSS-AES-128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:DHE-DSS-AES128-SHA" -":AECDH-AES128-SHA:SRP-AES-128-CBC-SHA:ADH-AES128-SHA256:ADH-AES128-SHA" -":AES128-SHA256:AES128-SHA:SRP-DSS-AES-256-CBC-SHA" -":SRP-RSA-AES-256-CBC-SHA:DHE-DSS-AES256-SHA256:AECDH-AES256-SHA" -":SRP-AES-256-CBC-SHA:ADH-AES256-SHA256:ADH-AES256-SHA" -":AES256-SHA256:AES256-SHA:RC4-SHA" -":DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:ADH-CAMELLIA256-SHA" -":CAMELLIA256-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-DSS-CAMELLIA128-SHA" -":ADH-CAMELLIA128-SHA:CAMELLIA128-SHA"). - --define(TOMBSTONE, '$deleted'). - -%% Avoid whitespace, control characters, comma, semi-colon, -%% non-standard Windows-only characters, other misc --define(ILLEGAL, lists:seq(0, 44) ++ lists:seq(58, 63) ++ - lists:seq(127, 191)). - --ifdef(TEST). --define(REFRESH_TIME, 1). --else. --define(REFRESH_TIME, 1000). --endif. - --record(context, - {username, - grants, - epoch}). - --type context() :: #context{}. --type bucket() :: {binary(), binary()} | binary(). --type permission() :: {string()} | {string(), bucket()}. --type userlist() :: all | [string()]. - -prettyprint_users([all], _) -> - "all"; -prettyprint_users(Users0, Width) -> - %% my kingdom for an iolist join... - Users = [unicode:characters_to_list(U, utf8) || U <- Users0], - prettyprint_permissions(Users, Width). - -print_sources() -> - Sources = riak_core_metadata:fold(fun({{Username, CIDR}, [{Source, Options}]}, Acc) -> - [{Username, CIDR, Source, Options}|Acc]; - ({{_, _}, [?TOMBSTONE]}, Acc) -> - Acc - end, [], {<<"security">>, <<"sources">>}), - - print_sources(Sources). - -print_sources(Sources) -> - GS = group_sources(Sources), - riak_core_console_table:print([{users, 20}, {cidr, 10}, {source, 10}, {options, 10}], - [[prettyprint_users(Users, 20), prettyprint_cidr(CIDR), - atom_to_list(Source), io_lib:format("~p", [Options])] || - {Users, CIDR, Source, Options} <- GS]). - --spec print_user(Username :: string()) -> - ok | {error, term()}. -print_user(User) -> - Name = name2bin(User), - Details = user_details(Name), - case Details of - undefined -> - {error, {unknown_user, Name}}; - _ -> - print_users([{Name, [Details]}]) - end. - -print_users() -> - Users = riak_core_metadata:fold(fun({_Username, [?TOMBSTONE]}, Acc) -> - Acc; - ({Username, Options}, Acc) -> - [{Username, Options}|Acc] - end, [], {<<"security">>, <<"users">>}), - print_users(Users). - - -print_users(Users) -> - riak_core_console_table:print([{username, 10}, {'member of', 15}, {password, 40}, {options, 30}], - [begin - Groups = case proplists:get_value("groups", Options) of - undefined -> - ""; - List -> - prettyprint_permissions([unicode:characters_to_list(R, utf8) - || R <- List, - group_exists(R)], 20) - end, - Password = case proplists:get_value("password", Options) of - undefined -> - ""; - Pw -> - proplists:get_value(hash_pass, Pw) - end, - OtherOptions = lists:keydelete("password", 1, - lists:keydelete("groups", 1, - Options)), - [Username, Groups, Password, - lists:flatten(io_lib:format("~p", [OtherOptions]))] - end || - {Username, [Options]} <- Users]). - --spec print_group(Group :: string()) -> - ok | {error, term()}. -print_group(Group) -> - Name = name2bin(Group), - Details = group_details(Name), - case Details of - undefined -> - {error, {unknown_group, Name}}; - _ -> - print_groups([{Name, [Details]}]) - end. - -print_groups() -> - Groups = riak_core_metadata:fold(fun({_Groupname, [?TOMBSTONE]}, Acc) -> - Acc; - ({Groupname, Options}, Acc) -> - [{Groupname, Options}|Acc] - end, [], {<<"security">>, <<"groups">>}), - print_groups(Groups). - -print_groups(Groups) -> - riak_core_console_table:print([{group, 10}, {'member of', 15}, {options, 30}], - [begin - GroupOptions = case proplists:get_value("groups", Options) of - undefined -> - ""; - List -> - prettyprint_permissions([unicode:characters_to_list(R, utf8) - || R <- List, - group_exists(R)], 20) - end, - OtherOptions = lists:keydelete("groups", 1, Options), - [Groupname, GroupOptions, - lists:flatten(io_lib:format("~p", [OtherOptions]))] - end || - {Groupname, [Options]} <- Groups]). - --spec print_grants(Rolename :: string()) -> - ok | {error, term()}. -print_grants(RoleName) -> - Name = name2bin(RoleName), - case is_prefixed(Name) of - true -> - print_grants(chop_name(Name), role_type(Name)); - false -> - case { print_grants(Name, user), print_grants(Name, group) } of - {{error, _}, {error, _}} -> - {error, {unknown_role, Name}}; - _ -> - ok - end - end. - -print_grants(User, unknown) -> - {error, {unknown_role, User}}; -print_grants(User, user) -> - case user_details(User) of - undefined -> - {error, {unknown_user, User}}; - _U -> - Grants = accumulate_grants(User, user), - - riak_core_console_table:print( - io_lib:format("Inherited permissions (user/~ts)", [User]), - [{group, 20}, {type, 10}, {bucket, 10}, {grants, 40}], - [begin - case Bucket of - any -> - [chop_name(Username), "*", "*", - prettyprint_permissions(Permissions, 40)]; - {T, B} -> - [chop_name(Username), T, B, - prettyprint_permissions(Permissions, 40)]; - T -> - [chop_name(Username), T, "*", - prettyprint_permissions(Permissions, 40)] - end - end || - {{Username, Bucket}, Permissions} <- Grants, Username /= <<"user/", User/binary>>]), - - riak_core_console_table:print( - io_lib:format("Dedicated permissions (user/~ts)", [User]), - [{type, 10}, {bucket, 10}, {grants, 40}], - [begin - case Bucket of - any -> - ["*", "*", - prettyprint_permissions(Permissions, 40)]; - {T, B} -> - [T, B, - prettyprint_permissions(Permissions, 40)]; - T -> - [T, "*", - prettyprint_permissions(Permissions, 40)] - end - end || - {{Username, Bucket}, Permissions} <- Grants, Username == <<"user/", User/binary>>]), - GroupedGrants = group_grants(Grants), - - riak_core_console_table:print( - io_lib:format("Cumulative permissions (user/~ts)", [User]), - [{type, 10}, {bucket, 10}, {grants, 40}], - [begin - case Bucket of - any -> - ["*", "*", - prettyprint_permissions(Permissions, 40)]; - {T, B} -> - [T, B, - prettyprint_permissions(Permissions, 40)]; - T -> - [T, "*", - prettyprint_permissions(Permissions, 40)] - end - end || - {Bucket, Permissions} <- GroupedGrants]), - ok - end; -print_grants(Group, group) -> - case group_details(Group) of - undefined -> - {error, {unknown_group, Group}}; - _U -> - Grants = accumulate_grants(Group, group), - - riak_core_console_table:print( - io_lib:format("Inherited permissions (group/~ts)", [Group]), - [{group, 20}, {type, 10}, {bucket, 10}, {grants, 40}], - [begin - case Bucket of - any -> - [chop_name(Groupname), "*", "*", - prettyprint_permissions(Permissions, 40)]; - {T, B} -> - [chop_name(Groupname), T, B, - prettyprint_permissions(Permissions, 40)]; - T -> - [chop_name(Groupname), T, "*", - prettyprint_permissions(Permissions, 40)] - end - end || - {{Groupname, Bucket}, Permissions} <- Grants, chop_name(Groupname) /= Group]), - - riak_core_console_table:print( - io_lib:format("Dedicated permissions (group/~ts)", [Group]), - [{type, 10}, {bucket, 10}, {grants, 40}], - [begin - case Bucket of - any -> - ["*", "*", - prettyprint_permissions(Permissions, 40)]; - {T, B} -> - [T, B, - prettyprint_permissions(Permissions, 40)]; - T -> - [T, "*", - prettyprint_permissions(Permissions, 40)] - end - end || - {{Groupname, Bucket}, Permissions} <- Grants, chop_name(Groupname) == Group]), - GroupedGrants = group_grants(Grants), - - riak_core_console_table:print( - io_lib:format("Cumulative permissions (group/~ts)", [Group]), - [{type, 10}, {bucket, 10}, {grants, 40}], - [begin - case Bucket of - any -> - ["*", "*", - prettyprint_permissions(Permissions, 40)]; - {T, B} -> - [T, B, - prettyprint_permissions(Permissions, 40)]; - T -> - [T, "*", - prettyprint_permissions(Permissions, 40)] - end - end || - {Bucket, Permissions} <- GroupedGrants]), - ok - end. - -prettyprint_permissions(Permissions, Width) -> - prettyprint_permissions(lists:sort(Permissions), Width, []). - -prettyprint_permissions([], _Width, Acc) -> - string:join([string:join(Line, ", ") || Line <- lists:reverse(Acc)], ",\n"); -prettyprint_permissions([Permission|Rest], Width, [H|T] =Acc) -> - case length(Permission) + lists:flatlength(H) + 2 + (2 * length(H)) > Width of - true -> - prettyprint_permissions(Rest, Width, [[Permission] | Acc]); - false -> - prettyprint_permissions(Rest, Width, [[Permission|H]|T]) - end; -prettyprint_permissions([Permission|Rest], Width, Acc) -> - prettyprint_permissions(Rest, Width, [[Permission] | Acc]). - --spec check_permission(Permission :: permission(), Context :: context()) -> - {true, context()} | {false, binary(), context()}. -check_permission({Permission}, Context0) -> - Context = maybe_refresh_context(Context0), - %% The user needs to have this permission applied *globally* - %% This is for things like mapreduce with undetermined inputs or - %% permissions that don't tie to a particular bucket, like 'ping' and - %% 'stats'. - MatchG = match_grant(any, Context#context.grants), - case lists:member(Permission, MatchG) of - true -> - {true, Context}; - false -> - %% no applicable grant - {false, unicode:characters_to_binary( - ["Permission denied: User '", - Context#context.username, "' does not have '", - Permission, "' on any"], utf8, utf8), Context} - end; -check_permission({Permission, Bucket}, Context0) -> - Context = maybe_refresh_context(Context0), - MatchG = match_grant(Bucket, Context#context.grants), - case lists:member(Permission, MatchG) of - true -> - {true, Context}; - false -> - %% no applicable grant - {false, unicode:characters_to_binary( - ["Permission denied: User '", - Context#context.username, "' does not have '", - Permission, "' on ", - bucket2iolist(Bucket)], utf8, utf8), Context} - end. - -check_permissions(Permission, Ctx) when is_tuple(Permission) -> - %% single permission - check_permission(Permission, Ctx); -check_permissions([], Ctx) -> - {true, Ctx}; -check_permissions([Permission|Rest], Ctx) -> - case check_permission(Permission, Ctx) of - {true, NewCtx} -> - check_permissions(Rest, NewCtx); - Other -> - %% return non-standard result - Other - end. - -get_username(#context{username=Username}) -> - Username. - --spec authenticate(Username::binary(), Password::binary(), ConnInfo :: - [{atom(), any()}]) -> {ok, context()} | {error, term()}. -authenticate(Username, Password, ConnInfo) -> - case user_details(Username) of - undefined -> - {error, unknown_user}; - UserData -> - Sources0 = riak_core_metadata:fold(fun({{Un, CIDR}, [{Source, Options}]}, Acc) -> - [{Un, CIDR, Source, Options}|Acc]; - ({{_, _}, [?TOMBSTONE]}, Acc) -> - Acc - end, [], {<<"security">>, <<"sources">>}), - Sources = sort_sources(Sources0), - case match_source(Sources, Username, - proplists:get_value(ip, ConnInfo)) of - {ok, Source, SourceOptions} -> - case Source of - trust -> - %% trust always authenticates - {ok, get_context(Username)}; - password -> - %% pull the password out of the userdata - case lookup("password", UserData) of - undefined -> - ?LOG_WARNING("User ~p is configured for " - "password authentication, but has " - "no password", [Username]), - {error, missing_password}; - PasswordData -> - HashedPass = lookup(hash_pass, PasswordData), - HashFunction = lookup(hash_func, PasswordData), - Salt = lookup(salt, PasswordData), - Iterations = lookup(iterations, PasswordData), - case riak_core_pw_auth:check_password(Password, - HashedPass, - HashFunction, - Salt, - Iterations) of - true -> - {ok, get_context(Username)}; - false -> - {error, bad_password} - end - end; - certificate -> - case proplists:get_value(common_name, ConnInfo) of - undefined -> - {error, no_common_name}; - CN -> - %% TODO postgres support a map from - %% common-name to username, should we? - case name2bin(CN) == Username of - true -> - {ok, get_context(Username)}; - false -> - {error, common_name_mismatch} - end - end; - Source -> - %% check for a dynamically registered auth module - AuthMods = app_helper:get_env(riak_core, - auth_mods, []), - case proplists:get_value(Source, AuthMods) of - undefined -> - ?LOG_WARNING("User ~p is configured with unknown " - "authentication source ~p", - [Username, Source]), - {error, unknown_source}; - AuthMod -> - case AuthMod:auth(Username, Password, - UserData, SourceOptions) of - ok -> - {ok, get_context(Username)}; - error -> - {error, bad_password} - end - end - end; - {error, Reason} -> - {error, Reason} - end - end. - --spec add_user(Username :: string(), Options :: [{string(), term()}]) -> - ok | {error, term()}. -add_user(Username, Options) -> - add_role(name2bin(Username), Options, - fun user_exists/1, - {<<"security">>, <<"users">>}). - --spec add_group(Groupname :: string(), Options :: [{string(), term()}]) -> - ok | {error, term()}. -add_group(Groupname, Options) -> - add_role(name2bin(Groupname), Options, fun group_exists/1, - {<<"security">>, <<"groups">>}). - -add_role(<<"all">>, _Options, _Fun, _Prefix) -> - {error, reserved_name}; -add_role(<<"on">>, _Options, _Fun, _Prefix) -> - {error, reserved_name}; -add_role(<<"to">>, _Options, _Fun, _Prefix) -> - {error, reserved_name}; -add_role(<<"from">>, _Options, _Fun, _Prefix) -> - {error, reserved_name}; -add_role(<<"any">>, _Options, _Fun, _Prefix) -> - {error, reserved_name}; -add_role(Name, Options, ExistenceFun, Prefix) -> - case illegal_name_chars(unicode:characters_to_list(Name, utf8)) of - false -> - case ExistenceFun(unicode:characters_to_list(Name, utf8)) of - false -> - case validate_options(Options) of - {ok, NewOptions} -> - riak_core_metadata:put(Prefix, Name, NewOptions), - ok; - Error -> - Error - end; - true -> - {error, role_exists} - end; - true -> - {error, illegal_name_char} - end. - - --spec alter_user(Username :: string(), Options :: [{string(), term()}]) -> - ok | {error, term()}. -alter_user("all", _Options) -> - {error, reserved_name}; -alter_user(Username, Options) -> - Name = name2bin(Username), - case user_details(Name) of - undefined -> - {error, {unknown_user, Name}}; - UserData -> - case validate_options(Options) of - {ok, NewOptions} -> - MergedOptions = lists:ukeymerge(1, lists:sort(NewOptions), - lists:sort(UserData)), - - riak_core_metadata:put({<<"security">>, <<"users">>}, - Name, MergedOptions), - ok; - Error -> - Error - end - end. - --spec alter_group(Groupname :: string(), Options :: [{string(), term()}]) -> - ok | {error, term()}. -alter_group("all", _Options) -> - {error, reserved_name}; -alter_group(Groupname, Options) -> - Name = name2bin(Groupname), - case group_details(Groupname) of - undefined -> - {error, {unknown_group, Name}}; - GroupData -> - case validate_groups_option(Options) of - {ok, NewOptions} -> - MergedOptions = lists:ukeymerge(1, lists:sort(NewOptions), - lists:sort(GroupData)), - - riak_core_metadata:put({<<"security">>, <<"groups">>}, - Name, MergedOptions), - ok; - Error -> - Error - end - end. - --spec del_user(Username :: string()) -> - ok | {error, term()}. -del_user("all") -> - {error, reserved_name}; -del_user(Username) -> - Name = name2bin(Username), - case user_exists(Name) of - false -> - {error, {unknown_user, Name}}; - true -> - riak_core_metadata:delete({<<"security">>, <<"users">>}, - Name), - %% delete any associated grants, so if a user with the same name - %% is added again, they don't pick up these grants - Prefix = {<<"security">>, <<"usergrants">>}, - riak_core_metadata:fold(fun({Key, _Value}, Acc) -> - %% apparently destructive - %% iteration is allowed - riak_core_metadata:delete(Prefix, Key), - Acc - end, undefined, - Prefix, - [{match, {Name, '_'}}]), - delete_user_from_sources(Name), - ok - end. - --spec del_group(Groupname :: string()) -> - ok | {error, term()}. -del_group("all") -> - {error, reserved_name}; -del_group(Groupname) -> - Name = name2bin(Groupname), - case group_exists(Name) of - false -> - {error, {unknown_group, Name}}; - true -> - riak_core_metadata:delete({<<"security">>, <<"groups">>}, - Name), - %% delete any associated grants, so if a user with the same name - %% is added again, they don't pick up these grants - Prefix = {<<"security">>, <<"groupgrants">>}, - riak_core_metadata:fold(fun({Key, _Value}, Acc) -> - %% apparently destructive - %% iteration is allowed - riak_core_metadata:delete(Prefix, Key), - Acc - end, undefined, - Prefix, - [{match, {Name, '_'}}]), - delete_group_from_roles(Name), - ok - end. - --spec add_grant(userlist(), bucket() | any, [string()]) -> ok | {error, term()}. -add_grant(all, Bucket, Grants) -> - %% all is always valid - case validate_permissions(Grants) of - ok -> - add_grant_int([{all, group}], bucket2bin(Bucket), Grants); - Error -> - Error - end; -add_grant(RoleList, Bucket, Grants) -> - RoleTypes = lists:map( - fun(Name) -> {chop_name(name2bin(Name)), - role_type(name2bin(Name))} end, - RoleList - ), - - UnknownRoles = lists:foldl( - fun({Name, unknown}, Accum) -> - Accum ++ [Name]; - ({_Name, _Type}, Accum) -> - Accum - end, - [], RoleTypes), - - NameOverlaps = lists:foldl( - fun({Name, both}, Accum) -> - Accum ++ [Name]; - ({_Name, _Type}, Accum) -> - Accum - end, - [], RoleTypes), - - case check_grant_blockers(UnknownRoles, NameOverlaps, - validate_permissions(Grants)) of - none -> - add_grant_int(RoleTypes, bucket2bin(Bucket), Grants); - Error -> - Error - end. - - --spec add_revoke(userlist(), bucket() | any, [string()]) -> ok | {error, term()}. -add_revoke(all, Bucket, Revokes) -> - %% all is always valid - case validate_permissions(Revokes) of - ok -> - add_revoke_int([{all, group}], bucket2bin(Bucket), Revokes); - Error -> - Error - end; -add_revoke(RoleList, Bucket, Revokes) -> - RoleTypes = lists:map( - fun(Name) -> {chop_name(name2bin(Name)), - role_type(name2bin(Name))} end, - RoleList - ), - - UnknownRoles = lists:foldl( - fun({Name, unknown}, Accum) -> - Accum ++ [Name]; - ({_Name, _Type}, Accum) -> - Accum - end, - [], RoleTypes), - - NameOverlaps = lists:foldl( - fun({Name, both}, Accum) -> - Accum ++ [Name]; - ({_Name, _Type}, Accum) -> - Accum - end, - [], RoleTypes), - - case check_grant_blockers(UnknownRoles, NameOverlaps, - validate_permissions(Revokes)) of - none -> - add_revoke_int(RoleTypes, bucket2bin(Bucket), Revokes); - Error -> - Error - end. - --spec add_source(userlist(), CIDR :: {inet:ip_address(), non_neg_integer()}, - Source :: atom(), - Options :: [{string(), term()}]) -> ok | {error, term()}. -add_source(all, CIDR, Source, Options) -> - %% all is always valid - - %% TODO check if there are already 'user' sources for this CIDR - %% with the same source - riak_core_metadata:put({<<"security">>, <<"sources">>}, - {all, anchor_mask(CIDR)}, - {Source, Options}), - ok; -add_source(Users, CIDR, Source, Options) -> - UserList = lists:map(fun name2bin/1, Users), - - %% We only allow sources to be assigned to users, so don't check - %% for valid group names - UnknownUsers = unknown_roles(UserList, user), - - Valid = case UnknownUsers of - [] -> - %% TODO check if there is already an 'all' source for this CIDR - %% with the same source - ok; - _ -> - {error, {unknown_users, UnknownUsers}} - end, - - case Valid of - ok -> - %% add a source for each user - add_source_int(UserList, anchor_mask(CIDR), Source, - Options), - ok; - Error -> - Error - end. - -del_source(all, CIDR) -> - %% all is always valid - riak_core_metadata:delete({<<"security">>, <<"sources">>}, - {all, anchor_mask(CIDR)}), - ok; -del_source(Users, CIDR) -> - UserList = lists:map(fun name2bin/1, Users), - _ = [riak_core_metadata:delete({<<"security">>, <<"sources">>}, - {User, anchor_mask(CIDR)}) || User <- UserList], - ok. - -is_enabled() -> - try riak_core_capability:get({riak_core, security}) of - true -> - case riak_core_metadata:get({<<"security">>, <<"status">>}, - enabled) of - true -> - true; - _ -> - false - end; - _ -> - false - catch - throw:{unknown_capability, {riak_core, security}} -> - false - end. - -enable() -> - case riak_core_capability:get({riak_core, security}) of - true -> - riak_core_metadata:put({<<"security">>, <<"status">>}, - enabled, true); - false -> - not_supported - end. - -get_ciphers() -> - case riak_core_metadata:get({<<"security">>, <<"config">>}, ciphers) of - undefined -> - ?DEFAULT_CIPHER_LIST; - Result -> - Result - end. - -print_ciphers() -> - Ciphers = get_ciphers(), - {Good, Bad} = riak_core_ssl_util:parse_ciphers(Ciphers), - io:format("Configured ciphers~n~n~s~n~n", [Ciphers]), - io:format("Valid ciphers(~b)~n~n~s~n~n", - [length(Good), riak_core_ssl_util:print_ciphers(Good)]), - case Bad of - [] -> - ok; - _ -> - io:format("Unknown/Unsupported ciphers(~b)~n~n~s~n~n", - [length(Bad), string:join(Bad, ":")]) - end. - -set_ciphers(CipherList) -> - case riak_core_ssl_util:parse_ciphers(CipherList) of - {[], _} -> - %% no valid ciphers - io:format("No known or supported ciphers in list.~n"), - error; - _ -> - riak_core_metadata:put({<<"security">>, <<"config">>}, ciphers, - CipherList), - ok - end. - -disable() -> - riak_core_metadata:put({<<"security">>, <<"status">>}, - enabled, false). - -status() -> - Enabled = riak_core_metadata:get({<<"security">>, <<"status">>}, enabled, - [{default, false}]), - case Enabled of - true -> - case riak_core_capability:get({riak_core, security}) of - true -> - enabled; - _ -> - enabled_but_no_capability - end; - _ -> - disabled - end. - -%% ============ -%% INTERNAL -%% ============ - -metadata_grant_prefix(user) -> - {<<"security">>, <<"usergrants">>}; -metadata_grant_prefix(group) -> - {<<"security">>, <<"groupgrants">>}. - - -add_revoke_int([], _, _) -> - ok; -add_revoke_int([{Name, RoleType}|Roles], Bucket, Permissions) -> - Prefix = metadata_grant_prefix(RoleType), - RoleGrants = riak_core_metadata:get(Prefix, {Name, Bucket}), - - %% check if there is currently a GRANT we can revoke - case RoleGrants of - undefined -> - %% can't REVOKE what wasn't GRANTED - add_revoke_int(Roles, Bucket, Permissions); - GrantedPermissions -> - NewPerms = [X || X <- GrantedPermissions, not lists:member(X, - Permissions)], - - %% TODO - do deletes here, once cluster metadata supports it for - %% real, if NewPerms == [] - - case NewPerms of - [] -> - riak_core_metadata:delete(Prefix, {Name, Bucket}); - _ -> - riak_core_metadata:put(Prefix, {Name, Bucket}, NewPerms) - end, - add_revoke_int(Roles, Bucket, Permissions) - end. - -add_source_int([], _, _, _) -> - ok; -add_source_int([User|Users], CIDR, Source, Options) -> - riak_core_metadata:put({<<"security">>, <<"sources">>}, {User, CIDR}, - {Source, Options}), - add_source_int(Users, CIDR, Source, Options). - -add_grant_int([], _, _) -> - ok; -add_grant_int([{Name, RoleType}|Roles], Bucket, Permissions) -> - Prefix = metadata_grant_prefix(RoleType), - BucketPermissions = case riak_core_metadata:get(Prefix, {Name, Bucket}) of - undefined -> - []; - Perms -> - Perms - end, - NewPerms = lists:umerge(lists:sort(BucketPermissions), - lists:sort(Permissions)), - riak_core_metadata:put(Prefix, {Name, Bucket}, NewPerms), - add_grant_int(Roles, Bucket, Permissions). - -match_grant(Bucket, Grants) -> - AnyGrants = proplists:get_value(any, Grants, []), - %% find the first grant that matches the bucket name and then merge in the - %% 'any' grants, if any - lists:umerge(lists:sort(lists:foldl(fun({B, P}, Acc) when Bucket == B -> - P ++ Acc; - ({B, P}, Acc) when element(1, Bucket) == B -> - %% wildcard match against bucket type - P ++ Acc; - (_, Acc) -> - Acc - end, [], Grants)), lists:sort(AnyGrants)). - -maybe_refresh_context(Context) -> - %% TODO replace this with a cluster metadata hash check, or something - Epoch = os:timestamp(), - case timer:now_diff(Epoch, Context#context.epoch) < ?REFRESH_TIME of - false -> - %% context has expired - get_context(Context#context.username); - _ -> - Context - end. - -concat_role(user, Name) -> - <<"user/", Name/binary>>; -concat_role(group, Name) -> - <<"group/", Name/binary>>. - - -%% Contexts are only valid until the GRANT epoch changes, and it will change -%% whenever a GRANT or a REVOKE is performed. This is a little coarse grained -%% right now, but it'll do for the moment. -get_context(Username) when is_binary(Username) -> - Grants = group_grants(accumulate_grants(Username, user)), - #context{username=Username, grants=Grants, epoch=os:timestamp()}. - -accumulate_grants(Role, Type) -> - %% The 'all' grants always apply - All = riak_core_metadata:fold(fun({{_R, _Bucket}, [?TOMBSTONE]}, A) -> - A; - ({{_R, Bucket}, [Permissions]}, A) -> - [{{<<"group/all">>, Bucket}, - Permissions}|A] - end, [], metadata_grant_prefix(group), - [{match, {all, '_'}}]), - {Grants, _Seen} = accumulate_grants([Role], [], All, Type), - lists:flatten(Grants). - -accumulate_grants([], Seen, Acc, _Type) -> - {Acc, Seen}; -accumulate_grants([Role|Roles], Seen, Acc, Type) -> - Options = role_details(Role, Type), - Groups = [G || G <- lookup("groups", Options, []), - not lists:member(G,Seen), - group_exists(G)], - {NewAcc, NewSeen} = accumulate_grants(Groups, [Role|Seen], Acc, group), - - Prefix = metadata_grant_prefix(Type), - - Grants = riak_core_metadata:fold(fun({{_R, _Bucket}, [?TOMBSTONE]}, A) -> - A; - ({{R, Bucket}, [Permissions]}, A) -> - [{{concat_role(Type, R), Bucket}, - Permissions}|A] - end, [], Prefix, - [{match, {Role, '_'}}]), - accumulate_grants(Roles, NewSeen, [Grants|NewAcc], Type). - -%% lookup a key in a list of key/value tuples. Like proplists:get_value but -%% faster. -lookup(Key, List, Default) -> - case lists:keyfind(Key, 1, List) of - false -> - Default; - {Key, Value} -> - Value - end. - -lookup(Key, List) -> - lookup(Key, List, undefined). - -stash(Key, Value, List) -> - lists:keystore(Key, 1, List, Value). - -%% @doc Get the subnet mask as an integer, stolen from an old post on -%% erlang-questions. -mask_address(Addr={_, _, _, _}, Maskbits) -> - B = list_to_binary(tuple_to_list(Addr)), - <> = B, - Subnet; -mask_address({A, B, C, D, E, F, G, H}, Maskbits) -> - <> = <>, - Subnet. - -%% @doc returns the real bottom of a netmask. Eg if 192.168.1.1/16 is -%% provided, return 192.168.0.0/16 -anchor_mask(Addr={_, _, _, _}, Maskbits) -> - M = mask_address(Addr, Maskbits), - Rem = 32 - Maskbits, - <> = <>, - {{A, B, C, D}, Maskbits}; -anchor_mask(Addr={_, _, _, _, _, _, _, _}, Maskbits) -> - M = mask_address(Addr, Maskbits), - Rem = 128 - Maskbits, - <> = <>, - {{A, B, C, D, E, F, G, H}, Maskbits}. - -anchor_mask({Addr, Mask}) -> - anchor_mask(Addr, Mask). - -prettyprint_cidr({Addr, Mask}) -> - io_lib:format("~s/~B", [inet_parse:ntoa(Addr), Mask]). - - - -validate_options(Options) -> - %% Check if password is an option - case lookup("password", Options) of - undefined -> - validate_groups_option(Options); - Pass -> - {ok, NewOptions} = validate_password_option(Pass, Options), - validate_groups_option(NewOptions) - end. - -validate_groups_option(Options) -> - case lookup("groups", Options) of - undefined -> - {ok, Options}; - GroupStr -> - %% Don't let the admin assign "all" as a container - Groups= [name2bin(G) || - G <- string:tokens(GroupStr, ","), G /= "all"], - - case unknown_roles(Groups, group) of - [] -> - {ok, stash("groups", {"groups", Groups}, - Options)}; - UnknownGroups -> - {error, {unknown_groups, UnknownGroups}} - end - end. - -%% Handle 'password' option if given -validate_password_option(Pass, Options) -> - {ok, HashedPass, AuthName, HashFunction, Salt, Iterations} = - riak_core_pw_auth:hash_password(list_to_binary(Pass)), - NewOptions = stash("password", {"password", - [{hash_pass, HashedPass}, - {auth_name, AuthName}, - {hash_func, HashFunction}, - {salt, Salt}, - {iterations, Iterations}]}, - Options), - {ok, NewOptions}. - - -validate_permissions(Perms) -> - KnownPermissions = app_helper:get_env(riak_core, permissions, []), - validate_permissions(Perms, KnownPermissions). - -validate_permissions([], _) -> - ok; -validate_permissions([Perm|T], Known) -> - case string:tokens(Perm, ".") of - [App, P] -> - try {list_to_existing_atom(App), list_to_existing_atom(P)} of - {AppAtom, PAtom} -> - case lists:member(PAtom, lookup(AppAtom, Known, [])) of - true -> - validate_permissions(T, Known); - false -> - {error, {unknown_permission, Perm}} - end - catch - error:badarg -> - {error, {unknown_permission, Perm}} - end; - _ -> - {error, {unknown_permission, Perm}} - end. - -match_source([], _User, _PeerIP) -> - {error, no_matching_sources}; -match_source([{UserName, {IP,Mask}, Source, Options}|Tail], User, PeerIP) -> - case (UserName == all orelse - UserName == User) andalso - mask_address(IP, Mask) == mask_address(PeerIP, Mask) of - true -> - {ok, Source, Options}; - false -> - match_source(Tail, User, PeerIP) - end. - -sort_sources(Sources) -> - %% sort sources first by userlist, so that 'all' matches come last - %% and then by CIDR, so that most sprcific masks come first - Sources1 = lists:sort(fun({UserA, _, _, _}, {UserB, _, _, _}) -> - case {UserA, UserB} of - {all, all} -> - true; - {all, _} -> - %% anything is greater than 'all' - true; - {_, all} -> - false; - {_, _} -> - true - end - end, Sources), - lists:sort(fun({_, {_, MaskA}, _, _}, {_, {_, MaskB}, _, _}) -> - MaskA > MaskB - end, Sources1). - -%% group users sharing the same CIDR/Source/Options -group_sources(Sources) -> - D = lists:foldl(fun({User, CIDR, Source, Options}, Acc) -> - dict:append({CIDR, Source, Options}, User, Acc) - end, dict:new(), Sources), - R1 = [{Users, CIDR, Source, Options} || {{CIDR, Source, Options}, Users} <- - dict:to_list(D)], - %% Split any entries where the user list contains (but is not - %% exclusively) 'all' so that 'all' has its own entry. We could - %% actually elide any user sources that overlap with an 'all' - %% source, but that may be more confusing because deleting the all - %% source would then 'resurrect' the user sources. - R2 = lists:foldl(fun({Users, CIDR, Source, Options}=E, Acc) -> - case Users =/= [all] andalso lists:member(all, Users) of - true -> - [{[all], CIDR, Source, Options}, - {Users -- [all], CIDR, Source, Options}|Acc]; - false -> - [E|Acc] - end - end, [], R1), - %% sort the result by the same criteria that sort_sources uses - R3 = lists:sort(fun({UserA, _, _, _}, {UserB, _, _, _}) -> - case {UserA, UserB} of - {[all], [all]} -> - true; - {[all], _} -> - %% anything is greater than 'all' - true; - {_, [all]} -> - false; - {_, _} -> - true - end - end, R2), - lists:sort(fun({_, {_, MaskA}, _, _}, {_, {_, MaskB}, _, _}) -> - MaskA > MaskB - end, R3). - -group_grants(Grants) -> - D = lists:foldl(fun({{_Role, Bucket}, G}, Acc) -> - dict:append(Bucket, G, Acc) - end, dict:new(), Grants), - [{Bucket, lists:usort(flatten_once(P))} || {Bucket, P} <- dict:to_list(D)]. - -flatten_once(List) -> - lists:foldl(fun(A, Acc) -> - A ++ Acc - end, [], List). - -check_grant_blockers([], [], ok) -> - none; -check_grant_blockers([], [], {error, Error}) -> - {error, Error}; -check_grant_blockers(UnknownRoles, [], ok) -> - {error, {unknown_roles, UnknownRoles}}; -check_grant_blockers([], NameOverlaps, ok) -> - {error, {duplicate_roles, NameOverlaps}}; -check_grant_blockers(UnknownRoles, NameOverlaps, ok) -> - {errors, [{unknown_roles, UnknownRoles}, - {duplicate_roles, NameOverlaps}]}; -check_grant_blockers(UnknownRoles, [], {error, Error}) -> - {errors, [{unknown_roles, UnknownRoles}, Error]}; -check_grant_blockers([], NameOverlaps, {error, Error}) -> - {errors, [{duplicate_roles, NameOverlaps}, - Error]}; -check_grant_blockers(UnknownRoles, NameOverlaps, {error, Error}) -> - {errors, [{unknown_roles, UnknownRoles}, - {duplicate_roles, NameOverlaps}, - Error]}. - - - -delete_group_from_roles(Groupname) -> - %% delete the group out of any user or group's 'roles' option - %% this is kind of a pain, as we have to iterate ALL roles - delete_group_from_roles(Groupname, <<"users">>), - delete_group_from_roles(Groupname, <<"groups">>). - -delete_group_from_roles(Groupname, RoleType) -> - riak_core_metadata:fold(fun({_, [?TOMBSTONE]}, Acc) -> - Acc; - ({Rolename, [Options]}, Acc) -> - case proplists:get_value("groups", Options) of - undefined -> - Acc; - Groups -> - case lists:member(Groupname, - Groups) of - true -> - NewGroups = lists:keystore("groups", 1, Options, {"groups", Groups -- [Groupname]}), - riak_core_metadata:put({<<"security">>, - RoleType}, - Rolename, - NewGroups), - Acc; - false -> - Acc - end - end - end, undefined, - {<<"security">>,RoleType}). - - -delete_user_from_sources(Username) -> - riak_core_metadata:fold(fun({{User, _CIDR}=Key, _}, Acc) - when User == Username -> - riak_core_metadata:delete({<<"security">>, - <<"sources">>}, - Key), - Acc; - ({{_, _}, _}, Acc) -> - Acc - end, [], {<<"security">>, <<"sources">>}). - -%%%% Role identification functions - -%% Take a list of roles (users or groups) and return any that can't -%% be found. -unknown_roles(RoleList, user) -> - unknown_roles(RoleList, <<"users">>); -unknown_roles(RoleList, group) -> - unknown_roles(RoleList, <<"groups">>); -unknown_roles(RoleList, RoleType) -> - riak_core_metadata:fold(fun({Rolename, _}, Acc) -> - Acc -- [Rolename] - end, RoleList, {<<"security">>, - RoleType}). - -user_details(U) -> - role_details(U, user). - -group_details(G) -> - role_details(G, group). - -is_prefixed(<<"user/", _Name/binary>>) -> - true; -is_prefixed(<<"group/", _Name/binary>>) -> - true; -is_prefixed(_) -> - false. - -chop_name(<<"user/", Name/binary>>) -> - Name; -chop_name(<<"group/", Name/binary>>) -> - Name; -chop_name(Name) -> - Name. - -%% When we need to know whether a role name is a group or user (or -%% both), use this -role_type(<<"user/", Name/binary>>) -> - role_type(role_details(Name, user), - undefined); -role_type(<<"group/", Name/binary>>) -> - role_type(undefined, - role_details(Name, group)); -role_type(Name) -> - role_type(role_details(Name, user), - role_details(Name, group)). - -role_type(undefined, undefined) -> - unknown; -role_type(_UserDetails, undefined) -> - user; -role_type(undefined, _GroupDetails) -> - group; -role_type(_UserDetails, _GroupDetails) -> - both. - - -role_details(Rolename, user) -> - role_details(Rolename, <<"users">>); -role_details(Rolename, group) -> - role_details(Rolename, <<"groups">>); -role_details(Rolename, RoleType) when is_list(Rolename) -> - riak_core_metadata:get({<<"security">>, RoleType}, name2bin(Rolename)); -role_details(Rolename, RoleType) -> - riak_core_metadata:get({<<"security">>, RoleType}, Rolename). - -user_exists(Username) -> - role_exists(Username, user). - -group_exists(Groupname) -> - role_exists(Groupname, group). - -role_exists(Rolename, user) -> - role_exists(Rolename, <<"users">>); -role_exists(Rolename, group) -> - role_exists(Rolename, <<"groups">>); -role_exists(Rolename, RoleType) -> - case role_details(Rolename, RoleType) of - undefined -> - false; - _ -> true - end. - -illegal_name_chars(Name) -> - [Name] =/= string:tokens(Name, ?ILLEGAL). - - -%% Rather than introduce yet another dependency to Riak this late in -%% the 2.0 cycle, we'll live with string:to_lower/1. It will lowercase -%% any latin1 characters. We can look at a better library to handle -%% more of the unicode space later. -name2bin(Name) when is_binary(Name) -> - Name; -name2bin(Name) -> - unicode:characters_to_binary(string:to_lower(Name), utf8, utf8). - -bucket2bin(any) -> - any; -bucket2bin({Type, Bucket}) -> - { unicode:characters_to_binary(Type, utf8, utf8), - unicode:characters_to_binary(Bucket, utf8, utf8)}; -bucket2bin(Name) -> - unicode:characters_to_binary(Name, utf8, utf8). - -bucket2iolist({Type, Bucket}) -> - [unicode:characters_to_binary(Type, utf8, utf8), "/", - unicode:characters_to_binary(Bucket, utf8, utf8)]; -bucket2iolist(Bucket) -> - unicode:characters_to_binary(Bucket, utf8, utf8). diff --git a/src/riak_core_send_msg.erl b/src/riak_core_send_msg.erl index 15d018795..80dda126c 100644 --- a/src/riak_core_send_msg.erl +++ b/src/riak_core_send_msg.erl @@ -31,7 +31,8 @@ -ifdef(PULSE). -compile(export_all). -compile({parse_transform, pulse_instrument}). --compile({pulse_replace_module, [{gen_fsm_compat, pulse_gen_fsm}, +-compile({pulse_replace_module, [{gen_fsm, pulse_gen_fsm}, + {gen_fsm_compat, pulse_gen_fsm}, {gen_server, pulse_gen_server}]}). -endif. -endif. @@ -43,7 +44,7 @@ reply_unreliable({To, Tag}, Reply) -> cast_unreliable(Dest, Request) -> bang_unreliable(Dest, {'$gen_cast', Request}). -%% NOTE: We'ed peeked inside gen_fsm_compat.erl's guts to see its internals. +%% NOTE: We'ed peeked inside gen_fsm.erl's guts to see its internals. send_event_unreliable({global, _Name} = GlobalTo, Event) -> erlang:error({unimplemented_send, GlobalTo, Event}); send_event_unreliable({via, _Mod, _Name} = ViaTo, Event) -> diff --git a/src/riak_core_ssl_util.erl b/src/riak_core_ssl_util.erl deleted file mode 100644 index b6634acd4..000000000 --- a/src/riak_core_ssl_util.erl +++ /dev/null @@ -1,366 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core: Core Riak Application -%% -%% Copyright (c) 2007-2015 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 Various ssl functions for the Riak Core Connection Manager --module(riak_core_ssl_util). - --include_lib("kernel/include/file.hrl"). --include_lib("public_key/include/OTP-PUB-KEY.hrl"). - --export([maybe_use_ssl/1, - validate_ssl_config/1, - upgrade_client_to_ssl/2, - upgrade_server_to_ssl/2, - get_common_name/1, - load_certs/1, - parse_ciphers/1, - print_ciphers/1 - ]). - --include_lib("kernel/include/logger.hrl"). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - --ifdef(deprecated_21). -ssl_handshake(Socket, SslOpts) -> - ssl:handshake(Socket, SslOpts). --else. -ssl_handshake(Socket, SslOpts) -> - ssl:ssl_accept(Socket, SslOpts). --endif. - --ifdef(deprecated_21). - -ifdef(deprecated_22). - openssl_suite(Cipher) -> - ssl_cipher_format:suite_openssl_str_to_map(Cipher). - openssl_suite_name(Cipher) -> - ssl_cipher_format:suite_map_to_openssl_str(ssl_cipher_format:suite_bin_to_map(Cipher)). - -else. - openssl_suite(Cipher) -> - ssl_cipher_format:openssl_suite(Cipher). - openssl_suite_name(Cipher) -> - ssl_cipher_format:openssl_suite_name(Cipher). - -endif. --else. -openssl_suite(Cipher) -> - ssl_cipher:openssl_suite(Cipher). -openssl_suite_name(Cipher) -> - ssl_cipher:openssl_suite_name(Cipher). --endif. - -maybe_use_ssl(App) -> - SSLOpts = [ - {certfile, app_helper:get_env(App, certfile, undefined)}, - {keyfile, app_helper:get_env(App, keyfile, undefined)}, - {cacerts, load_certs(app_helper:get_env(App, cacertdir, undefined))}, - {depth, app_helper:get_env(App, ssl_depth, 1)}, - {verify_fun, {fun verify_ssl/3, - {App, get_my_common_name(app_helper:get_env(App, certfile, - undefined))}}}, - {verify, verify_peer}, - {server_name_indication, disable}, - {fail_if_no_peer_cert, true}, - {secure_renegotiate, true} %% both sides are erlang, so we can force this - ], - case app_helper:get_env(App, ssl_enabled, false) == true of - false -> - %% not all the SSL options are configured, use TCP - false; - true -> - case validate_ssl_config(SSLOpts) of - {ok, Options} -> - Options; - {error, Reason} -> - ?LOG_ERROR("Error, invalid SSL configuration: ~s", [Reason]), - false - end - end. - -validate_ssl_config(Opts) -> - validate_ssl_config(Opts, []). - -validate_ssl_config([], Acc) -> - {ok, Acc}; -validate_ssl_config([{certfile, CertFile}|Rest], Acc) -> - case file_is_readable(CertFile) of - true -> - validate_ssl_config(Rest, [{certfile, CertFile}|Acc]); - {error, Reason} -> - {error, lists:flatten(io_lib:format("Certificate ~p is not readable: ~s", - [CertFile, posix_error(Reason)]))} - end; -validate_ssl_config([{keyfile, KeyFile}|Rest], Acc) -> - case file_is_readable(KeyFile) of - true -> - validate_ssl_config(Rest, [{keyfile, KeyFile}|Acc]); - {error, Reason} -> - {error, lists:flatten(io_lib:format("Key ~p is not readable ~p", - [KeyFile, posix_error(Reason)]))} - end; -validate_ssl_config([{cacertfile, CAFile}|Rest], Acc) -> - case file_is_readable(CAFile) of - true -> - validate_ssl_config(Rest, [{cacertfile, CAFile}|Acc]); - {error, Reason} -> - {error, lists:flatten(io_lib:format("CA certificate ~p is not readable ~p", - [CAFile, posix_error(Reason)]))} - end; -validate_ssl_config([{cacertdir, CACertDir}|Rest], Acc) -> - CACerts = load_certs(CACertDir), - case CACerts of - undefined -> - {error, lists:flatten( - io_lib:format("CA cert dir ~p is invalid", - [CACertDir]))}; - [] -> - {error, lists:flatten( - io_lib:format("Unable to load any CA certificates from ~p", - [CACertDir]))}; - Certs when is_list(Certs) -> - validate_ssl_config(Rest, [{cacerts, Certs}|Acc]) - end; -validate_ssl_config([E|Rest], Acc) -> - validate_ssl_config(Rest, [E|Acc]). - -upgrade_client_to_ssl(Socket, App) -> - case maybe_use_ssl(App) of - false -> - {error, no_ssl_config}; - Config -> - ssl:connect(Socket, Config) - end. - -upgrade_server_to_ssl(Socket, App) -> - case maybe_use_ssl(App) of - false -> - {error, no_ssl_config}; - Config -> - ssl_handshake(Socket, Config) - end. - -load_certs(undefined) -> - undefined; -load_certs(CertDirOrFile) -> - case filelib:is_regular(CertDirOrFile) of - true -> - load_cert(CertDirOrFile); - _ -> - case file:list_dir(CertDirOrFile) of - {ok, Certs} -> - load_certs(lists:map(fun(Cert) -> - filename:join(CertDirOrFile, Cert) - end, Certs), []); - {error, _} -> - undefined - end - end. - -load_certs([], Acc) -> - ?LOG_DEBUG("Successfully loaded ~p CA certificates", [length(Acc)]), - Acc; -load_certs([Cert|Certs], Acc) -> - case filelib:is_dir(Cert) of - true -> - load_certs(Certs, Acc); - _ -> - ?LOG_DEBUG("Loading certificate ~p", [Cert]), - load_certs(Certs, load_cert(Cert) ++ Acc) - end. - -load_cert(Cert) -> - {ok, Bin} = file:read_file(Cert), - case filename:extension(Cert) of - ".der" -> - %% no decoding necessary - [Bin]; - _ -> - %% assume PEM otherwise - Contents = public_key:pem_decode(Bin), - [DER || {Type, DER, Cipher} <- Contents, - Type == 'Certificate', Cipher == 'not_encrypted'] - end. - -%% Reject another node whose common name is the same as ours unless it's -%% a wildcard. A wildcard is defined ONLY as beginning with '*'. -%% -%% The test ONLY returns 'true' when the strings are identical (disregarding -%% case) AND do not start with the character '*'. All other cases return false, -%% hence the various shortcuts. -invalid_cn_pair([$* | _], _) -> - false; -invalid_cn_pair(_, [$* | _]) -> - false; -invalid_cn_pair(SameCN, SameCN) -> - true; -invalid_cn_pair(LeftCN, RightCN) when length(LeftCN) == length(RightCN) -> - string:to_lower(LeftCN) == string:to_lower(RightCN); -invalid_cn_pair(_, _) -> - false. - -%% Custom SSL verification function for checking common names against the -%% whitelist. -verify_ssl(_, {bad_cert, _} = Reason, _) -> - {fail, Reason}; -verify_ssl(_, {extension, _}, UserState) -> - {unknown, UserState}; -verify_ssl(_, valid, UserState) -> - %% this is the check for the CA cert - {valid, UserState}; -verify_ssl(_, valid_peer, undefined) -> - ?LOG_ERROR("Unable to determine local certificate's common name"), - {fail, bad_local_common_name}; -verify_ssl(Cert, valid_peer, {App, MyCommonName}) -> - CommonName = get_common_name(Cert), - case invalid_cn_pair(CommonName, MyCommonName) of - true -> - ?LOG_ERROR("Peer certificate's common name matches local " - "certificate's common name: ~p", [CommonName]), - {fail, duplicate_common_name}; - _ -> - ACL = app_helper:get_env(App, peer_common_name_acl, "*"), - case validate_common_name(CommonName, ACL) of - {true, Filter} -> - ?LOG_INFO("SSL connection from ~s granted by ACL \"~s\"", - [CommonName, Filter]), - {valid, MyCommonName}; - false -> - ?LOG_ERROR( - "SSL connection from ~s denied, no matching ACL in ~p", - [CommonName, ACL]), - {fail, no_acl} - end - end. - -%% read in the configured 'certfile' and extract the common name from it -get_my_common_name(undefined) -> - undefined; -get_my_common_name(CertFile) -> - case catch(load_cert(CertFile)) of - [CertBin|_] -> - OTPCert = public_key:pkix_decode_cert(CertBin, otp), - get_common_name(OTPCert); - _ -> - undefined - end. - -%% get the common name attribute out of an OTPCertificate record -get_common_name(OTPCert) -> - %% You'd think there'd be an easier way than this giant mess, but I - %% couldn't find one. - {rdnSequence, Subject} = OTPCert#'OTPCertificate'.tbsCertificate#'OTPTBSCertificate'.subject, - [Att] = [Attribute#'AttributeTypeAndValue'.value || [Attribute] <- Subject, - Attribute#'AttributeTypeAndValue'.type == ?'id-at-commonName'], - case Att of - {printableString, Str} -> Str; - {utf8String, Bin} -> binary_to_list(Bin) - end. - -%% Validate common name matches one of the configured filters. Filters can -%% have at most one '*' wildcard in the leftmost component of the hostname. -validate_common_name(_, []) -> - false; -validate_common_name(_, "*") -> - {true, "*"}; -validate_common_name(CN, [Filter|Filters]) -> - T1 = string:tokens(string:to_lower(CN), "."), - T2 = string:tokens(string:to_lower(Filter), "."), - case length(T1) == length(T2) of - false -> - validate_common_name(CN, Filters); - _ -> - case hd(T2) of - "*" -> - case tl(T1) == tl(T2) of - true -> - {true, Filter}; - _ -> - validate_common_name(CN, Filters) - end; - _ -> - case T1 == T2 of - true -> - {true, Filter}; - _ -> - validate_common_name(CN, Filters) - end - end - end. - - -file_is_readable(FileName) -> - case file:read_file_info(FileName) of - {ok, FI} -> - case FI#file_info.type == regular of - false -> - %% will never return 'symlink' type because we did not use - %% read_link_info - {error, eisdir}; - true -> - case FI#file_info.access == read orelse - FI#file_info.access == read_write of - false -> - {error, eaccess}; - true -> - true - end - end; - Err -> - Err - end. - -%% borrowed from lager, with modifications -posix_error(Error) -> - case erl_posix_msg:message(Error) of - "unknown POSIX error" -> lists:flatten(io_lib:format("~p", [Error])); - Message -> Message - end. - -%% Takes a list of openssl style cipher names and converts them to erlang -%% cipher names. Returns a 2-tuple of the supported and unknown/unsupported -%% suites. -parse_ciphers(CipherList) -> - {Good, Bad} = lists:foldl(fun(Cipher, {Acc, Unknown}) -> - try openssl_suite(Cipher) of - C -> - {[C|Acc], Unknown} - catch - _:_ -> - %% function will function_clause on - %% unsupported/unknown ciphers - {Acc, [Cipher|Unknown]} - end - end, {[], []}, string:tokens(CipherList, ":")), - {lists:reverse(Good), lists:reverse(Bad)}. - -%% print the OpenSSL name for ciphers -print_ciphers(CipherList) -> - string:join([openssl_suite_name(Cipher) || Cipher <- - CipherList], ":"). - - -%% =================================================================== -%% EUnit tests -%% =================================================================== --ifdef(TEST). --endif. diff --git a/src/riak_core_stat.erl b/src/riak_core_stat.erl deleted file mode 100644 index 87ce81e55..000000000 --- a/src/riak_core_stat.erl +++ /dev/null @@ -1,352 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% 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. -%% -%% ------------------------------------------------------------------- - --module(riak_core_stat). - -%% There is a dialyzer issue within exometer_core, as a temporary solution -%% there will be no warnings from these specific functions -%% - https://github.com/basho/riak_core/issues/946 --dialyzer({nowarn_function, register_vnode_stats/3}). - --behaviour(gen_server). - -%% API --export([start_link/0, get_stats/0, get_stats/1, update/1, - register_stats/0, vnodeq_stats/0, - register_stats/2, - register_vnode_stats/3, unregister_vnode_stats/2, - vnodeq_stats/1, - prefix/0]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --compile({parse_transform, riak_core_stat_xform}). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - --define(SERVER, ?MODULE). - --define(APP, riak_core). - -start_link() -> - gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). - -register_stats() -> - register_stats(common, system_stats()), - register_stats(?APP, stats()). - -%% @spec register_stats(App, Stats) -> ok -%% @doc (Re-)Register a list of metrics for App. -register_stats(App, Stats) -> - P = prefix(), - lists:foreach(fun(Stat) -> - register_stat(P, App, Stat) - end, Stats). - -register_stat(P, App, Stat) -> - {Name, Type, Opts, Aliases} = - case Stat of - {N, T} -> {N, T, [], []}; - {N, T, Os} -> {N, T, Os, []}; - {N, T, Os, As} -> {N, T, Os, As} - end, - StatName = stat_name(P, App, Name), - exometer:re_register(StatName, Type, Opts), - lists:foreach( - fun({DP, Alias}) -> - exometer_alias:new(Alias, StatName, DP) - end, Aliases). - -register_vnode_stats(Module, Index, Pid) -> - P = prefix(), - exometer:ensure([P, ?APP, vnodes_running, Module], - { function, exometer, select_count, - [[{ {[P, ?APP, vnodeq, Module, '_'], '_', '_'}, - [], [true] }]], match, value }, - [{aliases, [{value, vnodeq_atom(Module, <<"s_running">>)}]}]), - exometer:ensure([P, ?APP, vnodeq, Module], - {function, riak_core_stat, vnodeq_stats, [Module], - histogram, [mean,median,min,max,total]}, - [{aliases, [{mean , vnodeq_atom(Module, <<"q_mean">>)}, - {median, vnodeq_atom(Module, <<"q_median">>)}, - {min , vnodeq_atom(Module, <<"q_min">>)}, - {max , vnodeq_atom(Module, <<"q_max">>)}, - {total , vnodeq_atom(Module, <<"q_total">>)}]} - ]), - exometer:re_register( - [P, ?APP, vnodeq, Module, Index], - function, [{ arg, {erlang, process_info, [Pid, message_queue_len], - match, {'_', value} }}]). - -unregister_vnode_stats(Module, Index) -> - exometer:delete([riak_core_stat:prefix(), ?APP, vnodeq, Module, Index]). - -stat_name(P, App, N) when is_atom(N) -> - stat_name_([P, App, N]); -stat_name(P, App, N) when is_list(N) -> - stat_name_([P, App | N]). - -stat_name_([P, [] | Rest]) -> [P | Rest]; -stat_name_(N) -> N. - - -%% @spec get_stats() -> proplist() -%% @doc Get the current aggregation of stats. -get_stats() -> - get_stats(?APP). - -get_stats(App) -> - P = prefix(), - exometer:get_values([P, App]). - -update(Arg) -> - gen_server:cast(?SERVER, {update, Arg}). - -prefix() -> - app_helper:get_env(riak_core, stat_prefix, riak). - -%% gen_server - -init([]) -> - register_stats(), - {ok, ok}. - -handle_call(_Req, _From, State) -> - {reply, ok, State}. - -handle_cast({update, {worker_pool, vnode_pool}}, State) -> - exometer_update([prefix(), ?APP, vnode, worker_pool], 1), - {noreply, State}; -handle_cast({update, {worker_pool, queue_time, Pool, QueueTime}}, State) -> - exometer_update([prefix(), ?APP, worker_pool_queuetime, Pool], QueueTime), - {noreply, State}; -handle_cast({update, {worker_pool, work_time, Pool, WorkTime}}, State) -> - exometer_update([prefix(), ?APP, worker_pool_worktime, Pool], WorkTime), - {noreply, State}; -handle_cast({update, {worker_pool, Pool}}, State) -> - exometer_update([prefix(), ?APP, node, worker_pool, Pool], 1), - {noreply, State}; -handle_cast({update, Arg}, State) -> - exometer_update([prefix(), ?APP, update_metric(Arg)], update_value(Arg)), - {noreply, State}; -handle_cast(_Req, State) -> - {noreply, State}. - -handle_info(_Info, State) -> - {noreply, State}. - -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - - -exometer_update(Name, Value) -> - case exometer:update(Name, Value) of - {error, not_found} -> - ?LOG_DEBUG("~p not found on update.", [Name]); - ok -> - ok - end. - -update_metric(converge_timer_begin ) -> converge_delay; -update_metric(converge_timer_end ) -> converge_delay; -update_metric(rebalance_timer_begin) -> rebalance_delay; -update_metric(rebalance_timer_end ) -> rebalance_delay; -update_metric(Arg) -> Arg. - - -update_value(converge_timer_begin ) -> timer_start; -update_value(rebalance_timer_begin) -> timer_start; -update_value(converge_timer_end ) -> timer_end; -update_value(rebalance_timer_end ) -> timer_end; -update_value(_) -> 1. - -%% private -stats() -> - [{ignored_gossip_total, counter, [], [{value, ignored_gossip_total}]}, - {rings_reconciled, spiral, [], [{count, rings_reconciled_total}, - {one, rings_reconciled}]}, - {ring_creation_size, - {function, app_helper, get_env, [riak_core, ring_creation_size], - match, value}, [], [{value, ring_creation_size}]}, - {gossip_received, spiral, [], [{one, gossip_received}]}, - {rejected_handoffs, counter, [], [{value, rejected_handoffs}]}, - {handoff_timeouts, counter, [], [{value, handoff_timeouts}]}, - {dropped_vnode_requests, counter, [], [{value, dropped_vnode_requests_total}]}, - {converge_delay, duration, [], [{mean, converge_delay_mean}, - {min, converge_delay_min}, - {max, converge_delay_max}, - {last, converge_delay_last}]}, - {rebalance_delay, duration, [], [{min, rebalance_delay_min}, - {max, rebalance_delay_max}, - {mean, rebalance_delay_mean}, - {last, rebalance_delay_last}]} | nwp_stats()]. - -nwp_stats() -> - PoolNames = [vnode_pool, unregistered] ++ riak_core_node_worker_pool:pools(), - - [nwp_stat(Pool) || Pool <- PoolNames] ++ - - [nwpqt_stat(Pool) || Pool <- PoolNames] ++ - - [nwpwt_stat(Pool) || Pool <- PoolNames]. - -nwp_stat(Pool) -> - {[node, worker_pool, Pool], counter, [], - [{value, nwp_name_atom(Pool, <<"_total">>)}]}. - -nwpqt_stat(Pool) -> - {[worker_pool_queuetime, Pool], histogram, [], - [{mean , nwp_name_atom(Pool, <<"_queuetime_mean">>)}, - {max , nwp_name_atom(Pool, <<"_queuetime_100">>)}]}. - -nwpwt_stat(Pool) -> - {[worker_pool_worktime, Pool], histogram, [], - [{mean , nwp_name_atom(Pool, <<"_worktime_mean">>)}, - {max , nwp_name_atom(Pool, <<"_worktime_100">>)}]}. - -system_stats() -> - [ - {cpu_stats, cpu, [{sample_interval, 5000}], [{nprocs, cpu_nprocs}, - {avg1 , cpu_avg1}, - {avg5 , cpu_avg5}, - {avg15 , cpu_avg15}]}, - {mem_stats, {function, memsup, get_memory_data, [], match, {total, allocated, '_'}}, - [], [{total, mem_total}, - {allocated, mem_allocated}]}, - {memory_stats, {function, erlang, memory, [], proplist, [total, processes, processes_used, - system, atom, atom_used, binary, - code, ets]}, - [], [{total , memory_total}, - {processes , memory_processes}, - {processes_used, memory_processes_used}, - {system , memory_system}, - {atom , memory_atom}, - {atom_used , memory_atom_used}, - {binary , memory_binary}, - {code , memory_code}, - {ets , memory_ets}]} - ]. - -%% Provide aggregate stats for vnode queues. Compute instantaneously for now, -%% may need to cache if stats are called heavily (multiple times per seconds) -vnodeq_stats() -> - VnodesInfo = [{Service, vnodeq_len(Pid)} || - {Service, _Index, Pid} <- riak_core_vnode_manager:all_vnodes()], - ServiceInfo = lists:foldl(fun({S,MQL}, A) -> - orddict:append_list(S, [MQL], A) - end, orddict:new(), VnodesInfo), - lists:flatten([vnodeq_aggregate(S, MQLs) || {S, MQLs} <- ServiceInfo]). - -vnodeq_stats(Mod) -> - [vnodeq_len(Pid) || {_, _, Pid} <- riak_core_vnode_manager:all_vnodes(Mod)]. - -vnodeq_len(Pid) -> - try - element(2, erlang:process_info(Pid, message_queue_len)) - catch _:_ -> - 0 - end. - -vnodeq_aggregate(_Service, []) -> - []; % no vnodes, no stats -vnodeq_aggregate(Service, MQLs0) -> - MQLs = lists:sort(MQLs0), - Len = length(MQLs), - Total = lists:sum(MQLs), - Mean = Total div Len, - Median = case (Len rem 2) of - 0 -> % even number, average middle two - (lists:nth(Len div 2, MQLs) + - lists:nth(Len div 2 + 1, MQLs)) div 2; - 1 -> - lists:nth(Len div 2 + 1, MQLs) - end, - P = prefix(), - [{[P, riak_core, vnodeq_atom(Service,<<"s_running">>)], [{value, Len}]}, - {[P, riak_core, vnodeq_atom(Service,<<"q">>)], - [{min, lists:nth(1, MQLs)}, {median, Median}, {mean, Mean}, - {max, lists:nth(Len, MQLs)}, {total, Total}]}]. - -vnodeq_atom(Service, Desc) -> - binary_to_atom(<<(atom_to_binary(Service, latin1))/binary, Desc/binary>>, latin1). - --spec nwp_name_atom(atom(), binary()) -> atom(). -nwp_name_atom(QueueName, StatName) -> - binary_to_atom(<< <<"worker_">>/binary, - (atom_to_binary(QueueName, latin1))/binary, - StatName/binary >>, - latin1). - - --ifdef(TEST). - -nwp_name_to_atom_test() -> - ?assertEqual(worker_af1_pool_total, nwp_name_atom(af1_pool, <<"_total">>)). - - -%% Check vnodeq aggregation function -vnodeq_aggregate_empty_test() -> - ?assertEqual([], vnodeq_aggregate(service_vnode, [])). - -vnodeq_aggregate_odd1_test() -> - P = prefix(), - ?assertEqual([{[P, riak_core, service_vnodes_running], [{value, 1}]}, - {[P, riak_core, service_vnodeq], - [{min, 10}, {median, 10}, {mean, 10}, {max, 10}, {total, 10}]}], - vnodeq_aggregate(service_vnode, [10])). - -vnodeq_aggregate_odd3_test() -> - P = prefix(), - ?assertEqual([{[P, riak_core, service_vnodes_running], [{value, 3}]}, - {[P, riak_core, service_vnodeq], - [{min, 1}, {median, 2}, {mean, 2}, {max, 3}, {total, 6}]}], - vnodeq_aggregate(service_vnode, [1, 2, 3])). - -vnodeq_aggregate_odd5_test() -> - P = prefix(), - ?assertEqual([{[P, riak_core, service_vnodes_running], [{value, 5}]}, - {[P, riak_core, service_vnodeq], - [{min, 0}, {median, 1}, {mean, 2}, {max, 5}, {total, 10}]}], - vnodeq_aggregate(service_vnode, [1, 0, 5, 0, 4])). - -vnodeq_aggregate_even2_test() -> - P = prefix(), - ?assertEqual([{[P, riak_core, service_vnodes_running], [{value, 2}]}, - {[P, riak_core, service_vnodeq], - [{min, 10}, {median, 15}, {mean, 15}, {max, 20}, {total, 30}]}], - vnodeq_aggregate(service_vnode, [10, 20])). - -vnodeq_aggregate_even4_test() -> - P = prefix(), - ?assertEqual([{[P, riak_core, service_vnodes_running], [{value, 4}]}, - {[P, riak_core, service_vnodeq], - [{min, 0}, {median, 5}, {mean, 7}, {max, 20}, {total, 30}]}], - vnodeq_aggregate(service_vnode, [0, 10, 0, 20])). - --endif. diff --git a/src/riak_core_stat_cache.erl b/src/riak_core_stat_cache.erl deleted file mode 100644 index 1d8c0e893..000000000 --- a/src/riak_core_stat_cache.erl +++ /dev/null @@ -1,84 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2007-2014 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_stat_cache). - --behaviour(gen_server). - --export([start_link/0, - stop/0]). - --export([register_app/2, - get_stats/1]). - --export([init/1, - handle_call/3, - handle_cast/2, - handle_info/2, - terminate/2, - code_change/3]). - --record(st, {apps = []}). - -register_app(App, ProduceMFA) -> - gen_server:call(?MODULE, {register, App, ProduceMFA}), - ok. - -%% This function should not be called by code that's been adapted to -%% exometer. Thus, it must return the old format, and assume that the -%% -get_stats(App) -> - T1 = os:timestamp(), - Result = case get_app(App) of - {_, {M, F, A}} -> - apply(M, F, A); - false -> - [] - end, - T2 = os:timestamp(), - {ok, Result, timer:now_diff(T2, T1)}. - -%% The gen_server mainly exists as a stub, since legacy test suites expect -%% riak_core_stat_cache:start_link() to return {ok, Pid}. It also keeps track -%% of the produce_stats() callbacks for each registered app. - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). - -stop() -> - ok. - -init(_) -> {ok, #st{}}. - -handle_call({register, App, MFA}, _, #st{apps = Apps} = S) -> - {reply, ok, S#st{apps = lists:keystore(App, 1, Apps, {App, MFA})}}; -handle_call({get_app, App}, _, #st{apps = Apps} = S) -> - {reply, lists:keyfind(App, 1, Apps), S}; -handle_call(_, _, S) -> - {reply, {error,not_supported}, S}. - -handle_cast(_, S) -> {noreply, S}. -handle_info(_, S) -> {noreply, S}. -terminate(_, _) -> ok. -code_change(_, S, _) -> {ok, S}. - -%% -- end gen_server - -get_app(App) -> - gen_server:call(?MODULE, {get_app, App}). diff --git a/src/riak_core_stat_calc_proc.erl b/src/riak_core_stat_calc_proc.erl deleted file mode 100644 index ac242412e..000000000 --- a/src/riak_core_stat_calc_proc.erl +++ /dev/null @@ -1,182 +0,0 @@ -%% ------------------------------------------------------------------- -%% riak_core_stat_calc_proc: a process that caches the value of a calculated -%% folsom stat. Purpose is it add more fine grained caching to stat calculation -%% and not to use a single process for stat calculation. -%% -%% Copyright (c) 2007-2012 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. -%% -%% ------------------------------------------------------------------- - -%% riak_core_stat_calc_proc: a cache and concurrency control. -%% there is no point in calculating the value of a stat if it -%% is already being done. Some histogram stats with many readings can -%% take seconds to calculate. This process caches a value for N (default 5) -%% seconds, and also spawns a process to calculate the stat's value -%% when needed. Any request for the value will either get the cached -%% value, spawn a process to calculate, if none is running, or wait for -%% the last spawned process to return. -%% The idea / execution is as per riak_core_stat_cache, except more -%% fine grained. This will replace that in future releases. - --module(riak_core_stat_calc_proc). - --behaviour(gen_server). - -%% API --export([start_link/1, value/1, - stop/1]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - -%% @doc Cache item time to live in seconds --define(TTL, 5). - --record(state, {stat, %% the stat name this proc manages - value, %% the current value (if calculated) of this stat - timestamp, %% the time the value was calculated - ttl, %% How long, in seconds, to cache the stat - active, %% Pid of a process that is calculating the stat value - awaiting=[] %% list of processes waiting for a result - }). - -%%%=================================================================== -%%% API -%%%=================================================================== - -start_link(Stat) -> - gen_server:start_link(?MODULE, [Stat], []). - -value(Pid) -> - gen_server:call(Pid, value, infinity). - -stop(Pid) -> - gen_server:cast(Pid, stop). - -%%% gen server - -init([Stat]) -> - process_flag(trap_exit, true), - TTL = app_helper:get_env(riak_core, stat_cache_ttl, ?TTL), - {ok, #state{stat=Stat, ttl=TTL}}. - -handle_call(value, From, State0=#state{active=Active0, awaiting=Awaiting0, - stat=Stat, ttl=TTL, timestamp=TS, value=Value}) -> - Reply = case cache_get(TS, TTL) of - No when No == miss; No == stale -> - {Active, Awaiting} = maybe_get_stat(Stat, From, Active0, Awaiting0 ), - {noreply, State0#state{active=Active, awaiting=Awaiting}, - timer:seconds(10)}; - hit -> - {reply, Value, State0} - end, - Reply; -handle_call(_Request, _From, State) -> - Reply = ok, - {reply, Reply, State}. - -handle_cast({value, Value, TS}, State=#state{awaiting=Awaiting, - value=OldValue}) -> - case Value of - {error, Reason} -> - ?LOG_DEBUG("stat calc failed: ~p ~p", [Reason]), - Reply = maybe_tag_stale(OldValue), - _ = [gen_server:reply(From, Reply) || From <- Awaiting], - %% update the timestamp so as not to flood the failing - %% process with update requests - {noreply, State#state{timestamp=TS, active=undefined, - awaiting=[], value = Reply}}; - _Else -> - _ = [gen_server:reply(From, Value) || From <- Awaiting], - {noreply, State#state{value=Value, timestamp=TS, - active=undefined, awaiting=[]}} - end; -handle_cast(stop, State) -> - {stop, normal, State}; -handle_cast(_Msg, State) -> - {noreply, State}. - -%% don't let a crashing stat calc crash the server -handle_info({'EXIT', FromPid, Reason}, State=#state{active=FromPid, awaiting=Awaiting}) when Reason /= normal -> - _ = [gen_server:reply(From, {error, Reason}) || From <- Awaiting], - {noreply, State#state{active=undefined, awaiting=[]}}; -handle_info({'EXIT', _FromPid, Reason}, State=#state{active=undefined, - awaiting=[]}) - when Reason /= normal -> - %% catch intentional kills due to timeout here. - {noreply, State}; -handle_info(timeout, State=#state{active=Pid, awaiting=Awaiting, value=Value}) -> - %% kill the pid, causing the above clause to be processed - ?LOG_DEBUG("killed delinquent stats process ~p", [Pid]), - exit(Pid, kill), - %% let the cache get staler, tag so people can detect - _ = [gen_server:reply(From, maybe_tag_stale(Value)) || From <- Awaiting], - {noreply, State#state{active=undefined, awaiting=[]}}; -handle_info(_Info, State) -> - {noreply, State}. - -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%% internal -cache_get(undefined, _TTL) -> - miss; -cache_get(TS, TTL) -> - check_freshness(TS, TTL). - -check_freshness(TStamp, TTL) -> - case (TStamp + TTL) > folsom_utils:now_epoch() of - true -> - hit; - false -> - stale - end. - -maybe_get_stat(Stat, From, undefined, Awaiting) -> - %% if a process for getting stat value is not underway start one - Pid = do_calc_stat(Stat), - maybe_get_stat(Stat, From, Pid, Awaiting); -maybe_get_stat(_Stat, From, Pid, Awaiting) -> - {Pid, [From|Awaiting]}. - -do_calc_stat(Stat) -> - ServerPid = self(), - spawn_link( - fun() -> - StatVal = riak_core_stat_q:calc_stat(Stat), - gen_server:cast(ServerPid, {value, StatVal, folsom_utils:now_epoch()}) end - ). - -maybe_tag_stale(Value) -> - case Value of - <<"stale:",_/binary>> -> - Value; - _ -> - V = io_lib:format("stale: ~p", [Value]), - iolist_to_binary(V) - end. - diff --git a/src/riak_core_stat_calc_sup.erl b/src/riak_core_stat_calc_sup.erl deleted file mode 100644 index b35ca2e0e..000000000 --- a/src/riak_core_stat_calc_sup.erl +++ /dev/null @@ -1,51 +0,0 @@ -%% ------------------------------------------------------------------- -%% 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. -%% -%% ------------------------------------------------------------------- --module(riak_core_stat_calc_sup). --behaviour(supervisor). --export([start_link/0, init/1]). --export([calc_proc/1, stop_proc/1]). - -%% Helper macro for declaring children of supervisor --define(CHILD(I, Type, Timeout), {I, {riak_core_stat_calc_proc, start_link, [I]}, permanent, Timeout, Type, [riak_core_stat_calc_proc]}). --define(CHILD(I, Type), ?CHILD(I, Type, 5000)). - -start_link() -> - supervisor:start_link({local, ?MODULE}, ?MODULE, []). - -init([]) -> - {ok, {{one_for_one, 5, 10}, []}}. - -%% start a process for the given stat -%% {@see riak_core_stat_calc_proc} -calc_proc(Stat) -> - Ref = calc_proc_ref(Stat), - Pid = case supervisor:start_child(?MODULE, Ref) of - {ok, Child} -> Child; - {error, {already_started, Child}} -> Child - end, - Pid. - -stop_proc(Stat) -> - _ = supervisor:terminate_child(?MODULE, Stat), - _ = supervisor:delete_child(?MODULE, Stat), - ok. - -%% @private -calc_proc_ref(Stat) -> - ?CHILD(Stat, worker). diff --git a/src/riak_core_stat_q.erl b/src/riak_core_stat_q.erl deleted file mode 100644 index 34845853b..000000000 --- a/src/riak_core_stat_q.erl +++ /dev/null @@ -1,93 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2007-2012 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 riak_core_stat_q is an interface to query folsom stats -%% To use, call `get_stats/1' with a query `Path'. -%% A `Path' is a list of atoms | binaries. The module creates a set -%% of `ets:select/1' guards, one for each element in `Path' -%% For each stat that has a key that matches `Path' we calculate the -%% current value and return it. - --module(riak_core_stat_q). - --compile(nowarn_export_all). --compile(export_all). - --export_type([path/0, - stat_name/0]). - --include_lib("kernel/include/logger.hrl"). - --type path() :: [] | [atom()|binary()]. --type stats() :: [stat()]. --type stat() :: {stat_name(), stat_value()}. --type stat_name() :: list(). --type stat_value() :: integer() | [tuple()]. - -%% @doc To allow for namespacing, and adding richer dimensions, stats -%% are named with a tuple key. The key (like `{riak_kv, node, gets}' or -%% `{riak_kv, vnode, puts, time}') can -%% be seen as an hierarchical path. With `riak_kv' at the root and -%% the other elements as branches / leaves. -%% This module allows us to get only the stats at and below a particular key. -%% `Path' is a list of atoms or the empty list. -%% an example path might be `[riak_kv]' which will return every -%% stat that has `riak_kv' in the first element of its key tuple. -%% You may use the atom '_' at any point -%% in `Path' as a wild card. --spec get_stats(path()) -> stats(). -get_stats(Path) -> - exometer:get_values(Path). - %% %% get all the stats that are at Path - %% calculate_stats(exometer:select( - %% [{ {Path ++ '_','_',enabled}, [], ['$_'] }])). - -calculate_stats(NamesAndTypes) -> - [{Name, get_stat(Name)} || {Name, _, _} <- NamesAndTypes]. - -%% Create/lookup a cache/calculation process -get_stat(Stat) -> - exometer:get_value(Stat). - -%% Encapsulate getting a stat value from exometer. -%% -%% If for any reason we can't get a stats value -%% return 'unavailable'. -%% @TODO experience shows that once a stat is -%% broken it stays that way. Should we delete -%% stats that are broken? -calc_stat({Name, _Type}) when is_tuple(Name) -> - stat_return(exometer:get_value([riak_core_stat:prefix()|tuple_to_list(Name)])); -calc_stat({[_|_] = Name, _Type}) -> - stat_return(exometer:get_value([riak_core_stat:prefix()|Name])). - -stat_return({error,not_found}) -> unavailable; -stat_return({ok, Value}) -> Value. - -log_error(StatName, ErrClass, ErrReason) -> - ?LOG_WARNING("Failed to calculate stat ~p with ~p:~p", [StatName, ErrClass, ErrReason]). - -%% some crazy people put funs in gauges (exometer has a 'function' metric) -%% so that they can have a consistent interface -%% to access stats from disperate sources -calc_gauge({function, Mod, Fun}) -> - Mod:Fun(); -calc_gauge(Val) -> - Val. diff --git a/src/riak_core_stat_sup.erl b/src/riak_core_stat_sup.erl deleted file mode 100644 index a4cc361d5..000000000 --- a/src/riak_core_stat_sup.erl +++ /dev/null @@ -1,53 +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. -%% -%% ------------------------------------------------------------------- - --module(riak_core_stat_sup). - --behaviour(supervisor). - -%% API --export([start_link/0]). - -%% Supervisor callbacks --export([init/1]). - -%% Helper macro for declaring children of supervisor --define(CHILD(I, Type, Timeout), {I, {I, start_link, []}, permanent, Timeout, Type, [I]}). --define(CHILD(I, Type), ?CHILD(I, Type, 5000)). - -%% =================================================================== -%% API functions -%% =================================================================== - -start_link() -> - supervisor:start_link({local, ?MODULE}, ?MODULE, []). - -%% =================================================================== -%% Supervisor callbacks -%% =================================================================== - -init([]) -> - %% Note that exometer_core starts folsom now, so it is not needed here - Children = lists:flatten( - [?CHILD(riak_core_stats_sup, supervisor)]), - - {ok, {{rest_for_one, 10, 10}, Children}}. diff --git a/src/riak_core_stat_xform.erl b/src/riak_core_stat_xform.erl deleted file mode 100644 index 58423f9ca..000000000 --- a/src/riak_core_stat_xform.erl +++ /dev/null @@ -1,41 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2007-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_stat_xform). - --export([parse_transform/2]). - - -parse_transform(Forms, _) -> - case os:getenv("RIAK_CORE_STAT_PREFIX") of - false -> - Forms; - Str -> - transform(Forms, list_to_atom(Str)) - end. - -transform([{function,L,prefix,0,[_]}|T], Pfx) -> - [{function, L, prefix, 0, - [{clause, L, [], [], [{atom,L,Pfx}]}]}|T]; -transform([H|T], Pfx) -> - [H | transform(T, Pfx)]; -transform([], _) -> - []. - - diff --git a/src/riak_core_stats_sup.erl b/src/riak_core_stats_sup.erl deleted file mode 100644 index 3cdf23a8e..000000000 --- a/src/riak_core_stats_sup.erl +++ /dev/null @@ -1,50 +0,0 @@ -%% ------------------------------------------------------------------- -%% 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. -%% -%% ------------------------------------------------------------------- --module(riak_core_stats_sup). --behaviour(supervisor). --export([start_link/0, init/1]). --export([start_server/1, stop_server/1]). - -%% Helper macro for declaring children of supervisor --define(CHILD(I, Type, Timeout), {I, {I, start_link, []}, permanent, Timeout, Type, [I]}). --define(CHILD(I, Type), ?CHILD(I, Type, 5000)). - -start_link() -> - supervisor:start_link({local, ?MODULE}, ?MODULE, []). - -init([]) -> - Children = [stat_server(Mod) || {_App, Mod} <- riak_core:stat_mods()], - {ok, {{one_for_one, 5, 10}, [?CHILD(riak_core_stat_cache, worker)|Children]}}. - -start_server(Mod) -> - Ref = stat_server(Mod), - Pid = case supervisor:start_child(?MODULE, Ref) of - {ok, Child} -> Child; - {error, {already_started, Child}} -> Child - end, - Pid. - -stop_server(Mod) -> - _ = supervisor:terminate_child(?MODULE, Mod), - _ = supervisor:delete_child(?MODULE, Mod), - ok. - -%% @private -stat_server(Mod) -> - ?CHILD(Mod, worker). diff --git a/src/riak_core_status.erl b/src/riak_core_status.erl index 154f9bc18..fce67152e 100644 --- a/src/riak_core_status.erl +++ b/src/riak_core_status.erl @@ -135,8 +135,8 @@ ring_status() -> get_rings() -> {RawRings, Down} = riak_core_util:rpc_every_member( riak_core_ring_manager, get_my_ring, [], 30000), - RawRings2 = [riak_core_ring:upgrade(R) || {ok, R} <- RawRings], - Rings = orddict:from_list([{riak_core_ring:owner_node(R), R} || R <- RawRings2]), +%% RawRings2 = [R || {ok, R} <- RawRings], + Rings = orddict:from_list([{riak_core_ring:owner_node(R), R} || R <- RawRings]), {lists:sort(Down), Rings}. %% Produce a hash of the 'chash' portion of the ring diff --git a/src/riak_core_sup.erl b/src/riak_core_sup.erl index 6bdf8015d..5ce5d25ed 100644 --- a/src/riak_core_sup.erl +++ b/src/riak_core_sup.erl @@ -24,11 +24,8 @@ -behaviour(supervisor). --include("riak_core_bg_manager.hrl"). - %% API -export([start_link/0]). --export([ensembles_enabled/0]). %% Supervisor callbacks -export([init/1]). @@ -50,42 +47,20 @@ start_link() -> %% =================================================================== init([]) -> - DistMonEnabled = app_helper:get_env(riak_core, enable_dist_mon, - true), - {ok, Root} = application:get_env(riak_core, platform_data_dir), - - EnsembleSup = {riak_ensemble_sup, - {riak_ensemble_sup, start_link, [Root]}, - permanent, 30000, supervisor, [riak_ensemble_sup]}, Children = lists:flatten( - [?CHILD(riak_core_bg_manager, worker), - ?CHILD(riak_core_sysmon_minder, worker), + [ ?CHILD(riak_core_vnode_sup, supervisor, 305000), ?CHILD(riak_core_eventhandler_sup, supervisor), - [?CHILD(riak_core_dist_mon, worker) || DistMonEnabled], ?CHILD(riak_core_handoff_sup, supervisor), ?CHILD(riak_core_ring_events, worker), ?CHILD(riak_core_ring_manager, worker), - ?CHILD(riak_core_metadata_manager, worker), - ?CHILD(riak_core_metadata_hashtree, worker), - ?CHILD(riak_core_broadcast, 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_capability, worker), ?CHILD(riak_core_gossip, worker), - ?CHILD(riak_core_claimant, worker), - ?CHILD(riak_core_table_owner, worker), - ?CHILD(riak_core_stat_sup, supervisor), - ?CHILD(riak_core_node_worker_pool_sup, supervisor), - [EnsembleSup || ensembles_enabled()] + ?CHILD(riak_core_claimant, worker) ]), {ok, {{one_for_one, 10, 10}, Children}}. - -ensembles_enabled() -> - Exists = (code:which(riak_ensemble_sup) =/= non_existing), - Enabled = app_helper:get_env(riak_core, enable_consensus, false), - Exists and Enabled. diff --git a/src/riak_core_sysmon_handler.erl b/src/riak_core_sysmon_handler.erl deleted file mode 100644 index 1eefdfb6a..000000000 --- a/src/riak_core_sysmon_handler.erl +++ /dev/null @@ -1,246 +0,0 @@ -%% Copyright (c) 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 custom event handler to the `riak_sysmon' application's -%% `system_monitor' event manager. -%% -%% This module attempts to discover more information about a process -%% that generates a system_monitor event. - --module(riak_core_sysmon_handler). - --behaviour(gen_event). - -%% API --export([add_handler/0]). - -%% gen_event callbacks --export([init/1, handle_event/2, handle_call/2, - handle_info/2, terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --record(state, {timer_ref :: reference() | undefined}). - --define(INACTIVITY_TIMEOUT, 5000). - -%%%=================================================================== -%%% gen_event callbacks -%%%=================================================================== - -add_handler() -> - %% Vulnerable to race conditions (installing handler multiple - %% times), but risk is zero in the common OTP app startup case. - case lists:member(?MODULE, - gen_event:which_handlers(riak_sysmon_handler)) of - true -> - ok; - false -> - riak_sysmon_filter:add_custom_handler(?MODULE, []) - end. - -%%%=================================================================== -%%% gen_event callbacks -%%%=================================================================== - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Whenever a new event handler is added to an event manager, -%% this function is called to initialize the event handler. -%% -%% @spec init(Args) -> {ok, State} -%% @end -%%-------------------------------------------------------------------- -init([]) -> - {ok, #state{}, hibernate}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Whenever an event manager receives an event sent using -%% gen_event:notify/2 or gen_event:sync_notify/2, this function is -%% called for each installed event handler to handle the event. -%% -%% @spec handle_event(Event, State) -> -%% {ok, State} | -%% {swap_handler, Args1, State1, Mod2, Args2} | -%% remove_handler -%% @end -%%-------------------------------------------------------------------- -handle_event({monitor, Pid, Type, _Info}, - State=#state{timer_ref=TimerRef}) when Pid == self() -> - %% Reset the inactivity timeout - NewTimerRef = reset_timer(TimerRef), - maybe_collect_garbage(Type), - {ok, State#state{timer_ref=NewTimerRef}}; -handle_event({monitor, PidOrPort, Type, Info}, State=#state{timer_ref=TimerRef}) -> - %% Reset the inactivity timeout - NewTimerRef = reset_timer(TimerRef), - {Fmt, Args} = format_pretty_proc_or_port_info(PidOrPort, almost_current_function), - ?LOG_INFO("monitor ~w ~w "++ Fmt ++ " ~w", - [Type, PidOrPort] ++ Args ++ [Info]), - {ok, State#state{timer_ref=NewTimerRef}}; -handle_event(Event, State=#state{timer_ref=TimerRef}) -> - NewTimerRef = reset_timer(TimerRef), - ?LOG_INFO("Monitor got ~p", [Event]), - {ok, State#state{timer_ref=NewTimerRef}}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Whenever an event manager receives a request sent using -%% gen_event:call/3,4, this function is called for the specified -%% event handler to handle the request. -%% -%% @spec handle_call(Request, State) -> -%% {ok, Reply, State} | -%% {swap_handler, Reply, Args1, State1, Mod2, Args2} | -%% {remove_handler, Reply} -%% @end -%%-------------------------------------------------------------------- -handle_call(_Call, State) -> - Reply = not_supported, - {ok, Reply, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% This function is called for each installed event handler when -%% an event manager receives any other message than an event or a -%% synchronous request (or a system message). -%% -%% @spec handle_info(Info, State) -> -%% {ok, State} | -%% {swap_handler, Args1, State1, Mod2, Args2} | -%% remove_handler -%% @end -%%-------------------------------------------------------------------- -handle_info(die_for_testing_purposes_only, _State) -> - %% exit({told_to_die, lists:duplicate(500000, $x)}); - exit({told_to_die, lists:duplicate(50, $x)}); -handle_info(inactivity_timeout, State) -> - %% No events have arrived for the timeout period - %% so hibernate to free up resources. - {ok, State, hibernate}; -handle_info(Info, State) -> - ?LOG_INFO("handle_info got ~p", [Info]), - {ok, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Whenever an event handler is deleted from an event manager, this -%% function is called. It should be the opposite of Module:init/1 and -%% do any necessary cleaning up. -%% -%% @spec terminate(Reason, State) -> void() -%% @end -%%-------------------------------------------------------------------- -terminate(_Reason, _State) -> - ok. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Convert process state when code is changed -%% -%% @spec code_change(OldVsn, State, Extra) -> {ok, NewState} -%% @end -%%-------------------------------------------------------------------- -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -%% Enabling warnings_as_errors prevents a build since this function is -%% dead code. To be safe, commenting out rather than deleting. -%% format_pretty_proc_info(Pid) -> -%% format_pretty_proc_info(Pid, current_function). - -format_pretty_proc_or_port_info(PidOrPort, Acf) -> - try - case get_pretty_proc_or_port_info(PidOrPort, Acf) of - undefined -> - {"", []}; - Res -> - Res - end - catch Class:Reason:Stacktrace -> - {"Pid ~w, ~W ~W at ~w\n", - [PidOrPort, Class, 20, Reason, 20, Stacktrace]} - end. - -%% Enabling warnings_as_errors prevents a build since this function is -%% dead code. To be safe, commenting out rather than deleting. -%% get_pretty_proc_info(Pid) -> -%% get_pretty_proc_info(Pid, current_function). - -get_pretty_proc_or_port_info(Pid, Acf) when is_pid(Pid) -> - case process_info(Pid, [registered_name, initial_call, current_function, - message_queue_len]) of - undefined -> - undefined; - [] -> - undefined; - [{registered_name, RN0}, ICT1, {_, CF}, {_, MQL}] -> - ICT = case proc_lib:translate_initial_call(Pid) of - {proc_lib, init_p, 5} -> % not by proc_lib, see docs - ICT1; - ICT2 -> - {initial_call, ICT2} - end, - RNL = if RN0 == [] -> []; - true -> [{name, RN0}] - end, - {"~w", [RNL ++ [ICT, {Acf, CF}, {message_queue_len, MQL}]]} - end; -get_pretty_proc_or_port_info(Port, _Acf) when is_port(Port) -> - PortInfo = erlang:port_info(Port), - {value, {name, Name}, PortInfo2} = lists:keytake(name, 1, PortInfo), - QueueSize = [erlang:port_info(Port, queue_size)], - Connected = case proplists:get_value(connected, PortInfo2) of - undefined -> - []; - ConnectedPid -> - case proc_lib:translate_initial_call(ConnectedPid) of - {proc_lib, init_p, 5} -> % not by proc_lib, see docs - []; - ICT -> - [{initial_call, ICT}] - end - end, - {"name ~s ~w", [Name, lists:append([PortInfo2, QueueSize, Connected])]}. - - -%% @doc If the message type is due to a large heap warning -%% and the source is ourself, go ahead and collect garbage -%% to avoid the death spiral. --spec maybe_collect_garbage(atom()) -> ok. -maybe_collect_garbage(large_heap) -> - erlang:garbage_collect(), - ok; -maybe_collect_garbage(_) -> - ok. - --spec reset_timer(undefined | reference()) -> reference(). -reset_timer(undefined) -> - erlang:send_after(?INACTIVITY_TIMEOUT, self(), inactivity_timeout); -reset_timer(TimerRef) -> - _ = erlang:cancel_timer(TimerRef), - reset_timer(undefined). diff --git a/src/riak_core_sysmon_minder.erl b/src/riak_core_sysmon_minder.erl deleted file mode 100644 index 741c1b55a..000000000 --- a/src/riak_core_sysmon_minder.erl +++ /dev/null @@ -1,163 +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. -%% -%% ------------------------------------------------------------------- - --module(riak_core_sysmon_minder). - --behaviour(gen_server). - -%% API --export([start_link/0]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --record(state, {}). - -%%%=================================================================== -%%% API -%%%=================================================================== - -%%-------------------------------------------------------------------- -%% @doc -%% Starts the server -%% -%% @spec start_link() -> {ok, Pid} | ignore | {error, Error} -%% @end -%%-------------------------------------------------------------------- -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). - -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Initializes the server -%% -%% @spec init(Args) -> {ok, State} | -%% {ok, State, Timeout} | -%% ignore | -%% {stop, Reason} -%% @end -%%-------------------------------------------------------------------- -init([]) -> - %% Add our system_monitor event handler. We do that here because - %% we have a process at our disposal (i.e. ourself) to receive the - %% notification in the very unlikely event that the - %% riak_core_sysmon_handler has crashed and been removed from the - %% riak_sysmon_handler gen_event server. (If we had a supervisor - %% or app-starting process add the handler, then if the handler - %% crashes, nobody will act on the crash notification.) - riak_core_sysmon_handler:add_handler(), - - {ok, #state{}}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Handling call messages -%% -%% @spec handle_call(Request, From, State) -> -%% {reply, Reply, State} | -%% {reply, Reply, State, Timeout} | -%% {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, Reply, State} | -%% {stop, Reason, State} -%% @end -%%-------------------------------------------------------------------- -handle_call(_Request, _From, State) -> - Reply = ok, - {reply, Reply, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Handling cast messages -%% -%% @spec handle_cast(Msg, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% @end -%%-------------------------------------------------------------------- -handle_cast(_Msg, State) -> - {noreply, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Handling all non call/cast messages -%% -%% @spec handle_info(Info, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% @end -%%-------------------------------------------------------------------- -handle_info({gen_event_EXIT, riak_core_sysmon_handler, _}, State) -> - %% SASL will create an error message, no need for us to duplicate it. - %% - %% Our handler should never crash, but it did indeed crash. If - %% there's a pathological condition somewhere that's generating - %% lots of unforseen things that crash core's custom handler, we - %% could make things worse by jumping back into the exploding - %% volcano. Wait a little bit before jumping back. Besides, the - %% system_monitor data is nice but is not critical: there is no - %% need to make things worse if things are indeed bad, and if we - %% miss a few seconds of system_monitor events, the world will not - %% end. - timer:sleep(2*1000), - riak_core_sysmon_handler:add_handler(), - {noreply, State}; -handle_info(_Info, State) -> - {noreply, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% This function is called by a gen_server when it is about to -%% terminate. It should be the opposite of Module:init/1 and do any -%% necessary cleaning up. When it returns, the gen_server terminates -%% with Reason. The return value is ignored. -%% -%% @spec terminate(Reason, State) -> void() -%% @end -%%-------------------------------------------------------------------- -terminate(_Reason, _State) -> - ok. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Convert process state when code is changed -%% -%% @spec code_change(OldVsn, State, Extra) -> {ok, NewState} -%% @end -%%-------------------------------------------------------------------- -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== diff --git a/src/riak_core_table_owner.erl b/src/riak_core_table_owner.erl deleted file mode 100644 index 354f0e169..000000000 --- a/src/riak_core_table_owner.erl +++ /dev/null @@ -1,128 +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. -%% -%% ------------------------------------------------------------------- -%% -%% @doc

ETS tables, when created with the `ets:new/2' function, have a single -%% owning process. If the owning process exits, then any ETS tables associated -%% with that process are deleted. The purpose of the `riak_core_table_owner' -%% module (which is a gen_server process) is to serve as the owning process for -%% ETS tables that do not otherwise have an obvious owning process. For example, -%% the `riak_core_throttle' module uses an ETS table for maintaining its state, -%% but it is not itself a process and therefore the owning process for it ETS -%% table is not clear. In this case, `riak_core_table_owner' can be used to -%% create and own the ETS table on its behalf.

-%% -%%

It is important that this process never crashes, as that would lead to -%% loss of data. Therefore, a defensive approach is taken and any calls to -%% external modules are protected with the try/catch mechanism.

-%% -%%

Note that this first iteration does not provide any API functions for -%% reading or writing data in ETS tables and therefore is appropriate only for -%% named public ETS tables. In order to be more broadly useful, future -%% enhancements to this module should include API functions for efficiently -%% reading and writing ETS data, preferably without going through a gen_server -%% call.

--module(riak_core_table_owner). - --behaviour(gen_server). - -%% API --export([start_link/0, - create_table/2, - maybe_create_table/2]). - -%% gen_server callbacks --export([init/1, - handle_call/3, - handle_cast/2, - handle_info/2, - terminate/2, - code_change/3]). - -%% Unfortunately the `ets' module does not define a type for options, but we -%% can at least insist on a list. --type ets_options() :: list(). --type ets_table() :: ets:tab(). --type create_table_result() :: {ok, ets_table()} | {error, Reason::term()}. - -%%%=================================================================== -%%% API -%%%=================================================================== - --spec start_link() -> {ok, pid()} | ignore | {error, Reason::term()}. -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, dict:new(), []). - -%% Creates a new ETS table with the given `Name' and `Options'. -%% Since the table will be owned by the `riak_core_table_owner' process, it -%% should be created with the `public' option so that other processes can read -%% and write data in the table. --spec create_table(Name::atom(), Options::ets_options()) -> create_table_result(). -create_table(Name, Options) -> - gen_server:call(?MODULE, {create_table, Name, Options}). - -%% Creates a new ETS table with the given `Name' and `Options', if and only if -%% it was not already created previously. -%% Since the table will be owned by the `riak_core_table_owner' process, it -%% should be created with the `public' option so that other processes can read -%% and write data in the table. --spec maybe_create_table(Name::atom(), Options::ets_options()) -> create_table_result(). -maybe_create_table(Name, Options) -> - gen_server:call(?MODULE, {maybe_create_table, Name, Options}). - -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== - -init(State) -> - {ok, State}. - -handle_call({create_table, Name, Options}, _From, State) -> - do_create_table(Name, Options, State); -handle_call({maybe_create_table, Name, Options}, _From, State) -> - case dict:find(Name, State) of - {ok, Table} -> - {reply, {ok, Table}, State}; - error -> - do_create_table(Name, Options, State) - end. - -handle_cast(_Msg, State) -> - {noreply, State}. - -handle_info(_Info, State) -> - {noreply, State}. - -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -do_create_table(Name, Options, State) -> - try - Table = ets:new(Name, Options), - {reply, {ok, Table}, dict:store(Name, Table, State)} - catch - Error -> - {reply, {error, Error}, State} - end. diff --git a/src/riak_core_tcp_mon.erl b/src/riak_core_tcp_mon.erl deleted file mode 100644 index 79c1def1b..000000000 --- a/src/riak_core_tcp_mon.erl +++ /dev/null @@ -1,520 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% TCP Connection Monitor -%% -%% Copyright (c) 2013-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_tcp_mon). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - --export([start_link/0, start_link/1, monitor/3, status/0, status/1, format/0, format/2]). --export([default_status_funs/0, raw/2, diff/2, rate/2, kbps/2, - socket_status/1, format_socket_stats/2]). - -%% gen_server callbacks --behavior(gen_server). --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - -%% Keep 6 x 10s worth of data plus an extra sample for working out rates --define(DEFAULT_LIMIT, 7). --define(DEFAULT_INTERVAL, timer:seconds(10)). --define(DEFAULT_CLEAR, timer:seconds(60)). - --define(INET_STATS, [recv_oct,recv_cnt,recv_max,recv_avg,recv_dvi, - send_oct,send_cnt,send_max,send_avg,send_pend]). --define(INET_OPTS, [sndbuf,recbuf,active,buffer]). - --define(STATUS_FUNS, [{recv_oct, {recv_kbps, fun kbps/2}}, {recv_cnt, fun diff/2}, - {recv_max, fun raw/2}, {recv_avg, fun raw/2}, {recv_dvi, fun raw/2}, - {send_oct, {send_kbps, fun kbps/2}}, {send_cnt, fun diff/2}, - {send_max, fun raw/2}, {send_avg, fun raw/2}, {send_pend, fun raw/2}, - {sndbuf, fun raw/2}, {recbuf, fun raw/2}, {active, fun raw/2}, - {buffer, fun raw/2}]). - --record(state, {conns = gb_trees:empty(), % conn records keyed by Socket - tags = gb_trees:empty(), % tags to ports - interval = ?DEFAULT_INTERVAL, % how often to get stats - limit = ?DEFAULT_LIMIT, % how many entries to keep per stat - clear_after = ?DEFAULT_CLEAR, % how long to leave errored sockets in status - status_funs = dict:from_list(default_status_funs()) % Status reporting functions - }). - --record(conn, {tag, %% Tag used to find socket - transport, - type, %% Type - normal, dist, error - ts_hist = [], %% History of timestamps for readings - hist = []}). %% History of readings - -start_link() -> - start_link([]). - -start_link(Props) -> - gen_server:start_link({local, ?MODULE}, ?MODULE, Props, []). - -monitor(Socket, Tag, Transport) -> - gen_server:call(?MODULE, {monitor, Socket, Tag, Transport}, infinity). - -status() -> - gen_server:call(?MODULE, status, infinity). - -status(Timeout) -> - gen_server:call(?MODULE, status, Timeout). - -socket_status(Socket) -> - gen_server:call(?MODULE, {socket_status, Socket}, infinity). - -format() -> - Status = status(), - io:write([format(Status, recv_kbps), - format(Status, send_kbps)]). - -format(Status, Stat) -> - [format_header(Stat), - [format_entry(Entry, Stat) || Entry <- Status]]. - -format_header(Stat) -> - io_lib:format("~40w Value\n", [Stat]). - -format_entry(Status, Stat) -> - Tag = proplists:get_value(tag, Status), - Value = proplists:get_value(Stat, Status), - case Value of - Value when is_list(Value) -> - [format_tag(Tag), - " ", - format_list(Value), - "\n"]; - _ -> - [format_tag(Tag), - " [", - format_value(Value), - "\n"] - end. - -format_tag(Tag) when is_list(Tag) -> - io_lib:format("~40s", [Tag]); -format_tag(Tag) -> - io_lib:format("~40w", [Tag]). - -format_value(Val) when is_float(Val) -> - io_lib:format("~7.1f", [Val]); -format_value(Val) -> - io_lib:format("~w", [Val]). - -format_list(Value) -> - [$[, string:join([format_value(Item) || Item <- Value], ", "), $]]. - -%% Provide a way to get to the default status fun -default_status_funs() -> - ?STATUS_FUNS. - -%% Return raw readings, ignore timestamps -raw(_TS, Hist) -> - Hist. - -diff(TS, Hist) -> - RevTS = lists:reverse(TS), - RevHist = lists:reverse(Hist), - diff(RevTS, RevHist, []). - -diff([_TS], [_C], Acc) -> - Acc; -diff([_TS1 | TSRest], [C1 | CRest], Acc) -> - Diff = hd(CRest) - C1, - diff(TSRest, CRest, [Diff | Acc]). - -%% Convert byte rate to bit rate -kbps(TS, Hist) -> - [trunc(R / 128.0) || R <- rate(TS, Hist)]. % *8 bits / 1024 bytes - -%% Work out the rate of something per second -rate(TS, Hist) -> - RevTS = lists:reverse(TS), - RevHist = lists:reverse(Hist), - rate(RevTS, RevHist, []). - -rate([_TS], [_C], Acc) -> - Acc; -rate([TS1 | TSRest], [C1 | CRest], Acc) -> - Secs = timer:now_diff(hd(TSRest), TS1) / 1.0e6, - Rate = (hd(CRest) - C1) / Secs, - rate(TSRest, CRest, [Rate | Acc]). - -init(Props) -> - ?LOG_INFO("Starting TCP Monitor"), - ok = net_kernel:monitor_nodes(true, [{node_type, visible}, nodedown_reason]), - % blow up here if any state fields would not be sane so subsequent code - % can assume they're positive integers - State0 = #state{ - interval = pos_int_value( - proplists:get_value(interval, Props, ?DEFAULT_INTERVAL)), - limit = pos_int_value( - proplists:get_value(limit, Props, ?DEFAULT_LIMIT)), - clear_after = pos_int_value( - proplists:get_value(clear_after, Props, ?DEFAULT_CLEAR))}, - DistCtrl = erlang:system_info(dist_ctrl), - State = lists:foldl(fun({Node,Port}, DatState) -> - add_dist_conn(Node, Port, DatState) - end, State0, DistCtrl), - {ok, schedule_tick(State)}. - -pos_int_value(Val) when erlang:is_integer(Val) andalso Val > 0 -> - Val. - -handle_call(status, _From, State = #state{conns = Conns, - status_funs = StatusFuns}) -> - Out = [ [{socket,P} | conn_status(P, Conn, StatusFuns)] - || {P,Conn} <- gb_trees:to_list(Conns)], - {reply, Out , State}; - -handle_call({socket_status, Socket}, _From, State = #state{conns = Conns, - status_funs = StatusFuns}) -> - Stats = - case gb_trees:lookup(Socket, Conns) of - none -> []; - {value, Conn} -> conn_status(Socket, Conn, StatusFuns) - end, - {reply, Stats, State}; - -handle_call({monitor, Socket, Tag, Transport}, _From, State) -> - {reply, ok, add_conn(Socket, #conn{tag = Tag, type = normal, - transport = Transport}, State)}. - -handle_cast(Msg, State) -> - ?LOG_WARNING("unknown message received: ~p", [Msg]), - {noreply, State}. - -handle_info({nodeup, Node, _InfoList}, State) -> - DistCtrl = erlang:system_info(dist_ctrl), - case proplists:get_value(Node, DistCtrl) of - undefined -> - ?LOG_ERROR("Could not get dist for ~p\n~p\n", [Node, DistCtrl]), - {noreply, State}; - Port -> - {noreply, add_dist_conn(Node, Port, State)} - end; - -handle_info({nodedown, Node, _InfoList}, State) -> - GbList = gb_trees:to_list(State#state.conns), - MaybePortConn = [{P, C} || - {P, #conn{type = dist, tag = {node, MaybeNode}} = C} <- GbList, - MaybeNode =:= Node], - Conns2 = case MaybePortConn of - [{Port, Conn} | _] -> - erlang:send_after(State#state.clear_after, self(), {clear, Port}), - Conn2 = Conn#conn{type = error}, - gb_trees:update(Port, Conn2, State#state.conns); - _ -> - State#state.conns - end, - {noreply, State#state{conns = Conns2}}; - -handle_info(measurement_tick, State0) -> - State = schedule_tick(State0), - Limit = State#state.limit, - ClearAfter = State#state.clear_after, - UpdateConn = fun(Socket, Conn) -> - update_conn(Socket, Conn, Limit, ClearAfter) - end, - {noreply, State#state{conns = gb_trees:map(UpdateConn, State#state.conns)}}; - -handle_info({clear, Socket}, State = #state{conns = Conns}) -> - {noreply, State#state{conns = gb_trees:delete_any(Socket, Conns)}}. - -update_conn(_Socket, Conn = #conn{type = error}, _Limit, _ClearAfter) -> - Conn; -update_conn(Socket, Conn = #conn{ts_hist = TSHist, hist = Hist}, - Limit, ClearAfter) -> - try - RawSock = unwrap_socket(Socket), - {ok, StatVals} = inet:getstat(RawSock, ?INET_STATS), - % get the timestamp between stats and opts, split the difference - TS = os:timestamp(), - {ok, OptVals} = inet:getopts(RawSock, ?INET_OPTS), - NewHist = update_hist(OptVals, Limit, update_hist(StatVals, Limit, Hist)), - Conn#conn{ts_hist = prepend_trunc(TS, TSHist, Limit), hist = NewHist} - catch - _E:_R -> - % io:format("Error ~p: ~p\n", [_E, _R]), - %% Any problems with getstat/getopts mark in error - erlang:send_after(ClearAfter, self(), {clear, Socket}), - Conn#conn{type = error} - end. - -%% -%% The #sslsocket record type definition is invisible outside the ssl -%% application code (and barely defined inside it), so validate it roughly -%% the way erlang:is_record/2 would, by checking its type, size, and first -%% element. -%% The second element's first element is actually a transport module, but -%% gen_tcp gets special handling, and is the only type we support anyway. -%% Anything else will throw a badarg error, causing the connection to be -%% flagged in error. -%% -unwrap_socket(Socket) when erlang:is_tuple(Socket) - andalso erlang:tuple_size(Socket) > 1 - andalso erlang:element(1, Socket) == sslsocket -> - TcpSock = erlang:element(2, Socket), - if erlang:is_tuple(TcpSock) - andalso erlang:tuple_size(TcpSock) > 1 - andalso erlang:element(1, TcpSock) == gen_tcp -> - erlang:element(2, TcpSock); - true -> - erlang:error(badarg, [Socket]) - end; -%% -%% Anything else gets passed through as-is, let the consumer(s) handle it. -%% -unwrap_socket(Socket) -> - Socket. - -terminate(_Reason, _State) -> - ?LOG_INFO("Shutting down TCP Monitor"), - %% TODO: Consider trying to do something graceful with poolboy? - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%% Add a distributed connection to the state -add_dist_conn(Node, Port, State) -> - add_conn(Port, #conn{tag = {node, Node}, - type = dist, - transport = ranch_tcp}, State). - -%% Add connection to the state -add_conn(Socket, Conn, State = #state{conns = Conns}) -> - State#state{conns = gb_trees:enter(Socket, Conn, Conns)}. - --spec update_hist([{atom(), term()}], pos_integer(), list()) -> list(). -%% Update the histogram with the list of name/values -update_hist(Readings, Limit, Histories) -> - %% For all the readings of {Stat, Val} pairs - {Limit, NewHists} = lists:foldl( - fun update_hist/2, {Limit, Histories}, Readings), - NewHists. - --spec update_hist({atom(), term()}, {pos_integer(), list()}) -> {pos_integer(), list()}. -%% Update the a name/value entry in a histogram, to be called from lists:fold -update_hist({Stat, Val}, {Limit, Histories}) -> - %% Prepend newest reading and truncate - NewHists = orddict:update(Stat, - fun(StatHistory) -> - prepend_trunc(Val, StatHistory, Limit) - end, - [Val], Histories), - {Limit, NewHists}. - - --spec prepend_trunc(term(), list(), pos_integer()) -> list(). -%% Limit will normally be > 2, so don't bother specializing for lower values -prepend_trunc(Val, List, Limit) -> - [Val | lists:sublist(List, (Limit - 1))]. - -conn_status(Socket, #conn{tag = Tag, type = Type, - ts_hist = TsHist, hist = Histories, - transport = Transport}, StatusFuns) -> - Fun = fun({Stat, Hist}, Acc) -> - case dict:find(Stat, StatusFuns) of - {ok, {Alias, StatusFun}} -> - [{Alias, StatusFun(TsHist, Hist)} | Acc]; - {ok, StatusFun} -> - [{Stat, StatusFun(TsHist, Hist)} | Acc]; - _ -> - Acc - end - end, - Stats = lists:sort(lists:foldl(Fun, [], Histories)), - Conn = try % Socket could be dead, don't kill the TCP mon finding out - Peername = riak_core_util:peername(Socket, Transport), - Sockname = riak_core_util:sockname(Socket, Transport), - [{peername, Peername}, {sockname, Sockname}] - catch - _:_ -> - [{peername, "error"}, {sockname, "error"}] - end, - [{tag, Tag}, {type, Type}] ++ Conn ++ Stats. - -schedule_tick(State = #state{interval = Interval}) -> - erlang:send_after(Interval, self(), measurement_tick), - State. - -format_socket_stats([], Buf) -> lists:reverse(Buf); -%format_socket_stats([{K,V}|T], Buf) when K == tag -> - %format_socket_stats(T, [{tag, V} | Buf]); -format_socket_stats([{K,_V}|T], Buf) when - K == tag; - K == sndbuf; - K == recbuf; - K == buffer; - K == active; - K == type; - K == send_max; - K == send_avg -> - %% skip these - format_socket_stats(T, Buf); -format_socket_stats([{K,V}|T], Buf) when - K == recv_avg; - K == recv_cnt; - K == recv_dvi; - K == recv_kbps; - K == recv_max; - K == send_kbps; - K == send_pend; - K == send_cnt -> - format_socket_stats(T, [{K, lists:flatten(format_list(V))} | Buf]); -format_socket_stats([{K,V}|T], Buf) -> - format_socket_stats(T, [{K, V} | Buf]). - --ifdef(TEST). - --ifdef(deprecated_21). -ssl_handshake(Socket) -> - ssl:handshake(Socket). --else. -ssl_handshake(Socket) -> - ssl:ssl_accept(Socket). --endif. - -updown() -> - %% Set the stat gathering interval to 100ms - {ok, TCPMonPid} = riak_core_tcp_mon:start_link([{interval, 100}]), - {ok, LS} = gen_tcp:listen(0, [{active, true}, binary]), - {ok, Port} = inet:port(LS), - Pid = self(), - spawn( - fun () -> - %% server - {ok, S} = gen_tcp:accept(LS), - riak_core_tcp_mon:monitor(S, "test", gen_tcp), - timer:sleep(1000), - receive - {tcp, S, _Data} -> - %% only receive one packet, let the others build - %% up - ok; - _ -> - ?assert(fail) - after - 1000 -> - ?assert(fail) - end, - _Stat1 = riak_core_tcp_mon:status(), - MPid = whereis(riak_core_tcp_mon), - MPid ! {nodedown, 'foo', []}, - Stat2 = riak_core_tcp_mon:status(), - MPid ! {nodeup, 'foo', []}, - Stat3 = riak_core_tcp_mon:status(), - ?assert(proplists:is_defined(socket,hd(Stat2))), - ?assert(proplists:is_defined(socket,hd(Stat3))), - gen_tcp:close(S), - Pid ! finished - end), - %% client - {ok, Socket} = gen_tcp:connect("localhost",Port, - [binary, {active, true}]), - lists:foreach( - fun (_) -> - gen_tcp:send(Socket, "TEST") - end, - lists:seq(1,10000)), - receive - finished -> ok - end, - gen_tcp:close(Socket), - unlink(TCPMonPid), - exit(TCPMonPid, kill), - ok. - -nodeupdown_test_() -> - %% spawn is here because this test has been known to timeout - %% after 60 seconds. Locally, I've never seen it take more than - %% two seconds, so I'm inclined to believe it's either a - %% race-condition or prior-state related issue. The spawn is an - %% attempt at seeing if the failure still occasionally happens - {spawn, {timeout, 60, fun updown/0}}. - -ssl_test_() -> - {timeout, 60, fun() -> - ssl:start(), - % Set the stat gathering interval to 100ms - {ok, TCPMonPid} = riak_core_tcp_mon:start_link([{interval, 100}]), - % set up a server to hear us out. - {ok, LS} = ssl:listen(0, [{active, true}, binary, {certfile, "test/site1-cert.pem"}, {keyfile, "test/site1-key.pem"}]), - {ok, {_, Port}} = ssl:sockname(LS), - spawn(fun () -> - %% server - {ok, S} = ssl:transport_accept(LS), - {ok, SslSock} = case ssl_handshake(S) of - ok -> - {ok, S}; - {ok, NewSocket} -> - {ok, NewSocket}; - Error = {error, _} -> - Error - end, - ssl_recv_loop(SslSock) - end), - - {ok, Socket} = ssl:connect("localhost", Port, [binary, {active, true}, {certfile, "test/site2-cert.pem"}, {keyfile, "test/site2-key.pem"}]), - riak_core_tcp_mon:monitor(Socket, "test", ssl), - % so we have stats to see - lists:foreach(fun(_) -> - ssl:send(Socket, <<"TEST">>) - end, lists:seq(1, 100)), - - % wait for stats to update - timer:sleep(1000), - - Status1 = riak_core_tcp_mon:socket_status(Socket), - ?assertNotEqual([], Status1), - - Status2 = riak_core_tcp_mon:status(), - Filtered = lists:filter(fun(StatBlock) -> - proplists:get_value(socket, StatBlock) =:= Socket - end, Status2), - ?assertNotEqual([], Filtered), - ?assertNotEqual([[{socket, Socket}]], Filtered), - - % clean up my mess - ssl:close(Socket), - TCPMonPid = whereis(riak_core_tcp_mon), - unlink(TCPMonPid), - exit(TCPMonPid, kill), - ok - end}. - -ssl_recv_loop(S) -> - receive - {ssl, S, _Data} -> - ssl_recv_loop(S); - {ssl_closed, S} -> - ok; - {ssl_error, S, _Error} -> - ok - end. - --endif. diff --git a/src/riak_core_test_util.erl b/src/riak_core_test_util.erl index 7c5220c24..8646f51ee 100644 --- a/src/riak_core_test_util.erl +++ b/src/riak_core_test_util.erl @@ -28,14 +28,25 @@ -export([setup_mockring1/0, fake_ring/2, stop_pid/1, - wait_for_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(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, _ExitType) when not is_pid(Other) -> + ok; +stop_pid(Pid, ExitType) -> unlink(Pid), - exit(Pid, shutdown), + exit(Pid, ExitType), ok = wait_for_pid(Pid). wait_for_pid(Pid) -> @@ -49,6 +60,9 @@ wait_for_pid(Pid) -> 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()), diff --git a/src/riak_core_throttle.erl b/src/riak_core_throttle.erl deleted file mode 100644 index 3ef8bb07e..000000000 --- a/src/riak_core_throttle.erl +++ /dev/null @@ -1,400 +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. -%% -%% ------------------------------------------------------------------- -%% -%% @doc Throttling for activities that can potentially overload resources. -%% Provides support for "throttling" (i.e. slowing down) calling processes -%% that, when under heavy load, could potentially overload other resources. -%% Activities are identified by a unique key so that different throttle values -%% can be used for different activities. -%% -%% The throttle for an activity can be set to a specific value with the -%% `set_throttle/2' function, or it can be set to a value based on the current -%% "load" for the activity by using the `set_limits/2' function to define a -%% mapping from load factors to throttle values, and then periodically calling -%% the `set_throttle_by_load/2' function with the current load factor. Note -%% that "load factor" is an abstract concept, the purpose of which is simply -%% to represent numerically the amount of load that an activity is under and -%% map that level of load to a particular throttle level. Examples of metrics -%% that could be used for load factors include the size of the mailbox for a -%% particular process, or the number of messages per second being sent to an -%% external service such as Solr. --module(riak_core_throttle). - -%% API --export([get_throttle/2, - set_throttle/3, - clear_throttle/2, - disable_throttle/2, - enable_throttle/2, - is_throttle_enabled/2, - init/0, - init/4, - set_limits/3, - get_limits/2, - clear_limits/2, - create_limits_translator_fun/2, - set_throttle_by_load/3, - throttle/2]). - --include_lib("kernel/include/logger.hrl"). - --ifdef(TEST). --export([get_throttle_for_load/3]). --define(SLEEP(Time), Time). --else. --define(SLEEP(Time), timer:sleep(Time)). --endif. - --type app_name() :: atom(). --type activity_key() :: atom(). --type throttle_time() :: non_neg_integer(). --type load_factor() :: number() | atom() | tuple(). --type limits() :: [{load_factor(), throttle_time()}]. - --export_type([activity_key/0, throttle_time/0, load_factor/0, limits/0]). - --define(ETS_TABLE_NAME, riak_core_throttles). --define(ETS_TABLE_OPTIONS, [set, named_table, public]). - --define(THROTTLE_KEY(Key), list_to_atom("throttle_" ++ atom_to_list(Key))). --define(THROTTLE_LIMITS_KEY(Key), - list_to_atom("throttle_limits_" ++ atom_to_list(Key))). --define(THROTTLE_ENABLED_KEY(Key), - list_to_atom("throttle_enabled_" ++ atom_to_list(Key))). - -%% @doc Initialize the throttling subsystem. Should be called just once during -%% startup, although calling multiple times will not have any negative -%% consequences. --spec init() -> ok. -init() -> - case riak_core_table_owner:maybe_create_table(?ETS_TABLE_NAME, ?ETS_TABLE_OPTIONS) of - {ok, ?ETS_TABLE_NAME} -> - ok; - {error, Reason} -> - throw({"Failed to create ETS table for riak_core_throttle", Reason}) - end. - -%% @doc Sets the throttle for the activity identified by `AppName' and `Key' to -%% the specified `Time'. --spec set_throttle(app_name(), activity_key(), throttle_time()) -> ok. -set_throttle(AppName, Key, Time) when Time >= 0 -> - maybe_log_throttle_change(AppName, Key, Time, "client request"), - do_set_throttle(AppName, Key, Time). - -%% @private -%% Actually set the throttle, but don't log anything. -do_set_throttle(AppName, Key, Time) when Time >= 0 -> - set_value(AppName, ?THROTTLE_KEY(Key), Time). - -%% @doc Clears the throttle for the activity identified by `AppName' and `Key'. --spec clear_throttle(app_name(), activity_key()) -> ok. -clear_throttle(AppName, Key) -> - unset_value(AppName, ?THROTTLE_KEY(Key)). - -%% @doc Disables the throttle for the activity identified by `AppName' and -%% `Key'. --spec disable_throttle(app_name(), activity_key()) -> ok. -disable_throttle(AppName, Key) -> - ?LOG_INFO("Disabling throttle for ~p/~p.", [AppName, Key]), - set_value(AppName, ?THROTTLE_ENABLED_KEY(Key), false). - -%% @doc Enables the throttle for the activity identified by `AppName' and -%% `Key'. --spec enable_throttle(app_name(), activity_key()) -> ok. -enable_throttle(AppName, Key) -> - ?LOG_INFO("Enabling throttle for ~p/~p.", [AppName, Key]), - set_value(AppName, ?THROTTLE_ENABLED_KEY(Key), true). - -%% @doc Returns `true' if the throttle for the activity identified by `AppName' -%% and `Key' is enabled, `false' otherwise. --spec is_throttle_enabled(app_name(), activity_key()) -> boolean(). -is_throttle_enabled(AppName, Key) -> - get_value(AppName, ?THROTTLE_ENABLED_KEY(Key), true). - -%% @doc Initializes the throttle for the activity identified by `AppName' and -%% `Key' using configuration values found in the application environment for -%% `AppName'. --spec init(AppName::app_name(), Key::activity_key(), - {LimitsKey::atom(), LimitsDefault::limits()}, - {EnabledKey::atom(), EnabledDefault::boolean()}) -> - ok | {error, Reason :: term()}. -init(AppName, Key, - {LimitsKey, LimitsDefault}, - {EnabledKey, EnabledDefault}) -> - Limits = app_helper:get_env(AppName, LimitsKey, LimitsDefault), - set_limits(AppName, Key, Limits), - Enabled = app_helper:get_env(AppName, EnabledKey, EnabledDefault), - case Enabled of - true -> - enable_throttle(AppName, Key); - false -> - disable_throttle(AppName, Key) - end. - -%% @doc

Sets the limits for the activity identified by `AppName' and `Key'. -%% `Limits' is a mapping from load factors to throttle values. Once this -%% mapping has been established, the `set_throttle_by_load/2' function can -%% be used to set the throttle for the activity based on the current load -%% factor.

-%% -%%

All of the throttle values in the `Limits' list must be non-negative -%% integers. Additionally, the `Limits' list must contain a tuple with the -%% key `-1'. If either of these conditions does not hold, this function exits -%% with an error.

-%% @end -%% -%% @see set_throttle_by_load/2 --spec set_limits(app_name(), activity_key(), limits()) -> ok | no_return(). -set_limits(AppName, Key, Limits) -> - ok = validate_limits(AppName, Key, Limits), - set_value(AppName, ?THROTTLE_LIMITS_KEY(Key), lists:sort(Limits)). - -%% @doc Returns the limits for the activity identified by `AppName' and `Key' -%% if defined, otherwise returns `undefined'. --spec get_limits(app_name(), activity_key()) -> limits() | undefined. -get_limits(AppName, Key) -> - case get_value(AppName, ?THROTTLE_LIMITS_KEY(Key)) of - {ok, Limits} -> - Limits; - _ -> - undefined - end. - -%% @doc Clears the limits for the activity identified by `AppName' and `Key'. --spec clear_limits(app_name(), activity_key()) -> ok. -clear_limits(AppName, Key) -> - unset_value(AppName, ?THROTTLE_LIMITS_KEY(Key)). - -%% @doc Returns a fun that used in Cuttlefish translations to translate from -%% configuration items of the form: -%% `ConfigPrefix'.throttle.tier1.`LoadFactorMeasure' -%% to the list of tuples form expected by the `set_limits/2' function in this -%% module. See riak_kv.schema and yokozuna.schema for example usages. -create_limits_translator_fun(ConfigPrefix, LoadFactorMeasure) -> - fun(Conf) -> - %% Grab all of the possible names of tiers so we can ensure that - %% both LoadFactorMeasure and delay are included for each tier. - CfgPrefix = cuttlefish_variable:tokenize(ConfigPrefix), - Prefix = flat_concat([CfgPrefix, "throttle", "$tier"]), - LoadFactorTierNames = cuttlefish_variable:fuzzy_matches( - flat_concat([Prefix, LoadFactorMeasure]), - Conf), - DelayTierNames = cuttlefish_variable:fuzzy_matches( - flat_concat([Prefix, "delay"]), Conf), - TierNames = lists:usort(LoadFactorTierNames ++ DelayTierNames), - - Throttles = get_throttles(Conf, CfgPrefix, TierNames, LoadFactorMeasure), - - case Throttles of - %% -1 is a magic "minimum" bound and must be included, so if it - %% isn't present we call it invalid - [{-1,_}|_] -> - Throttles; - _ -> - Msg = ConfigPrefix - ++ ".throttle tiers must include a tier with " - ++ LoadFactorMeasure - ++ " 0", - cuttlefish:invalid(Msg) - end - end. - -%% @private -%% Concatenates all of the individual elements in `ListOfLists' into a single -%% list, flattening one level if necessary. -flat_concat(ListOfLists) when is_list(ListOfLists)-> - lists:foldl( - fun(X, Acc) -> - case length(X) == lists:flatlength(X) of - true -> - lists:append(Acc, [X]); - false -> - lists:append(Acc, X) - end - end, - [], - ListOfLists). - -get_throttles(Conf, ConfigPrefix, TierNames, LoadFactorMeasure) -> - lists:sort( - lists:foldl( - fun({"$tier", Tier}, Settings) -> - TierPrefix = flat_concat([ConfigPrefix, "throttle", Tier]), - LoadFactorValue = cuttlefish:conf_get( - flat_concat([TierPrefix, LoadFactorMeasure]), - Conf), - Delay = - cuttlefish:conf_get( flat_concat([TierPrefix, "delay"]), Conf), - [{LoadFactorValue - 1, Delay} | Settings] - end, - [], - TierNames)). - -%% @doc

Sets the throttle for the activity identified by `AppName' and `Key' -%% to a value determined by consulting the limits for the activity. The -%% throttle value is the value associated with the largest -%% load factor <= `LoadFactor'. -%% Normally the `LoadFactor' will be a number representing the current level -%% of load for the activity, but it is also allowed to pass an atom or a tuple -%% as the `LoadFactor'. This can be used when a numeric value cannot be -%% established, and results in using the throttle value for the largest load -%% factor defined in the limits for the activity.

-%% -%%

If there are no limits defined for the activity, exits with -%% error({no_limits, Key}).

-%% @see set_limits/2 --spec set_throttle_by_load(app_name(), activity_key(), load_factor()) -> - throttle_time(). -set_throttle_by_load(AppName, Key, LoadFactor) -> - case get_throttle_for_load(AppName, Key, LoadFactor) of - undefined -> - error({no_limits, AppName, Key}); - ThrottleVal -> - ThrottleReason = lists:flatten(io_lib:format("load factor ~p", - [LoadFactor])), - maybe_log_throttle_change(AppName, Key, ThrottleVal, ThrottleReason), - do_set_throttle(AppName, Key, ThrottleVal), - ThrottleVal - end. - -%% @doc Sleep for the number of milliseconds specified as the throttle time for -%% the activity identified by `AppName' and `Key' (unless the throttle for the -%% activity has been disabled with `disable_throttle/1'). If there is no -%% throttle value configured for `Key', then exits with error({badkey, Key}). --spec throttle(app_name(), activity_key()) -> throttle_time(). -throttle(AppName, Key) -> - maybe_throttle(Key, - get_throttle(AppName, Key), - is_throttle_enabled(AppName, Key)). - -maybe_throttle(Key, undefined, _False) -> - error({badkey, Key}); -maybe_throttle(_Key, _Time, false) -> - 0; -maybe_throttle(_Key, 0, _Enabled) -> - 0; -maybe_throttle(_Key, Time, true) -> - ?SLEEP(Time), - Time. - --spec get_throttle(app_name(), activity_key()) -> throttle_time() | undefined. -get_throttle(AppName, Key) -> - get_value(AppName, ?THROTTLE_KEY(Key), undefined). - --spec get_throttle_for_load(app_name(), activity_key(), load_factor()) -> - throttle_time() | undefined. -get_throttle_for_load(AppName, Key, LoadFactor) -> - case get_limits(AppName, Key) of - undefined -> - undefined; - Limits -> - find_throttle_for_load_factor(Limits, LoadFactor) - end. - -%% The current structure (defined by riak_kv_entropy_manager) of the Limits -%% list is like this: -%% [{-1,0}, {200,10}, {500,50}, {750,250}, {900,1000}, {1100,5000}]. -%% where in each tuple, you have {LoadGreaterThan, ThrottleVal}. -%% If, instead, we eliminated the magical "-1" value and made each entry -%% {LoadLessThan, ThrottleVal} instead, we could manipulate this -%% structure much more easily. Unfortunately, it would change the -%% advanced.config structure in a way that will affect existing customers. -%% We're investigating changing this. -find_throttle_for_load_factor([], _LoadFactor) -> - undefined; -find_throttle_for_load_factor(Limits, max) -> - {_Load, ThrottleVal} = lists:last(Limits), - ThrottleVal; -find_throttle_for_load_factor([{_Load, ThrottleVal}, {NextLoad, _NextThrottleVal}|_], LoadFactor) - when is_number(LoadFactor), LoadFactor < NextLoad -> - ThrottleVal; -find_throttle_for_load_factor([{_, ThrottleVal}], LoadFactor) when is_number(LoadFactor) -> - ThrottleVal; -find_throttle_for_load_factor([_|Limits], LoadFactor) when is_number(LoadFactor) -> - find_throttle_for_load_factor(Limits, LoadFactor). - -validate_limits(AppName, Key, Limits) -> - Validators = [validate_all_non_negative(Limits), - validate_has_negative_one_key(Limits)], - Errors = [Message || {error, Message} <- Validators], - case Errors of - [] -> - ok; - Messages -> - ?LOG_ERROR("Invalid throttle limits for application ~p, activity ~p: ~p.", - [AppName, Key, Messages]), - error(invalid_throttle_limits) - end. - -validate_all_non_negative(Limits) -> - Good = lists:all( - fun({LoadFactor, ThrottleVal}) -> - is_integer(LoadFactor) andalso - is_integer(ThrottleVal) andalso - ThrottleVal >= 0 - end, - Limits), - case Good of - true -> - ok; - false -> - {error, "All throttle values must be non-negative integers"} - end. - -validate_has_negative_one_key(Limits) -> - case lists:keyfind(-1, 1, Limits) of - {-1, _} -> - ok; - false -> - {error, "Must include -1 entry"} - end. - -maybe_log_throttle_change(AppName, Key, NewValue, Reason) -> - OldValue = get_throttle(AppName, Key), - case NewValue == OldValue of - true -> - ok; - false -> - ?LOG_INFO("Changing throttle for ~p/~p from ~p to ~p based on ~ts", - [AppName, Key, OldValue, NewValue, Reason]) - end. - -set_value(AppName, Key, Value) -> - true = ets:insert(?ETS_TABLE_NAME, {{AppName, Key}, Value}), - ok. - -unset_value(AppName, Key) -> - true = ets:delete(?ETS_TABLE_NAME, {AppName, Key}), - ok. - -get_value(AppName, Key) -> - case ets:lookup(?ETS_TABLE_NAME, {AppName, Key}) of - [] -> - {error, undefined}; - [{{AppName, Key}, Value}] -> - {ok, Value} - end. - -get_value(AppName, Key, Default) -> - case get_value(AppName, Key) of - {ok, Value} -> - Value; - _ -> - Default - end. diff --git a/src/riak_core_tracer.erl b/src/riak_core_tracer.erl deleted file mode 100644 index 4e06f6ec8..000000000 --- a/src/riak_core_tracer.erl +++ /dev/null @@ -1,217 +0,0 @@ -%% -%% 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. -%% -%% ------------------------------------------------------------------- --module(riak_core_tracer). - --behaviour(gen_server). - -%% API --export([start_link/0, - stop/0, - reset/0, - filter/2, - collect/0, collect/1, collect/2, - results/0, - stop_collect/0]). --export([test_all_events/1]). - --export([all_events/1]). --export([trigger_sentinel/0]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --define(SERVER, ?MODULE). - --record(state, {trace=[], - filters=[], - mfs=[], - stop_tref, - stop_from, - tracing=false}). - -%%=================================================================== -%% API -%%=================================================================== - -start_link() -> - gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). - -stop() -> - gen_server:call(?SERVER, stop, infinity). - -reset() -> - gen_server:call(?SERVER, reset, infinity). - -%% Set up a filter on trace messages to the list of [{M, F}]s. The -%% tracer function should return a list of events to log -filter(MFs, Filter) -> - gen_server:call(?SERVER, {filter, MFs, Filter}, infinity). - -%% Collect traces -collect() -> - collect(100). - -collect(Duration) -> - collect(Duration, nodes()). - -collect(Duration, Nodes) -> - gen_server:call(?SERVER, {collect, Duration, Nodes}, infinity). - -%% Stop collection -stop_collect() -> - gen_server:call(?SERVER, stop_collect, infinity). - -%% Return the trace -results() -> - gen_server:call(?SERVER, results, infinity). - -all_events({trace, Pid, call, {M,F,A}}) -> - [{node(Pid), {M,F,A}}]. - -test_all_events(Ms) -> - {ok, _Pid} = riak_core_tracer:start_link(), - riak_core_tracer:reset(), - riak_core_tracer:filter(Ms, fun all_events/1), - riak_core_tracer:collect(5000). - -%%=================================================================== -%% gen_server callbacks -%%=================================================================== - -init([]) -> - {ok, #state{}}. - -handle_call(reset, _From, State) -> - cancel_timer(State#state.stop_tref), - {reply, ok, #state{}}; -handle_call({filter, MFs, Filter}, _From, State) -> - {reply, ok, State#state{mfs=MFs ++ State#state.mfs, - filters = [Filter | State#state.filters]}}; -handle_call({collect, Duration, Nodes}, _From, State) -> - cancel_timer(State#state.stop_tref), - Tref = timer:send_after(Duration, collect_timeout), - dbg:stop_clear(), - dbg:tracer(process, {fun ({trace, _, call, {?MODULE, trigger_sentinel, _}}, Pid) -> - gen_server:cast(Pid, stop_sentinel), - Pid; - (Msg, Pid) -> - Entries = lists:flatten( - [begin - case catch F(Msg) of - {'EXIT', _} -> - []; - E -> - E - end - end || F <- State#state.filters]), - case Entries of - [] -> - ok; - _ -> - {Mega, Secs, Micro} = os:timestamp(), - Ts = 1000000 * (1000000 * Mega + Secs) + Micro, - TsEntries = [{Ts, E} || E <- Entries], - gen_server:call(Pid, {traces, TsEntries}, infinity) - end, - Pid - end, self()}), - _ = [{ok, N} = dbg:n(N) || N <- Nodes], - dbg:p(all, [call]), - {ok, _} = dbg:tpl(?MODULE, trigger_sentinel, []), - add_tracers(State#state.mfs), - {reply, ok, State#state{trace=[], stop_tref = Tref, tracing = true}}; -handle_call(stop_collect, From, State = #state{tracing = true}) -> - %% Trigger the sentinel so that we wait for the trace buffer to flush - erlang:system_flag(multi_scheduling, block), - timer:sleep(100), - ?MODULE:trigger_sentinel(), - erlang:system_flag(multi_scheduling, unblock), - {noreply, State#state{stop_from = From, tracing = stopping}}; -handle_call(stop_collect, _From, State) -> - {reply, State#state.tracing, State}; -handle_call({traces, Entries}, _From, State) -> - {reply, ok, State#state{trace=Entries ++ State#state.trace}}; -handle_call(results, _From, State) -> - case lists:sort(State#state.trace) of - [] -> - R = []; - STrace -> - {MinTs,_} = hd(STrace), - R = zero_ts(MinTs, STrace, []) - end, - {reply, R, State}; -handle_call(stop, _From, State) -> - {stop, normal, ok, State}. - -handle_cast(stop_sentinel, State) -> - dbg:stop_clear(), - case State#state.stop_from of - undefined -> - ok; - StopFrom -> - gen_server:reply(StopFrom, ok) - end, - {noreply, State#state{stop_from = undefined}}; -handle_cast(_Msg, State) -> - {noreply, State}. - -handle_info(collect_timeout, State = #state{tracing = true}) -> - handle_call(stop_collect, undefined, State); -handle_info(collect_timeout, State) -> - {noreply, State}. - -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -add_tracers([]) -> - ok; -add_tracers([{M, F} | Rest]) -> - {ok, _} = dbg:tpl(M, F, [{'_',[],[{message,{return_trace}}]}]), - add_tracers(Rest); -add_tracers([M | Rest]) -> - {ok, _} = dbg:tpl(M,[{'_',[],[{message,{return_trace}}]}]), - add_tracers(Rest). - -cancel_timer(undefined) -> - ok; -cancel_timer(Tref) -> - catch timer:cancel(Tref), - receive - stop -> - ok - after - 0 -> - ok - end. - -zero_ts(_Offset, [], Acc) -> - lists:reverse(Acc); -zero_ts(Offset, [{Ts,Trace}|Rest], Acc) -> - zero_ts(Offset, Rest, [{Ts - Offset, Trace} | Acc]). - -trigger_sentinel() -> - ok. diff --git a/src/riak_core_util.erl b/src/riak_core_util.erl index 1ffad8ffe..8ffed9312 100644 --- a/src/riak_core_util.erl +++ b/src/riak_core_util.erl @@ -40,6 +40,7 @@ safe_rpc/5, rpc_every_member/4, rpc_every_member_ann/4, + count/2, keydelete/2, multi_keydelete/2, multi_keydelete/3, @@ -73,17 +74,27 @@ job_class_enabled/1, job_class_enabled/2, job_class_disabled_message/2, - report_job_request_disposition/6 + report_job_request_disposition/6, + responsible_preflists/1, + responsible_preflists/2, + get_index_n/1, + preflist_siblings/1, + posix_error/1 ]). --include_lib("kernel/include/logger.hrl"). - -include("riak_core_vnode.hrl"). -ifdef(TEST). +-ifdef(EQC). +-include_lib("eqc/include/eqc.hrl"). +-endif. %% EQC -include_lib("eunit/include/eunit.hrl"). -export([counter_loop/1,incr_counter/1,decr_counter/1]). --endif. +-endif. %% TEST + +-type riak_core_ring() :: riak_core_ring:riak_core_ring(). +-type index() :: non_neg_integer(). +-type index_n() :: {index(), pos_integer()}. %% R14 Compatibility -compile({no_auto_import,[integer_to_list/2]}). @@ -96,6 +107,12 @@ %% *86400 seconds/day -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. + %% @spec moment() -> integer() %% @doc Get the current "moment". Current implementation is the %% number of seconds from year 0 to now, universal time, in @@ -130,7 +147,7 @@ rfc1123_to_now(String) when is_list(String) -> %% to the new directory. make_tmp_dir() -> TmpId = io_lib:format("riptemp.~p", - [erlang:phash2({rand:uniform(),self()})]), + [erlang:phash2({riak_core_rand:uniform(),self()})]), TempDir = filename:join("/tmp", TmpId), case filelib:is_dir(TempDir) of true -> make_tmp_dir(); @@ -211,19 +228,11 @@ integer_to_list(I0, Base, R0) -> integer_to_list(I1, Base, R1) end. --ifndef(old_hash). sha(Bin) -> crypto:hash(sha, Bin). md5(Bin) -> crypto:hash(md5, Bin). --else. -sha(Bin) -> - crypto:sha(Bin). - -md5(Bin) -> - crypto:md5(Bin). --endif. %% @spec unique_id_62() -> string() %% @doc Create a random identifying integer, returning its string @@ -237,7 +246,7 @@ unique_id_62() -> %% [{purge_response(), load_file_response()}] %% @type purge_response() = boolean() %% @type load_file_response() = {module, Module :: atom()}| -%% {error, term()} +%% 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. @@ -264,9 +273,11 @@ chash_key({Bucket,_Key}=BKey) -> %% @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}). +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}). %% @spec chash_std_keyfun(BKey :: riak_object:bkey()) -> chash:index() %% @doc Default object/ring hashing fun, direct passthrough of bkey. @@ -320,6 +331,18 @@ ensure_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(). +count(Pred, List) -> + FoldFun = fun(E, A) -> + case Pred(E) of + false -> A; + true -> A + 1 + end + end, + lists:foldl(FoldFun, 0, List). + %% @doc Returns a copy of `TupleList' where the first occurrence of a tuple whose %% first element compares equal to `Key' is deleted, if there is such a tuple. %% Equivalent to `lists:keydelete(Key, 1, TupleList)'. @@ -346,19 +369,22 @@ multi_keydelete(KeysToDelete, N, TupleList) -> %% @doc Function composition: returns a function that is the composition of %% `F' and `G'. --spec compose(fun(), fun()) -> fun(). -compose(F, G) when is_function(F), is_function(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. %% @doc Function composition: returns a function that is the composition of all -%% functions in the `Funs' list. --spec compose([fun()]) -> fun(). +%% 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; -compose([Fun|Funs]) -> - lists:foldl(fun compose/2, Fun, Funs). +compose(Funs) when is_list(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. @@ -611,7 +637,7 @@ orddict_delta(A, B) -> shuffle(L) -> N = 134217727, %% Largest small integer on 32-bit Erlang - L2 = [{rand:uniform(N), E} || E <- L], + L2 = [{riak_core_rand:uniform(N), E} || E <- L], L3 = [E || {_, E} <- lists:sort(L2)], L3. @@ -664,8 +690,7 @@ make_fold_req(FoldFun, Acc0) -> make_fold_req(FoldFun, Acc0, false, []). make_fold_req(FoldFun, Acc0, Forwardable, Opts) -> - make_fold_reqv(riak_core_capability:get({riak_core, fold_req_version}, v1), - FoldFun, Acc0, Forwardable, Opts). + make_fold_reqv(v2, FoldFun, Acc0, Forwardable, Opts). %% @doc Force a #riak_core_fold_req_v? record to the latest version, %% regardless of cluster support @@ -752,7 +777,7 @@ job_class_enabled(Application, Operation) -> %% * 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 app_helper:get_env(riak_core, job_accept_class) of + case application:get_env(riak_core, job_accept_class, undefined) of [_|_] = EnabledClasses -> case lists:member(Class, EnabledClasses) of true -> @@ -772,7 +797,7 @@ enable_job_class(Class) -> %% * 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 app_helper:get_env(riak_core, job_accept_class) of + case application:get_env(riak_core, job_accept_class, undefined) of [_|_] = EnabledClasses -> case lists:member(Class, EnabledClasses) of false -> @@ -792,7 +817,7 @@ disable_job_class(Class) -> %% * 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 app_helper:get_env(riak_core, job_accept_class) of + case application:get_env(riak_core, job_accept_class, undefined) of undefined -> true; [] -> @@ -804,7 +829,7 @@ job_class_enabled(Class) -> % 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. - ?LOG_ERROR( + _ = logger:error( "riak_core.job_accept_class is not a list: ~p", [Other]), false end. @@ -840,10 +865,93 @@ 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) -> - ?LOG_DEBUG("Request '~p' accepted from ~p", [Class, Client]); -report_job_request_disposition(false, Class, _Mod, _Func, _Line, Client) -> - ?LOG_WARNING("Request '~p' disabled from ~p", [Class, Client]). +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 +%% =================================================================== + +%% @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), + 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 @@ -944,8 +1052,22 @@ compose_test_() -> Upper = fun string:to_upper/1, Reverse = fun lists:reverse/1, Strip = fun(S) -> string:strip(S, both, $!) end, - Composed = compose([Upper, Reverse, Strip]), - ?_assertEqual("DLROW OLLEH", Composed("Hello world!")). + 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]), + + CompatibleTypes = compose(Increment, + 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))]. pmap_test_() -> Fgood = fun(X) -> 2 * X end, @@ -1022,49 +1144,6 @@ bounded_pmap_test_() -> Tests }. -make_fold_req_test_() -> - {setup, - fun() -> - meck:new(riak_core_capability, [passthrough]) - end, - fun(_) -> - meck:unload(riak_core_capability) - end, - [ - fun() -> - FoldFun = fun(_, _, _) -> ok end, - Acc0 = acc0, - Forw = true, - Opts = [opts], - F_1 = #riak_core_fold_req_v1{foldfun=FoldFun, acc0=Acc0}, - F_2 = #riak_core_fold_req_v2{foldfun=FoldFun, acc0=Acc0, - forwardable=Forw, opts=Opts}, - F_2_default = #riak_core_fold_req_v2{foldfun=FoldFun, acc0=Acc0, - forwardable=false, opts=[]}, - Newest = fun() -> F_2_default = make_newest_fold_req(F_1), - F_2 = make_newest_fold_req(F_2), - ok - end, - - meck:expect(riak_core_capability, get, - fun(_, _) -> v1 end), - F_1 = make_fold_req(F_1), - F_1 = make_fold_req(F_2), - F_1 = make_fold_req(FoldFun, Acc0), - F_1 = make_fold_req(FoldFun, Acc0, Forw, Opts), - ok = Newest(), - - meck:expect(riak_core_capability, get, - fun(_, _) -> v2 end), - F_2_default = make_fold_req(F_1), - F_2 = make_fold_req(F_2), - F_2_default = make_fold_req(FoldFun, Acc0), - F_2 = make_fold_req(FoldFun, Acc0, Forw, Opts), - ok = Newest() - end - ] - }. - proxy_spawn_test() -> A = proxy_spawn(fun() -> a end), ?assertEqual(a, A), @@ -1081,5 +1160,14 @@ proxy_spawn_test() -> ok end. --endif. +-ifdef(EQC). + +count_test() -> + ?assert(eqc:quickcheck(prop_count_correct())). + +prop_count_correct() -> + ?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 56916e554..8875f55a7 100644 --- a/src/riak_core_vnode.erl +++ b/src/riak_core_vnode.erl @@ -54,9 +54,8 @@ trigger_delete/1, core_status/1, handoff_error/3]). --export([queue_work/4]). --include_lib("kernel/include/logger.hrl"). +-include("stacktrace.hrl"). -ifdef(TEST). @@ -137,6 +136,34 @@ -callback delete(ModState::term()) -> {ok, NewModState::term()}. +%% This commands are not executed inside the VNode, instead they are +%% part of the vnode_proxy contract. +%% +%% The vnode_proxy will drop requests in an overload situation, when +%% his happens one of the two handle_overload_* commands in the +%% vnode module is called. This call happens **from the vnode proxy** +%% +%% These calls are wrapped in a catch() meaning that when they don't +%% exist they will quietly fail. However the catch is hugely expensive +%% leading to the sitaution that when there already is a overload +%% the vnode proxy gets even worst overloaded. +%% +%% This is pretty bad since the proxy is supposed to protect against +%% exactly this overload. +%% +%% So yea sorry, you're going to be forced to implement them, if nothing +%% else just nop them out. +%% +%% 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_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 %% process dies and allows the module using the behaviour to take appropriate @@ -198,21 +225,8 @@ send_command_after(Time, Request) -> init([Mod, Index, InitialInactivityTimeout, Forward]) -> process_flag(trap_exit, true), - State = #state{index=Index, mod=Mod, forward=Forward, - inactivity_timeout=InitialInactivityTimeout}, - %% Check if parallel disabled, if enabled (default) - %% we don't care about the actual number, so using magic 2. - case app_helper:get_env(riak_core, vnode_parallel_start, 2) =< 1 of - true -> - case do_init(State) of - {ok, State2} -> - {ok, active, State2, InitialInactivityTimeout}; - {error, Reason} -> - {stop, Reason} - end; - _ -> - {ok, started, State, 0} - end. + State = #state{index=Index, mod=Mod, forward=Forward, inactivity_timeout=InitialInactivityTimeout}, + {ok, started, State, 0}. started(timeout, State = #state{inactivity_timeout=InitialInactivityTimeout}) -> @@ -242,38 +256,24 @@ do_init(State = #state{index=Index, mod=Mod, forward=Forward}) -> {error, Reason} -> {error, Reason}; _ -> - ModState0 = - case lists:keyfind(pool, 1, Props) of - {pool, WorkerMod, PoolSize, WorkerArgs}=PoolConfig -> - ?LOG_INFO("Starting vnode worker pool " ++ - "~p with size of ~p~n", - [WorkerMod, PoolSize]), - {ok, PoolPid} = - riak_core_vnode_worker_pool:start_link(WorkerMod, - PoolSize, - Index, - WorkerArgs, - worker_props), - % If the vnode Module requires access to the vnode worker - % pool, it should export a function add_vnode_pool/2 - case erlang:function_exported(Mod, add_vnode_pool, 2) of - true -> - ?LOG_INFO("Adding vnode_pool ~w to ~w state", - [PoolPid, Mod]), - Mod:add_vnode_pool(PoolPid, ModState); - false -> - ModState - end; - _ -> - PoolPid = PoolConfig = undefined, - ModState - end, + 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 = app_helper:get_env(riak_core, vnode_inactivity_timeout, ?DEFAULT_TIMEOUT), - Timeout2 = Timeout + rand:uniform(Timeout), - State2 = State#state{modstate=ModState0, inactivity_timeout=Timeout2, + 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}, - ?LOG_DEBUG("vnode :: ~p/~p :: ~p~n", [Mod, Index, Forward]), + logger:debug("vnode :: ~p/~p :: ~p~n", [Mod, Index, Forward]), State3 = mod_set_forwarding(Forward, State2), {ok, State3} end. @@ -373,7 +373,7 @@ vnode_command(Sender, Request, State=#state{mod=Mod, case catch Mod:handle_command(Request, Sender, ModState) of {'EXIT', ExitReason} -> reply(Sender, {vnode_error, ExitReason}), - ?LOG_ERROR("~p command failed ~p", [Mod, ExitReason]), + logger:error("~p command failed ~p", [Mod, ExitReason]), {stop, ExitReason, State#state{modstate=ModState}}; continue -> continue(State, ModState); @@ -387,15 +387,6 @@ vnode_command(Sender, Request, State=#state{mod=Mod, %% the result is sent back to 'From' riak_core_vnode_worker_pool:handle_work(Pool, Work, From), continue(State, NewModState); - {PoolName, Work, From, NewModState} -> - %% dispatch some work to the node worker pool - %% the result is sent back to 'From' - %% The node worker pool stops too many vnodes from running - %% the fold concurrently - %% If a node_worker_pool has not been setup under the given name - %% then it will fallback to the vnode worker pool - queue_work(PoolName, Work, From, Pool), - continue(State, NewModState); {stop, Reason, NewModState} -> {stop, Reason, State#state{modstate=NewModState}} end. @@ -413,7 +404,7 @@ vnode_coverage(Sender, Request, KeySpaces, State=#state{index=Index, Forwards when is_list(Forwards) -> Action = Mod:handle_coverage(Request, KeySpaces, Sender, ModState); NextOwner -> - ?LOG_DEBUG("Forwarding coverage ~p -> ~p: ~p~n", [node(), NextOwner, Index]), + 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)), @@ -432,15 +423,6 @@ vnode_coverage(Sender, Request, KeySpaces, State=#state{index=Index, %% the result is sent back to 'From' riak_core_vnode_worker_pool:handle_work(Pool, Work, From), continue(State, NewModState); - {PoolName, Work, From, NewModState} -> - %% dispatch some work to the node worker pool - %% the result is sent back to 'From' - %% The node worker pool stops too many vnodes from running - %% the fold concurrently - %% If a node_worker_pool has not been setup under the given name - %% then it will fallback to the vnode worker pool - queue_work(PoolName, Work, From, Pool), - continue(State, NewModState); {stop, Reason, NewModState} -> {stop, Reason, State#state{modstate=NewModState}} end. @@ -465,7 +447,7 @@ vnode_handoff_command(Sender, Request, ForwardTo, {forward, NewModState} -> forward_request(HOType, Request, HOTarget, ForwardTo, Sender, State), continue(State, NewModState); - {forward, NewReq, NewModState} -> + {forward, NewReq, NewModState} -> forward_request(HOType, NewReq, HOTarget, ForwardTo, Sender, State), continue(State, NewModState); {drop, NewModState} -> @@ -488,7 +470,7 @@ forward_request(_, Request, HOTarget, _ResizeTarget, Sender, State) -> vnode_forward(explicit, HOTarget, Sender, Request, State). vnode_forward(Type, ForwardTo, Sender, Request, State) -> - ?LOG_DEBUG("Forwarding (~p) {~p,~p} -> ~p~n", + 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)). @@ -509,17 +491,17 @@ vnode_resize_command(Sender, Request, FutureIndex, active(timeout, State=#state{mod=Mod, index=Idx}) -> riak_core_vnode_manager:vnode_event(Mod, Idx, self(), inactive), continue(State); -active(?COVERAGE_REQ{keyspaces=KeySpaces, +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(?VNODE_REQ{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(?VNODE_REQ{sender=Sender, request=Request}, +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(?VNODE_REQ{sender=Sender, request=Request}, +active(#riak_vnode_req_v1{sender=Sender, request=Request}, State=#state{handoff_type=resize, handoff_target={HOIdx,HONode}, index=Index, @@ -543,7 +525,7 @@ active(?VNODE_REQ{sender=Sender, request=Request}, _Other -> vnode_command(Sender, Request, State) end end; -active(?VNODE_REQ{sender=Sender, request=Request},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), @@ -572,7 +554,7 @@ 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), - ?LOG_DEBUG("~p ~p vnode deleted", [Idx, Mod]); + logger:debug("~p ~p vnode deleted", [Idx, Mod]); _ -> NewModState = ModState end, maybe_shutdown_pool(State), @@ -582,7 +564,7 @@ active(unregistered, State=#state{mod=Mod, 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), - ?LOG_DEBUG("~p ~p vnode excluded and unregistered.", + logger:debug("~p ~p vnode excluded and unregistered.", [Index, Mod]), {stop, normal, State#state{handoff_target=none, handoff_type=undefined, @@ -701,10 +683,10 @@ finish_handoff(SeenIdxs, State=#state{mod=Mod, %% running on non-existant data. maybe_shutdown_pool(State), {ok, NewModState} = Mod:delete(ModState), - ?LOG_DEBUG("~p ~p vnode finished handoff and deleted.", + logger:debug("~p ~p vnode finished handoff and deleted.", [Idx, Mod]), riak_core_vnode_manager:unregister_vnode(Idx, Mod), - ?LOG_DEBUG("vnode hn/fwd :: ~p/~p :: ~p -> ~p~n", + 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 @@ -754,7 +736,7 @@ handle_event({set_forwarding, undefined}, _StateName, %% ignore requests to stop forwarding. continue(State); handle_event({set_forwarding, ForwardTo}, _StateName, State) -> - ?LOG_DEBUG("vnode fwd :: ~p/~p :: ~p -> ~p~n", + logger:debug("vnode fwd :: ~p/~p :: ~p -> ~p~n", [State#state.mod, State#state.index, State#state.forward, ForwardTo]), State2 = mod_set_forwarding(ForwardTo, State), continue(State2#state{forward=ForwardTo}); @@ -798,9 +780,9 @@ handle_event(trigger_delete, _StateName, State=#state{modstate={deleted,_}}) -> continue(State); handle_event(trigger_delete, _StateName, State) -> active(trigger_delete, State); -handle_event(R=?VNODE_REQ{}, _StateName, State) -> +handle_event(R=#riak_vnode_req_v1{}, _StateName, State) -> active(R, State); -handle_event(R=?COVERAGE_REQ{}, _StateName, State) -> +handle_event(R=#riak_coverage_req_v1{}, _StateName, State) -> active(R, State). @@ -820,7 +802,7 @@ handle_sync_event({handoff_data,BinObj}, _From, StateName, {reply, ok, StateName, State#state{modstate=NewModState}, State#state.inactivity_timeout}; {reply, {error, Err}, NewModState} -> - ?LOG_ERROR("~p failed to store handoff obj: ~p", [Mod, Err]), + logger:error("~p failed to store handoff obj: ~p", [Mod, Err]), {reply, {error, Err}, StateName, State#state{modstate=NewModState}, State#state.inactivity_timeout} end; @@ -874,9 +856,9 @@ handle_info({'EXIT', Pid, Reason}, Reason when Reason == normal; Reason == shutdown -> continue(State#state{pool_pid=undefined}); _ -> - ?LOG_ERROR("~p ~p worker pool crashed ~p\n", [Index, Mod, Reason]), + logger:error("~p ~p worker pool crashed ~p\n", [Index, Mod, Reason]), {pool, WorkerModule, PoolSize, WorkerArgs}=PoolConfig, - ?LOG_DEBUG("starting worker pool ~p with size " + logger:debug("starting worker pool ~p with size " "of ~p for vnode ~p.", [WorkerModule, PoolSize, Index]), {ok, NewPoolPid} = @@ -897,7 +879,7 @@ handle_info({'DOWN',_Ref,process,_Pid,normal}, _StateName, continue(State); handle_info(Info, _StateName, State=#state{mod=Mod,modstate={deleted, _},index=Index}) -> - ?LOG_INFO("~p ~p ignored handle_info ~p - vnode unregistering\n", + logger:info("~p ~p ignored handle_info ~p - vnode unregistering\n", [Index, Mod, Info]), continue(State); handle_info({'EXIT', Pid, Reason}, StateName, State=#state{mod=Mod,modstate=ModState}) -> @@ -915,7 +897,7 @@ handle_info({'EXIT', Pid, Reason}, StateName, State=#state{mod=Mod,modstate=ModS {stop, Reason1, State#state{modstate=NewModState}} end catch - _Class:undef -> + _ErrorType:undef -> {stop, linked_process_crash, State} end; @@ -941,9 +923,9 @@ terminate(Reason, _StateName, #state{mod=Mod, modstate=ModState, _ -> ok end - catch Class:Reason:Stacktrace -> - ?LOG_ERROR("Error while shutting down vnode worker pool ~p:~p trace : ~p", - [Class, Reason, Stacktrace]) + 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. @@ -971,7 +953,7 @@ maybe_handoff(TargetIdx, TargetNode, Target -> not ExistingHO; _ -> - ?LOG_INFO("~s/~b: handoff request to ~p before " + logger:info("~s/~b: handoff request to ~p before " "finishing handoff to ~p", [Mod, Idx, Target, CurrentTarget]), not ExistingHO @@ -1101,22 +1083,6 @@ mod_set_forwarding(Forward, State=#state{mod=Mod, modstate=ModState}) -> State end. -queue_work(PoolName, Work, From, VnodeWrkPool) -> - PoolName0 = - case PoolName of - queue -> riak_core_node_worker_pool:nwp(); - PoolName -> PoolName - end, - case whereis(PoolName0) of - undefined -> - ?LOG_INFO("Using vnode pool as ~w pool is not registered", - [PoolName0]), - riak_core_stat:update({worker_pool, unregistered}), - riak_core_vnode_worker_pool:handle_work(VnodeWrkPool, Work, From); - _P -> - riak_core_node_worker_pool:handle_work(PoolName0, Work, From) - end. - %% =================================================================== %% Test API %% =================================================================== @@ -1138,34 +1104,33 @@ test_link(Mod, Index) -> current_state(Pid) -> gen_fsm:sync_send_all_state_event(Pid, current_state). -pool_death_test_() -> - {timeout, 60, [ - fun() -> - 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:new(test_pool_mod, [non_strict, no_link]), - meck:expect(test_pool_mod, init_worker, fun(_, _, _) -> {ok, []} end), - - {ok, Pid} = ?MODULE:test_link(test_vnode, 0), - unlink(Pid), - {_, StateData1} = ?MODULE:current_state(Pid), - PoolPid1 = StateData1#state.pool_pid, - exit(PoolPid1, kill), - wait_for_process_death(PoolPid1), - ?assertNot(is_process_alive(PoolPid1)), - wait_for_state_update(StateData1, Pid), - {_, StateData2} = ?MODULE:current_state(Pid), - PoolPid2 = StateData2#state.pool_pid, - ?assertNot(PoolPid2 =:= undefined), - exit(Pid, normal), - wait_for_process_death(Pid), - meck:validate(test_pool_mod), - meck:validate(test_vnode), - meck:unload(test_pool_mod), - meck:unload(test_vnode) - end - ]}. +pool_death_test() -> + 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: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), + PoolPid1 = StateData1#state.pool_pid, + exit(PoolPid1, kill), + wait_for_process_death(PoolPid1), + ?assertNot(is_process_alive(PoolPid1)), + wait_for_state_update(StateData1, Pid), + {_, StateData2} = ?MODULE:current_state(Pid), + PoolPid2 = StateData2#state.pool_pid, + ?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)). diff --git a/src/riak_core_vnode_manager.erl b/src/riak_core_vnode_manager.erl index 0ba14c6ca..cf62b2891 100644 --- a/src/riak_core_vnode_manager.erl +++ b/src/riak_core_vnode_manager.erl @@ -43,12 +43,6 @@ %% Field debugging -export([get_tab/0]). --include_lib("kernel/include/logger.hrl"). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - -record(idxrec, {key, idx, mod, pid, monref}). -record(monrec, {monref, key}). @@ -70,8 +64,8 @@ -type repairs() :: [repair()]. -record(state, {idxtab, - forwarding :: riak_core_dict(), - handoff :: riak_core_dict(), + forwarding :: dict:dict(), + handoff :: dict:dict(), known_modules :: [term()], never_started :: [{integer(), term()}], vnode_start_tokens :: integer(), @@ -79,7 +73,6 @@ repairs :: repairs() }). --include("riak_core.hrl"). -include("riak_core_handoff.hrl"). -include("riak_core_vnode.hrl"). -define(XFER_EQ(A, ModSrcTgt), A#xfer_status.mod_src_target == ModSrcTgt). @@ -323,7 +316,7 @@ handle_call({xfer_complete, ModSrcTgt}, _From, State) -> ModPartition = {Mod, Partition}, case get_repair(ModPartition, Repairs) of none -> - ?LOG_ERROR("Received xfer_complete for non-existing repair: ~p", + logger:error("Received xfer_complete for non-existing repair: ~p", [ModPartition]), {reply, ok, State}; #repair{minus_one_xfer=MOX, plus_one_xfer=POX}=R -> @@ -334,7 +327,7 @@ handle_call({xfer_complete, ModSrcTgt}, _From, State) -> POX2 = POX#xfer_status{status=complete}, R#repair{plus_one_xfer=POX2}; true -> - ?LOG_ERROR("Received xfer_complete for " + logger:error("Received xfer_complete for " "non-existing xfer: ~p", [ModSrcTgt]) end, @@ -398,7 +391,7 @@ create_repair(Pairs, ModPartition, FilterModFun, Mod, Partition, Repairs, State) plus_one_xfer = POXStatus}, Repairs2 = Repairs ++ [Repair], State2 = State#state{repairs = Repairs2}, - ?LOG_DEBUG("add repair ~p", [ModPartition]), + logger:debug("add repair ~p", [ModPartition]), {reply, {ok, Pairs}, State2}. %% @private @@ -433,7 +426,7 @@ handle_cast(maybe_start_vnodes, State) -> {noreply, State2}; handle_cast({kill_repairs, Reason}, State) -> - ?LOG_WARNING("Killing all repairs: ~p", [Reason]), + logger:warning("Killing all repairs: ~p", [Reason]), kill_repairs(State#state.repairs, Reason), {noreply, State#state{repairs=[]}}; @@ -462,9 +455,7 @@ handle_info(management_tick, State0) -> State2#state{repairs=[]} end, - MaxStart = app_helper:get_env(riak_core, vnode_rolling_start, - ?DEFAULT_VNODE_ROLLING_START), - State4 = State3#state{vnode_start_tokens=MaxStart}, + State4 = State3#state{vnode_start_tokens = ?DEFAULT_VNODE_ROLLING_START}, State5 = maybe_start_vnodes(Ring, State4), Repairs2 = check_repairs(State4#state.repairs), @@ -536,23 +527,30 @@ maybe_ensure_vnodes_started(Ring) -> ok end. +-ifndef('21.0'). ensure_vnodes_started(Ring) -> - case riak_core_ring:check_lastgasp(Ring) of - true -> - ?LOG_INFO("Don't start vnodes - last gasp ring"); - false -> - spawn(fun() -> + spawn(fun() -> try riak_core_ring_handler:ensure_vnodes_started(Ring) catch - Class:Reason:Stacktrace -> - ?LOG_ERROR("~p", [{Class, Reason, Stacktrace}]) + Type:Reason:Stacktrace -> + logger:error("~p", [{Type, Reason, Stacktrace}]) end - end) - end. + end). +-else. +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}]) + end + end). +-endif. schedule_management_timer() -> - ManagementTick = app_helper:get_env(riak_core, + ManagementTick = application:get_env(riak_core, vnode_management_timer, 10000), erlang:send_after(ManagementTick, ?MODULE, management_tick). @@ -569,7 +567,7 @@ trigger_ownership_handoff(Transfers, Mods, Ring, State) -> ok. limit_ownership_handoff(Transfers, IsResizing) -> - Limit = app_helper:get_env(riak_core, + Limit = application:get_env(riak_core, forced_ownership_handoff, ?DEFAULT_OWNERSHIP_TRIGGER), limit_ownership_handoff(Limit, Transfers, IsResizing). @@ -620,18 +618,16 @@ get_vnode(IdxList, Mod, State) -> StartFun = fun(Idx) -> ForwardTo = get_forward(Mod, Idx, State), - ?LOG_DEBUG("Will start VNode for partition ~p", [Idx]), + 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), - ?LOG_DEBUG("Started VNode, waiting for initialization to complete ~p, ~p ", [Pid, Idx]), + logger:debug("Started VNode, waiting for initialization to complete ~p, ~p ", [Pid, Idx]), ok = riak_core_vnode:wait_for_init(Pid), - ?LOG_DEBUG("VNode initialization ready ~p, ~p", [Pid, Idx]), + logger:debug("VNode initialization ready ~p, ~p", [Pid, Idx]), {Idx, Pid} end, - MaxStart = app_helper:get_env(riak_core, vnode_parallel_start, - ?DEFAULT_VNODE_ROLLING_START), - Pairs = Started ++ riak_core_util:pmap(StartFun, NotStarted, MaxStart), + 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 @@ -1052,8 +1048,12 @@ kill_repair(Repair, Reason) -> {Mod, undefined, Partition}, Reason). -register_vnode_stats(Mod, Index, Pid) -> - riak_core_stat:register_vnode_stats(Mod, Index, Pid). +register_vnode_stats(_Mod, _Index, _Pid) -> + %% STATS + %riak_core_stat:register_vnode_stats(Mod, Index, Pid). + ok. -unregister_vnode_stats(Mod, Index) -> - riak_core_stat:unregister_vnode_stats(Mod, Index). +unregister_vnode_stats(_Mod, _Index) -> + %% STATS + %riak_core_stat:unregister_vnode_stats(Mod, Index). + ok. diff --git a/src/riak_core_vnode_master.erl b/src/riak_core_vnode_master.erl index 474018c27..bf31e58f6 100644 --- a/src/riak_core_vnode_master.erl +++ b/src/riak_core_vnode_master.erl @@ -40,10 +40,7 @@ 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]). - --include_lib("kernel/include/logger.hrl"). - + terminate/2, code_change/3]). -record(state, {idxtab, sup_name, vnode_mod, legacy}). -define(LONG_TIMEOUT, 120*1000). @@ -126,10 +123,10 @@ coverage(Msg, {Index, Node}, Keyspaces, Sender, VMaster) -> %% VnodePid}'. command_return_vnode({Index,Node}, Msg, Sender, VMaster) -> Req = make_request(Msg, Sender, Index), - case riak_core_capability:get({riak_core, vnode_routing}, legacy) of - legacy -> + case application:get_env(riak_core, vnode_routing) of + {ok, legacy} -> gen_server:call({VMaster, Node}, {return_vnode, Req}, ?LONG_TIMEOUT); - proxy -> + {ok, proxy} -> Mod = vmaster_to_vmod(VMaster), riak_core_vnode_proxy:command_return_vnode({Mod,Index,Node}, Req) end. @@ -198,14 +195,14 @@ proxy_cast(Who, Req) -> proxy_cast(Who, Req, normal). proxy_cast({VMaster, Node}, Req, How) -> - case riak_core_capability:get({riak_core, vnode_routing}, legacy) of - legacy -> + case application:get_env(riak_core, vnode_routing) of + {ok, legacy} -> if How == normal -> gen_server:cast({VMaster, Node}, Req); How == unreliable -> riak_core_send_msg:cast_unreliable({VMaster, Node}, Req) end; - proxy -> + {ok, proxy} -> do_proxy_cast({VMaster, Node}, Req, How) end. @@ -230,7 +227,7 @@ handle_cast({wait_for_service, Service}, State) -> undefined -> ok; _ -> - ?LOG_DEBUG("Waiting for service: ~p", [Service]), + logger:debug("Waiting for service: ~p", [Service]), riak_core:wait_for_service(Service) end, {noreply, State}; diff --git a/src/riak_core_vnode_proxy.erl b/src/riak_core_vnode_proxy.erl index 71f423a85..571707b95 100644 --- a/src/riak_core_vnode_proxy.erl +++ b/src/riak_core_vnode_proxy.erl @@ -20,9 +20,6 @@ -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([soft_load_mailbox_check/2]). - --include_lib("kernel/include/logger.hrl"). -include("riak_core_vnode.hrl"). @@ -45,8 +42,6 @@ check_request :: undefined | sent | ignore }). -%% NOTE: changed down to 50 for gh1661 soft-limits on vnode mailbox --define(DEFAULT_CHECK_REQUEST_INTERVAL, 50). -define(DEFAULT_CHECK_INTERVAL, 5000). -define(DEFAULT_OVERLOAD_THRESHOLD, 10000). @@ -67,13 +62,13 @@ init([Parent, RegName, Mod, Index]) -> erlang:register(RegName, self()), proc_lib:init_ack(Parent, {ok, self()}), - Interval = app_helper:get_env(riak_core, + Interval = application:get_env(riak_core, vnode_check_interval, ?DEFAULT_CHECK_INTERVAL), - RequestInterval = app_helper:get_env(riak_core, + RequestInterval = application:get_env(riak_core, vnode_check_request_interval, - ?DEFAULT_CHECK_REQUEST_INTERVAL), - Threshold = app_helper:get_env(riak_core, + Interval div 2), + Threshold = application:get_env(riak_core, vnode_overload_threshold, ?DEFAULT_OVERLOAD_THRESHOLD), @@ -82,7 +77,7 @@ init([Parent, RegName, Mod, Index]) -> true -> Interval; false -> - ?LOG_WARNING("Setting riak_core/vnode_check_interval to ~b", + logger:warning("Setting riak_core/vnode_check_interval to ~b", [Threshold div 2]), Threshold div 2 end, @@ -91,7 +86,7 @@ init([Parent, RegName, Mod, Index]) -> true -> RequestInterval; false -> - ?LOG_WARNING("Setting riak_core/vnode_check_request_interval " + logger:warning("Setting riak_core/vnode_check_request_interval " "to ~b", [SafeInterval div 2]), SafeInterval div 2 end, @@ -149,7 +144,7 @@ loop(Parent, State) -> receive {'$vnode_proxy_call', From, Msg} -> {reply, Reply, NewState} = handle_call(Msg, From, State), - gen:reply(From, Reply), + {_, Reply} = gen:reply(From, Reply), loop(Parent, NewState); {'$vnode_proxy_cast', Msg} -> {noreply, NewState} = handle_cast(Msg, State), @@ -173,10 +168,6 @@ handle_call(overloaded, _From, State=#state{check_mailbox=Mailbox, check_threshold=Threshold}) -> Result = (Mailbox > Threshold), {reply, Result, State}; -handle_call(mailbox_size, _From, State=#state{check_mailbox=Mailbox, - check_request_interval=CRI}) -> - Result = soft_load_mailbox_check(Mailbox, CRI), - {reply, Result, State}; handle_call(_Msg, _From, State) -> {reply, ok, State}. @@ -199,11 +190,6 @@ handle_cast({vnode_proxy_pong, Ref, Msgs}, State=#state{check_request=RequestSta State end, {noreply, NewState}; -handle_cast({mailbox_size, From, Tag}, State=#state{check_mailbox=Mailbox, - check_request_interval=CRI}) -> - Result = soft_load_mailbox_check(Mailbox, CRI), - From ! {mbox, {Tag, Result}}, - {noreply, State}; handle_cast(_Msg, State) -> {noreply, State}. @@ -292,7 +278,8 @@ handle_proxy(Msg, State=#state{check_counter=Counter, check_request=RequestState2}}. handle_overload(Msg, #state{mod=Mod, index=Index}) -> - riak_core_stat:update(dropped_vnode_requests), + %% 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)); @@ -327,13 +314,6 @@ send_proxy_ping(Pid, MailboxSizeAfterPing) -> Pid ! {'$vnode_proxy_ping', self(), Ref, MailboxSizeAfterPing}, Ref. -%% @private moved into it's own function for call and cast (and for -%% intercepting in riak-test) -soft_load_mailbox_check(MBox, Interval) when MBox < Interval *2 -> - {ok, MBox, Interval}; -soft_load_mailbox_check(MBox, Interval) -> - {soft_loaded, MBox, Interval}. - -ifdef(TEST). update_msg_counter() -> @@ -382,6 +362,7 @@ 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}; @@ -397,8 +378,8 @@ overload_test_() -> {VnodePid, ProxyPid} end, fun({VnodePid, ProxyPid}) -> - meck:unload(riak_core_vnode_manager), - meck:unload(fakemod), + unlink(VnodePid), + unlink(ProxyPid), exit(VnodePid, kill), exit(ProxyPid, kill) end, diff --git a/src/riak_core_vnode_proxy_sup.erl b/src/riak_core_vnode_proxy_sup.erl index 8922a8c88..ab842eb22 100644 --- a/src/riak_core_vnode_proxy_sup.erl +++ b/src/riak_core_vnode_proxy_sup.erl @@ -21,8 +21,6 @@ -export([start_link/0, init/1]). -export([start_proxy/2, stop_proxy/2, start_proxies/1]). --include_lib("kernel/include/logger.hrl"). - start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). @@ -49,7 +47,7 @@ stop_proxy(Mod, Index) -> ok. start_proxies(Mod) -> - ?LOG_DEBUG("Starting vnode proxies for: ~p", [Mod]), + logger:debug("Starting vnode proxies for: ~p", [Mod]), Indices = get_indices(), _ = [start_proxy(Mod, Index) || Index <- Indices], ok. diff --git a/src/riak_core_vnode_sup.erl b/src/riak_core_vnode_sup.erl index 5f4237ffc..661a930f8 100644 --- a/src/riak_core_vnode_sup.erl +++ b/src/riak_core_vnode_sup.erl @@ -31,6 +31,10 @@ 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. + %% This is needed because we need to make sure vnode shutdown triggers + %% async worker pool shutdown AND blocks waiting for the worker pool to + %% terminate. supervisor:start_link({local, ?MODULE}, ?MODULE, []). %% @private diff --git a/src/riak_core_vnode_worker.erl b/src/riak_core_vnode_worker.erl index 1cca1c840..ae373c79f 100644 --- a/src/riak_core_vnode_worker.erl +++ b/src/riak_core_vnode_worker.erl @@ -20,39 +20,24 @@ -behaviour(gen_server). --compile({nowarn_deprecated_function, - [{gen_fsm, send_all_state_event, 2}]}). - -include("riak_core_vnode.hrl"). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -export([start_link/1, handle_work/3, handle_work/4]). --include_lib("kernel/include/logger.hrl"). - --ifdef(PULSE). --compile(export_all). --compile({parse_transform, pulse_instrument}). --compile({pulse_replace_module, [{gen_fsm, pulse_gen_fsm}, - {gen_server, pulse_gen_server}]}). --endif. +-type mod_state() :: term(). -record(state, { module :: atom(), - modstate :: any() + modstate :: mod_state() }). --callback init_worker(VnodeIDx :: partition(), - Args :: list(any()), - Props :: list(tuple())) -> - {ok, WorkerState :: any()}. - --callback handle_work(Work :: any(), - From :: sender(), - WorkerState :: any()) -> - {noreply, UpdWorkerState :: any()} | - {reply, Reply :: any(), UpdWorkerState :: any()}. +-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()}. start_link(Args) -> WorkerMod = proplists:get_value(worker_callback_mod, Args), @@ -68,11 +53,11 @@ handle_work(Worker, Work, From, Caller) -> 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 - gen_fsm:send_all_state_event(Caller, worker_start), + riak_core_vnode_worker_pool:worker_started(Caller), {ok, #state{module=Module, modstate=WorkerState}}. handle_call(Event, _From, State) -> - ?LOG_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}, @@ -85,17 +70,12 @@ handle_cast({work, Work, WorkFrom, Caller}, NS end, %% check the worker back into the pool - gen_fsm:send_all_state_event(Caller, {checkin, 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. +handle_cast(_Event, State) -> {noreply, State}. -code_change(_OldVsn, State, _Extra) -> - {ok, 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 9376a094c..7b8134f86 100644 --- a/src/riak_core_vnode_worker_pool.erl +++ b/src/riak_core_vnode_worker_pool.erl @@ -39,39 +39,259 @@ %% confuse (or cause a race) with this module's checkout management. -module(riak_core_vnode_worker_pool). --behaviour(riak_core_worker_pool). +-behaviour(gen_fsm_compat). --export([do_init/1, reply/2, do_work/3]). +%% 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]). %% API --export([start_link/5, stop/2, shutdown_pool/2, handle_work/3]). +-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()} + }). + +-type pool_opt() :: + {strategy, fifo | filo}. + start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps) -> - riak_core_worker_pool:start_link( - [WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps], - ?MODULE, - vnode_pool). - + start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps, []). + +-spec start_link(atom(), pos_integer(), pos_integer(), term(), term(), + [pool_opt()]) -> + {ok, pid()}. + +start_link(WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps, Opts) -> + gen_fsm_compat:start_link(?MODULE, [WorkerMod, PoolSize, VNodeIndex, WorkerArgs, + WorkerProps, Opts], []). + handle_work(Pid, Work, From) -> - riak_core_stat:update({worker_pool, vnode_pool}), - riak_core_worker_pool:handle_work(Pid, Work, From). + gen_fsm_compat:send_event(Pid, {work, Work, From}). stop(Pid, Reason) -> - riak_core_worker_pool:stop(Pid, Reason). + gen_fsm_compat:sync_send_all_state_event(Pid, {stop, Reason}). + +worker_started(Pid) -> + gen_fsm_compat:send_all_state_event(Pid, worker_start). + +checkin_worker(Pid, WorkerPid) -> + gen_fsm_compat:send_all_state_event(Pid, {checkin, WorkerPid}). %% wait for all the workers to finish any current work shutdown_pool(Pid, Wait) -> - riak_core_worker_pool: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, + {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}. + +queueing({work, _Work, _From} = Msg, State) -> + {next_state, queueing, in(Msg, State)}; +queueing(_Event, State) -> + {next_state, queueing, State}. + +shutdown(_Event, _From, State) -> + {reply, ok, shutdown, State}. + +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}. + +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} + 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) -> + 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} + end; +handle_info(shutdown, shutdown, #state{monitors=Monitors} = State) -> + %% 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}. + +%% 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] + 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 + 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 + 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]}. + +out(#state{queue_strategy = fifo, queue = Q}) -> + queue:out(Q); -reply(From, Msg) -> - riak_core_vnode:reply(From, Msg). +out(#state{queue_strategy = filo, queue = []}) -> + {empty, []}; +out(#state{queue_strategy = filo, queue = [Msg | Q]}) -> + {{value, Msg}, Q}. -do_init([WorkerMod, PoolSize, VNodeIndex, WorkerArgs, WorkerProps]) -> - poolboy:start_link([{worker_module, riak_core_vnode_worker}, - {worker_args, - [VNodeIndex, WorkerArgs, WorkerProps, self()]}, - {worker_callback_mod, WorkerMod}, - {size, PoolSize}, {max_overflow, 0}]). +new(#state{queue_strategy = fifo}) -> + queue:new(); +new(#state{queue_strategy = filo}) -> + []. -do_work(Pid, Work, From) -> - riak_core_vnode_worker:handle_work(Pid, Work, From). diff --git a/src/riak_core_worker_pool.erl b/src/riak_core_worker_pool.erl deleted file mode 100644 index 958248a42..000000000 --- a/src/riak_core_worker_pool.erl +++ /dev/null @@ -1,380 +0,0 @@ -%% -%% 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 This is a wrapper around a poolboy pool, that implements a -%% queue. That is, this process maintains a queue of work, and checks -%% workers out of a poolboy pool to consume it. -%% -%% The workers it uses send two messages to this process. -%% -%% The first message is at startup, the bare atom -%% `worker_started'. This is a clue to this process that a worker was -%% just added to the poolboy pool, so a checkout request has a chance -%% of succeeding. This is most useful after an old worker has exited - -%% `worker_started' is a trigger guaranteed to arrive at a time that -%% will mean an immediate poolboy:checkout will not beat the worker -%% into the pool. -%% -%% The second message is when the worker finishes work it has been -%% handed, the two-tuple, `{checkin, WorkerPid}'. This message gives -%% this process the choice of whether to give the worker more work or -%% check it back into poolboy's pool at this point. Note: the worker -%% should *never* call poolboy:checkin itself, because that will -%% confuse (or cause a race) with this module's checkout management. --module(riak_core_worker_pool). - --behaviour(gen_fsm). - --compile({nowarn_deprecated_function, - [{gen_fsm, start_link, 3}, - {gen_fsm, send_event, 2}, - {gen_fsm, sync_send_all_state_event, 2}, - {gen_fsm, sync_send_all_state_event, 3}]}). - -%% gen_fsm callbacks --export([init/1, handle_event/3, handle_sync_event/4, handle_info/3, - terminate/3, code_change/4]). - --export([start_link/3, handle_work/3, stop/2, shutdown_pool/2]). - -%% gen_fsm states --export([queueing/2, ready/2, ready/3, queueing/3, shutdown/2, shutdown/3]). - --export([monitor_worker/4]). - --include_lib("kernel/include/logger.hrl"). - --ifdef(PULSE). --compile(export_all). --compile({parse_transform, pulse_instrument}). --compile({pulse_replace_module, [{gen_fsm, pulse_gen_fsm}]}). --endif. - --define(SHUTDOWN_WAIT, 60000). - --record(state, {queue = queue:new(), - pool :: pid(), - monitors = [] :: list(), - shutdown :: undefined | {pid(), reference()}, - callback_mod :: atom(), - pool_name :: atom(), - checkouts = [] :: list(checkout()) - }). - --type checkout() :: {pid(), erlang:timestamp()}. - --callback handle_work(Pid::pid(), Work::term(), From::term()) -> any(). - --callback stop(Pid::pid(), Reason::term()) -> any(). - --callback shutdown_pool(Pid::pid(), Wait::integer()) -> any(). - --callback do_init(PoolBoyArgs::list()) -> {ok, pid()}. - --callback reply(Term::term(), Term::term()) -> any(). - --callback do_work(Pid::pid(), Work::term(), From::term()) -> any(). - - -start_link(PoolBoyArgs, CallbackMod, PoolName) -> - gen_fsm:start_link(?MODULE, [PoolBoyArgs, CallbackMod, PoolName], []). - -handle_work(Pid, Work, From) -> - gen_fsm:send_event(Pid, {work, Work, From}). - -stop(Pid, Reason) -> - gen_fsm:sync_send_all_state_event(Pid, {stop, Reason}). - -%% wait for all the workers to finish any current work -shutdown_pool(Pid, Wait) -> - gen_fsm:sync_send_all_state_event(Pid, {shutdown, Wait}, infinity). - -init([PoolBoyArgs, CallbackMod, PoolName]) -> - {ok, Pid} = CallbackMod:do_init(PoolBoyArgs), - {ok, - ready, - #state{pool=Pid, - callback_mod = CallbackMod, - pool_name = PoolName}}. - -ready(_Event, _From, State) -> - {reply, ok, ready, State}. - -queueing(_Event, _From, State) -> - {reply, ok, queueing, State}. - -shutdown(_Event, _From, State) -> - {reply, ok, shutdown, State}. - -ready({work, Work, From} = Msg, - #state{pool=Pool, - queue=Q, - pool_name=PoolName, - checkouts=Checkouts0, - monitors=Monitors0} = State) -> - case poolboy_checkout(Pool, PoolName, Checkouts0) of - full -> - {next_state, queueing, State#state{queue=push_to_queue(Msg, Q)}}; - {Pid, Checkouts} when is_pid(Pid) -> - Monitors = - riak_core_worker_pool:monitor_worker(Pid, - From, - Work, - Monitors0), - do_work(Pid, Work, From, State#state.callback_mod), - {next_state, - ready, - State#state{monitors=Monitors, checkouts = Checkouts}} - end; -ready(_Event, State) -> - {next_state, ready, State}. - -queueing({work, _Work, _From} = Msg, #state{queue=Q} = State) -> - {next_state, queueing, State#state{queue=push_to_queue(Msg, Q)}}; -queueing(_Event, State) -> - {next_state, queueing, State}. - -shutdown({work, _Work, From}, State) -> - %% tell the process requesting work that we're shutting down - Mod = State#state.callback_mod, - Mod:reply(From, {error, vnode_shutdown}), - {next_state, shutdown, State}; -shutdown(_Event, State) -> - {next_state, shutdown, State}. - -handle_event({checkin, Pid}, - shutdown, - #state{pool=Pool, - pool_name=PoolName, - monitors=Monitors0, - checkouts=Checkouts0} = State) -> - Monitors = demonitor_worker(Pid, Monitors0), - {ok, Checkouts} = - poolboy_checkin(Pool, Pid, PoolName, Checkouts0), - case Monitors of - [] -> %% work all done, time to exit! - {stop, shutdown, State}; - _ -> - {next_state, - shutdown, - State#state{monitors=Monitors, checkouts=Checkouts}} - end; -handle_event({checkin, Worker}, - _, - #state{pool=Pool, - queue=Q, - pool_name=PoolName, - checkouts=Checkouts0, - monitors=Monitors0} = State) -> - case consume_from_queue(Q, State#state.pool_name) 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 - Monitors = monitor_worker(Worker, From, Work, Monitors0), - do_work(Worker, Work, From, State#state.callback_mod), - {next_state, - queueing, State#state{queue=Rem, monitors=Monitors}}; - {empty, Empty} -> - Monitors = demonitor_worker(Worker, Monitors0), - {ok, Checkouts} = - poolboy_checkin(Pool, Worker, PoolName, Checkouts0), - {next_state, - ready, - State#state{queue=Empty, - monitors=Monitors, - checkouts=Checkouts}} - end; -handle_event(worker_start, StateName, - #state{pool=Pool, - queue=Q, - pool_name=PoolName, - checkouts=Checkouts0, - monitors=Monitors0}=State) -> - %% a new worker just started - if we have work pending, try to do it - case consume_from_queue(Q, State#state.pool_name) of - {{value, {work, Work, From}}, Rem} -> - case poolboy_checkout(Pool, PoolName, Checkouts0) of - full -> - {next_state, queueing, State}; - {Pid, Checkouts} when is_pid(Pid) -> - Monitors = monitor_worker(Pid, From, Work, Monitors0), - do_work(Pid, Work, From, State#state.callback_mod), - {next_state, - queueing, - State#state{queue=Rem, - monitors=Monitors, - checkouts=Checkouts}} - 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==queueing -> - ready; - true -> - StateName - end, - State} - 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{queue=Q, - monitors=Monitors} = State) -> - discard_queued_work(Q, State#state.callback_mod), - 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=queue:new()}} - end; -handle_sync_event(_Event, _From, StateName, State) -> - {reply, {error, unknown_message}, StateName, State}. - -handle_info({'DOWN', _Ref, _, Pid, Info}, - StateName, - #state{monitors=Monitors0} = State) -> - %% remove the listing for the dead worker - case lists:keyfind(Pid, 1, Monitors0) of - {Pid, _, From, Work} -> - Mod = State#state.callback_mod, - Mod:reply(From, {error, {worker_crash, Info, Work}}), - Monitors = lists:keydelete(Pid, 1, Monitors0), - %% 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=Monitors}}; - false -> - {next_state, StateName, State} - end; -handle_info(shutdown, shutdown, #state{monitors=Monitors} = State) -> - %% we've waited too long to shutdown, time to force the issue - Mod = State#state.callback_mod, - _ = [Mod:reply(From, {error, vnode_shutdown}) - || {_, _, From, _} <- Monitors], - {stop, shutdown, State}; -handle_info(_Info, StateName, State) -> - {next_state, StateName, State}. - -terminate(shutdown, _StateName, #state{pool=Pool, queue=Q, callback_mod=Mod}) -> - discard_queued_work(Q, Mod), - %% stop poolboy - gen_fsm:sync_send_all_state_event(Pool, stop), - ok; -terminate(_Reason, _StateName, #state{pool=Pool}) -> - gen_fsm:sync_send_all_state_event(Pool, stop), - ok. - -code_change(_OldVsn, StateName, State, _Extra) -> - {ok, StateName, State}. - -%% 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] - 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 - end. - -discard_queued_work(Q, Mod) -> - case queue:out(Q) of - {{value, {work, _Work, From}}, Rem} -> - Mod:reply(From, {error, vnode_shutdown}), - discard_queued_work(Rem, Mod); - {empty, _Empty} -> - ok - end. - --spec poolboy_checkin(pid(), pid(), atom(), list(checkout())) - -> {ok, list(checkout())}. -poolboy_checkin(Pool, Worker, PoolName, Checkouts) -> - R = poolboy:checkin(Pool, Worker), - case lists:keytake(Worker, 1, Checkouts) of - {value, {Worker, WT}, Checkouts0} -> - riak_core_stat:update({worker_pool, - work_time, - PoolName, - timer:now_diff(os:timestamp(), WT)}), - {R, Checkouts0}; - _ -> - ?LOG_WARNING( - "Unexplained poolboy behaviour - failure to track checkouts"), - {R, Checkouts} - end. - --spec poolboy_checkout(pid(), atom(), list(checkout())) - -> full | {pid(), list(checkout())}. -poolboy_checkout(Pool, PoolName, Checkouts) -> - case poolboy:checkout(Pool, false) of - full -> - full; - P when is_pid(P) -> - riak_core_stat:update({worker_pool, - queue_time, - PoolName, - 0}), - {P, [{P, os:timestamp()}|Checkouts]} - end. - -do_work(Pid, Work, From, Mod) -> - Mod:do_work(Pid, Work, From). - --spec push_to_queue({work, term(), term()}, queue:queue()) -> queue:queue(). -push_to_queue(Msg, Q) -> - QT = os:timestamp(), - queue:in({QT, Msg}, Q). - --spec consume_from_queue(queue:queue(), atom()) -> - {empty | {value, {work, term(), term()}}, - queue:queue()}. -consume_from_queue(Q, PoolName) -> - case queue:out(Q) of - {empty, Empty} -> - {empty, Empty}; - {{value, {QT, {work, Work, From}}}, Rem} -> - riak_core_stat:update({worker_pool, - queue_time, - PoolName, - timer:now_diff(os:timestamp(), QT)}), - {{value, {work, Work, From}}, Rem} - end. diff --git a/test/bg_manager_tests.erl b/test/bg_manager_tests.erl deleted file mode 100644 index 627208ba6..000000000 --- a/test/bg_manager_tests.erl +++ /dev/null @@ -1,165 +0,0 @@ --module(bg_manager_tests). --compile([export_all, nowarn_export_all]). - --include_lib("riak_core_bg_manager.hrl"). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - --define(BG_MGR, riak_core_bg_manager). --define(TIMEOUT, 3000). %% blocking resource timeout - -bg_mgr_test_() -> - {timeout, 60000, %% Seconds to finish all of the tests - {setup, fun() -> - start_bg_mgr() %% uses non-linking start. - end, - fun(_) -> - kill_bg_mgr(), - ok end, %% cleanup - fun(_) -> - [ %% Tests - { "set/get token rates + verify rates", - fun() -> - setup_token_rates(), - verify_token_rates() - end}, - - { "crash token manager + verify rates persist", - fun() -> - crash_and_restart_token_manager(), - verify_token_rates() - end}, - - {"lock/token separation", - fun() -> - %% Trying to set the rate on a token of the wrong type looks - %% like an unregistered token. - ?assertEqual({unregistered, token_a}, riak_core_bg_manager:get_token(token_a)), - ?assertEqual(undefined, riak_core_bg_manager:set_token_rate(token_a, {1,5})), - ?assertEqual({badtype, token_a}, - riak_core_bg_manager:set_concurrency_limit(token_a, 42)), - - %% Same for locks. - ?assertEqual({unregistered, lock_a}, riak_core_bg_manager:get_lock(lock_a)), - ?assertEqual(undefined, riak_core_bg_manager:set_concurrency_limit(lock_a, 52)), - ?assertEqual({badtype, lock_a}, - riak_core_bg_manager:set_token_rate(lock_a, {1, 5})), - - %% Don't allow get_token(Lock) - ?assertEqual({badtype, lock_a}, riak_core_bg_manager:get_token(lock_a)), - - %% Don't allow get_lock(Token) - ?assertEqual({badtype, token_a}, riak_core_bg_manager:get_lock(token_a)) - - end}, - - {"failing crash/revive EQC test case", - %% bg_manager_eqc:set_token_rate('B', 2) -> 0 - %% bg_manager_eqc:get_token('B') -> ok - %% bg_manager_eqc:crash() -> ok - %% bg_manager_eqc:revive() -> true - %% bg_manager_eqc:get_token('B') -> ok - %% bg_manager_eqc:get_token('B') -> ok - fun() -> - T = token_b, - Max = 2, - Period = 5000000, - ?BG_MGR:set_token_rate(T, {Period, Max}), - ?assertEqual(ok, ?BG_MGR:get_token(T)), - ?assertEqual(1, length(?BG_MGR:all_tokens(T))), - crash_and_restart_token_manager(), - ?assertEqual(ok, ?BG_MGR:get_token(T)), - ?assertEqual(2, length(?BG_MGR:all_tokens(T))), - ?assertEqual(max_concurrency, ?BG_MGR:get_token(T)) - end}, - - {"bypass API", - fun() -> - %% bypass API - riak_core_bg_manager:bypass(true), - - %% reduce token rate to zero and ensure we still get one - riak_core_bg_manager:set_token_rate(token_a, {1,0}), - ok = riak_core_bg_manager:get_token(token_a), - - %% reduce lock limit to zero and ensure we still get one - riak_core_bg_manager:set_concurrency_limit(lock_a, 0), - {ok, _Ref1} = riak_core_bg_manager:get_lock(lock_a), - - %% even if globally disabled, we get a lock - riak_core_bg_manager:disable(), - {ok, _Ref2} = riak_core_bg_manager:get_lock(lock_a), - - %% turn it back on - ?BG_MGR:bypass(false), - ?BG_MGR:enable(), - ?assertEqual(max_concurrency, ?BG_MGR:get_lock(lock_a)) - end} - - ] end} - }. - -registered_token_names() -> - [Token || {Token, _Enabled, _Rate} <- ?BG_MGR:token_info()]. - -check_head_token(Token, StatsList) -> - F1 = fun(Stats) -> filter_stat(Token, Stats) end, - ?assertEqual(?BG_MGR:head(Token), lists:map(F1, StatsList)). - -filter_stat(Token, Stats) -> - lists:filter(fun({T,_Stat}) -> Token==T end, Stats). - -spawn_sync_request(Token, Pid, Meta) -> - spawn(fun() -> ok = ?BG_MGR:get_token_blocking(Token, Pid, Meta, ?TIMEOUT) end). - --spec some_token_rates() -> [{bg_token(), {bg_period(), bg_count()}}]. -some_token_rates() -> - [ {token1, {1*1000, 5}}, - {token2, {1*1000, 4}}, - {{token3,stuff3}, {1*1000, 3}} - ]. - -expected_token_names() -> - [ Type || {Type, _Rate} <- some_token_rates()]. - -max_token_period() -> - lists:foldl(fun({_T,{Period,_Limit}},Max) -> erlang:max(Period,Max) end, 0, some_token_rates()). - -expected_token_limit(Token) -> - {_Period, Limit} = proplists:get_value(Token, some_token_rates()), - Limit. - -setup_token_rates() -> - [?BG_MGR:set_token_rate(Type, Rate) || {Type, Rate} <- some_token_rates()]. - -verify_token_rate(Type, ExpectedRate) -> - Rate = ?BG_MGR:token_rate(Type), - ?assertEqual(ExpectedRate, Rate). - -verify_token_rates() -> - [verify_token_rate(Type, Rate) || {Type, Rate} <- some_token_rates()], - %% check un-registered token is not setup - Rate = ?BG_MGR:token_rate(bogusToken), - DefaultRate = {unregistered, bogusToken}, - ?assertEqual(DefaultRate, Rate). - -%% start a stand-alone server, not linked, so that when we crash it, it -%% doesn't take down our test too. -start_bg_mgr() -> - %% setup with history window to 1 seconds - ?BG_MGR:start(), - timer:sleep(100). - -kill_bg_mgr() -> - Pid = erlang:whereis(?BG_MGR), - ?assertNot(Pid == undefined), - erlang:exit(Pid, kill). - -crash_and_restart_token_manager() -> - kill_bg_mgr(), - timer:sleep(100), - start_bg_mgr(), - timer:sleep(100). - --endif. diff --git a/test/bucket_fixup_test.erl b/test/bucket_fixup_test.erl deleted file mode 100644 index 642accb2a..000000000 --- a/test/bucket_fixup_test.erl +++ /dev/null @@ -1,171 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% 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. -%% -%% ------------------------------------------------------------------- --module(bucket_fixup_test). - --include_lib("eunit/include/eunit.hrl"). - --export([fixup/2]). - -fixup(test1, Props) -> - {ok, [{test, 1}|Props]}; -fixup(test2, Props) -> - case proplists:get_value(expand, Props) of - undefined -> - {ok, Props}; - X -> - CleanProps = proplists:delete(expand, Props), - {ok, [{expanded1, X}, {expanded2, X} | CleanProps]} - end; -fixup(test3, Props) -> - {ok, proplists:delete(suppress, Props)}; -fixup(test4, _Props) -> - {error, my_hovercraft_is_full_of_eels}; -fixup(test5, Props) -> - {ok, undef:this_is_undefined(Props)}; -fixup(_, Props) -> - {ok, Props}. - -fixup_test_() -> - {setup, - fun() -> - application:set_env(riak_core,ring_creation_size, 4), - application:set_env(riak_core, bucket_fixups, [{someapp, ?MODULE}]), - application:set_env(riak_core, default_bucket_props, []) - end, - fun(_) -> - application:unset_env(riak_core, ring_creation_size), - application:unset_env(riak_core, bucket_fixups), - application:unset_env(riak_core, default_bucket_props), - process_flag(trap_exit, true), - catch application:stop(riak_core), - riak_core_test_util:stop_pid(whereis(riak_core_ring_manager)), - riak_core_test_util:stop_pid(whereis(riak_core_ring_events)) - end, - [ - fun do_no_harm/0, - fun property_addition/0, - fun property_expansion/0, - fun property_supression/0, - fun fixup_error/0, - fun fixup_crash/0 - ] - }. - -load_test_() -> - {setup, - fun() -> - application:load(riak_core), - application:set_env(riak_core, bucket_fixups, []), - application:set_env(riak_core, default_bucket_props, []), - application:set_env(riak_core, ring_creation_size, 64), - riak_core_ring_events:start_link(), - riak_core_ring_manager:start_link(test), - ok - end, - fun(_) -> - process_flag(trap_exit, true), - catch application:stop(riak_core), - catch(riak_core_ring_manager:stop()), - catch(exit(whereis(riak_core_ring_events), shutdown)), - application:unset_env(riak_core, bucket_fixups), - application:unset_env(riak_core, default_bucket_props), - application:unset_env(riak_core, ring_creation_size) - end, - [ - ?_test(begin - {ok, _R} = riak_core_ring_manager:get_my_ring(), - riak_core_bucket:set_bucket(test1, []), - ?assertEqual([{name, test1}], - riak_core_bucket:get_bucket(test1)), - riak_core:register(loadtestapp, [{bucket_fixup, ?MODULE}]), - ?assertEqual([{test, 1}, {name, test1}], - riak_core_bucket:get_bucket(test1)), - ok - end) - ] - }. - -do_no_harm() -> - Ring = riak_core_ring:update_meta({bucket,test0}, - [], - riak_core_ring:fresh()), - riak_core_ring_manager:setup_ets(test), - riak_core_ring_manager:set_ring_global(Ring), - ?assertEqual([test0], riak_core_ring:get_buckets(Ring)), - [ ?assertEqual([], riak_core_bucket:get_bucket(Bucket)) || - Bucket <- riak_core_ring:get_buckets(Ring)], - ok. - -property_addition() -> - Ring = riak_core_ring:update_meta({bucket,test1}, - [{foo, bar}], - riak_core_ring:fresh()), - riak_core_ring_manager:setup_ets(test), - riak_core_ring_manager:set_ring_global(Ring), - ?assertEqual([test1], riak_core_ring:get_buckets(Ring)), - [ ?assertEqual(1, proplists:get_value(test, - riak_core_bucket:get_bucket(Bucket))) || - Bucket <- riak_core_ring:get_buckets(Ring)], - ok. - -property_expansion() -> - Ref = foobar, - Ring = riak_core_ring:update_meta({bucket,test2}, - [{expand, Ref}], - riak_core_ring:fresh()), - riak_core_ring_manager:setup_ets(test), - riak_core_ring_manager:set_ring_global(Ring), - ?assertEqual([test2], riak_core_ring:get_buckets(Ring)), - ?assertMatch([{expanded1, Ref}, {expanded2, Ref}], - riak_core_bucket:get_bucket(test2)), - ok. - -property_supression() -> - Ring = riak_core_ring:update_meta({bucket,test3}, - [{suppress, 1}, {foo, bar}], - riak_core_ring:fresh()), - riak_core_ring_manager:setup_ets(test), - riak_core_ring_manager:set_ring_global(Ring), - ?assertEqual([test3], riak_core_ring:get_buckets(Ring)), - ?assertMatch([{foo, bar}], - riak_core_bucket:get_bucket(test3)), - ok. - -fixup_error() -> - Ring = riak_core_ring:update_meta({bucket,test4}, - [{foo, bar}], - riak_core_ring:fresh()), - riak_core_ring_manager:setup_ets(test), - riak_core_ring_manager:set_ring_global(Ring), - ?assertEqual([test4], riak_core_ring:get_buckets(Ring)), - ?assertMatch([{foo, bar}], - riak_core_bucket:get_bucket(test4)), - ok. - -fixup_crash() -> - Ring = riak_core_ring:update_meta({bucket,test5}, - [{foo, bar}], - riak_core_ring:fresh()), - riak_core_ring_manager:setup_ets(test), - riak_core_ring_manager:set_ring_global(Ring), - ?assertEqual([test5], riak_core_ring:get_buckets(Ring)), - ?assertMatch([{foo, bar}], - riak_core_bucket:get_bucket(test5)), - ok. diff --git a/test/claim_simulation.erl b/test/claim_simulation.erl index 442b0a833..6b5971684 100644 --- a/test/claim_simulation.erl +++ b/test/claim_simulation.erl @@ -22,7 +22,7 @@ %% https://gist.github.com/992317 -module(claim_simulation). --compile([export_all, nowarn_export_all]). +-compile(export_all). %%-define(SIMULATE,1). -ifdef(SIMULATE). @@ -38,8 +38,6 @@ basic_test_() -> basic_default() -> Opts = [{suffix, "_default"}, - {wc_mf, {riak_core_claim, default_wants_claim}}, - {cc_mf, {riak_core_claim, default_choose_claim}}, {target_n_val, 4}, {ring_size, 32}, {node_count, 8}, @@ -49,8 +47,6 @@ basic_default() -> basic_new() -> Opts = [{suffix, "_new"}, - {wc_mf, {riak_core_new_claim, new_wants_claim}}, - {cc_mf, {riak_core_new_claim, new_choose_claim}}, {target_n_val, 4}, {ring_size, 32}, {node_count, 8}, @@ -61,13 +57,9 @@ basic_new() -> run(Opts) -> application:load(riak_core), - WCMod = ?get(wc_mf, Opts, {riak_core_claim, default_wants_claim}), - CCMod = ?get(cc_mf, Opts, {riak_core_claim, default_choose_claim}), TargetN = ?get(target_n_val, Opts, 4), Suffix = ?get(suffix, Opts, ""), - application:set_env(riak_core, wants_claim_fun, WCMod), - application:set_env(riak_core, choose_claim_fun, CCMod), application:set_env(riak_core, target_n_val, TargetN), RingSize = ?get(ring_size, Opts, 2048), diff --git a/test/dummy_evt.erl b/test/dummy_evt.erl new file mode 100644 index 000000000..3b507048a --- /dev/null +++ b/test/dummy_evt.erl @@ -0,0 +1,62 @@ + +%% ------------------------------------------------------------------- +%% +%% A dummey gen_event listener for testing. +%% +%% Copyright (c) 2015 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(dummy_evt). + +-behaviour(gen_event). + +%%% ------------------------------------------------------------------ +%%% gen_event Function Exports +%%% ------------------------------------------------------------------ + +-export([code_change/3]). +-export([handle_call/2]). +-export([handle_event/2]). +-export([handle_info/2]). +-export([init/1]). +-export([terminate/2]). + +-record(state, {}). + +%%% ------------------------------------------------------------------ +%%% gen_event Function Definitions +%%% ------------------------------------------------------------------ + +init(_) -> + {ok, #state{}}. + +handle_event(_Event, State) -> + {ok, State}. + +handle_call(_Request, State) -> + Reply = ok, + {ok, Reply, State}. + +handle_info(_Info, State) -> + {ok, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. diff --git a/test/13node_12node_ring.eqc b/test/eqc/13node_12node_ring.eqc similarity index 100% rename from test/13node_12node_ring.eqc rename to test/eqc/13node_12node_ring.eqc diff --git a/test/169_group_join.eqc b/test/eqc/169_group_join.eqc similarity index 100% rename from test/169_group_join.eqc rename to test/eqc/169_group_join.eqc diff --git a/test/648_unbalanced_singly.eqc b/test/eqc/648_unbalanced_singly.eqc similarity index 100% rename from test/648_unbalanced_singly.eqc rename to test/eqc/648_unbalanced_singly.eqc diff --git a/eqc/bprops_eqc.erl b/test/eqc/bprops_eqc.erl similarity index 100% rename from eqc/bprops_eqc.erl rename to test/eqc/bprops_eqc.erl diff --git a/test/eqc/bucket_eqc_utils.erl b/test/eqc/bucket_eqc_utils.erl new file mode 100644 index 000000000..c06dce241 --- /dev/null +++ b/test/eqc/bucket_eqc_utils.erl @@ -0,0 +1,58 @@ +%% ------------------------------------------------------------------- +%% +%% 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, 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, 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(), + {ok, MetaMgr} = riak_core_metadata_manager:start_link([{data_dir, "./meta_temp"}]), + {ok, Hashtree} = riak_core_metadata_hashtree:start_link("./meta_temp/trees"), + {ok, Broadcast} = riak_core_broadcast:start_link(), + + Results = TestFun(), + + riak_core_test_util:stop_pid(Broadcast), + riak_core_test_util:stop_pid(Hashtree), + riak_core_test_util:stop_pid(MetaMgr), + 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/claim-statem-leaving-nodes-still-claim.eqc b/test/eqc/claim-statem-leaving-nodes-still-claim.eqc similarity index 100% rename from test/claim-statem-leaving-nodes-still-claim.eqc rename to test/eqc/claim-statem-leaving-nodes-still-claim.eqc diff --git a/test/claim_32_5_unbalanced.eqc b/test/eqc/claim_32_5_unbalanced.eqc similarity index 100% rename from test/claim_32_5_unbalanced.eqc rename to test/eqc/claim_32_5_unbalanced.eqc diff --git a/eqc/node_watcher_qc.erl b/test/eqc/node_watcher_qc.erl similarity index 89% rename from eqc/node_watcher_qc.erl rename to test/eqc/node_watcher_qc.erl index 29f22b7d1..69fd4952f 100644 --- a/eqc/node_watcher_qc.erl +++ b/test/eqc/node_watcher_qc.erl @@ -27,7 +27,7 @@ -include_lib("eqc/include/eqc_statem.hrl"). -include_lib("eunit/include/eunit.hrl"). --compile([export_all, nowarn_export_all]). +-compile(export_all). -record(state, { up_nodes = [], services = [], @@ -40,48 +40,65 @@ -define(ORDSET(L), ordsets:from_list(L)). +qc_test_() -> + {timeout, 120, fun() -> ?assert(eqc:quickcheck(?QC_OUT(prop_main()))) end}. + prop_main() -> + ?SETUP( + fun setup_cleanup/0, + ?FORALL(Cmds, commands(?MODULE), + begin + %% Setup ETS table to recv broadcasts + ets:new(?MODULE, [ordered_set, named_table, public]), + ets:insert_new(?MODULE, {bcast_id, 0}), + + %% Start the watcher + {ok, Pid} = riak_core_node_watcher:start_link(), + + %% Internal call to the node watcher to override default broadcast mechanism + riak_core_node_watcher:set_broadcast_module(?MODULE, on_broadcast), + + %% Run the test + {_H, _S, Res} = run_commands(?MODULE, Cmds), + + %% Unlink and kill our PID + riak_core_test_util:stop_pid(Pid), + + %% Delete the ETS table + ets:delete(?MODULE), + + case Res of + ok -> ok; + _ -> io:format(user, "QC result: ~p\n", [Res]) + end, + aggregate(command_names(Cmds), Res == ok) + end)). + +setup_cleanup() -> + meck:unload(), %% Initialize necessary env settings + riak_core_test_util:stop_pid(whereis(riak_core_node_watcher)), application:load(riak_core), application:set_env(riak_core, gossip_interval, 250), application:set_env(riak_core, ring_creation_size, 8), - - %% Start supporting processes - riak_core_eventhandler_sup:start_link(), - riak_core_ring_events:start_link(), - riak_core_node_watcher_events:start_link(), - - %% meck used for health watch / threshold + RingEventHandlerSup = ensure_started(riak_core_eventhandler_sup), + RingEvents = ensure_started(riak_core_ring_events), + NodeWatcherEvents = ensure_started(riak_core_node_watcher_events), meck:new(mod_health, [non_strict, no_link]), + fun() -> + unlink(RingEventHandlerSup), + unlink(RingEvents), + unlink(NodeWatcherEvents), + riak_core_test_util:stop_pid(RingEventHandlerSup), + riak_core_test_util:stop_pid(RingEvents), + riak_core_test_util:stop_pid(NodeWatcherEvents) + end. - ?FORALL(Cmds, commands(?MODULE), - begin - %% Setup ETS table to recv broadcasts - ets:new(?MODULE, [ordered_set, named_table, public]), - ets:insert_new(?MODULE, {bcast_id, 0}), - - %% Start the watcher - {ok, Pid} = riak_core_node_watcher:start_link(), - - %% Internal call to the node watcher to override default broadcast mechanism - gen_server:call(riak_core_node_watcher, {set_bcast_mod, ?MODULE, on_broadcast}), - - %% Run the test - {_H, _S, Res} = run_commands(?MODULE, Cmds), - - %% Unlink and kill our PID - unlink(Pid), - kill_and_wait(Pid), - - %% Delete the ETS table - ets:delete(?MODULE), - - case Res of - ok -> ok; - _ -> io:format(user, "QC result: ~p\n", [Res]) - end, - aggregate(command_names(Cmds), Res == ok) - end). +ensure_started(Mod) -> + case Mod:start_link() of + {ok, Pid} -> Pid; + {error, {already_started, Pid}} -> Pid + end. %% ==================================================================== @@ -353,7 +370,7 @@ g_services() -> list(elements([s1, s2, s3, s4])). g_ring_nodes() -> - vector(app_helper:get_env(riak_core, ring_creation_size), + vector(application:get_env(riak_core, ring_creation_size, undefined), oneof([node(), 'n1@127.0.0.1', 'n2@127.0.0.1', 'n3@127.0.0.1'])). g_service_threshold() -> [g_service(), {nw_mecked_thresher, health_check, [oneof([true, false, kill, error])]}]. @@ -376,7 +393,7 @@ local_service_down(Service) -> local_service_kill(Service, State) -> Avsn0 = riak_core_node_watcher:avsn(), Pid = orddict:fetch(Service, State#state.service_pids), - kill_and_wait(Pid), + riak_core_test_util:stop_pid(Pid), wait_for_avsn(Avsn0). local_node_up() -> @@ -579,15 +596,6 @@ broadcasts() -> ets:match_delete(?MODULE, {'_', '_', '_'}), Bcasts. - -kill_and_wait(Pid) -> - Mref = erlang:monitor(process, Pid), - exit(Pid, kill), - receive - {'DOWN', Mref, _, _, _} -> - ok - end. - wait_for_avsn(Avsn0) -> case riak_core_node_watcher:avsn() of Avsn0 -> @@ -605,7 +613,7 @@ service_loop() -> end. build_ring([Node | Rest]) -> - Inc = trunc(math:pow(2,160)-1) div app_helper:get_env(riak_core, ring_creation_size), + Inc = trunc(math:pow(2,160)-1) div application:get_env(riak_core, ring_creation_size, undefined), build_ring(Rest, 0, Inc, riak_core_ring:fresh(Node)). build_ring([], _Id, _Inc, R) -> diff --git a/test/riak_core_claim_statem.erl b/test/eqc/riak_core_claim_statem.erl similarity index 100% rename from test/riak_core_claim_statem.erl rename to test/eqc/riak_core_claim_statem.erl diff --git a/eqc/vclock_qc.erl b/test/eqc/vclock_qc.erl similarity index 99% rename from eqc/vclock_qc.erl rename to test/eqc/vclock_qc.erl index 6b8380ed9..0d31b0460 100644 --- a/eqc/vclock_qc.erl +++ b/test/eqc/vclock_qc.erl @@ -5,7 +5,7 @@ -include_lib("eqc/include/eqc.hrl"). -include_lib("eqc/include/eqc_statem.hrl"). -include_lib("eunit/include/eunit.hrl"). --compile([export_all, nowarn_export_all]). +-compile(export_all). -define(ACTOR_IDS, [a,b,c,d,e]). -define(QC_OUT(P), diff --git a/eqc/worker_pool_pulse.erl b/test/eqc/worker_pool_pulse.erl similarity index 68% rename from eqc/worker_pool_pulse.erl rename to test/eqc/worker_pool_pulse.erl index e67053157..d10906578 100644 --- a/eqc/worker_pool_pulse.erl +++ b/test/eqc/worker_pool_pulse.erl @@ -32,7 +32,7 @@ %% riak_core_vnode_worker behavior -export([init_worker/3, handle_work/3]). %% console debugging convenience --compile([export_all, nowarn_export_all]). +-compile(export_all). -ifdef(PULSE). -include_lib("pulse/include/pulse.hrl"). @@ -59,26 +59,25 @@ handle_work(Work, _From, State) -> %% @doc Any amount of work should complete through any size pool. prop_any_pool() -> - ?SETUP(fun setup_and_teardown/0, - ?FORALL({Seed, ExtraWork, WorkList}, - {pulse:seed(), - frequency([{10,true},{1,false}]), - list(frequency([{10,nat()}, {1,die}]))}, - aggregate([{{extra_work, - pool_size(ExtraWork, WorkList) < length(WorkList) }, - {deaths, lists:member(die, WorkList)}}], - ?WHENFAIL( - io:format(user, - "PoolSize: ~b~n" - "WorkList: ~p~n" - "Schedule: ~p~n", - [pool_size(ExtraWork, WorkList), - WorkList, - pulse:get_schedule()]), - begin - PoolSize = pool_size(ExtraWork, WorkList), - true == all_work_gets_done(Seed, PoolSize, WorkList) - end)))). + ?FORALL({Seed, ExtraWork, WorkList}, + {pulse:seed(), + frequency([{10,true},{1,false}]), + list(frequency([{10,nat()}, {1,die}]))}, + aggregate([{{extra_work, + pool_size(ExtraWork, WorkList) < length(WorkList) }, + {deaths, lists:member(die, WorkList)}}], + ?WHENFAIL( + io:format(user, + "PoolSize: ~b~n" + "WorkList: ~p~n" + "Schedule: ~p~n", + [pool_size(ExtraWork, WorkList), + WorkList, + pulse:get_schedule()]), + begin + PoolSize = pool_size(ExtraWork, WorkList), + true == all_work_gets_done(Seed, PoolSize, WorkList) + end))). pool_size(false, WorkList) -> length(WorkList); @@ -93,9 +92,7 @@ pool_size(true, WorkList) -> %% @doc Minimal case for the issue this test was created to probe: one %% worker, two inputs. prop_small_pool() -> - ?SETUP(fun setup_and_teardown/0, - ?PULSE(Result, all_work_gets_done(1, [1,2]), - true == Result)). + ?PULSE(Result, all_work_gets_done(1, [1,2]), true == Result). all_work_gets_done(Seed, PoolSize, WorkList) -> pulse:run_with_seed( @@ -122,12 +119,21 @@ all_work_gets_done(PoolSize, WorkList) -> %% thus never get here length(Results) == length(WorkList). -setup_and_teardown() -> - error_logger:tty(false), - pulse:start(), - fun() -> - pulse:stop(), - error_logger:tty(true) - end. +pool_test_() -> + {setup, + fun() -> + error_logger:tty(false), + pulse:start() + end, + fun(_) -> + pulse:stop(), + error_logger:tty(true) + end, + [ + %% not necessary to run both tests here, but why not anyway? + ?_assert(eqc:quickcheck(prop_small_pool())), + ?_assert(eqc:quickcheck(prop_any_pool())) + ] + }. -endif. diff --git a/test/mock_vnode.erl b/test/mock_vnode.erl new file mode 100644 index 000000000..44dbe6a87 --- /dev/null +++ b/test/mock_vnode.erl @@ -0,0 +1,196 @@ +%% ------------------------------------------------------------------- +%% +%% 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/test/my_ring b/test/my_ring index d3bd9132b..f3d00adbb 100644 --- a/test/my_ring +++ b/test/my_ring @@ -1,94 +1,156 @@ {chstate,'dev5@127.0.0.1', - [{'dev3@127.0.0.1',{89,63479179549}}, - {'dev2@127.0.0.1',{79,63479091987}}, - {'dev4@127.0.0.1',{43,63479013109}}, - {'dev5@127.0.0.1',{43,63479013108}}, - {'dev6@127.0.0.1',{130,63479013109}}], - {64, - [{0,'dev1@127.0.0.1'}, - {22835963083295358096932575511191922182123945984,'dev2@127.0.0.1'}, - {45671926166590716193865151022383844364247891968,'dev3@127.0.0.1'}, - {68507889249886074290797726533575766546371837952,'dev4@127.0.0.1'}, - {91343852333181432387730302044767688728495783936,'dev5@127.0.0.1'}, - {114179815416476790484662877555959610910619729920,'dev6@127.0.0.1'}, - {137015778499772148581595453067151533092743675904,'dev1@127.0.0.1'}, - {159851741583067506678528028578343455274867621888,'dev2@127.0.0.1'}, - {182687704666362864775460604089535377456991567872,'dev3@127.0.0.1'}, - {205523667749658222872393179600727299639115513856,'dev4@127.0.0.1'}, - {228359630832953580969325755111919221821239459840,'dev5@127.0.0.1'}, - {251195593916248939066258330623111144003363405824,'dev6@127.0.0.1'}, - {274031556999544297163190906134303066185487351808,'dev1@127.0.0.1'}, - {296867520082839655260123481645494988367611297792,'dev2@127.0.0.1'}, - {319703483166135013357056057156686910549735243776,'dev3@127.0.0.1'}, - {342539446249430371453988632667878832731859189760,'dev4@127.0.0.1'}, - {365375409332725729550921208179070754913983135744,'dev5@127.0.0.1'}, - {388211372416021087647853783690262677096107081728,'dev6@127.0.0.1'}, - {411047335499316445744786359201454599278231027712,'dev1@127.0.0.1'}, - {433883298582611803841718934712646521460354973696,'dev2@127.0.0.1'}, - {456719261665907161938651510223838443642478919680,'dev3@127.0.0.1'}, - {479555224749202520035584085735030365824602865664,'dev4@127.0.0.1'}, - {502391187832497878132516661246222288006726811648,'dev5@127.0.0.1'}, - {525227150915793236229449236757414210188850757632,'dev6@127.0.0.1'}, - {548063113999088594326381812268606132370974703616,'dev1@127.0.0.1'}, - {570899077082383952423314387779798054553098649600,'dev2@127.0.0.1'}, - {593735040165679310520246963290989976735222595584,'dev3@127.0.0.1'}, - {616571003248974668617179538802181898917346541568,'dev4@127.0.0.1'}, - {639406966332270026714112114313373821099470487552,'dev5@127.0.0.1'}, - {662242929415565384811044689824565743281594433536,'dev6@127.0.0.1'}, - {685078892498860742907977265335757665463718379520,'dev1@127.0.0.1'}, - {707914855582156101004909840846949587645842325504,'dev2@127.0.0.1'}, - {730750818665451459101842416358141509827966271488,'dev3@127.0.0.1'}, - {753586781748746817198774991869333432010090217472,'dev4@127.0.0.1'}, - {776422744832042175295707567380525354192214163456,'dev5@127.0.0.1'}, - {799258707915337533392640142891717276374338109440,'dev6@127.0.0.1'}, - {822094670998632891489572718402909198556462055424,'dev1@127.0.0.1'}, - {844930634081928249586505293914101120738586001408,'dev2@127.0.0.1'}, - {867766597165223607683437869425293042920709947392,'dev3@127.0.0.1'}, - {890602560248518965780370444936484965102833893376,'dev4@127.0.0.1'}, - {913438523331814323877303020447676887284957839360,'dev5@127.0.0.1'}, - {936274486415109681974235595958868809467081785344,'dev6@127.0.0.1'}, - {959110449498405040071168171470060731649205731328,'dev1@127.0.0.1'}, - {981946412581700398168100746981252653831329677312,'dev2@127.0.0.1'}, - {1004782375664995756265033322492444576013453623296, - 'dev3@127.0.0.1'}, - {1027618338748291114361965898003636498195577569280, - 'dev4@127.0.0.1'}, - {1050454301831586472458898473514828420377701515264, - 'dev5@127.0.0.1'}, - {1073290264914881830555831049026020342559825461248, - 'dev6@127.0.0.1'}, - {1096126227998177188652763624537212264741949407232, - 'dev1@127.0.0.1'}, - {1118962191081472546749696200048404186924073353216, - 'dev2@127.0.0.1'}, - {1141798154164767904846628775559596109106197299200, - 'dev3@127.0.0.1'}, - {1164634117248063262943561351070788031288321245184, - 'dev4@127.0.0.1'}, - {1187470080331358621040493926581979953470445191168, - 'dev5@127.0.0.1'}, - {1210306043414653979137426502093171875652569137152, - 'dev6@127.0.0.1'}, - {1233142006497949337234359077604363797834693083136, - 'dev1@127.0.0.1'}, - {1255977969581244695331291653115555720016817029120, - 'dev2@127.0.0.1'}, - {1278813932664540053428224228626747642198940975104, - 'dev3@127.0.0.1'}, - {1301649895747835411525156804137939564381064921088, - 'dev4@127.0.0.1'}, - {1324485858831130769622089379649131486563188867072, - 'dev5@127.0.0.1'}, - {1347321821914426127719021955160323408745312813056, - 'dev6@127.0.0.1'}, - {1370157784997721485815954530671515330927436759040, - 'dev1@127.0.0.1'}, - {1392993748081016843912887106182707253109560705024, - 'dev2@127.0.0.1'}, - {1415829711164312202009819681693899175291684651008, - 'dev3@127.0.0.1'}, - {1438665674247607560106752257205091097473808596992, - 'dev4@127.0.0.1'}]}, - {dict,0,16,16,8,80,48, - {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}, - {{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}}. + [{'dev3@127.0.0.1',{89,63479179549}}, + {'dev2@127.0.0.1',{79,63479091987}}, + {'dev4@127.0.0.1',{43,63479013109}}, + {'dev5@127.0.0.1',{43,63479013108}}, + {'dev6@127.0.0.1',{130,63479013109}}], + {64, + [{0,'dev1@127.0.0.1'}, + {22835963083295358096932575511191922182123945984, + 'dev2@127.0.0.1'}, + {45671926166590716193865151022383844364247891968, + 'dev3@127.0.0.1'}, + {68507889249886074290797726533575766546371837952, + 'dev4@127.0.0.1'}, + {91343852333181432387730302044767688728495783936, + 'dev5@127.0.0.1'}, + {114179815416476790484662877555959610910619729920, + 'dev6@127.0.0.1'}, + {137015778499772148581595453067151533092743675904, + 'dev1@127.0.0.1'}, + {159851741583067506678528028578343455274867621888, + 'dev2@127.0.0.1'}, + {182687704666362864775460604089535377456991567872, + 'dev3@127.0.0.1'}, + {205523667749658222872393179600727299639115513856, + 'dev4@127.0.0.1'}, + {228359630832953580969325755111919221821239459840, + 'dev5@127.0.0.1'}, + {251195593916248939066258330623111144003363405824, + 'dev6@127.0.0.1'}, + {274031556999544297163190906134303066185487351808, + 'dev1@127.0.0.1'}, + {296867520082839655260123481645494988367611297792, + 'dev2@127.0.0.1'}, + {319703483166135013357056057156686910549735243776, + 'dev3@127.0.0.1'}, + {342539446249430371453988632667878832731859189760, + 'dev4@127.0.0.1'}, + {365375409332725729550921208179070754913983135744, + 'dev5@127.0.0.1'}, + {388211372416021087647853783690262677096107081728, + 'dev6@127.0.0.1'}, + {411047335499316445744786359201454599278231027712, + 'dev1@127.0.0.1'}, + {433883298582611803841718934712646521460354973696, + 'dev2@127.0.0.1'}, + {456719261665907161938651510223838443642478919680, + 'dev3@127.0.0.1'}, + {479555224749202520035584085735030365824602865664, + 'dev4@127.0.0.1'}, + {502391187832497878132516661246222288006726811648, + 'dev5@127.0.0.1'}, + {525227150915793236229449236757414210188850757632, + 'dev6@127.0.0.1'}, + {548063113999088594326381812268606132370974703616, + 'dev1@127.0.0.1'}, + {570899077082383952423314387779798054553098649600, + 'dev2@127.0.0.1'}, + {593735040165679310520246963290989976735222595584, + 'dev3@127.0.0.1'}, + {616571003248974668617179538802181898917346541568, + 'dev4@127.0.0.1'}, + {639406966332270026714112114313373821099470487552, + 'dev5@127.0.0.1'}, + {662242929415565384811044689824565743281594433536, + 'dev6@127.0.0.1'}, + {685078892498860742907977265335757665463718379520, + 'dev1@127.0.0.1'}, + {707914855582156101004909840846949587645842325504, + 'dev2@127.0.0.1'}, + {730750818665451459101842416358141509827966271488, + 'dev3@127.0.0.1'}, + {753586781748746817198774991869333432010090217472, + 'dev4@127.0.0.1'}, + {776422744832042175295707567380525354192214163456, + 'dev5@127.0.0.1'}, + {799258707915337533392640142891717276374338109440, + 'dev6@127.0.0.1'}, + {822094670998632891489572718402909198556462055424, + 'dev1@127.0.0.1'}, + {844930634081928249586505293914101120738586001408, + 'dev2@127.0.0.1'}, + {867766597165223607683437869425293042920709947392, + 'dev3@127.0.0.1'}, + {890602560248518965780370444936484965102833893376, + 'dev4@127.0.0.1'}, + {913438523331814323877303020447676887284957839360, + 'dev5@127.0.0.1'}, + {936274486415109681974235595958868809467081785344, + 'dev6@127.0.0.1'}, + {959110449498405040071168171470060731649205731328, + 'dev1@127.0.0.1'}, + {981946412581700398168100746981252653831329677312, + 'dev2@127.0.0.1'}, + {1004782375664995756265033322492444576013453623296, + 'dev3@127.0.0.1'}, + {1027618338748291114361965898003636498195577569280, + 'dev4@127.0.0.1'}, + {1050454301831586472458898473514828420377701515264, + 'dev5@127.0.0.1'}, + {1073290264914881830555831049026020342559825461248, + 'dev6@127.0.0.1'}, + {1096126227998177188652763624537212264741949407232, + 'dev1@127.0.0.1'}, + {1118962191081472546749696200048404186924073353216, + 'dev2@127.0.0.1'}, + {1141798154164767904846628775559596109106197299200, + 'dev3@127.0.0.1'}, + {1164634117248063262943561351070788031288321245184, + 'dev4@127.0.0.1'}, + {1187470080331358621040493926581979953470445191168, + 'dev5@127.0.0.1'}, + {1210306043414653979137426502093171875652569137152, + 'dev6@127.0.0.1'}, + {1233142006497949337234359077604363797834693083136, + 'dev1@127.0.0.1'}, + {1255977969581244695331291653115555720016817029120, + 'dev2@127.0.0.1'}, + {1278813932664540053428224228626747642198940975104, + 'dev3@127.0.0.1'}, + {1301649895747835411525156804137939564381064921088, + 'dev4@127.0.0.1'}, + {1324485858831130769622089379649131486563188867072, + 'dev5@127.0.0.1'}, + {1347321821914426127719021955160323408745312813056, + 'dev6@127.0.0.1'}, + {1370157784997721485815954530671515330927436759040, + 'dev1@127.0.0.1'}, + {1392993748081016843912887106182707253109560705024, + 'dev2@127.0.0.1'}, + {1415829711164312202009819681693899175291684651008, + 'dev3@127.0.0.1'}, + {1438665674247607560106752257205091097473808596992, + 'dev4@127.0.0.1'}]}, + {dict,0,16,16,8,80,48, + {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}, + {{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}, + undefined,[], + [{'dev1@127.0.0.1',{valid,[{'dev5@127.0.0.1',{1,63560752118}}], + []}}, + {'dev2@127.0.0.1',{valid,[{'dev5@127.0.0.1',{1,63560752118}}], + []}}, + {'dev3@127.0.0.1',{valid,[{'dev5@127.0.0.1',{1,63560752118}}], + []}}, + {'dev4@127.0.0.1',{valid,[{'dev5@127.0.0.1',{1,63560752118}}], + []}}, + {'dev5@127.0.0.1',{valid,[{'dev5@127.0.0.1',{1,63560752118}}], + []}}, + {'dev6@127.0.0.1',{valid,[{'dev5@127.0.0.1',{1,63560752118}}], + []}}], + undefined,[], + [{'dev3@127.0.0.1',{89,63479179549}}, + {'dev2@127.0.0.1',{79,63479091987}}, + {'dev4@127.0.0.1',{43,63479013109}}, + {'dev5@127.0.0.1',{43,63479013108}}, + {'dev6@127.0.0.1',{130,63479013109}}]}. diff --git a/test/riak_core_base64url_tests.erl b/test/riak_core_base64url_tests.erl new file mode 100644 index 000000000..b4ec62522 --- /dev/null +++ b/test/riak_core_base64url_tests.erl @@ -0,0 +1,42 @@ +%% ------------------------------------------------------------------- +%% 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/src/riak_core_claim_sim.erl b/test/riak_core_claim_sim.erl similarity index 94% rename from src/riak_core_claim_sim.erl rename to test/riak_core_claim_sim.erl index d7ffec9f0..d987f6132 100644 --- a/src/riak_core_claim_sim.erl +++ b/test/riak_core_claim_sim.erl @@ -24,12 +24,20 @@ %% -module(riak_core_claim_sim). --compile(nowarn_export_all). --compile(export_all). - --include_lib("kernel/include/logger.hrl"). - +-export([help/0, run/1, add_choose_params/2, run_rebalance/4, + read_ringfile/1, setup_environment/1, dryrun/3, make_current/2, + make_prepared/3, make_postxfer/2, make_percmd/1, make_rebalance/2, + make_analysis/2, default_simopts/3, dryrun1/3, sim_node/1, + command/2, pretty_print/3, run_analysis/3, o/2, o/3, + commission/0, commission/1, commission/2, commission/3, + commission_tests_all/0 + ]). -ifdef(TEST). +-export([ + commission_test_dir/6, commission_tests_first/0, + commission_tests_rest/0, commission_claims/0, + commission_test_no_longer_run_by_default/0 + ]). -include_lib("eunit/include/eunit.hrl"). -endif. @@ -105,9 +113,9 @@ run(Opts) -> setup_environment(AppVars), Wants = proplists:get_value(wants, Opts, - app_helper:get_env(riak_core, wants_claim_fun)), + application:get_env(riak_core, wants_claim_fun, undefined)), Choose = proplists:get_value(choose, - Opts, app_helper:get_env(riak_core, choose_claim_fun)), + Opts, application:get_env(riak_core, choose_claim_fun, undefined)), Prepare = proplists:get_value(prepare, Opts, finish), Cmds = proplists:get_value(cmds, Opts, []), @@ -115,7 +123,7 @@ run(Opts) -> Analysis = proplists:get_value(analysis, Opts, []), ReturnRing = proplists:get_value(return_ring, Opts, false), - TN0 = proplists:get_value(target_n_val, Opts, app_helper:get_env(riak_core, target_n_val)), + TN0 = proplists:get_value(target_n_val, Opts, application:get_env(riak_core, target_n_val, undefined)), {Ring, TN} = case {Claimant, RingFile, RingArg} of @@ -124,7 +132,7 @@ run(Opts) -> {Ring0, TN0}; {Claimant, undefined, undefined} -> {ok, Ring0} = rpc:call(Claimant, riak_core_ring_manager, get_raw_ring, []), - ClaimantTN = rpc:call(Claimant, app_helper, get_env, [riak_core, target_n_val]), + ClaimantTN = rpc:call(Claimant, application, get_env, [riak_core, target_n_val, undefined]), {Ring0, ClaimantTN}; {undefined, RingFile, undefined} -> Ring0 = riak_core_ring_manager:read_ringfile(RingFile), @@ -437,7 +445,7 @@ commission(Base, Test, {Wants, Choose}) -> riak_core_claim_util:ring_stats(Ring2, TN) catch _:Reason -> - ?LOG_INFO("Ring stats failed - ~p\n", [Reason]), + logger:info("Ring stats failed - ~p\n", [Reason]), [] end, io:format(SeqFh, "\"~w\",~p,~p,~p\n", @@ -472,7 +480,7 @@ commission(Base, Test, {Wants, Choose}) -> riak_core_claim_util:ring_stats(Ring2, TN) catch _:Reason -> - ?LOG_INFO("Ring stats failed - ~p\n", [Reason]), + logger:info("Ring stats failed - ~p\n", [Reason]), [] end, io:format(BulkFh, "\"~w\",~p,~p,~p\n", diff --git a/test/riak_core_schema_tests.erl b/test/riak_core_schema_tests.erl deleted file mode 100644 index ea471b466..000000000 --- a/test/riak_core_schema_tests.erl +++ /dev/null @@ -1,129 +0,0 @@ --module(riak_core_schema_tests). - --include_lib("eunit/include/eunit.hrl"). --compile([export_all, nowarn_export_all]). - -%% basic schema test will check to make sure that all defaults from -%% the schema make it into the generated app.config -basic_schema_test() -> - %% The defaults are defined in priv/riak_core.schema. it is the - %% file under test. - Config = cuttlefish_unit:generate_templated_config( - "priv/riak_core.schema", [], context()), - - cuttlefish_unit:assert_config(Config, "riak_core.default_bucket_props.n_val", 3), - cuttlefish_unit:assert_config(Config, "riak_core.ring_creation_size", 64), - cuttlefish_unit:assert_config(Config, "riak_core.handoff_concurrency", 2), - cuttlefish_unit:assert_config(Config, "riak_core.ring_state_dir", "./data/ring"), - cuttlefish_unit:assert_not_configured(Config, "riak_core.ssl.certfile"), - cuttlefish_unit:assert_not_configured(Config, "riak_core.ssl.keyfile"), - cuttlefish_unit:assert_not_configured(Config, "riak_core.ssl.cacertfile"), - cuttlefish_unit:assert_config(Config, "riak_core.handoff_ip", "0.0.0.0"), - cuttlefish_unit:assert_config(Config, "riak_core.handoff_port", 8099 ), - cuttlefish_unit:assert_not_configured(Config, "riak_core.handoff_ssl_options"), - cuttlefish_unit:assert_config(Config, "riak_core.dtrace_support", false), - cuttlefish_unit:assert_config(Config, "riak_core.platform_bin_dir", "./bin"), - cuttlefish_unit:assert_config(Config, "riak_core.platform_data_dir", "./data"), - cuttlefish_unit:assert_config(Config, "riak_core.platform_etc_dir", "./etc"), - cuttlefish_unit:assert_config(Config, "riak_core.platform_lib_dir", "./lib"), - cuttlefish_unit:assert_config(Config, "riak_core.platform_log_dir", "./log"), - cuttlefish_unit:assert_config(Config, "riak_core.enable_consensus", false), - cuttlefish_unit:assert_config(Config, "riak_core.use_background_manager", false), - cuttlefish_unit:assert_config(Config, "riak_core.vnode_management_timer", 10000), - ok. - -%% Tests that configurations which should be prohibited by validators defined -%% in the schema are, in fact, reported as invalid. -invalid_states_test() -> - Conf = [ - {["handoff", "ip"], "0.0.0.0.0"} - ], - - Config = cuttlefish_unit:generate_templated_config("priv/riak_core.schema", Conf, context()), - - %% Confirm that we made it to validation and test that each expected failure - %% message is present. - ?assertMatch({error, validation, {errorlist, _}}, Config), - %%cuttlefish_unit:assert_error_in_phase(Config, validation), - cuttlefish_unit:assert_error_message(Config, "handoff.ip invalid, must be a valid IP address"), - ok. - - -default_bucket_properties_test() -> - Conf = [ - {["buckets", "default", "n_val"], 5} - ], - - Config = cuttlefish_unit:generate_templated_config( - "priv/riak_core.schema", Conf, context()), - - cuttlefish_unit:assert_config(Config, "riak_core.default_bucket_props.n_val", 5), - ok. - -override_schema_test() -> - %% Conf represents the riak.conf file that would be read in by cuttlefish. - %% this proplists is what would be output by the conf_parse module - Conf = [ - {["buckets", "default", "n_val"], 4}, - {["ring_size"], 8}, - {["transfer_limit"], 4}, - {["ring", "state_dir"], "/absolute/ring"}, - {["ssl", "certfile"], "/absolute/etc/cert.pem"}, - {["ssl", "keyfile"], "/absolute/etc/key.pem"}, - {["ssl", "cacertfile"], "/absolute/etc/cacertfile.pem"}, - {["handoff", "ip"], "1.2.3.4"}, - {["handoff", "port"], 8888}, - {["handoff", "ssl", "certfile"], "/tmp/erlserver.pem"}, - {["handoff", "ssl", "keyfile"], "/tmp/erlkey/pem"}, - {["dtrace"], on}, - %% Platform-specific installation paths (substituted by rebar) - {["platform_bin_dir"], "/absolute/bin"}, - {["platform_data_dir"],"/absolute/data" }, - {["platform_etc_dir"], "/absolute/etc"}, - {["platform_lib_dir"], "/absolute/lib"}, - {["platform_log_dir"], "/absolute/log"}, - {["strong_consistency"], on}, - {["background_manager"], on}, - {["vnode_management_timer"], "20s"} - ], - - Config = cuttlefish_unit:generate_templated_config("priv/riak_core.schema", Conf, context()), - - cuttlefish_unit:assert_config(Config, "riak_core.default_bucket_props.n_val", 4), - cuttlefish_unit:assert_config(Config, "riak_core.ring_creation_size", 8), - cuttlefish_unit:assert_config(Config, "riak_core.handoff_concurrency", 4), - cuttlefish_unit:assert_config(Config, "riak_core.ring_state_dir", "/absolute/ring"), - cuttlefish_unit:assert_config(Config, "riak_core.ssl.certfile", "/absolute/etc/cert.pem"), - cuttlefish_unit:assert_config(Config, "riak_core.ssl.keyfile", "/absolute/etc/key.pem"), - cuttlefish_unit:assert_config(Config, "riak_core.ssl.cacertfile", "/absolute/etc/cacertfile.pem"), - cuttlefish_unit:assert_config(Config, "riak_core.handoff_ip", "1.2.3.4"), - cuttlefish_unit:assert_config(Config, "riak_core.handoff_port", 8888), - cuttlefish_unit:assert_config(Config, "riak_core.handoff_ssl_options.certfile", "/tmp/erlserver.pem"), - cuttlefish_unit:assert_config(Config, "riak_core.handoff_ssl_options.keyfile", "/tmp/erlkey/pem"), - cuttlefish_unit:assert_config(Config, "riak_core.dtrace_support", true), - cuttlefish_unit:assert_config(Config, "riak_core.platform_bin_dir", "/absolute/bin"), - cuttlefish_unit:assert_config(Config, "riak_core.platform_data_dir", "/absolute/data"), - cuttlefish_unit:assert_config(Config, "riak_core.platform_etc_dir", "/absolute/etc"), - cuttlefish_unit:assert_config(Config, "riak_core.platform_lib_dir", "/absolute/lib"), - cuttlefish_unit:assert_config(Config, "riak_core.platform_log_dir", "/absolute/log"), - cuttlefish_unit:assert_config(Config, "riak_core.enable_consensus", true), - cuttlefish_unit:assert_config(Config, "riak_core.use_background_manager", true), - cuttlefish_unit:assert_config(Config, "riak_core.vnode_management_timer", 20000), - ok. - -%% this context() represents the substitution variables that rebar -%% will use during the build process. riak_core's schema file is -%% written with some {{mustache_vars}} for substitution during -%% packaging cuttlefish doesn't have a great time parsing those, so we -%% perform the substitutions first, because that's how it would work -%% in real life. -context() -> - [ - {handoff_ip, "0.0.0.0"}, - {handoff_port, "8099"}, - {platform_bin_dir , "./bin"}, - {platform_data_dir, "./data"}, - {platform_etc_dir , "./etc"}, - {platform_lib_dir , "./lib"}, - {platform_log_dir , "./log"} - ]. diff --git a/test/riak_core_security_tests.erl b/test/riak_core_security_tests.erl deleted file mode 100644 index b2cce7c0a..000000000 --- a/test/riak_core_security_tests.erl +++ /dev/null @@ -1,247 +0,0 @@ --module(riak_core_security_tests). --compile([export_all, nowarn_export_all]). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - -start_manager(Node) -> - Dir = atom_to_list(Node), - case length(Dir) of - 0 -> exit(no_dir); %% make sure we don't do something stupid below - _ -> ok - end, - os:cmd("mkdir " ++ Dir), - os:cmd("rm -rf " ++ Dir ++ "/"), - {ok, Mgr} = riak_core_metadata_manager:start_link([{data_dir, Dir}, - {node_name, Node}]), - TreeDir = Dir ++ "/trees", - {ok, Tree} = riak_core_metadata_hashtree:start_link(TreeDir), - {ok, Bcst} = riak_core_broadcast:start_link([node()], [], [], []), - unlink(Bcst), - unlink(Tree), - unlink(Mgr), - - application:set_env(riak_core, permissions, [{riak_kv,[get,put]}]), - {Mgr, Tree, Bcst}. - -stop_manager({Mgr, Tree, Bcst}) -> - catch exit(Mgr, kill), - catch exit(Tree, kill), - catch exit(Bcst, kill), - ok. - -security_test_() -> - {foreach, - fun() -> - start_manager(node()) - end, - fun(S) -> - stop_manager(S) - end, - [ - {timeout, 60, { "trust auth works", - fun() -> - ?assertMatch({error, _}, riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}])), - ?assertEqual(ok, riak_core_security:add_user(<<"user">>, - [{"password","password"}])), - ?assertMatch({error, _}, riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}])), - ?assertEqual(ok, riak_core_security:add_source(all, {{127, 0, 0, 1}, 32}, trust, [])), - ?assertMatch({ok, _}, riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}])), - %% make sure these don't crash, at least - ?assertEqual(ok, riak_core_security:print_users()), - ?assertEqual(ok, riak_core_security:print_sources()), - ?assertEqual(ok, riak_core_security:print_user(<<"user">>)), - ok - end}}, - {timeout, 60, { "password auth works", - fun() -> - ?assertMatch({error, _}, riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}])), - ?assertEqual(ok, riak_core_security:add_user(<<"user">>, - [])), - ?assertMatch({error, _}, riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}])), - ?assertEqual(ok, riak_core_security:add_source(all, {{127, 0, 0, 1}, 32}, password, [])), - ?assertEqual({error, missing_password}, riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}])), - ?assertEqual(ok, riak_core_security:alter_user(<<"user">>, [{"password", "password"}])), - ?assertMatch({error, _}, riak_core_security:authenticate(<<"user">>, <<"badpassword">>, - [{ip, {127, 0, 0, 1}}])), - ?assertMatch({ok, _}, riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}])), - %% make sure these don't crash, at least - ?assertEqual(ok, riak_core_security:print_users()), - ?assertEqual(ok, riak_core_security:print_sources()), - ?assertEqual(ok, riak_core_security:print_user(<<"user">>)), - ok - end}}, - {timeout, 60, { "user grant/revoke on type/bucket works", - fun() -> - ?assertEqual(ok, riak_core_security:add_user(<<"user">>, - [{"password","password"}])), - ?assertEqual(ok, riak_core_security:add_source(all, {{127, 0, 0, 1}, 32}, password, [])), - {ok, Ctx} = riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}]), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:add_grant([<<"user">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.get", "riak_kv.put"])), - ?assertMatch({error, {unknown_permission, _}}, riak_core_security:add_grant([<<"user">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.upsert"])), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:add_revoke([<<"user">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.get"])), - ?assertMatch({error, {unknown_permission, _}}, riak_core_security:add_revoke([<<"user">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.upsert"])), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.put", {<<"default">>, <<"mybucket">>}}, Ctx)), - %% make sure these don't crash, at least - ?assertEqual(ok, riak_core_security:print_users()), - ?assertEqual(ok, riak_core_security:print_sources()), - ?assertEqual(ok, riak_core_security:print_user(<<"user">>)), - %% delete the user - ?assertMatch(ok, riak_core_security:del_user(<<"user">>)), - %% re-add them - ?assertEqual(ok, riak_core_security:add_user(<<"user">>, - [{"password","password"}])), - %% make sure their old grants are gone - {ok, Ctx2} = riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}]), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.put", {<<"default">>, <<"mybucket">>}}, Ctx2)), - ok - end}}, - {timeout, 60, { "group grant/revoke on type/bucket works", - fun() -> - ?assertEqual(ok, riak_core_security:add_user(<<"user">>, - [{"password","password"}])), - ?assertEqual(ok, riak_core_security:add_group(<<"group">>, - [])), - ?assertEqual(ok, riak_core_security:add_source([<<"user">>], {{127, 0, 0, 1}, 32}, password, [])), - {ok, Ctx} = riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}]), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:add_grant([<<"group">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.get"])), - ?assertMatch({error, {unknown_permission, _}}, riak_core_security:add_grant([<<"group">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.upsert"])), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:alter_user(<<"user">>, [{"groups", ["group"]}])), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:add_revoke([<<"group">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.get"])), - ?assertMatch({error, {unknown_permission, _}}, riak_core_security:add_revoke([<<"group">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.upsert"])), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:add_grant([<<"group">>], {<<"default">>, <<"mybucket">>}, ["riak_kv.get"])), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertMatch({error, {unknown_groups, _}}, riak_core_security:alter_user(<<"user">>, [{"groups", ["nogroup"]}])), - ?assertEqual(ok, riak_core_security:alter_user(<<"user">>, [{"groups", []}])), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:alter_user(<<"user">>, [{"groups", ["group"]}])), - %% make sure these don't crash, at least - ?assertEqual(ok, riak_core_security:print_users()), - ?assertEqual(ok, riak_core_security:print_sources()), - ?assertEqual(ok, riak_core_security:print_user(<<"user">>)), - ?assertEqual(ok, riak_core_security:print_groups()), - ?assertEqual(ok, riak_core_security:print_group(<<"group">>)), - ok - end}}, - {timeout, 60, { "all grant/revoke on type/bucket works", - fun() -> - ?assertEqual(ok, riak_core_security:add_user(<<"user">>, - [{"password","password"}])), - ?assertEqual(ok, riak_core_security:add_source([<<"user">>], {{127, 0, 0, 1}, 32}, password, [])), - {ok, Ctx} = riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}]), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:add_grant(all, {<<"default">>, <<"mybucket">>}, ["riak_kv.get"])), - ?assertMatch({error, {unknown_permission, _}}, riak_core_security:add_grant(all, {<<"default">>, <<"mybucket">>}, ["riak_kv.upsert"])), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:add_revoke(all, {<<"default">>, <<"mybucket">>}, ["riak_kv.get"])), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - %% make sure these don't crash, at least - ?assertEqual(ok, riak_core_security:print_users()), - ?assertEqual(ok, riak_core_security:print_sources()), - ?assertEqual(ok, riak_core_security:print_user(<<"user">>)), - ?assertEqual(ok, riak_core_security:print_groups()), - ?assertEqual({error, {unknown_group, <<"all">>}}, riak_core_security:print_group(<<"all">>)), - ok - end}}, - {timeout, 60, { "groups can be members of groups and inherit permissions from them", - fun() -> - ?assertEqual(ok, riak_core_security:add_group(<<"sysadmin">>, [])), - ?assertEqual(ok, riak_core_security:add_group(<<"superuser">>, [{"groups", ["sysadmin"]}])), - ?assertEqual(ok, riak_core_security:add_user(<<"user">>, - [{"password","password"}])), - ?assertEqual(ok, riak_core_security:add_source([<<"user">>], {{127, 0, 0, 1}, 32}, password, [])), - %% sysadmins can get/put on any key in a default bucket - ?assertEqual(ok, riak_core_security:add_grant([<<"sysadmin">>], <<"default">>, ["riak_kv.get", "riak_kv.put"])), - %% authenticating from the wrong IP - ?assertMatch({error, no_matching_sources}, riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {10, 0, 0, 1}}])), - {ok, Ctx} = riak_core_security:authenticate(<<"user">>, <<"password">>, - [{ip, {127, 0, 0, 1}}]), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.put", {<<"default">>, <<"myotherbucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:alter_user(<<"user">>, [{"groups", ["superuser"]}])), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.put", {<<"default">>, <<"myotherbucket">>}}, Ctx)), - %% make sure these don't crash, at least - ?assertEqual(ok, riak_core_security:print_users()), - ?assertEqual(ok, riak_core_security:print_sources()), - ?assertEqual(ok, riak_core_security:print_user(<<"user">>)), - ?assertEqual(ok, riak_core_security:print_grants(<<"user">>)), - ?assertEqual(ok, riak_core_security:print_groups()), - ?assertEqual(ok, riak_core_security:print_group(<<"superuser">>)), - ?assertEqual(ok, riak_core_security:print_group(<<"sysadmin">>)), - ?assertEqual(ok, riak_core_security:alter_group(<<"superuser">>, [{"groups", []}])), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:alter_group(<<"superuser">>, [{"groups", ["sysadmin"]}])), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertMatch(ok, riak_core_security:del_group(<<"sysadmin">>)), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - %% check re-adding the group does not resurrect old permissions or memberships - ?assertEqual(ok, riak_core_security:add_group(<<"sysadmin">>, [])), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:add_grant([<<"sysadmin">>], <<"default">>, ["riak_kv.get", "riak_kv.put"])), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - %% re-adding the group membership does restore the permissions, though - ?assertEqual(ok, riak_core_security:alter_group(<<"superuser">>, [{"groups", ["sysadmin"]}])), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ok - end}}, - {timeout, 60, { "user/group disambiguation", - fun() -> - ?assertEqual(ok, riak_core_security:add_group(<<"sysadmin">>, [])), - ?assertEqual(ok, riak_core_security:add_user(<<"sysadmin">>, [{"password", "password"}])), - ?assertEqual(ok, riak_core_security:add_source(all, {{127, 0, 0, 1}, 32}, password, [])), - ?assertEqual({error, {duplicate_roles, [<<"sysadmin">>]}}, riak_core_security:add_grant([<<"sysadmin">>], <<"default">>, ["riak_kv.get", "riak_kv.put"])), - ?assertEqual(ok, riak_core_security:add_grant([<<"user/sysadmin">>], <<"default">>, ["riak_kv.get", "riak_kv.put"])), - ?assertEqual(ok, riak_core_security:add_grant([<<"group/sysadmin">>], any, ["riak_kv.get", "riak_kv.put"])), - {ok, Ctx} = riak_core_security:authenticate(<<"sysadmin">>, <<"password">>, - [{ip, {127, 0, 0, 1}}]), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"default">>, <<"mybucket">>}}, Ctx)), - ?assertMatch({false, _, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"custom">>, <<"mybucket">>}}, Ctx)), - ?assertEqual(ok, riak_core_security:alter_user(<<"sysadmin">>, [{"groups", ["sysadmin"]}])), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get", {<<"custom">>, <<"mybucket">>}}, Ctx)), - ?assertMatch({true, _}, riak_core_security:check_permissions({"riak_kv.get"}, Ctx)), - ?assertEqual(ok, riak_core_security:print_grants(<<"sysadmin">>)), - ok - end}}, - {timeout, 60, { "Expected user/group errors", - fun() -> - ?assertMatch({error, _}, riak_core_security:add_group(<<"all">>, [])), - ?assertMatch({error, _}, riak_core_security:alter_user(<<"sysadmin">>, [{"password", "password"}])), - ?assertMatch({error, _}, riak_core_security:print_user(<<"sysadmin">>)), - ?assertMatch({error, _}, riak_core_security:alter_group(<<"sysadmin">>, [{"password", "password"}])), - ?assertMatch({error, _}, riak_core_security:print_group(<<"sysadmin">>)), - ?assertEqual(ok, riak_core_security:add_group(<<"sysadmin">>, [])), - ?assertMatch({error, _}, riak_core_security:add_group(<<"sysadmin">>, [])), - ?assertEqual(ok, riak_core_security:add_user(<<"sysadmin">>, [])), - ?assertEqual({error, {duplicate_roles, [<<"sysadmin">>]}}, riak_core_security:add_grant([<<"sysadmin">>], <<"default">>, ["riak_kv.get", "riak_kv.put"])), - ?assertMatch({error, {unknown_roles, [<<"sysadm">>]}}, riak_core_security:add_grant([<<"sysadm">>], any, ["riak_kv.put"])), - ?assertMatch({error, {unknown_permission, _}}, riak_core_security:add_grant([<<"group/sysadmin">>], any, ["riak_kv.upsert"])), - ?assertMatch({errors, [_, _]}, riak_core_security:add_grant([<<"group/foo">>], any, ["riak_kv.upsert"])), - ?assertMatch({errors, [_, _]}, riak_core_security:add_grant([<<"sysadmin">>], any, ["riak_kv.upsert"])), - ?assertMatch({error, {unknown_role, _}}, riak_core_security:print_grants(<<"foo">>)), - ?assertEqual(ok, riak_core_security:add_user(<<"fred">>, [])), - ?assertMatch({error, {unknown_role, _}}, riak_core_security:print_grants(<<"group/fred">>)), - ok - end}} - ]}. - --endif. diff --git a/test/riak_core_throttle_tests.erl b/test/riak_core_throttle_tests.erl deleted file mode 100644 index b81a7be10..000000000 --- a/test/riak_core_throttle_tests.erl +++ /dev/null @@ -1,121 +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_throttle_tests). - --include_lib("eunit/include/eunit.hrl"). - --define(APP_NAME, test_app). - -activity_keys() -> - [some_activity, another_activity, yet_another_activity]. - -clear_throttles(ActivityKeys) -> - lists:foreach(fun(Key) -> - riak_core_throttle:clear_throttle(?APP_NAME, Key), - riak_core_throttle:clear_limits(?APP_NAME, Key), - riak_core_throttle:enable_throttle(?APP_NAME, Key) - end, - ActivityKeys). - -throttle_test_() -> - riak_core_table_owner:start_link(), - riak_core_throttle:init(), - {foreach, - fun activity_keys/0, - fun clear_throttles/1, - [fun test_throttle_badkey/1, - fun test_set_throttle/1, - fun test_throttle_disable/1, - fun test_set_throttle_by_load_with_no_limits/1, - fun test_set_throttle_by_load_with_good_limits/1, - fun test_set_throttle_by_load_actually_sets_throttle/1, - fun test_set_limits_does_not_overwrite_current_throttle/1, - fun test_set_limits_with_invalid_limits/1 - ]}. - -test_throttle_badkey([Key|_]) -> - [?_assertError({badkey, Key}, riak_core_throttle:throttle(?APP_NAME, Key)), - ?_assertEqual(undefined, riak_core_throttle:get_throttle(?APP_NAME, Key))]. - -test_set_throttle([Key1, Key2, Key3|_]) -> - ok = riak_core_throttle:set_throttle(?APP_NAME, Key1, 42), - ok = riak_core_throttle:set_throttle(?APP_NAME, Key2, 0), - [?_assertEqual(42, riak_core_throttle:throttle(?APP_NAME, Key1)), - ?_assertEqual(42, riak_core_throttle:get_throttle(?APP_NAME, Key1)), - ?_assertEqual(0, riak_core_throttle:throttle(?APP_NAME, Key2)), - ?_assertError({badkey, Key3}, riak_core_throttle:throttle(?APP_NAME, Key3))]. - -test_throttle_disable([Key1, Key2, Key3|_]) -> - ok = riak_core_throttle:set_throttle(?APP_NAME, Key1, 42), - ok = riak_core_throttle:set_throttle(?APP_NAME, Key2, 64), - ok = riak_core_throttle:set_throttle(?APP_NAME, Key3, 11), - ok = riak_core_throttle:disable_throttle(?APP_NAME, Key1), - ok = riak_core_throttle:disable_throttle(?APP_NAME, Key2), - ok = riak_core_throttle:enable_throttle(?APP_NAME, Key2), - [?_assertNot(riak_core_throttle:is_throttle_enabled(?APP_NAME, Key1)), - ?_assert(riak_core_throttle:is_throttle_enabled(?APP_NAME, Key2)), - ?_assert(riak_core_throttle:is_throttle_enabled(?APP_NAME, Key3)), - ?_assertEqual(0, riak_core_throttle:throttle(?APP_NAME, Key1)), - ?_assertEqual(64, riak_core_throttle:throttle(?APP_NAME, Key2)), - ?_assertEqual(11, riak_core_throttle:throttle(?APP_NAME, Key3))]. - -test_set_throttle_by_load_with_no_limits([Key|_]) -> - [?_assertEqual(undefined, riak_core_throttle:get_limits(?APP_NAME, Key)), - ?_assertError({no_limits, ?APP_NAME, Key}, - riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 50))]. - -test_set_throttle_by_load_with_good_limits([Key, Key2|_]) -> - Limits = [{-1, 0}, {10, 5}, {100, 10}], - ok = riak_core_throttle:set_limits(?APP_NAME, Key, Limits), - [?_assertEqual(Limits, riak_core_throttle:get_limits(?APP_NAME, Key)), - ?_assertEqual(0, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, -10000000)), - ?_assertEqual(0, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, -10)), - ?_assertEqual(0, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, -1)), - ?_assertEqual(0, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 0)), - ?_assertEqual(0, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 1)), - ?_assertEqual(0, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 2)), - ?_assertEqual(0, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 9)), - ?_assertEqual(5, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 10)), - ?_assertEqual(5, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 11)), - ?_assertEqual(5, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 99)), - ?_assertEqual(10, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 100)), - ?_assertEqual(10, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 101)), - ?_assertEqual(10, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 10000001)), - ?_assertEqual(10, riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, max)), - ?_assertError(function_clause, - riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, {max})), - ?_assertError({no_limits, ?APP_NAME, Key2}, - riak_core_throttle:set_throttle_by_load(?APP_NAME, Key2, 100)) - ]. - -test_set_throttle_by_load_actually_sets_throttle([Key|_]) -> - ok = riak_core_throttle:set_limits(?APP_NAME, Key, [{-1, 0}, {5, 42}]), - 42 = riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 5), - [?_assertEqual(42, riak_core_throttle:throttle(?APP_NAME, Key))]. - -test_set_limits_does_not_overwrite_current_throttle([Key|_]) -> - ok = riak_core_throttle:set_limits(?APP_NAME, Key, [{-1, 0}, {100, 42}]), - 42 = riak_core_throttle:set_throttle_by_load(?APP_NAME, Key, 500), - ok = riak_core_throttle:set_limits(?APP_NAME, Key, [{-1, 0}, {100, 500}]), - [?_assertEqual(42, riak_core_throttle:throttle(?APP_NAME, Key))]. - -test_set_limits_with_invalid_limits([Key|_]) -> - [?_assertError(invalid_throttle_limits, - riak_core_throttle:set_limits(?APP_NAME, Key, [{-1, 0}, {100, -1}])), - ?_assertError(invalid_throttle_limits, - riak_core_throttle:set_limits(?APP_NAME, Key, [{1, 0}, {100, 100}]))]. diff --git a/test/site1-cert.pem b/test/site1-cert.pem deleted file mode 100644 index 851ffb03b..000000000 --- a/test/site1-cert.pem +++ /dev/null @@ -1,60 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 15478466820361036466 (0xd6ce8f908f4a22b2) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=New York, L=Potsdam, O=Basho, CN=Basho child CA - Validity - Not Before: Apr 29 17:16:54 2013 GMT - Not After : Apr 29 17:16:54 2014 GMT - Subject: C=US, ST=New York, L=Potsdam, O=Basho, CN=site1.basho.com - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:d5:55:1b:61:76:7f:67:8e:ae:73:d2:2e:e6:7a: - c1:8a:7c:d8:72:1b:7b:07:62:16:bc:dc:ea:7f:59: - 71:6b:7d:04:b7:6b:60:d2:1d:c7:47:5d:28:80:64: - 43:77:c2:66:73:51:77:23:20:d7:52:38:24:64:7e: - 2a:61:e4:61:39:8a:03:a9:c8:98:9f:0f:27:13:d0: - 3e:39:5a:7b:89:e2:05:1a:71:33:41:b4:77:4c:82: - 00:83:6e:1f:1d:a7:4d:17:b8:4c:76:4d:09:3a:5f: - 17:5f:eb:c0:bd:0b:0b:18:4b:ad:b3:6a:0f:7a:78: - 5a:d6:a4:96:4a:a9:8f:18:23 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - 4F:E8:AA:D0:AF:0A:E7:4E:DF:75:85:5D:EF:EC:27:D0:0F:71:8A:E0 - X509v3 Authority Key Identifier: - keyid:25:7A:8F:54:F3:F3:C6:57:09:6E:BF:98:4B:02:A2:9E:D5:6A:F3:89 - - Signature Algorithm: sha1WithRSAEncryption - 36:0c:ff:d0:c2:89:24:bf:40:eb:ea:14:37:bd:95:9d:2e:90: - b0:73:01:a4:0d:ca:a7:11:ef:b0:cd:51:06:85:bf:64:ba:d7: - 5a:d0:fd:3d:50:39:f3:57:58:2f:7f:d0:b4:d3:11:2b:5d:0d: - b2:a8:59:74:25:09:c4:93:4f:6d:6b:b3:db:b6:1d:d7:35:db: - 33:6f:06:96:9e:9a:26:c3:90:8f:ab:66:39:a0:66:0e:4b:bc: - 15:8d:11:01:ac:6c:b3:5e:e1:3a:ae:c2:f6:b7:9f:eb:9b:4c: - ff:16:90:74:3b:79:d5:d2:73:aa:5b:58:90:56:07:ce:d6:73: - b1:ff ------BEGIN CERTIFICATE----- -MIICsDCCAhmgAwIBAgIJANbOj5CPSiKyMA0GCSqGSIb3DQEBBQUAMFsxCzAJBgNV -BAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEQMA4GA1UEBwwHUG90c2RhbTEOMAwG -A1UECgwFQmFzaG8xFzAVBgNVBAMMDkJhc2hvIGNoaWxkIENBMB4XDTEzMDQyOTE3 -MTY1NFoXDTE0MDQyOTE3MTY1NFowXDELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5l -dyBZb3JrMRAwDgYDVQQHDAdQb3RzZGFtMQ4wDAYDVQQKDAVCYXNobzEYMBYGA1UE -AwwPc2l0ZTEuYmFzaG8uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV -VRthdn9njq5z0i7mesGKfNhyG3sHYha83Op/WXFrfQS3a2DSHcdHXSiAZEN3wmZz -UXcjINdSOCRkfiph5GE5igOpyJifDycT0D45WnuJ4gUacTNBtHdMggCDbh8dp00X -uEx2TQk6Xxdf68C9CwsYS62zag96eFrWpJZKqY8YIwIDAQABo3sweTAJBgNVHRME -AjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0 -ZTAdBgNVHQ4EFgQUT+iq0K8K507fdYVd7+wn0A9xiuAwHwYDVR0jBBgwFoAUJXqP -VPPzxlcJbr+YSwKintVq84kwDQYJKoZIhvcNAQEFBQADgYEANgz/0MKJJL9A6+oU -N72VnS6QsHMBpA3KpxHvsM1RBoW/ZLrXWtD9PVA581dYL3/QtNMRK10NsqhZdCUJ -xJNPbWuz27Yd1zXbM28Glp6aJsOQj6tmOaBmDku8FY0RAaxss17hOq7C9ref65tM -/xaQdDt51dJzqltYkFYHztZzsf8= ------END CERTIFICATE----- diff --git a/test/site1-key.pem b/test/site1-key.pem deleted file mode 100644 index 74ccd4b84..000000000 --- a/test/site1-key.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBANVVG2F2f2eOrnPS -LuZ6wYp82HIbewdiFrzc6n9ZcWt9BLdrYNIdx0ddKIBkQ3fCZnNRdyMg11I4JGR+ -KmHkYTmKA6nImJ8PJxPQPjlae4niBRpxM0G0d0yCAINuHx2nTRe4THZNCTpfF1/r -wL0LCxhLrbNqD3p4WtaklkqpjxgjAgMBAAECgYEAjyAfU59N0OuQLVKJdsZLDR+/ -k6bOPuDXQnSwuyoGB0iEHo7jEXU7GqzsnF8oSLPbSmkQljfVXmseN3HR+4VemCKv -+tWVGaEY2YA3YBY91Ew+ayjLoAtmm95xZFzE8BHE3e6K9E1o10020IcLbhJvkgSa -qQj5gF4l5i8d+aJSuFkCQQD58lytdD/Mr94vwDrDSQd2DVVNdO3P9pEbO9diZbtE -q3r+AFOmnSC53ltedLRS6DPChdPmd86rkH5OROOPRUAnAkEA2n+9tieqkdmG414d -oCiFZv9NQHFYraix0s+UDR0q5RF7uv8qaLkCJvRFDs7iJb4tHAlQZIz9tD36wWmC -KbWppQJBAIom7BLzrk/05Vp/ZfuK4hTeScgGWWwZXRsweFxq3peWMOU0SQhO0Ufr -H5WV7BXnQrTCQ92fWxx5QVcBvMX0AQECQQDDuX3lN+8RKzwrW9lJ6EJnmvZGbcIz -/VMdNhi3DpOoEls1jPEeUevdnR5nP2dQy+R4otdC2xFAbey7aJnSZwqJAkEAiTzj -MSit4H/AduWGBMKYcWY5NTvHrkFTZ2ePaurt2DKYzwYmYDjXpiqiGEEG0IITFbG5 -jeRIRkPPkD+Wj53fOg== ------END PRIVATE KEY----- diff --git a/test/site2-cert.pem b/test/site2-cert.pem deleted file mode 100644 index 96c8fd843..000000000 --- a/test/site2-cert.pem +++ /dev/null @@ -1,60 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 15478466820361036467 (0xd6ce8f908f4a22b3) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=New York, L=Potsdam, O=Basho, CN=Basho child CA - Validity - Not Before: Apr 29 17:17:44 2013 GMT - Not After : Apr 29 17:17:44 2014 GMT - Subject: C=US, ST=New York, L=Potsdam, O=Basho, CN=site2.basho.com - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:c7:ab:df:cc:06:eb:ec:22:51:bd:81:11:ae:c5: - b9:df:01:d7:eb:81:77:04:6c:c3:2d:e7:e2:1b:b2: - b2:89:2d:5b:e3:68:a2:3f:2a:e4:ec:25:9e:1f:8e: - f6:f0:e9:28:09:5f:54:3d:06:72:0a:ea:a7:10:c5: - 7b:e6:35:9d:1f:3c:49:0e:b5:5f:a4:2a:04:32:7b: - 87:30:91:e8:e7:2f:75:74:1f:6e:7a:de:98:91:ae: - 1e:e2:b8:d8:9e:90:c2:a3:81:bd:54:1b:6a:2e:36: - cc:70:e0:77:cb:86:3e:3b:bf:64:28:5c:cb:6a:03: - 92:af:af:f5:05:be:a7:16:c7 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - F1:2A:C8:30:55:2B:DB:3B:B1:E7:D2:24:1F:37:B0:35:3E:6A:D4:F2 - X509v3 Authority Key Identifier: - keyid:25:7A:8F:54:F3:F3:C6:57:09:6E:BF:98:4B:02:A2:9E:D5:6A:F3:89 - - Signature Algorithm: sha1WithRSAEncryption - 2d:6d:ba:49:9a:42:38:76:30:d4:7e:f0:a6:f3:50:ff:3d:54: - 8f:eb:65:05:5f:0b:a1:99:b3:a3:e4:6c:db:e0:50:a2:64:f0: - d4:58:0b:e5:34:a5:e7:9b:66:f0:27:fd:79:69:e2:0c:4f:3e: - e1:3c:f0:e3:91:63:5d:a0:5d:94:b4:4e:5c:4b:51:6b:c9:52: - c1:96:48:68:c8:ba:eb:c0:af:9d:ec:b7:af:2b:40:ce:2c:0b: - 13:02:6e:de:b8:18:7f:4d:40:86:0b:a5:ef:df:7a:16:a4:0b: - bb:1a:75:f1:3c:70:64:85:67:46:f9:14:4b:14:ec:f1:bc:8c: - 1b:23 ------BEGIN CERTIFICATE----- -MIICsDCCAhmgAwIBAgIJANbOj5CPSiKzMA0GCSqGSIb3DQEBBQUAMFsxCzAJBgNV -BAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEQMA4GA1UEBwwHUG90c2RhbTEOMAwG -A1UECgwFQmFzaG8xFzAVBgNVBAMMDkJhc2hvIGNoaWxkIENBMB4XDTEzMDQyOTE3 -MTc0NFoXDTE0MDQyOTE3MTc0NFowXDELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5l -dyBZb3JrMRAwDgYDVQQHDAdQb3RzZGFtMQ4wDAYDVQQKDAVCYXNobzEYMBYGA1UE -AwwPc2l0ZTIuYmFzaG8uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH -q9/MBuvsIlG9gRGuxbnfAdfrgXcEbMMt5+IbsrKJLVvjaKI/KuTsJZ4fjvbw6SgJ -X1Q9BnIK6qcQxXvmNZ0fPEkOtV+kKgQye4cwkejnL3V0H2563piRrh7iuNiekMKj -gb1UG2ouNsxw4HfLhj47v2QoXMtqA5Kvr/UFvqcWxwIDAQABo3sweTAJBgNVHRME -AjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0 -ZTAdBgNVHQ4EFgQU8SrIMFUr2zux59IkHzewNT5q1PIwHwYDVR0jBBgwFoAUJXqP -VPPzxlcJbr+YSwKintVq84kwDQYJKoZIhvcNAQEFBQADgYEALW26SZpCOHYw1H7w -pvNQ/z1Uj+tlBV8LoZmzo+Rs2+BQomTw1FgL5TSl55tm8Cf9eWniDE8+4Tzw45Fj -XaBdlLROXEtRa8lSwZZIaMi668Cvney3rytAziwLEwJu3rgYf01Ahgul7996FqQL -uxp18TxwZIVnRvkUSxTs8byMGyM= ------END CERTIFICATE----- diff --git a/test/site2-key.pem b/test/site2-key.pem deleted file mode 100644 index 3c7fae5b5..000000000 --- a/test/site2-key.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMer38wG6+wiUb2B -Ea7Fud8B1+uBdwRswy3n4huysoktW+Nooj8q5Owlnh+O9vDpKAlfVD0GcgrqpxDF -e+Y1nR88SQ61X6QqBDJ7hzCR6OcvdXQfbnremJGuHuK42J6QwqOBvVQbai42zHDg -d8uGPju/ZChcy2oDkq+v9QW+pxbHAgMBAAECgYBvaidpuF8Cly/XN2L/i9MobeXm -won/zRSn0+EmJXNb+hRw81y9NJkib+coouSGDwPJHwlpN+SA1Oi+AgQds8LkwrZ3 -MHe/88WjN8iSlp8jcmi1I7BbMCiASmundiUMJwGwcJDgg2bBh0ZOlm4DExyMYuPm -hI45R1aDC03TIRifAQJBAPcXwxhPJO2Ujc15rvP176wFfR8PlKQ9hM+47VzYsRqz -V1nGbNo+kO8Yd+Un2MyXQ7AYnEMjylyeQ9PHGm/FLoECQQDO3n6a+o37fuPu4rIk -keepGUnLDTuWiHAp9GXQ9b1lRhR6yOVOdl2nFBjQjJxTGRngPGjOw/9oWBWS2bUh -0LFHAkEAjzuhBihquaXRhXiyKA06f7c2zpiTi5l1sYv7XETodRfc3NefJev6y/6d -EaNFk2NkA2JgwrKujX3Yx5y1AHGHAQJBAIBh1HCZzkOmHA7E4YmQgxSOfR1muPRS -+EkRQ57K4x9Wvp70zlpDWxu1fTDwEpP/n+9pjiHDwV4gTEM2mRLDUUECQDP+gvps -QFZ0RMXlQRoMZI7s4ASANfM7/fqLdHPzChAKDW4AsAL3tuDNlMgv35GVsQV29158 -PHraw/J/0/veLT8= ------END PRIVATE KEY----- diff --git a/test/sync_command_test.erl b/test/sync_command_test.erl index bae37eec3..82d503856 100644 --- a/test/sync_command_test.erl +++ b/test/sync_command_test.erl @@ -64,11 +64,10 @@ setup_simple() -> {vnode_rolling_start, 0}], error_logger:tty(false), _ = [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(), @@ -90,25 +89,9 @@ setup_simple() -> stop_servers(_Pid) -> %% 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_events)), - stop_pid(whereis(riak_core_vnode_sup)), - application:stop(exometer). - -stop_pid(undefined) -> - ok; -stop_pid(Pid) -> - unlink(Pid), - exit(Pid, 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. + 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_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). diff --git a/test/worker_pool_test.erl b/test/worker_pool_test.erl index d4031f226..c85202aaa 100644 --- a/test/worker_pool_test.erl +++ b/test/worker_pool_test.erl @@ -60,59 +60,12 @@ simple_worker_pool() -> timer:sleep(1200), %% make sure we got all the expected responses - [ ?assertEqual(true, receive_result(N)) || N <- lists:seq(1, 10)], unlink(Pool), riak_core_vnode_worker_pool:stop(Pool, normal). -simple_node_worker_pool() -> - {ok, BestEffortPool} = - riak_core_node_worker_pool:start_link(?MODULE, - 1, - false, - [], - be_pool), - [ riak_core_node_worker_pool:handle_work(be_pool, fun() -> - timer:sleep(100), - 1/(N rem 2) - end, - {raw, N, self()}) - || N <- lists:seq(1, 10)], - - timer:sleep(1000 + 500), - - %% make sure we got all the expected responses - - [ ?assertEqual(true, receive_result(N)) || N <- lists:seq(1, 10)], - unlink(BestEffortPool), - riak_core_node_worker_pool:stop(BestEffortPool, normal), - - {ok, AssuredForwardingPool} = - riak_core_node_worker_pool:start_link(?MODULE, - 5, - false, - [], - af1_pool), - [ riak_core_node_worker_pool:handle_work( - af1_pool, - fun() -> - timer:sleep(100), - 1/(N rem 2) - end, - {raw, N, self()}) - || N <- lists:seq(1, 10)], - - timer:sleep(200 + 500), - - %% make sure we got all the expected responses - - [ ?assertEqual(true, receive_result(N)) || N <- lists:seq(1, 10)], - unlink(AssuredForwardingPool), - riak_core_node_worker_pool:stop(AssuredForwardingPool, normal). - 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, true, []), [ riak_core_vnode_worker_pool:handle_work(Pool, fun() -> timer:sleep(100), 1/(N rem 2) @@ -131,16 +84,11 @@ simple_noreply_worker_pool() -> pool_test_() -> {setup, - fun() -> - error_logger:tty(false) - end, - fun(_) -> - error_logger:tty(true) - end, + 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_node_worker_pool/0 + fun simple_noreply_worker_pool/0 ] }. diff --git a/tools.mk b/tools.mk new file mode 100644 index 000000000..72638c65d --- /dev/null +++ b/tools.mk @@ -0,0 +1,16 @@ +REBAR ?= ./rebar3 + +.PHONY: test docs xref dialyzer \ + cleanplt + +test: compile + ${REBAR} eunit + +docs: + ${REBAR} doc + +xref: compile + ${REBAR} xref + +dialyzer: + ${REBAR} dialyzer

cwdpgzax>>l-lE0@ zMqrn+71eZNDY^;CNI;gThF}6wWfh5Rx;A3&jA%Ue2-G=oEOu=Yw{Ct&+z?wf&k-Bf z##mXM;Tr&yh&UN6@75{#x5MF)Xd`sR6J!QQISY0ZvwYphZkg#R?glq(zkF!bMrKJ2 zlO5b_ZrXa$j0d=Z{F`^rU4#?YGROJW_^tIS|0-4;pS_CjezVRV&p;-@C|@8PI78`X zJcYpt9yMBevO|Zlqp;?xxaXQ=)&EAq7dPX!zyKL=y0COPcXK!V^c$7C+SkNM9Z!*h zS^U1GKBw;#IBvc2ao`t~qeQ`3v0~DTpTZ|*I^Z#rG5mvyxvqJ%r67{Se!IEo3UW5L zi0g9K5o!e@!X68@iEx#VxRQr?F;*8n_)1N$<6lRgt|03}WCKFZ?!Acy#54B+p*w?` zHO~ z3q^LhNMJOWF&N{aOIhwt#?6IDHcA{(KBu$}v_i z9wqacvY~H~bI?orA7amsoW>Icd7N1T;k&7-_t0w7ZhE`CnNDmOJz9jDZ!zcG<^$a$ zer!LB^j<+1j(0Ha&{|v44lRP&Fv-#I^;Ov11%BR*1&yNKx z0|^5R+!(Rk$Y`_LcFQhf0qyh}?p*^bLFZD4LB#8<^EfZ4AYWpeswGuAAgbgiP|9en z{nPUocMxL<$)1ckSbfF%+Q+2gjaginl1oKZ;EYvfvpFIk5cek7FHQ_DG8+*Xf+QbF zxSGs+ad;V~BW{xKOo<-G>qOM6xme1Sk}Pr`u^5q6qqw}gopf+(G^x#BP%V@QypF|% zEJ7b(ENi<4+4gt1v$`Y1WIv}BmIYnDI^%6{5AOLJNzv$CsaA#2o9AZuZGz6v0OQd~ zq_JH~X&Ki1({|iaL7`W6HpsB3_-fVM9KgN(l0-dWyVHx>cMV-uOo)?qJF6{PIpG*C zCmD4pN3}v!C_kXKWbVZU+;6*l4O#(iMxj-HqS%3A(u;SSXS<` zE2kL*nx2Yd*eb()H)`LGu~;d(4le2E3a{D$a7g<4^U~#Oe|zDYg#NDkNYaip>4<;WncuP$AKJh_TdKojo&k>GQ4TBPguCFP zyTBMA1%%D=AU$wRTW|Z^C#rQb@qCZ19Bp)iUc(DxJK%25G@f2aNief0)`+%>lWdgC zJ;KaVl042w2f&UD2q@`C%w78kapL>?s;48C;=4`Oyt7&Oj=rGN7|P2%HE>t{=z-Wy z&m7Mx^zcFXd5^Nl^n1lN(5j2~vc~*c&}_k5SedC1*8CNF22DXT9aIL{vQY((FppZV zY05=K3LXcK9fM_Dly{zKEKC}iXl2uZMqdy2=YHcVl7^7!VnHlEn+9og_wzGm z5BgTaj9x5~nzZr_Ey{F1HlR~EFFVFAt(PhGi|koE;zl|Pnx4Zwh1JK6*?I<&l`}88 z!dKGLbmtUjJ^%cC4D0gy2MEWx1<9Wsg4A0)sK5Hb`~CLK&y}AS`a%EC$Joe0qpcygbfQ5ql?t~)-5c(c-?A;J;B?s#vZHFbn{OP z{S$Oigu^UDw(-cwOGl-M(8gJibk#IY{}WkgkV;U~F$ilo36@jchQ8Tl!^%pk$w}=h z!|xeTXSxX0FHkkA(?6LtQ~KQmlz0eY);q9P_M*>?ePiO@=Z>Gl68v3id{aZxzZ2Hwv7=nuFbMoc8uPK9 zF2a1|;u{|*InKQH2d(o^;uFt7YP4;c?C}BG1u2ki_=;5rOWo0u6#yS(261MQaPUwm z~u?(qlx^gLl%qkMKn#GOJgk*p>jtZz{h;7gg5Iz4iTU82lHg1+T@eA0PRNQbQ zZctP8LFNZmIxF}FEgH06%CO9V>aBXhlTb(c3{$xzE68WF7_o*Xsy%Xwmt8k4j--$( zSXSNe$jnuq_tTj}cYO^iyFeXj&d4WQby+@$JURh(p*dR>meC{-ZE;6B;D~E4wujhO z?Agd>2w~GuCF7gN)i7_Pk~orwLCCX%S)8$=fy-cIW;8r~kr zmTzXmi7i&oIHCBaqVeF+4ut+x52c#Pbmbjtnn9pqqP*B%6QL{E$ zk4W8tMvQp%bx?DHj2fiV{t?h+&RfV2VQIU*2^kmB0H336z&581{Sz^3CXzB`LF)@t zw2s!oo)yQCwSPwz39Z(8pU4d=Hkol5(9+EJzPZPy8BzY+bu|i=o6Q3&8JDJRa`EH0Pn57P8qySgS=r6`P;+$Xb z_Ei(7-2Pe^q9e`Uq%B#k!;_<(?{D>rwB6BL_vHLu-AU+~nw;$Q<{?xWc90>*D=qG@ zDCKC=w`>Dx@_Eoc29aYovjKl!T@dJoQhTA^U*mTbJjI#ohP0rK5!&@LJu( zA0>}J9>=gN)I1l7+P@RM&DP2MNM_BVJB{6UJ#_!!eACtuIs zCf|<5jh$AXo48&5$#Lg;RmGr>Yr(p&!7E~l;?ISmp8*&a*oCcFeYqwY+%in7+sIX@ z-y|q+()|Sug{b-V=LIfH)e91I00A`st0-|z#Zia*rKk$7ogpxW@e`>5o}>Yma8wtb z7$}C95tg1n%rq2t#)^uqP8xY}abM3ok$Hh90sG4nKaanw>E*qPb=(}?9^UKNdG0e_ zsgyks8suwpUX$q?3YUPLslwarT0<_+r#G95_HP$HPgV{q=lT9t(5HiVf{%fLzG2gj zH&dr)BL6^rz5lo&VVE<#dHBhMI=p;jNODp$LLJy=pMXryfSrTTNVd`1GyhPt7bQ5; zl0VaxUR*6AaCKoHWajc0$nAZXQlO{27LRnN>?vRQaPYAw>Fq7>Bi63{%KZEbMe!$t zT*}jba%dcoDl2ufv*yXE>2+n$hXyTwWpB9}(su?XI8)ImtvY75f|=^Znr9Mm7Ethi zQ=lqFhQvQC?TdRaDYm#5a%t<2+>Lz4L(~yBUfbj-szNs12QBi2j{(ovjqR?T_SXDj22bbIZ}L-L-G<|Gc7B zm~9B3|6NT{{~v>rv!}DZvAvy{rMYYZulz6rOxWuu>a7ys0-~E+f=0kT0HWDW^1{Sg)4@HRp&Nq zEG}^;ffLc%^q>?@CJ@;RG~k4#X%7eqT2Nf-w8wUp$c=-2g|`*Bm7R6($M`qFZ>;x}SCg7xnSi6@ z`52?)cEkga|L(Z@r{FSlGIzFB(X~frMDUrd*GNfMBP^5%2=TBI zhC-#S{Q#7J5asixZ#-z0Z=*l2eClVuBmphq%W-MniO*cWhYf#HWtAx`>oIv4yfet@ z3BkjoXv$819UB`o;3%<#pq^9-ml!R>v0XN08=j}^7r-^|o%SeuDRN$qYZf&rHj;)F zOMEU7R@SUmOOOYh<0+_PvE>P1w`L!{ zG}zhDXmL{`KAB~7+UsLngH)oqPayYi>aa={jBmDd(OivDy@rW(q8e0s5x%4gXEafH z)Ue1NeF0e_*7PnKh>ykNn#XBlFIl&lh5OASxe8~g@`LwzT*LxRc2Hy3%Q0f>UI`2x zf|;JR<=|{x5t^x_2kh|`V9)jhOq5r4&a*sDn6)lKImg zTK;xs*1m7nO#Sh2adVxumrsZ>R_?64Y}e#&O&>z1ZG;2sPhG(>i#U6p5i#b^`Ns9h z3&CR2;D%R?E+(PDHx}9`7-{rAV5+G5J%kp0Vf+x^D>Do(31g>Jiq=ZoO({x*$jhAR znWRsCaghQP-0?xgnYOZh?d#GLWY@OfFMP1Bhob1apL#liBHT_}2528cT!wQ-xJElid&kxm^cS{5Me^{dK0M?XiQP^RAGeV4-ER3A}owMMc7P^TOmqFeRp0(=3crKF*fjk0L`0{pP@HmT~;2 z0mr(ALLlmvK8?2#xc~ogu1!D@D}$;~G5e4K0Py@nGW>6r)7jZZ-_6v?(#%ue%+-$G z^q+K${{OC7+L@a={WApHxzHJz8rs&lxT>V+e%`>ax`d~|kP=A1)57R3z|!*q!!Qoa z5l~VP)TWfU5W^-dENoK};z~gVfq#F^c&%!lem!%~YOQX3cE0%PzV^O8UTF&oXTt*+ zpr<6Jt0lXwA_D>hH~;_$$e*8_SlmF06WaJp*&;}2b4-AS3UnR*q(2B4X>0zOs@ z$LVP2#yJmj5DVf-fRiw%CrQNKnjeKVj1C!^(%o}FxzXR*+CUl_McR+Jv^(72+&{SqGlq6&?|;1uIP@Sey!*u9h`IRP z7k;Ye_3R+VfxOz=vAdygb~ksX20;oD_^AZlUf&K?5LQ=y(Ti;m)X?r4a@6Ii!9iR( zfpfs;K?e_M=fttRh6y&-EcVga%4NKw*}j6f!S%!b9z&WP$2{4GU>7H_&1u}D5SK2Y zoxc_O72U;ey6PSK_WazDj|BYne7F&Gg{L8Kq+-OPM5afefg(pPCIFsH00bEZrKl+Q zdSF5zpl77F$KyiP$j*d;NF^lh(_bhK(h4o)3CJ4m+1r&SG%*o?c5Lz%71D?UpF6H6 zI@Lo2F(n%UIt4yd8nh@`HZWl0!+;?j3Mfhz=AKvf6f^)Z$NgY8(i^}B1f$G=c>|1+ z10xk51Cb97#I00dQPMGDaFBV*k-5r&`RYG@O)V(53W|v2Y@c%+FNgwo+TCEqgaLTe z=cNaP#PCS6Dii@5CX;i0zaD}fCL08Q6v|{QFgfZUav0An>_9oI6eQ5QyLE?gL5f-8 zK*&f>4nWD}!GV#O2168%^o;yX373QFcqIy@Li&{qlTCx_a4!V~XdEvrIjaP4HIgM@ z8}XMgB49hVALHj)1HuKEa}+=S;qx#hPv0%x=M{J*=m6j6ox2fqf?x0kxD|YV{oJAk zgufB|uE)sgXLRYmo&9ALPk#M5r1yZ2@t*scjDNXpC;$D#FZiC0e_@B;U=I1Tul?d( z>RGI%rJ<>zp<%feqfw!uO;HUGOQDSv593e`=i`r_!@yBm_ISwfHHbjgC?YMN#rY$Y znmUz`YL<}z2ZFGue7=><8t|GvlkK?ay6%Gbm;N3;| z+d~iu7^87p4hf&)ap4E1n$hR%WoS=d9n;dO|9MA__wCMe_EYw42L%U^z`!1&osfMC ze|dG_C*SoAHxvTsVCX;%zsZjd1Xdu%mEGN`@pFSbBS!}z&N1=zlcznjz2!$82mv0z z6QA3RoCAIwDDp> zqu*}g*O?t;VPhT`?6341ZryVsdyBT}}>jt3V?YBuk@7J6Dw9j7V#YwFV0w93# zGL#G;q3bYL&n_yW_)=1Y3@`IOV`Kksi!gJ4Cqm2XA74fm3Aqow&>8=|Q^jjR{cq9`k^ zBx0p%FCne}* zPjN?@>6xLc4Ni8I%l48ZG0dWTq3?~TqCZy$m)Mt4#m}MRT4HJ!bOm+w40}U3vF85X z)4Ob7Tm$kSTgcS-oO&q5WYX!2LOXssF9)9nX|a>o~ZMdylVQ zVW;P4Za3q1CkE>kXu9vVD6QDf7sT`Igx`EFMUAskAZtoj#5uz3Pv)uf(hB)g|cDCEqA6vV?J`8Dg9-rE^@x$1y81fY>yI z=SyS%^vX;91(oW>E>YR?Oi~M7lkM2$lWH;f{qxqIl-!eg2e`HC#b18~mp&z{3WFK_ zYUI$b&Qnv%1y$!Hq=E>bzOAtj8CYv6nAjO*l~W~sd3C@yRY{6=W$BXNLY-cVGdMf% zl+$u7PC#wcIbY>d=<>s;n6$$AwGhfm2C$Gp)2`a_&UqqL8GmR{nhOYAYul>o`cEV~ z0=A+A4PY2&j&!DQHSdgUP=$Rgl-{7gE3NH=30VJ8bsrA5FZAJApv2W25j(u;c^f~P zO8OaEQJ!~Ie0Aefu-Sb14O0BviQ&M~Wc=l}f^Q@p6`UL!x6cnm0-UzR}9@C6h zK%>+!k-s=}wS`pn9lansKD9T=vkHEgi~OAbXyOBlezXc4O9u&E<3)tuW5D;j{FRd= zP1AD$IrlJf=6eCY@CQ|cG#MEJ!mtIViM74OFt&?W<@SH0wf0HGaWeHlp_r}NW>Eaq zIwDX0_I%0}bMc-4nnVRzR^noZ@M1A`*02}@RztgQ;jd#v2*Nv z#;}(mFalhAUyI4yrdD6Euu5qb{c<%$8Vqv1EqFq_;*smx;%!Vj}rz*T7ytZT$1fV z&N>5LIlG#Xujr;m1K$0te&b0!N1_ zg@!Ok?Fc#zM%o>~ul>UiB$@3n@z3ADKj=#1!R%XSGx{HkE#aFL;rN=1hhQ7hGPb7? zWq(JqB6PAeQWvGz3q~i#4=+p5;U~>xT20GVF#n`*wup3G`unK$Sv&MvzvWDA?ydN~ z!8!-XK22u3lC?SNRpKSll-cd%kBAKfxYL&`ZJe2^o6=mP->%V|yW630`8oOaGCwpz zL>Q)-3}GK=UdD|$LP1aeOMPeRo7KkHp?wE^AwFCi${bdo9~DKuw2DpV1~+vE@yWyL z9v%zMqb?sK6{pr>!za_vvlEfq4u^Se#alW^^ppxvW7URmZC&Df1~G#=42elu^p>mE zr0$0F14hOKU1_*Fui8f9babG9ZlwbxBJ@c!NL2kIn)Tk{i8Ux^XhQG{(#3B|GL6ju zK6)wn{jLfcOFllgO6|aAGW?0>y_K;=Q%pGu-P*ThoOC(_O?%|%J%F%HRr<0V0AskcjMrS6*0AgX-f zL(J9@nM``3a?cv;%G0oac-mk>0C4gt5T0?;RnQVi6RBoTLI~#xxHbLx%&~+&BNh%l9a-i ze1aBc^L~Q4WbkG(I~I{VAWy$$ML%NUu0fcr33$Vt#?&ozhl$4VTpxQb1Jcf)Lf5px zS{|>OExiM4;bbr6LOXJ;%+Kv+7>~s{={DPR)*)A9?JG6v*J#6UCRy;^sJU-^3z2Np zg~XeP<$rlJZSWbz)vN=N)rBi=LW>x4%`Tsqq+57~kULAaLL}fA_?U&gsaDIBcqjc+ z+?&v6)U2Hcj|P03&$H}|mg6zuQNiw1i2kk=DOOnRGC0Hi5$Z{Y@zOPc(5+6dVC%3O z%s?Q#pZmQW08=ViDm*z}1#y*d0Vv-4_X2A}>LqG8$VAt(L*s)n+h8D@opyq`K8x}U z1M6lf2SW}N;x;BJO}%N$FAmKamlxCA;+8IpnTj1}<_)uI>t}?KVgAbZGvr6E^lX`? z^H{J5)E;I$bSRk}mPq|rS#+n$1f~CON`z{r-ZQ~$$_UhEvi)F-TMvT&M0kg&nor07i-*Y;9)KU!wxrwe}ygUf|DY)7bC~|^3%m;X^FYy%~Mq4 z9jL?)kP1`QsUtLXcXaYcX(Dy<*k$tU0m7f&RR2Rd_=X(2w1#Mdi09F1d#vO1fjSDN z)H4$Nb&pf8oDWu(ifg|yh}@Los=>_wblSc;O-@F%T&lT{amP%KNwT4Y4*`QXz6qHL znYXC`t1W4S{k<&SfP`Bo@^8o?dI$`vd@WBTd&(qpfsneeyZ{6n77ctvhDdBWj0EL~ zza6KSuFDEZNFA8e+OoJ*dG`jB-^){J4LU@SA*~lr)$KaRMS4x$(C&>^ zU~C>Ec=JBV69(qOVdInPToNDn4v@Cn75NmhG)cKz$SGnbap1Oc??p%%X1bju|9un8*Pua zQA*yTBCOlh!0Nz8WXA%ucEU98I@gUQHvPb~0`%0gp@(rkM^pF(3nr7|%#XE8$hP|f zAd0cSmC!qAd}a;=U~EcDl{jIAZ#H8L z9Xq_}T8?$!8o`ZuP|toPqr%2VCsjy__R-3E!o)!SGpo*!bW7!Q$^K&rg z&mhp6G%1{daS?Tf=cci7*I4U(9U%Gs#4T7POyU@me{&94Z+6>Cc%|0432(*j@+0Zo z3+NTAMbTQ4wK*kON)7>H zbx=~6>@=2i@388iV6}0X$QD#P3F`0 zNP_&ZvM^#AWG%Ku#kA0ribHZ&B-rV8yWwo$(+KmZ#M8Ywy`^&CZdn7!-F4zvBl_sy zn+Luu$-LuUY*RzX<|qFN55{(rK|xxdWnMuu7`HI?!^>t4##j1qfc}$hRRUD|V3_`JmtQEphmr_aMuR``sl1nU?rB5l zhOQ9XqsU^D0cm4bFaK~-3ZPCPyV^J?@dj#^5f&}Wa7A!*ms%K$T3RjBs!s)|9*1HR zBiW5^X%z0U<2i}h`$KJhMV-8^9)r8&flkiU7ZXVE8dN;jY;P64QSdve6Z@u07LR%-O9@98@_QOhF3PJB#wm+o;VP|;X6cZFRTqE>hbr0P#WX=Kwp~4zq zHp-fRzr&DifQ&HOZS~Eqe0IlG$`JLQdqh#gwtn11PEb-oFv3<2h3(lA_N^MRe3f5} zDODPEC*)f*ICG2~X*da{`0rcF-FAZST5(B8f@PF4OR2!Qs1$Qde*No(ywgUWMvu1p zF?%M%+aU5*E=|QFAEw7-{RVdLK>>>%WJei88#)$g4s|@#j1cyUK?sHBH&yGKX^zLF zl#UuB19Yz&1)Kii?G8K?3oMGTw_#;d-!(~{2VRJmnwnS7BVSz;WM;u z;Z{J|n4o#uJ$lwnYR`Q=^l}0B&w~JePqV+74eUpH#u#o^$2XTwt#)+`wpuWk+M^r2 zOwdh8+f!TIP)I8?ymbzsuIl45HxF;KjUu|7<8H`TiL3_M>RlHq5m1^u#Gw#>xWy*U z5Dk6Dp_WSc9EVkp)x?q795UT{?E=-oGkp`66D}W?tJ$Ee9b6DoS9w$C3H-=qJ9gVr zT#fI8zhd~0)UzF4ek2Z;1-Q;V2izqdH#`D7lo^b_~K84|9W9Z_rsBJ@w)gULiiLyTcuU2QL#c4n zdyzJAP6emV<$GR_TugDZciDWvM+cJu%WL3@e(q_H7ComVZ5OEb>x3i3WK&tR$;tB5vqwXRk4bPIqhEEJc?-UpnT6|;^|*} zW->Yw&)rU@O5QwA$Rn(pu=xYY*}o!f=h9s*jZEq{(+E$-&`NQ|ET~j&FAyXo*Rd$+ z(PMHwyCxMcetG9WUz9rd*nW>v2p=wrCH)2jB#s_atRcF1m z7#G8b{SidfiJP$HGtA zKZvU3@i77_wBw}5N_1=Cz4Gf*CbamlRjDmA5;B|W26Yvxr8S*1hYJHz9?CMJ1|HK9 zmd!}|1vA*Go@dZ(3l1f%)5hh$1d;6$0JU&0_=L*W%KQ3p(1!tyi*sr8s*pQ=9$FcC zp33?W7Z=A=#x7Xski{+a$`$i#-Z}%NLcO?CMTFCPpcPcBgv589h6{PJh#LwvorD)V zqj?M?g7O7XFGn^W+4Ca3npfV{0^ODu@7G~6g=mX&jZmsqQ=-T=q`McHc<|GmI&+JV(`vI*wDl=CpFKEk|w8(-ae zies+pRgMgfN16<37Y#xVa^|x7kj~#OjjvYh_4d5HE<#?KmVHaPwY?iZ*LYfNwSms4 z0lJ=6){MW|nrs!HPBhx9@0~|WvwFm!@OINM8$f*&64Qvo9&mG+2UK|eRhWoj*^4Bbl|Wnr zxE0E$tX=7XPPBw;)=|A#G^*pUrWCWwif9S{YSZwYHze2s%p9iE5Ier{;OaG$h`-{I z2t=AK7$gvVIW{2jM#s5Yah(|ctBTc&d4l-YSrP=9l03*^q+=>B;z)PKvzcJoIh>5G;EG$WEDPJ#7<-MZbVf z0kzf(!a3Jarl2A<(TL`Hi(c@^AACi9NVWb>dgecS_+6LK5es9QFyb%PCxX@X__`~P zdW_OlvC*L6WA%FBJH?BMpz}@TmfZ~e{zaluY`c6Z($3O~_G*agRrDWFWsefmCfaZx zME>R*%`#3jD0XJQ-C%KJI75nS2wy?(`1n`dXO9zJ{50>%UNw^9w9go{p6YHw_6lG_ zg^0E^`Z0jGS`Yhn*jhI=Hk9=)bx5C#MY})m_%s6jh#Wf{i4vsVkj0p;2|k3Suxg)= zs>anklubKF}GTUDeNi9S}>F8%%sl>TtkcoBwJ&^LLB;+|{_R7)(bBJx+GQO#< zv%K+57$m{!*v>&`} zlWX)(qu9s-G}Rvcdl%?qrILRhk$+1=RCBk&HrRUfYn^5uC!mt`Sh0|n@5)-E*A?kU zNy*!MfflOd6}1BF7(A~m3Y@rd!RXZ+9h|Git36=3rXj&#-tL{ZCaX-e^xjNU}V_yMNhIm5zvm?F_!DD z5jAL^Ep-39R8dB5h+lOpVW&&EOq6y@@?X}=xVMR_q(|RnRtArbwk{iD09e$7JrVdn zk(afZ`L40uZOIaKafowo4&`$OiGU})pQd_}hyeL+lRt9=J0n&VQiL=&!wne*237b} zHmUYiNIcf1Q_1;B9|{G`yAlJl)zUIxp+;=p$@EFG=Ueu(q^~C*-L6k_@s%c_@FI@K zX|{RblxH93FB+M7Hygr=8-#G9TbXoaA3+^7TKu4y+dBQX;>`8Vt0>dCdXe9UjC|1p z&m52x)vP+eiE5M#;>LMDCQDh{NatQ$D^D)2emt%8?ir{c-${loV?L+fv?Y{;MJA&v zsG+2sRTI^T?&_;`-y~@~#&-iK?@=<8=4w;r`@K%$B}N{Z1p1)j;OUOW-WIQ~o0G2(yA0($Z^6RH z{K#&-9KR?m*zz(6Ec&!RVdoFUyw@RL{QT{lZ_eeG6WFQyl#(*~AB% z#|&gO&e7~C=I-O}q@o!Fnm$V6{XVP~Pyijlc%~+Gv`sIcafu9C8;=s!=virAso(XG zv^H1_LAiG1&TtJ?xHTr(zw1oL?LYF?Z73T9)@?FfKUC7f^1!3}6fCg+X}%IQH(k1} zPY*lfTVmP%;Oiy+{y%0AAP>aQtFnAgsP#sGX5~}%F``En77m)7daK;Z-WXqHd*IZX z;0&8A!4-`DS9aq7t^vEw@GK%y>JYFU8&wLmA4-AgmTl6ka16XlI}9YT8>Ms( zOhI7a-b3{&9ht(XyX7gD_L*6^O-o-usRqd+P)^L-|CYWWT_Oe7gX3*>NBV zd3Yz*0tyf4exYAm0n3ou7Hkq6c4N%L<7UUNe9BfenOn7pn!I#0TSX~G`ZJT}E>^17 zrazNC^RAO1Z1*NbK`0T)E2}rg^|#h!%C{FfF822z7S#*MtCiyNaiaZ9z^>{EPUD_P zqme#+jiZtG6EYWbN2DpoOKHb-OsQ-dLpm-h)C#4><-I}h?SV5`bcHZIYC8`l(AX-8 z4TU?Z)gj z9@^>Oi7OP4>gmP^DUZ^KQI=i$RJVw>_npkVc}vEgyU#J{D+ZhjG5pyXQ&nqZ&Go5< ztiH8)*Ox15)i$dh)3Vcp9$_(Z|1iADsDPMp!x-fGLmH?XGriOEybI#3|d#OZmi$}1)VJma0 z-YYOlgw?~?mUYcr)_G@=eDp?1@+c(^DO48E8Qpmi@N|d0DJ!idWq&w;l;vtWQTE!S z;;-1+tLY5N6`_&P2OY+=Ecr@zwQ{|qaRr+mfEf_VkX{I|d%j--wwPtQuG=j;Z$w8j zv2EI%+!cQPzEXp#l9CJ>oA7k;W4gMffkHeRSz8uKe2w^sNvuHQZKi)9K8;hV|8O1U zE1kzZz^*krd64B)1j*oqnKfhP-bHL%x~{(?e1$QomVmVtSS)$?lNpdb4*LtAZZz-r zMl12S5)wO0l39&Tp`Y+v#1NsSMD;;^cz9#`Atzdhj9zX`hyUZA$pVReDvjb1v{X!G z%xW^RvBf5yeR*;lw-B@b&>trI_*DpnO}gOh{mKL9Q-r9sb*ncN z?9P#hOx7CEk=2h*Rkj)sef#@)Vc1cQhhYc^_g`T}>}b1iD|Jea9oshWkh>E^OPYBi z@)73iUWgc|98PH1ZDAKQfTSv9T3xb6Cp4J+k|t?mN6slGb5c{ExSo#!w|f9qMuEBy z8+G@ZQLsTgC`ELdko$-ZUVOb)OuZJPKMQ8m_iDt>N*71|u@0i=lmMGlW;y613JKJhdfzb3X^rM?Y8~Zu9 z^%4bUg~oXuu=6USB@j|GTxeGvK-S#vg;mwb{=N`T2s=yA*hWDb4Le&%>6)Ui ztd%9vn&NPX=LA-IkS4Haw2mu|J|)F(>-wCnBhd-V4YFb^{>obWbSL@_xZ^&EsJ3;*b?ea98}>z9>vR|TjDyTN#g(LA zly-PcG$ys{XpRw=lV4m>8D?$!#46zSBvyMfRI{;Mahk*M-f)9^R*-Lhf-&)U22K#u zUrK931kh45Ee_F#%nVt&04XS-7Y)&{!{elQ5awRk(SJ8y)9~ojWrP|Ru3J`o@#rf3<2dvGE|&;Xm)rX?+ZE zs#K^bNp}cp8OBl46o{@4h$f&Z=KGf@36)%|I0gwLiQxa+2!Y2A#JYzcX6v-SYKwXi z3`lojv2$#C^fIv?;Of)UWp5&(5H6irA3#Gq0)O~p#8v_~{BUX2%L8bfe+X_V%Cwi` z;Yyc3QhY*hgq|jcLt<;{kk=hQ2csAi@2^5HD9_c%%XIoZ;WF+K;-+$nlqQYfWR^SF z(#@5g#$Y+97dlH_wbly7&%tlu5aa?4eJR_Z`}1E&_(_~LUC<&r8`#rPPZfO1 zaZrZT$F1tsvTPH1Y1C2%bR-dLU#&LF=w#BSJ^^h|@+|T$m?`PmBaeuvZG~3 zlcfXg$0Ba23K1LO9lsHBSQz4|2pU!Ih$MkVfbTg@*^9Z7_7{V{s%Ps z!Do&RzyHTq|IMBmJ6Qd1kgcG)z_$74a@v0A>yKyqKSDNV8+t=KyU3Vc=zt#rd(AI) zs{_X18MetA7E-Si(3n&JP2BZf2CL4EFwXS)%`n={v1DO|6I>rV(Wd8Dvwmj7#EfK^ z*bZU?xFnMc-=m_x9HwRMD#@keBhFsYczWX&oI@gW`$nwxkAH=XvT*$KY>Z9`fQ+N4l;J=`ScYb`w6^g#_6&$@Y!Toa$is=Vy zHY)#0sqhjBI^hvlMk2HI{~*@?FnoWnheTC>{9fQsvl8q7r(4(mZS3HrZ)R*|XYAnk zpODYRRaNEk&PMnIvFri8;5jNMCpQ4~RJnkh$d^d)MEY8pgwNNPP|PE?im($PtprvO zstO!SEPW3Vz1@18)xPw3?E0)Vy*AC`dE{j2N6DiPHZ(}pGc^in4Jl&KahZWci2ybfj=p;xY47X4-aD)3Vg|_(h_Q&LBEr@Y z93Brd(TgJ#uAf$x_7NO30SPC;*_wl7#|-z^7Hn;N5Kk_mCkJ;%k{AqPKZ@vE0_9&( zPtPnllmY=5_P>|r)qQ>xy@i3{Sv25#_6K{>)*dG$U~V%CSBn7we?1pU3o zxeo$M`Py%Jbzv=7@cqWbgc#&_)che+;QJx%O9M*CpNbZsoPP?SK!k3AfAv{?|LO+0 zLG22`7xc~|&gd2b3*R9TmNZa@KqS~gl&KYh&6M~<3vxmc!KJ`M=LK5;3vx;cL!}6b z!vBFK1DXXs@r!%KCM?OPmP7_4%c1c1O$8RDR1Jp+42YWn^8Kes2c@?Yw;4yu0DVK78LPC!nWK|gGJ~SQii_h88&VmBgzkzz+yA3~Y z&zw+L1(msx82L_Ex)?nOsrc|U>}0^4-Vq6@K*@kW3XfYafDxdYgKdGcK~j)Zq2A^} zl*LPKyP;5`P`9NVu)Uz_K~msE0lmSxO2B?l_r0`)P+XVBNu0`B$k^D}P>~QP(4EXF zXp&;+4OM^qyDQxigfQXd{FSd$-n!OC*cY~ zcYz>S;{@l*znS-*UsU!9c)*}Z4+k%IFKOM#ygET%I^6|d4SeuF-oNU}x?%aqB1sd1 zZ}jO}X+sgWk+DD6KL*@DV^jsvY28}Ocd{J-C%Fd|FJG~OutF~ZrhAc0oxCC3Hu%Y| ze7qsIguMZ%2!!}fZZqGIrXS-B-YMVVC?68Ee*eA+mbbcaxOz1)S;8bN7{S87?$smb0o~VeCHbpkg z@IbW14NHrXN%eSrolI5kg*iRJ04G|T`4z9lph1F1K|>LdA5}vXMX2>=;@42B!(MM` zn_}5wW6^0}M&Em>8sT(CgMxGz5c)aHE+?dD$(Pp*g?*IuZF!ogG^ zc%WC0+;7?$R^OKE?y5TnaqUiTyN*oPKwP-HCjlQUeLFzt4ego9!2tw5(yi_8EjfsoJO~jyu)BxO zSOBM1gqavS7grHU1Fsn~F!8==JV$+y06V9ikq^gu#|L|%-X9|g14)q33^q2XwD+Ac zh^&XXB4EM&?Z}3~3VR4D@sVG0C!p@snLzyH@Z8&j_zWEK&G0DwA<#9v_kvJL^QBwD zL#zwrTiydD0z~+n^w%aa5+Z0~gcsvrlSX^R(^g4|Lg6 z>107_L}MPB; zdyEq<&v%=~4mK8~BIhKo9qyIE*lZRWOAN#3o=IDjMt65tc-#b6i>^Z}|8<)`N~{x; z4Y%v3FWsv}+LH%1$fGOqeLhd(=v3y1$r^>8(Jf}SP#5bXZ)a!aMaJ;dew*<)uqs!E z@Us~!O=bTzIL8umAU$Nez;*Ss!f-ZvpNi>zgm_OaGTr{YyJi%0ehV@!>>PJ)e9I=(; z`CxJI8m^wX&w`s~RqZNW7yHWaSx+FTw_DHy(QY*Kz23mM-GEixWXhN%$*{;+=~N$; z%aeHQK=`sp@w!Np{T*)l;{^#?ScHn##wbkyjjkA)g{q%YZ{zrhDRg7`?w(6?g!085|IeYH6*5FFL5%q7W z*`k}eO;x{E=maS3HC=P*m@0Qyy@sUCJb&vrPLU8r09BVS$(-Sn)gPCtO#rujhGB!nNdQPhu zUykUsSRE|26zSO8aYzu#Ex)HXZQDlsg)Ue~8z9W1WY?65vC4RLPnZO{QASsrqo?ar zkMEKvU*N}&QOq?p?D?3H2t0o49cHaVfcxMwa#vm~#UJ0AV->GwysYVc%q-_+ z7lOKMZnMA{<~*BKfci@ptY*R8GKt%_AFt+c#S=QRx5Ee|@iO@9GCiSf<1#~&GduT< zWk}&Y>fC#f@|_3Us)KZ_mV>1(RE?owU3DHJgxiqgKGo^XSFNLMSf?lrvs#bZ z2#8YXn_#^2YqD#!@JyqmODDQ&p9}a9UqqX+$a0bEBsZ(S^KBRQQ2uM5E*yi)tO%cc zD7l6|sWQ2ld>24M{kRn}>jX%AeyCIPH1`_Cg(Rp8qOhDk+?oxjy@#YiDQ#Hh_2`XV zxpOp`$6>TQ9$wWxVX&R)*wf{!{)Z&Q-7-vQVxms5+o7O|Hxsv%~APQ`*V(h|DX%#PZw!;O^67i zs@dVpO2@7h7qE8*Gp!>fTHWI4Tgz*c!(d3kAJfi zb(`C8KO|q20SNxf@jyl3=xu&nE*92~8}GOd80k7#3wi7MM)htMR!Mdq@pY66EhpT( zk#gc6#u@jN%h%WL@&DaeNg5`gb`WHt@17L3tS;mX$I`|wzA}wCx2$k!i6s2q&G_-k zhVSW0r~Xr{+JN4?$~j?(S)C9z>_WO8ELDbIF;YDqW7qBfLRVo{c7|rP!jQo1r|VeiMoUIt%dM)^)&45nlI;xjvaAn=xx#2E_I&>Dpz3XWf!@8Nw+w?=qv8(*Dc1#x zBEt*QiS*lTQ&z!Tf0%{10rQVOYJOp2JP>Fakf~S+o2$)fa3vXTDFhY8>hn4AJ{h#8 zKumC$^(5V~fctm0tK|t6o-J7heIe=$Vu3C6%ER!n5rVWe1@#Xu#`gLQeZeNW=doOG z+}RGslFH=nvgGOEgRS%ERgz&eFX~?!C-=;1^H&zX$3@CaD`>u8Q+B+6t$A)J60ViF z2-z-XIrHry73&qaoVU_0CY10~6Iyv>8x-}w@s}|Tv0X22E**PnG;%j0#qO!@o6Z_y zx4?u^lRXXD*kno}1E$#kYi-0y&g+e9vUQCqc^jtnu4qkIC!*b~i>&qbNp1Mf{A6LP znpUM+G7+WA)?RG9^Y-tclffqlo>gQH4Dan0`14E8nocN1=q@I(-jBJ^K6$CujT{wW zHB~~~48d-&Q(;o_IlMe=q8}vCpj!Sqm95^S7%c7qDk}PCs!H!+lp7gbt>mER-ajqh zSUc~Ge=goD=iW@^&V)>z)S?i|b#T0&!(XTOv8N{S2Xvq~N`fL>oVgcy(~xnob&h@f8r3o!mQ(%%lxLQt96B+kRnZwmItmrAEj&2Gqy9hdX!@g7uyuW@|l-H+?_)VjgU%hKX=x?~UY#evw1vP3u+oTHFpkxlJRG~E#QEI-m*RYpZ%WFI_C37|6#P(4kz%K`3O~I@IXQRS zE>V>Cyd-}dG`ZjBj9pfyoU*1im-pqb3pebI4o8hrCtBb#SrD0d|FqHsGZB6Hq?(0# z8WtYV+B`&d3%qTrUHUT7MR>U0kI*EwU@(%~6GL%QOUI>2VKDFH&l(nQ-y#N>~*ry-Mr#MF_EOP;u+P>A?J4rP3X{-i50^K zUakRUG2=BAn&$A@SSB>AC>_Ki$iy{41VM{+0o4`$7Rsc%M}NjNvt^~zuQZ1Jw)%0+-yM;vsOFolKxHnybKIVP2j z#jUzhM(a@IXvLYohgPvqb~CV53W zYKB3-n8}Qc|G^4!+Z&+H9=5#s2*)8=co)8zULc0;7*txLF9P$mm&t-Vp8)I|MWJJ@y zoaiNTfM2C+!xe&wJf&0cvtBN%ZPm6&iuYHkTiwS{o;kR^#KjJHm8jPM?<1wdG#anw zC8G7=KR~Kf)rF)cH}`}8eHREC56L`goG>2heki{tkPhzc`r=nsu=f}n^-yEH#)xTq z)zkDxj*Xu8Uez_gvwfy}p5nXK>P=FCXBT=CewPRIf`Q~Q(9ZukwH-DUOu6mRzSxxk zwNI6FyA7MnwH{yHDT>z`+q@86{?SyAgu(0-9bFEc6+B%ls;FD9ZL>hGcnYdPhaWwO zn*^g;JiCJf*L(V|A5=$?rQypx&7k8JL$-_bC3fohqM2)AT;d;%L>TXOuOb0kxu^Gf zBg-H`WYifvTe835Y|s^0@EeoeTEE7HmEx2=i$ zR=%z}{kG}LE$JtJVUe6;1Mm5U=UO(I=Jo3_B-@)$bap;=p5}k)*`vV1;_cOsannvQ ziyD_cA>68MKD}lhN`=Gr;WwreyN?D!=YE4#X~&n!2m1K>Gf9^MOX~;3+%z6FqikvR zw}=j3nCec_w*R)eRYFn3yd;;n7WKU`3f-YlO%;%_W>=J<7G>mhz8 ziMH>iVv-?lk`mLv52iUz?L#eX`175_8WQ6c;bK~VlPIu{0v>+WffJmdzlGp^l?Ew0cG8keS{K+{*B^$ZVy%4Fv&Fae!+Gz z524D+8^KtVup6-O*Wwp=)}4@uT|_txSlB4b^EJOM*=g#~#CK2C4aU+cJDqSox3jWq z8t}1AKU#k{>eY0@QA{|H(JxRV9U~_#!rfr))w1>I8*=AQC_q|Xf^~Kljv}`nwBbhi zLQ1O3Nmt8)x6np8F6lNu#Zw{reulk~cfYN$`e8AXmuZq*B*}?ZYD0PdV|5b3BbT&y z{S}-Q)<+Ukr=ZVPXcIb>>zmvI_rR{tXqq>;TBex-4cUnN@eG4wC`1Q01*kMIDgU<1 zxb`r0z@%#l^BRffAIe&m79UM0*K3(cxDva$KYZ!DlttubUZMi&S7zKZW#Lq8B{5M6 zQH)5tOPjX)m!&l=sG;CQa_`meqrm~X-#uGrM?3DaoGeR zdkcX+R6^T#A0|(S5^T>W_uETzDef_1lb(u;l^i?$Z$^7L47kSOy5e=^DG{_HN&Bp6 z@jhXVG4Ki@N3}0K*CD97?MS2O`ihmn2zMQ)xy}kS;vI2tGUv2fby|q7(LOL0PL4F? z(%la()6lMQ7Tv7shlaaov7V~e>IxAMXso{vwP+CNE<_Y(PcukyXo8OruI!@%C8*I( zNy0ZlKGfds&kEw_%ePtOD%|LWn_MD1I|j*}#TeSQkyDMbfF{mVXabuT6|aT}XqV3> zr~sxQZ0nP>GwONE_|-{Bt!&6C1&vkbUWtCHosB);n&$dZl{vT$tkVjb-e7||i6Zqyfw67AS3 z)AgpWR#r3a7>_=DtsSNo^Ub_&4kf$`_w5YBKmkiQJoG(4VuxN-U~TKAJXG@hoZ*i= z|G3G~yrh!@!6N=Pm@-ypCYbD}c%Xfd2?O}+QW!K-Ue;Q&3egh9hiO2!i%9qz@tONd;-E*p?gc+C&aSi@>ak4Vja?>_z@Q&uA90dd>0 zPawk5s`jYvFX9a~sM;BjQ&+4yv5r{G6BbM5%*i0uVSk&25Tjm$I2BiJA)yI!GuWOl z8D(CM;l~d+C$?-n@(N2r=z!k-XV$8m6+#6A^NRcs>1|O>_D{gjI{U^^Qq=_CH`3-n z5_C$kPcCnD=4$eB0kNB^m)j$QeQ2dm_QBb>Mw8&F?VNo@@Ww}`X@I;Czj3nueAPq; zehDZ3!*^q2@cq18ii(+5ScA(2dWG#IkW6V-?p9x7ZBqvCQBC`8b%Vc28aqt0;NHKmkHETX zK8@-vB9esd(3XzkD8d4KE3kram)1n5Ln-_M)({We!dGTfwVceVhsF?QCE|d$AwLtv z{qr|+<%72EZM_Dv0X1*dvdwS3rG@p}si2^JecV`m#n6ib;a%TzILA|1woI{{?#wDJ zDI;m6On3oaSR^pL5T;kQT}A71HPqevf-Y+KydC9VF2yfAjLqWWP;q z=uVV56qI3qJ@7Pu$;jEwqLpAzAi7TrI=dS3j$q}Ny*_y6XBkl}PNzLCfSy-ulch3i z9V!VXm-sYVKbH@wxAXZD!aS>66g<*TPe(OqM*m^}w-(Zr|HLgMEb3p z2a2ain$;{_tJB~@cr|2zx})J#*hg_b!9f1$$OPJHej8OQ^R5&1gAiA!2(4H4(7m8? z6$S!D9MWH8-)z#LRz_@e5lgpl^hkv*pg- zvLqkov|l^YAz&WjLa%yX)}c?Ds|@x}xG3MF#M?=^#7Ltrt+(r+0v3HIT1rM+nc?8@ zM_GpELDz`R@JP;oXw!%reM8jb@{CXT10~wz&$SoA#k!nU72p3^#||6_?fKZwePiZ0 z2pr>Pn)DSSkkw((R9j{tx2&AuH+_#hk%+1fS>8DIYqWLZ%DI^vE(q;*-+#qf=N}7j zw~BTIBp4m$$yx~A60Tjit1;aJHO}v_&%PM?%`~#+WK+ZxOORJFs@sh0{`cl9S{G|c z9iD<3oDN1yV6j>o9=BD6I%~@|v{Vp=87)Se_lpJSq*nd1h?Tq4YB$wsdqP#sG6fQH zfwp0tY@4l*&ZbtO-&;7$-0uslp@mNtq(jT|GL(kT65s>f;o4adS&_^rvphRjc_rhsG@IzhkEQ*5l;y((6$+cWyY2!e^2 zTjUsfaaM|XS@zqz$|YVI?_k)i9%r|}&FWN-Jvtqh;0X)onTm+sdDZaV; zf^7(96iBXhR=*lYuUlJkSl5tEyI5WcNmO`*7A`3g9ZjWb@tpxN=KNFgIK|zRAyH;M z@w6B6xNVN~moRZdnoyKV%e5fD-)FNW6?F0sIg<8G8f!xb!hE_H^gGd7y5N@ofRRrB z4MvVOm4`fhB$Bod$_T6v?Th zGki-s!gqklp5iY5f$H45ZX~G_Hi&4w87^TDuSd=8G|^NBqsK}NL%iP=6U&HTKwDkS zH})}ATeTJC(YrV1x~1L$2Ug?a{i>djH%g?svDkU7tj8oF#)`%OC&0qn)n?z6qWcdQ zDYh4JfA2GoF8agg&NhpL7kM+2brpEaE#4w`gnwLQCWPSP|Lr1UZ<$&yJmq-nlM<&L zEf1jueAP{YF|ZiS@O;Nxl@#QiGcBNGwcRTXsGbT^n48b)zWBmwFnN^8lce0ZYg$u3 zgnm{FbjtS!1}^D$edx|DpE@>VX(W+$L3b_gHMqZ=*|Hvs=$=eeNL~JskBi8OG5)Yf zs~;BWA^G-p6%weDu$fl)N-h3tc2bTz0d`1ibN4ox+<05P0?X~KN|Ths)>w-(a+H|| zr^`ruTb&qfdde7sgMsvK;V+Y6d3m-_xM8r3pCJ&sXyP!O&p^xg{QHUVi#Zdl2}jFG zn3a@?jYKAm&4e)(i&YD|*nWBj?Y^%d}0RWfTT&i*=_B9%lNwLZ3;h^(rY zg%>K#^6pb-2(=5=VbJ7FE@hl%p3b5l6iMM2B|nYN+9_B0J$4ZfT0UPFJYmv^6!C*1 z=^Rn6A3DQsC_^j`k=n<)jyZ!OL+-(l(CZSZH2Xr3DxxKMXaR**vC09{EE80Q??qzw z65@=BoWtwBxAR!e)h28-Is`0o%XGnow>zB9{vcrG@tsn@carr?&LwR@b2#at2wG?c;~!c?!lr=~;I(m)j;qitbl-oGY?ww|*8lUyZ&{lV*aNb=U;25_Vp2 zJl|*BO}cVMN~y1^ojEce(s}Eq=ff-2o7j%T=I$kfI%>GK2(LmAk6WaB%6M4{KOY4@ zPtPUWK4rKzk5{D2g57K>+o;RF_{1746)*Fe8EJKCnQ$ii>mB%lMMLJK z84twJ%p|4=z$%bKWO!hH1sHr(Z@c1Ze6p=;gZ6rmR%k-hVi(^;!&CQZEzKNIHjO7m1$_>?rIm_u#- zY`~N}r({QU;xAKDsc9)UmQjl=lw~(~_eGZ%GA=zJCC)8$yN(Itkb@BIgs2uVr-47A zWBE;#8P(uuSycTu=v1)hG;_B28QI#PGsVY_hW=4p0!!RX8LKFropSsc>;}R54$b(o zbn4V~`Dni-W6hxI{MK<21`{RgtRp80)0}M4KxWjNT${=l+LAbSMzWlPr^O8s4J*(0 z>W`{M%!e&$MS|`x>Yyb6=~}G0)tVPy^n#PkBZYK4>g;P)8p06={eqgK;w~h*&11kG zTGB^*`z9t+WNzWx;6@C3h|aT=Ax(S*7OyM*hZ6yLqG;K(cb`3lvT& z**B&%O;3e?MX3i@`Kt=}!@HxSDoPc$nom)ltlt8?)A>~f6z~$u4^0VEc;c!XBED?BIDeN8#J+R{5JT#GJNtc|@dg#$5q?wKU?_b$L8d zTHPQpaRY-N#Ggh^t`mfs-U3mKp8%L}ZtG}7kf#yLHom(w8`gzpT^wdekR;V(=Dru_ zd*x)JbNR)mG1RBk#Hs?8aeOQI?qZs5TlKMX&CMp0OfC0b-paF;gBmiOn1%Mhr1)u~l{m@J< zfZz|zlmW;A8UO!JGo5YzCn@|7pZUK5&A~%K;lDp!CT_4mKukZE``=Rq|KE}Ze@cz~-#uW|x~Cb9sN;!rCn zO;yPS8kbO~f{==dYH>%Fq_hYS<&~()kceZ)N5*b87?{Sq5>c#$1viGMjb?+W0>MYw z%f16<)8m*NU3uZOGf$X^^zyQnG=(2rBAZ`N>PK#XDJ>mQjkRV)6R;JsE=|>{MYj|u zimxFT`jh5y`bSPdh)CH#<-=n^i;9dg1H6Rkl{8Y_5Dc5GbYX4BLm2vPcD_s8@dahn zABf)#*Xu7oiP5an*WZ&@PY^IVU=9Q!Sa!E8Oje&uNOqhRQcM;@*eFPdd)W?BSpQGC zFIahM1a$d-jJXk($jt65eXN0?_PeON%x18XvQ)59_yNwje3HKq`ohHtZCL$@b~o^k z`Odq_s-}m#{y3f zV25kjGtyh(p96ZhaIC<(gsWTZx=T}fU$Fv$Y3C{h&yL22zU0RH$OmXW=kXzi(fbY1 zO?C491J!lnQwR5fqb#{0^K^W1J65Bhs2@!f#I_}fSE?AtXVWhObCg)`r#SZyCSAl8 z|JpXeU~^A#f=1*x9@YFvL6CZ#KBOnrVbHR7>BAT2^ z60>s?Ea?2;GXesOHUNkc1(ZoE3|9z1y6?kqDZ(B(&|Nr?XX-wX(XyzN;HJv=`Dgxy zn9?@R8QLFxPM4Q%vqRP-h8eD4qONxZ9_r<;m#4$u2WyXwdyN999#}lM!ne2D5Q5Ru z02jsu;>c(;wFl)x6?^y~YB9rhmPgaU9bH!cswV|K%Y1e|1<8_>qJfoTvTwTXgpkxp z6h5Oo=(*;FiC@S%r_s?*Zn`p2h7>tS)Zd(5W-CS-`ISEtWT&0swadMf1o+<`vK9Ue zM^)lHcC2yK@_Xl2|E&L}uRYyL?_Ih--Sp6uzqze->NfS5!3^kiXI4&rIVLpJXzoZY zc&HFyU7@Nw{=0tfp?~P8FF&?yu{?PoUK-I7dtBngi@fu+r11~?fX)fV1;;jnLB!%2 ztZ%^yt0nlK@*ZRH#TEWsUmdB+lsT#87^7D8d=-=y{0l@aE_tN}WOY*!CVw?8IQkhJ zDdc6CC9}s>5I*|&vjFmpUnZ(3(0(8q(vg8ef+fcOe>Wq*6ZH6%=)R&gRN@`_N_r@$ z#Xon$%1@Qq6P8Mn_g7;s{yKE~f4ktn`r&!9fzc(FF6^w=Xl8@xg_yQB4vVIaHqY1M z3RJ%>>RXvno6j2KZo_(eh=M@!h+eySP3)w5yzH9fSHS;nvVE1xx;Kzg@_F~C+e{XY zem6S{%SL}dgT016^r5_jHe))Vw=tih?h~DU?_1xvAZCwtTZ1$Sb9f6b;1i0s<&d<6 zpp;wL+M>2h{QXYUPTRiOth204pP1d=)ab;3rRTrNJn7}&Q1W5yuCUm?2|Q0i7U_uG z2I<=6OtJq;3_5>>eXW`NOmT|=L99{nTKUX>uxRGlGOf6Zo)@nc)Lhu6E|YNcIw*Cn z+)-4VSloCF4|}Qaa$9;VmiWYQRC>IoaomZl zkbukGHZ2#A>Mh1Y^)l_#N_0g~fV;W0i=DWRju<*%;-fz2UG11;clc^b-29C0g*yM2 z{Qb29%y4->w#uNoY$c_U=YGSL9K%8yW+RZ|-|S~{@*7QXI7g*!OE?;KUgJ2_gRUyq zv|fWJcA8klL-^$wGBpM(S*V3W`cuTo&PSv(^s^sobcZsR4>fZoTU5lwS;u%3`SseT z$KDn#(s5^8{Zbsn{c*iV_p|*xFX2cUj%Kj>q|?Fh@I}hK;Kta;!SCh-95{l!`qoHd zb+5BY&NJbiI_+Zo^rO+)fDg()5~uX<#g(tgQJnT}X>|@%O$>);BPjFH_1$ImlM!&# zo*g|-$OILKf1S#YZPdL7gP2|1Rh}Tv1Duv+;4j)ytL!mPPO}|2V!7Jft_{!j9%n#I z-n@)&@JKDI%edBp?Xx_$=`$_(>K)tfKCgqL)-E=mz63?6@INRc+&{7y^BvDBU=^yZ z{!ZB{$Z&*t;bp5oElXXt!{ILT}Rye z3x2vN-OWkgo9*$u68JclKX_R)y&l3mbIpgIQ9%}&<5XqH%ghEg(XkHW6PEFgXZ>}b zyf;u8FAZ?7>g4jvpOZ2FJ06;j${$wAln~v)F!=lfET0N1k0zrdP7>xA8t8-~Io?viFs zTkX~IOO3OrhRd%uYSG+L+OqWPFY|rj$tssog`#Axw+9#^s4XQuRct(+iyLxB@UBO@ zKksHv9-f0Ri)zj|p2^osb9oQLt{Y2??ED?+%D?`EW#?7tHBi?ed?BT_6BDPmpABg< zltm^BRDE78s@U&rm&g16v-MnX|ARO&8L-X)haVRd9&*?6ek7GU&ILE75zLYGX)>Qv zacg3*-)0k3@;C4959sGr2`1uOnL4jBH zQkOg|YMc-1ZNI8Xp)L8XkHVwJd*QZl^Yql)AB_!f5;nb+S}T-_pV0Pz!6M^8d5%Av z>Aqv2T%_w@GKf>X#P%L}H?En=rs}=5*j~Moyx$)D+EiSR(VFs}BmtF8kWTbwdAdgA z(<0-buGY#0x7s?<)ic?8%~9=$_FBfmFi4k)w_QmKz5ZI_YHSUxg;G;Tc=Pm$W$KZ< z1!P*D2KLRDi+z%f;cX(Hiy#1R5$&KTu>i>Q^T@5AHE;sP_7l$&cH(N=`>xdwAo>FS zpED=9gg~$1Kg+ldwx79<|MP0j%+}G##?adMf6bbB^2UF^e;;k7tTG?54s&H=k(088 z#i#^HPORXXvN}Q|#X1SAI)OJeBKY2P6B7R!1II3u?B*hbf^*KX=_#xKh<~liWMxI`yh&{o;8#7S~ zu^tSyD`0}|isi<2n#-ay(8Y=U4t#@TaqGkMi`apJmehtshf0Em|Nz9BmD10C2+~x>p_11IvzX{(y+h zq6#$OFLi4YTNo10b$;M?{{bE@D(b|qaQ_dA3XT98PQ|@%i0?zH*K9WGNuCtx zcTc5(bYy9gcNSr;$Um>a^GmlNf6;KqjNVwhkO(vIafN<6%%?a(_a~1Jh_d!&%Rd$| zmi`fEggGEo8F323h=g~0X97kXghPkq2m6ly767v0j@(1?AbV@^@fx0;57NiR71Cz;NEIDX2SNYY@-BHR4F}^*VJ(TcqjSd`7 zNACZ9-LoV6S6=`-8LOqk*TVOPKJ6T5(Wt>92+m6L1hg znBnghutO-tj#w0za7J|7e?cc$=Ya4yr^(5OTrgNaJ2b?>>%?JUDNK;8d{4t#MabW@ zCw;IoIYN9KI>>^_h^SeDalx@bL~*=H3BWbCylx>L$TyfGz7?-MV7I@_cmX|efk2#H zPzZ9rQCh$}Z)QMHff;~Eek#~~LDB~TdSievrJ%-Le0Sd^q3f@{eF2m;e1@bA zzHfLyp|8Ojk}IP6LjbOl2+9W)IGKf^Z!7eycz?8iB2khWLm^}FZBy82ce@ggT zBm9K~wK%&F5I*ItfF&h`fMCQ7R?G=8W&DZ37H0i_k^T!Du)Fa8XGVKMGB8^!+JGoH z*B^HPY{RPs7KUhq@e5Qjkg*+P0D3J!6C_MU=WTEA$MPoG3Y1-n zB-V_+L*-thlrP}k!f+J|7{3Fwc+Gj99?A^)px3i3uMmh*3h1JmS2DprxCZGLzVJv} z0OAP{1W=AIAs8&-pgBUZHIzBK@K0tqf{P@C7;)@_0jYb8h94Lr*Q}%m5DpOt1S`7m zct9c`&o~y7H3cJ!MG8|;nXm|v(JGJnsYWR7%#5o> z$O?=e0$wTr*bU`iGGY9SfNUHt zc^+@EQH_o~avaXoH#t$WIyrz=B`Y$f4&9$v5ZSy&$JkEE9tFSubXQBkn3E6O0NacV zXiR+P_bw(Q($o<;B8WcMU}dXcS^&2emaj09^mmgY7HmsVNexmRVJq|s{^BE3b^d{1 z0)!TvFLnMRFeYkl6T~5`R%SikGAkUrF#bT9|F6mKhzt$5K$;5hMUdck1<}gJOp<9X zPcT;CK(l(JFhZ?JATh)hs6tFmBDnBPMIb)o26%PbeZi9)C@{Z9EKum3RTGkg-mJ2+ z{7_3iwa_3D>Oe5gPYC^YE(8Vqn@kh>jTE=0RwfG_1@qk6w!_apA&k^`wfmqW}M zBdnGZUL_16I2Q$GZh6=eXpgu>1pRb+optvx*3aK$8(V;66R$e1|d5=T_;&@hN$ zkNM7mbk`0SK+P2RHVsFZH+_XMLha9-bZ^%6xnhpIPs2 zdba160U|FAtxaoSo{nD1>>dUG7i;$voJrWWjXF-A*v7=RZQI7gww=kuwr$(CZQHh! zf8O`|{*2e0suC9BttGcSM>p0K4fF0QIbqEAMYuxNVj`e{`-QQr=wV?C6&8(+qiLEw z%Wg1oUcIFy1$yDBgArQQx{nd;KRtRc;7{nVp!OJN=U0d<&nh(og*9>+6AvItgkn|F z)l+ZQbNJBy7=a}S3sWG$P6ts9=D=@j^;Q(I)3PK6{`+tVO*Vb~2{d1yWPk`9UW|q^ zg|K9{&_gZW=0~Vk$8^V;gSg2~WZ;s{xV|a+^3!8&5>DIxsnz_NS^LD=eq^A!A`n~n zVKf2?3Fl_vh&+>p`P=$avsm%<)AnN(&@v5V55e8#{nf{KLe3@d>t#pucsnf0P_n7E zWFS~;iQUPIJsd6!iD$uFp1tHZR1$O;(#@h16&-d8f`uMEl}#(dk^&%QY1f5WI!~gR z(pt3Drkx_({=>AiFTxXh#uxRQhjEd3K!W>_Ge^(>{e5C2NE>M-F`ICZ)3LD8LDB^xor2@tU>Ad2xkv?j7C;sFuP_g?Wyc zN4;T5)*6;K(~0GD(&nPBNXNmCvME=f%<5D42*2yMU`u~~2r0;Mx5s09mVP&12Pb_8 zy}_^L5~;#>)obmOIBhxf$7+YLd(E%kCvo!xW^Lrrk*4fZUSnBo^|ve@g=9rewQSmc z60+yelC_GOzeqe+k|#$zYP zV|P9)Hi5Jb z-ZF>H-D`XKl?$A#tSw@msNC=c>&>l{epia9C9mgP7pkObne0h)XsLd*lAII5oFA_e z`j#XqZW2OKEj4<5y}MW_+e37!f#%s`{3NVt169!CqA&`&Cn{QnW!1eZZ@nuZxk`fOHzf!DtqaW z1~)?vL6XHwsfolK^jRVpIGy0MLunsDtb9D8V+g(Lk^HTeJkuD6e%dccSBs^#ly~!& zG0-(KaQY!7R~r`*fjLrJvi`~H8aJNxWmFfFO>OCfw``bKMt))By~os6l;&Q7C|e!l zZ5S>adMD!Dn*~URd3~G)^%za_UXysmQN}{Fg-JAFc8@R!&6@GLuBN7W(WsneTzlMd zF20#&+ZFWX+@rfb@lG)8q%KsMkmO*fcJc{LN^+S>8taJ-^IJ;H&JUM~+~@a_Dwh&i zn-lCpjCSt3(_gD4(({+iK-Z9KOJ|kJ>K@w=uw+)YLtU%rm`vLF7hW%Gz!9st_Tn+* zuf7XLtNAOTU2MyuTghnTda!2cneZ!CMyuKB-qB9^l3Yh50xmhvLRUrb1}5+kU-8jV z9$&4w!$qfHNKg&&$>5lc?(7w*I5lKA%}Fu_I?tWHo*S#XhXtup87758j+SXBNJE3| zk;8>|wc9W^ww^(k7@=${8(w{FY*1*#0U6wln;Rn6xLrkyaXOdP$)_a8`A~2?FXp6s zrv$C=O_0$t3Q{E4n*H3ot&nod)Zfojo`>Fsd^94`VmkCS=>*h#95zKN{u_5ED#n>k zV9LumEWcY$5^09HP1S1#ZNBi-wR<`(CyLw*(iQYDBpdK*gd9d(YbL?qNGTeU&S|)E zy9&V7=Cog@e%9yM{x6tp&49L!?mknGQ!+g$qsa&YXu@H;Ak7HzIF_ppd{GA`^dNTk+kAGdm?|M^tmVq4eCzWRbGa-)P&pURz zVb&A;$#+Jl9|7+gt4{KYS3L*!{x;*=(I(ej{V%Uo%@}c#O>vA}YkSOBvr9oHzF3gR zFP%i=rFswWZfys8s?61W^VR8k{&X)}^HKLdjO!R23BT_SbO6;2gHri>b*Bn_*;$9TYb$Q{JWN{P;^`=`g`7^C6n;%O*g%#f-;A}sqLF<0&DtlpCGDd-K+zHlxJel!hLbVx3kD%$T zsvgOxJnCbs@->;qly>%idlwemg}NNn@4Pv&^*ptnJRRz|Lhw#CM@&B5Xa_||Z+D}h zve7sMd+uH5Y(DafF^^Fqhh(%1UF=-#>Lv3UyXsqC8l<1*6bC{YJB!UUuU#IHcj!gD zd5S9eaB{RbGT$)fYhMe?FCs1Um!7Wzu?O5nEOdY$WOG_8WAo^dN478aFg=S|2NN_= zB)r@Bit;(QsLNMuT%VJ#(=RqvzoaN8jd_i{&F!YW9E^$-cSet_;PWkrd=I!nl5BTxf5-~C?RD)xbxk2!NkN}ntHhu#q5p}) zyz$iBx+P8nR8BZCCYL%>SA=*sD$7N?(xWpO}`hGHo(Nm-*P% zxR3QLc|R~LUf3UF*;4AT3jwFjjjGHEPZ;FS9s=KSf4%>+)a%_~ zm@*eHW6;z=`B3+Tep$|n3YeAP{#>m!X!jUzDHB3Qmr5||c^iisU$nI8m}4|-e%cK9 zJvWh*Cn!Nw6But5=XPjRCb)Rg1I69>-LQuQMF z%#0Mh)lzV-pR?k7B4HT#QkPQ}=Gk-fsRx%WS?f`6?_7T~e0bA|eXm33hN-?v29wpG zGo45@kq8-+XrB~MMzuwOyuo5xkw*QdR?mp^Hc`Sb{QmHUoV7>+_vh~T+l!VT3{}5% z_#)dIqT_LOTwH@qre44?<@6}?yPT&FLi7qU3;q80$WoBibQd)mE9!gO0<#Rfx+~@K z^X8WSH}huw&2Nx&5X(cZ0{5*0h8J=r!hfl`$TKv^8B1U)m--@Gys9r;Jf#&h)Ft1g zH8;~YJ=i`t;nf+anQ9Q-jWg@TQ8pImg_9yxDy_mQuPQ3SF*mRbHtwqT(RmA+{;(NL z50zxF52I}mb1q{e>&5ynLj3hiOsGz{RsTl!Da%BjCz;_TcyGhRB0|kPssm3!Gnbr( zu_0=APbR(EjEehiu`Qm>j}4AIOetj7t&Vs+J3iu9=C^-(IKEdIhf0<7jGJNy-tcRz zxRE4nDVf4lw$0Jx(Q5u;h0d>HVTH4JnCx`e(Fp|X3!}`jc?{~t@dwJRws5)P5N8^%-+fkZG>+i z)aH)fyS0qSq2l$t|7*bbSDf;%MOO+1tHY@j)YLF!gWNi>_z~yKyi8u_1v2oxt&p{6 zN7?hxz+**)pyOr^G(6j3`xlX^6T}(OmT+6?IyTgCd9y07{Xr+&3Zzcr_F}_E$XYra zXdi!+@KQb(ww;vNn!25O^&6tij6MU5p33^kgI-BeXCYcAjZv7MJFCv**SV7z-={=3 z5n^V&^ypQIZ&qPo^1V}g{3cAkI9E%^NS$5(-6Tl~?QHXdq2 zspxF);nVioXsA}Zd&U36njEQ}ND!*ie~XvnqsUp{s=|m});7kO8NE%Uthbf3Y)R;eJ%wkJ8vXWcbcjx>j?M3TBD4_6KkDE*pUnb*n#;jEy=BRJ4|J`hs?vF19*vq+ z@vgV1^7xAVo+8MF+u=e16K88%d~fDRvKi+zA8|6;cx&mTFUdKZybhr$BUt(28+t01 zGp|*-7q|G#RHl@kM?Y#YWK&yx={$z~ymr)vTPEZoR@b{tC)leVe6b)ko+HcCA9>b` z4)#v+^)}Nno_Q@gni!J|aqXbFtXWoQsLFp(_=23-B3zE3+Pt{&SexH^$6@N2`T{30 zPvb7CuHCogckm9ww0;~xe;^!Db^F_6(AVPA)_b8bXOfXIXqbdl9To?V8$`g>F@WoZ z-U(1J-g^1+Bq!iEI@@G0O2cPv4naLiMeBS5T5`Z?8DERZA<^N(PStllvq}x{iDBtD z-Dlw#^RaxTYG!faAu$xaoGC^}X1Gsjz zMDyX*mU+E|8;dq>l|y+wxPA}QwG0_!tP!3yj>&MlN!!%ay$`4EW|R=z`w^TGXnlTJ zJs<^y3@J}h!E>k34f<{R)SM8WcRa7;a}eLhPtL8y+xL{)wk<-AvLDKoAiUo>G`FmS z_!aT_7ptjjY}v1D^s%XXS{Qha=Sr0oqBCjhEl=Y>5lGqa3+(Vr_Pl7P?B;V9-te@K zD{|;uir99DR!_s9NJ5_%+9`j#u)2pbxXO2s{r%md^T1|a%)8GvcD}*M`Sf@d3!j!q zE;Z!UfAW9>Bi*k@V(q8Z;DKnFU%IaK?CF+rQ85llyErwCB#jV|<1oH7;2Ur(`rr_I zw5Ff>RYoDcTAg@?W94`>3gr&zT5F-q>RIO9kF96 zmL%d#_BK#Qo%6w&KWifT^7&gR`p^F0)Q-yQ=tB_7vO5~AV%f;<^Al`g3)piZf!)O1 za)q<(QA~hXKhIu#-b)qJ#6>Bn(AP0lj?V}U??73wQOJhNCYV{+T?&ns8}H&n`NASm zg#?y2ZoV~TZCTT>)YC(=rdycQ=PkSJI6sMT(OU3 zoe}1Y0lp_WdiXImtLjX6YX>Iks0&W^%C5tE{1qY(SA%#Pk3mFtb=V_0oF$#e$_!t_ ztutDps*{Mwirnmkni_Y^&A^F#+=2E1eG<*1NSfV|@HfYkRm8uQfYi_f_RRWInVGhn zr-o=dSf%_668h~zJl_XBud`p0bvr$b2lIj@L|8Sa)Ja*B4Q|kq@LAp1OUtUwTi;Rzsc!ovFWpC<@MRZ(0)`hQV?FIftNlB6-o>7 z)Kep;N$>$vviK)iEIN4LXR|VKFAWH}p}?d%dDe(;tIU9mt(~Kt_2bP1maY;x!YR~k z-?C+oH|8Mi2g}DC2^EucQ=LrBcZ1Jq+!9a=EJ`KXvY?DBTFI-Xz;+UK7)Kp(^K!No z@lEzIvkkVlV`r>zy~&9(S`t1;bU(EUZ3I&)`cEy?w#$pbWhI=LQ!mAKdG{t5$7-v@ zzOHuGeXgTlBBF_&A|pC#FwLVS>Kjqr&-(vnem_6JooK@6D=cdB2*D%c7sqt%H0KmCJl3Po&62s=fcfPc^*3=zwgJYK@wF-B2~JyQa+PZH`7mm zbXz?SaC7q!Q*2Vo3wkXLdeUX2rd}WN4sp!TmWTXZ95jX*ko|tomt9m!1Dzqqrz&yJ zo@p6HO5aD-!BYovwk06tsp0S;F)b$qpgz8b;U!_>02vAI>1u$M%SA=4b<_?QVU8$I zoT{$DKC*|LKto=q%b5@eT$L&olQSWWh4on)f~q}LU<#j=&Y@&0ptq*epTW`~WR-EH zs}k7faV)-CZ$lIUH{}c;1+o2#su1W88!JioENcc%u`wj9217_nA70X_suIFR=@|$M z;d~)IGB$yH0g2I*Exnvs4T z(CZQ;6bz#Oimh;Hv3Pc@h-%+Zj8%Hdf<0t(&Fb$iD>n&O7|4{*re!pDt%WtBsAx@b z$C9qO0jDr$5ov7A9tmBNaD3yb1JhVDg$!EG8g;?64TG73VM(+w*s+DT{{J*P-sq$y`!E*OmqnfHGwbr$$0S-zZ&N3FIBfc2?E+=uF3q+%2Ta?7+P8y+}M=uRw zxn9Pvm(b3Go^K_;m=uKePl`$i1F4`S-5Lu)1-C?x@?xIhFGN&mHQ!7jM?$B^&zd%S ztGR_Mm0{^l>zEF@7di0#;(Gc1l!Umz7@((TxFsi)pygU*!rmE2!z;&%3VF=uPo#e@ zFn7>&?pjq)Hs?vEer^H&-tesJ$)bNo`Slz&=#un8Zk&!+ju5rg7WSS1^kZBnf)_)` zBS&1SCqco$l0A)f-vRWqWhlf4DKt$cWUIB~;qE9Tns?`2okHj`F6$senk}Bp$2sPqAjA89q2piQWSR)1>5eJc0adx)}7i6>4hEW zi#_Duc^rkEX}!TNUE`rA_}tEfe@{xFBui~ro-Z&Q_C3O&Z$7y<^>fqI;#@YpdQZ9x zFE}XtS>RFiM+DCb92ku7%(BhD(ro*<6n}l@^ypE4j$1w*Kf~#Q)Agknw5?eTNoYr0 z*AsOjQC}!QccM#sP!1(p=OEEdrO$W4FC&E~;M}FtOaV8!3#)Y^CLNiLV5c!l&_wmp z5w{0Ft#2|yHgYP%@m!sv%0-2XuvVbUx6)CkgBw%0rpIwozj+#ow@%PNyMlDXujoFy zWQ*Z;5>QWItOkfU&r|=X}%MGYux?e%&9MD z*OhjF;H!{kkSDuqYEi3!Ps*~oV!fs!S8zw-rVG^@G2tM-H|gW(+@Ch*EnNI*5;TtrnLjG^@)X}mve~QQW&Kzw%8P#L z?D9wxS^E9Ix~ZPT^q+1zF(=_87yplLvV1A8cGPz5IjGVSeb36;Hp-siYa!b`w;d7o zI=&}DyLRccqn-%9l&$rM8xG#*Hc;G!ujB&_5H(@F->=fqyoX+KC_9|utQzSQId>w& zmfWuc^*kljIXJ~LVET`4ngZ+#)!atIC0t{b(6{4e{|DhRuyOW zKixDX5D<3$U)@CWKe|c%c+{PBl!I`3jAe{WuRG~b^PJoG7NVNiXtgSR5yfsVebsE) zvdh#3D%+GRBxpnRYz+HymHdk>b`0-Oh912c<{xfyjNTBpYu)`9`X2Nz^nH3BN?q}G z32O3R=zHoFQ6?aSg)aVoLfntc_`8Rx`vrJJgr^57TjV z|AoF|<m9cxWHC;lZ~7T?A!d<8Z6Ef3Y$%MNgim%=BH*{e_1IU!LrLZPVNt zW9#F8ZBw(n(?t>$x4#hch}fv%i(4oO5)8yQW|9hLaUK3rCx%SnCCye?SuAHXt!Bs&)h)1V zomo-+VXVF)1XmkCb%a3t|cjSsNCsnXlf+(PRcMX3*NC`QUw>rzC=v4g(jTB_7SC8HhPA+ zW>z}G#6V5kN>Ap*m`jJ!VM(^EvM{+C!i?(?S;(w4ehNrEAR(VFR5_`#Xcz21k?&+% z<$tYu0lIi+Wp_sRYJLYes465Jff=pMP4J5$S86q9?aeDvkm40)FX`L$hw?$bjs{Iy zt~qO!;Cr3NA5G9scWOHo_c0LXz5?P)hFmDqh#Ca4G;%j7hk9mb)x!SLIK>ty!S~n-xGx9 zkm1WrAdG^Pwpl7Cq~@)M$&H+TT_Vu^O)~<&0~~7H>&zzcWX;~5t2K-#$I3i%QgE4w z>01JOULKYiiHoHXck$rhima0p+Qjol-C&2^7(|5T6rSZIu;2-1%U`lqIXh18yNEas zi4mF-KJ^KGk`L}+Q{2`GpIDktMnSLUx1<17H$UifWAhmUhtG%(0Ui~t@^A3Y0ya%> z5uDEWNd$ofPwrf?LS|HmLeJsAhvii zr#+@0SToOf;eAMsiD%wMox1zSjw>D~cA4_d;M<( zg@!nw9YvZwU_j^f>sKClQ%TdT$F)KDc6AtBbN{X z^!67N_7`ZrH7wr~qAI|CNv8+>VSyn9fqAOWjIPhj2K!E2Kbzl`1`XV#J0@)fX0C&I6?|drYm{@ZlqhLjZaG`FHZt<%if97{;L6F%Oh*CckTkj$ zd0=2t3Eeee`yza%P!|!NKM~1kk zQX}{yT26 zuh9)7Qqh4>FKa);7nE>r3tw>5M5_jL*l^M(p$@1)5u1U#kk*u?Doi77-r`bvXMw`^ zJ8@!soaxxkqpxL>*K*2d-pw4u9<4Sa8zz(!7tJ;*VWq2u=Y`oRRw0ZX5buMRBU-8D z-&CR+Mn&?48a^&x3^G)+G}DhOA$qfX_{f3GH)REuK4BK2&z1$-FjpGk) zbK`ch+qB}+N``}*tKQwpKC7w#v(qK@vRa&tW4T?;It|Ji=R}o8yeAe+F|VX!K#vZL zSg1;{PkG))Ju}=NM4KD@q*H6`qiOrlvUigeU>pHdx2v7qS|*UeUNnkfwgS%f6v~rB%`1P}+iTCT4J+|?!ps$AX|cvv3Ma*J>I!i>h~f~n zQIS=|c~V{!a|mBgMbl?1GRPo_SMonaZ*S4Y_|>ioysrd&s>F5;md92iWOJODGDzuU z&T^fs+~`=}Y1Bi4<;CO;a=495NcP(#0(G&L?N|eSkt0QbeTV9KPK~fq65lx}x|V3E z6C_QSkg0=cg0R}yQ+JF!Nkd1OrmU0cUF(+&Rl#J$6oNY0TH#`qdYI&ds?fY+k}A`= zFeRyHun=b${2#WBRJO}QFemMRGbe4SB)>#PFFo4Vm8JGRhbBvV6|mfJ4vyF4N($1+ zFfy$z75Jd-Pj|A`0$C7jR{J3bpY|#g4q{i5h<*a_3FJ+O!FuT-NSiR71B)LvbG$f* zKJZG=4|lgg&jPGWZfHp1`QtE=3N0Tmm4ea8ISd%4*Pk5m4C6lF3g=DN5>r*#nex^r ze~o&f&fd!=D`*t>Tmazy@9AvJ#H*R|Kp-!jG(=#l;9+4cd>2e&zw2_~HCIctv-{T? zAqpy?wBI~WGuLijZ1gV$D7~T_HSXj6zQUA{P^!nnnsj}6d^l)4{!y5qCOu7|xZ}D* zENIry|upkj}TLA`H9j&+(7KR!N z3hz|4F46e=nBv4RAl3}uB!n4q=YSZ>Q_1uUd=J>2lR5hL0}&&heK1MW*Sck$?1NCMV$g0 zacg&N;&_xFgBX7M=*@mStkc{|uX}9Kdi=Jz7Kb^QhDXn%6&G>g z=h)a9hZ`Rdm4QW=J5x(|aCXHG^T-IEwuzknMc#)8`w;!-xhK#GAsT)KSc0Vj^m^90 z7mq_isp@98NsLXZic@olH;x{l_d#l-H`X-zwympXq1WgP*Su0Ncc?C7X^wt3B7yWn zhx$NAr-(6pFIRjcw>^C6jOJw49OYI{bT22dU*O-F0A_4qzmp}E?%Ka)Dp^0rTNdSh z*dxOF6Hh}kz_5aq)99*coyV{W2){85zu8CI8A`n#SM$cGdCdt(Wy-uU42}#OsAf>Q zh1eJ}LGGxx?tM2*DW~rydl_0m^>L`Fr@tQPZk5-#`HRq#y(U=yuw$2WEIyqhM`Ns1 zw&v5vpb2N`^!zdR_t6}?Q=7|!hjc;^-@xY`Xr}~$L7FFas|2A`Y#212MKOja_dE{r z2;W0tj(A7uc~sc^Gekm~=?VJ@-uk}XENC47J^DWM_5W7>AxY1M=C z_}Y4At?E8=3wvhGhAy7>L~_k3Tg83aPu+FEZPuwffmJCq{&JfCfwF>yd}5aaj=zZQ zTKQ9t<;6Z6ldg6nXKXKP5#BMJFYunHAo&CHxwnZ{&IQC2*%WbJmSuks-!fg3K8JwuUfrkM|g}8`{7w zym5sJ56dh+AKJ?UZFMUSl~g*YD}B?WW|6+k*=x#~wV7R~-=0G&>3Nt+bh{yDtScrZ zBkPyR^+d8)4wdWmf^FE9vgi!K=-dM&jc0Lx_vl}rIKZu;?|AgVsi*^}V*CkdUy1(w zbOb#m5!M`DsuS8JDLaiU6S((o!}x9*!iauNs?B2)|hBU;_q8D z2Zr7CXS4pL0{Cw(BEGs|pJL0< z_clk|7^24yZ17lr*n^@TNIxGW$1WR1;LC3c{cj9%CAe?#e03TE8z{V&Tgj#l&Ke+| zSGem_VYi*$Awk%dcfwl0j1*r=M4lt;dV~dE9{$uHv{E=H=YA~xxjwlHp8b>h@%!Xn zmkhCEV9~o}*LJ+)T=Q{jlHJme`gLXJeEx4w1FGHPHj4lDf-MQYL3y3>z$9qUf}6^d zzt$3HS~>K$x$W}5zn%a0;{SK^AHVvK z+Yq3WWssJpOj5>RAyro)APHVqC=NePZ5=s0E)pxZ7j z5Sxf70+19e0s{k_#oLk;f&-9%$L#L*y1GxkK0cn?uX&wJr#G3Mj&&ZCSC~=3feeVs zEvej8cp{B~fDFKafOg4-3}Vsspc)IZYJxJD=bDU9!iZ{{>zir?b9teV`0$}nhv(41 zpG7zebh;D|F~R2H56okPR<&9Q5zX_hx`Lw6s);ypgX_TRfO?tBE0G+#~&W55CMx<_oj4sW$cV@(ERfAahIuHn(|1ACj{?F8m;{Q~Oh zK(yh2)uE+jl(1KA+_xp4PpcT4RoO}yApe3GG)kbK&-F$?Ydrvzj=jrGZDSbff*PvwT5N zyEUM6Xs94GA%VZ_EfMjZaiOip{0|h66a@l=>w5?tdkAN#-4I#XgmtW`5IN{5gb6UD zqyXCBNQ(V-paSY(5$a&And-Pig|G^{dcj2yU=jjxd%;Kfe?R~fM}mco&h|u5l&nas zlxVU3Qt_xD0m1@Ugzc!P0w5AVl(eYOz~F`$NU_jRVp1?5dTA&>>1Cvn7S(b_oEFuM zob9OgzksVqD7TuDucfrV)unUh998|HV*LZas6b8zgM>?&gL_fm)j5&t{F%`E6eg^d z#A2b4BB-FC1LBy3LUYT1S=%gTuHM(8F&HtMPOdHh0RvK*plYj#3`gb}jjRklv_WB- zA<%yT!$c+~p*U{E@mPyPY1Dim248^!;{b+KUtvL{7#88gpuzXPZ;F%+t`uHvpl9{N zctQQ6`oMvZ?R(1vuz+;K5q|-n@Jm@g>8PjuED56sy7A7wRO2TUM{F!%`-3B)7iz@* z4hRHiMQ70fs>>bvbFI(x^@IgMgIV(=qrsp*QK?a@o3q#Z=RvEu%eSM~Z;Zo|&(A5g z7X$;Q+KPLH6=($)bp^L@h5FQT$>Fi}UbRDePJ03C>cE-H69W9tHQAC4Wc*ok-K3|SV@WKz&Wz9J1SdJnbAa@Lqi$(+tOhjWub@gmAyMef|=6Uq{rQ0c8iq%8gE(Mtd&5M~YYPZ%j=sUbVKTdLk#z z?qQ3@JZllFWsm%x?5UCH290?ZStQatT?WI3NJ<<c zuS|(F?Prz@o=4%fcRpor6S}QZ4!5&MZr{dr`B}fq5Ruo4{*Dg*nJXPr_=aF+Q{47u zKeqB5%-4cGUNuma8A!_}U$k^=3{F06Feu=^t-B?o!KyrX^cgirT6IkGn3O+`eYtt} z!-(A{SxENULQ*e6o>HG=LD4UWY24?0jnia~rPj8S?x}YhS?#QSBw1JkW1ulWdv%xb zPp>0=toJ=I;t@BKp*86fJsIWZr;cXt$T1X#kDk!f()*kjnJV1dr>+mYwg_7*J%=Y^ ztCVp0J-LdQyr19EC4s3xaECpN ze+xSq+GUpSE=H*_hfr|;*Zq3}W~>#75(3P(0y6|^)pPsY?{h-}7ALPt=&6?SMXtq< zL3o!?(k_$dfFzkKjyRIgnJUa=w@4Pwy`ivktec3lY<1}MR5)*x@}=^0B&!#q3U>hB zX|X^o)~!eclSW`cu?ofDkZqi}O|7{45t3&R$~=A@!wv3!Sj#VFbWN8n;lOZD0hdR z9(u~{(zDKZq%BY?t9bbfPR>4lH$Yj|SN@Su_~T#A&oVpXN>g1BP4Xf|8d|tE69i-C zZ1l3Wh(l|O$%&qPjBTh0qkN;h&jb_0Im2yYF1_b%_@bE&#e+s+6ZvnWwy4<22G!kQ zQopojJFqZ$rc>4LyVQZli+ztski=9QT1M7u zJf;yLil{+!ClhbtmogvsjKpEeDj6;ho#1L6Si-Y^^EmR5y<*wry0AL8ymN`I)d`+= zv)SpIhr4;Y={W2ev45env0bQcX;ntK8A&};quo)ptZh7-2iQ$bGiK<7Bomd_TDEpH z(o)-r(|XoX&Q%X8tPnZjD-rW5=4{;e$Q*oCEhAu(zshI@mf9@ z76!Zy81xJ=Y8%jUd)8#_J+%xzZbhCgS{2MY>-CJRpURdLIq$2LGA}ef>=k_-5U<>k z`YT!KI!SzXChWsYqVx}y#Tc>07^YnLF(>P*ZmS#dehtn7K7ES5Ei1NoXX%^-cv#CB zJqZn(Xm4y%OxN@u8~V!9^z$Kf;~{dQplt%-I^;b=T82kc!xuxQ0;A|NDfsOlv<@vN z+ZG0Os6T4^XQzhM6kFw_ahKEYtJQkA&@1#{g-~W$rd8<~?AQCIJwu4bd3mC%$Jg8Z zsqeaNA03W&1!_UAu4=-+zanBY%&1(pBwwwpPt8rL&HE1`sWO2~>|^g6F$!QDbb_ZW zg#MaMU$<{!@}_tGeOtLW8OaZlZ+zowS+DPIwweAA*;EH>R71p`HqEWRxcf=&nI(8MBBM>GD=vO2hC=F%uAsNrLY zs9Q&4@Z~0#AFYeOk7<0)g^JDc+0GGcwjePhpG+?A;e`etyOVK{`7$tIp=M4-sS|gF zP9??HP=#h-8;L7>Y_;86w2q4;zycRDWXEF_A+=bA5@x|--1^>hthqkj&U ztsYmHOU9N;(UtN0<9X%o*q1%_KIQZ4GKFjnYb8ahXmUDSAVd(kY?mDLJ7>5;dPv#1 ze&4s3iVns!L zgoHw2)>!}Vy@^q^+X~f|K4Zr;md8NeV~QU4&eW56X#H}xqOIT~+}@fvuFy0i{VkXs zY^r?$*@`8X$&ChXV>7pAgcr+@+eH_hkFn2Y_SOS!?VzpuzabQ(W!{(=l5SRh4Z+o8VjAN*%PRC#cyHb}4ln`n6MZOJoeiIePUchS$a2+a*?&LEVb(LK> zE!a%_3gesVcOtzlLnf>W=sZQ`5d6FXcub$j&tUf!KfJVJuebDR@{e|;aVX#vj&Jo4 zFPOZ%s}aTKTb#};;q+e+`^E@PmG8S50EcdVwY{_Of;!NaqBK?Yf%0|31@g5Ftg?P^Aw z`ft6|mt+1?y#-ds(2yh6GmmzU<|U6hq1`LX<`r5$8a8L?hu|MC#5=;oRSXwQ{JC2d z%g{NTJ{n(uaX5LIc%I~bzOsd0B9MS*G!E&>ZvG@8<0fIde7t5s*|`lv;xvqe4$T-V z=sk?U*^=ivfzU_A95a!(8e|Wf0_#xMKh`}xwSHp7?;n*jNZXWtw{m=Tj9}03YN4lL zh(O=Bc9c;TQq38KtT;@^2Y4eXXu8|Ib|_Y>dLIG*KEv0I$4t0J;4gPHfVszbaSL;j z?#QGvm>()&Ij!*0$s&QT^hKuMX7)-URgqH^*}nDB$a)>LdQr>4oUWOD0vg_GG#6CW zw&RMW^p9BuzIwld5r+G+Dp=fQ2r@%BK6RvKq|5YO*EFL}fiR z7Hhd1=m@!PfGnsnw_4HH2tS5eHXo{&$p?V3p$4+V`kdMR<@|%DRaC&Zw_kz_kHUPH z_eWPeuk73=9nDk&y|CnkWn}d@nf1>I(<93gO z70Ec8G7%VFuYr(*A>!dLcJMW_egL^s`FVeP03sm<@5?)oMD!n`Y* z#1nLZRF+c5OQ#zDvI8MH*N)2O>p<)86=$=%>{JprO(c(xnfTiOxsnG(Y|)&K7JwAg zCtAzI2`winI1AjK2K!ls@=(#iemCJE6{#BerU^}$&9;DyMtK-w2XzstkYYdvj%fm2`8Se?fXyJ*=`&@8!wT(qh3(X<{e!UAq+>IKf%P5)Jy zhrFs0d7Ltf`xALy6qR9@P)c^l^0P=+e6XoSzl8!nc1luq_SVpGdbaTw3$U3f=1Z_3 z0iOMj1yI9Fy1Wtp9*EOYDUVq1i|hoqn0}X~$#y#0kKmuo5;Aair;U5GOHa}!!r+Te zI2RLcrTinQvmA<;6BdDLLkDkGt7$!v_jbvB`pEx0ol9_6;MNN&E&NlrEy z?%&fZzw6zAMCDUwJOX^jlB$2(GPj%5nYLEZrV$#w;pjZN?Gs@=D|3x0b7>*YWD$n7rPNUc0&Jpelo7Ub+7A5rCX%qTP}<dH<^N1~r zi*yCL*1n2A;Uh<`Wrkd)u_-8PnIsOzI-?rUc_AINxouiMK!$ z`|QM*!V5P0k0wi>Jzs59`!{XP-h1|F{;W*Gk2w$+zPGI*;Klb!{ceermv*&Kl}>;T zy6)#2F15-Bb3`rr8POZ`M!TUam$afJ*{?I0ss#r*JA3wir(F-!{DQ7iJn=&*&WVe49uB- zPs(lJO~nM%AopbVI$rkjP>5J4McPviQ6gny<> zjL+ta@)VDSd??!K$fA`IYTIe};=AoHjbjcb3oqRTp)dN@qkOtfktZ~}$*Y=j#cQ(e zjru!Yq{*8EEH77MW)vd+#l~ewVxM&)v~E_5I^_-S_)*^LaeZ)9ZR&uXT-c zy{kKYRXR@-iivbEJW0UGzkztaDsIkSHZl0w@B7HtYf3lPkLz7eayDbH3(Jep?c|tv zre3hiNBxi+y3nEZwLE6wtlsD|{lT0Rr0q?1;Yyr&{W$qS&Lk-Onf8TKcPw5icaxbh zBIhPk>%N^lULG3rJ=mf5Ox2L@q$6F4qVyMt*>>j?{pEgw8neCngv|VVVWkt;%3*2Y zNqcqH9@qG>`jM4K9*HcUi;mlNq~*My&E@6p(%*GkW;FMNNypGLHD2YHn|!3JZRs@G zIn3Q#pBAjPuF+mR-c?llX}vV*I^u(W_zbTvSE&R+AYmLK_Bd`0YhGj6qgKS57ss&9 z%=eaThEd*jr%MP797=S4gUm8s#VioWwxfbo%OBEr=335+JEFLwHzId zr94|RL(A~t>Q^fBcI_Gl5{k=<&XU=7<{Jv7frPR-SVdFEx_4PG*zf6%iom_q9dpcy z>y+i?T=PSVqqWMfzW2FPcP_`WS1>F>!@G%mP0qrM~{1&MOU?} zgx>Xu-95pwwvMEEr;>9;)O<6}|udBaOp3c(T_y7-&;8TbSzv#<#5 z?Vo2t^T zlSHiXpX{Mk__{y!bKiHN6{2m+8}XY-l9JU!Ho;X%+gQwVEecT|__Gd1&f=ol8ce zGGY_AD(nM43l7bP+|Eh&9@CYyu>$U1l`G~}1ZE+w=AK{PM<>zR;zbQ_>QRN{LL*o? zWwBZkbQ;cA(~(H1UwmO&({@7Hg^LOLZJ=w?d@EIH=hI+A%rj)n%SMG8F^0xf4eX=OM0(}zVZBda$zH@>o|5E zWgktX#1#j$u=*|(i0_|%%Q3J*dEdP=byfRvM{v?=+o~r=%fgvUc}E5B=;eOnILjr= zzI}dpCzVF=^3D6pG!y$(SJ;+%GS=mvJ2R{D(%CuQyz#8@rGMdS)JK-wp^mZ`{N8@E z#Q?XJ))b#`xhT^+uDo*6?3C$Qk7m`*>mYdPLuW5M^~@eBsJ?EA6{H&Q_@QP%jg;c` zdu9f?LR;(XUg-;+pIBJr2`2mr8ha>Aan=^XR{Otp66=zim+M4Mw+4xvYUdbuH_7R= ztU{74D7WHMuT&jgIH8?%nbF%KrBT-d)^{dkNpy?N<(O$v&DdhV%Op0=QsT#(6=5dG z#OT)iQw&9`VR^Vn^HF0q}9U>eSFl&6c$s28NS%gUsHR-^WcUhbnvFEan|f=p|`=3TBy;!-~`yl5wXTkDzbm2b4vMzx|HOw?P#_m$k{nLXHxq%pX31@XV#T@qCS) z)*M@@ocgo(7CBGvf-LT~mG1r!0^t`{8nSs}8p3Q(R196Bogy%!a#8U*_2}W_#5+*g zZZ?Joc4|quY>$;Gkw>hZ)oCM3SR^b$j&G{#r+mw36q9KaE@vyZuSr0VnoJ!^CdNDU4StET)i!Gxg#6r( zaF!f57RPX+;QiPziT`-HIe0Oh=s?Z zvb($S7|o>hmV3r9EY>QG+hF=FH7gmbhPNke6D~)^8Rwy)Jvy-24Zi9lO!#)a@0{<@ zu&*{dYtTk7I0+wRl{O}5OjIdpF%h%yT%G;a#NAR}>sHg(qpIT6l24NAf4t|TKXKuo z_k75Y4ZcE%y4l3lN4=&BT!|~-2;43bpS&Adzl&sSTyu{jqMLrU*uLmgshM}ZdhMgz zJBzKUPdHB(9mPsaJ#;c^tHL&|;Jp#m_<}CCPbS6SrG+!Gk@vX!JGM4!x5vx$YdGIeb$(VidBRI< zF`^CazWMg!L#+#XZLt%VoQ2{)I4MnT9XIGJJ&nuMEpTzPL0|jgXt(|iN}Kk`75*k+ ziJu4IyW5_3IW-Lv>&YASME`RTUWez7-~)%}y!gs|59?|da>tE{@6JcxrEXH78MjnF z0wdoV9a0ckWO+4m-Xko6pEV(2%IlYI&XACO3@drm@OGRtQqgsuJG^Jg?-G~|( z&FuKP()bj)jax=}IZVqLZr~cM<&xRar6kcYPc24e63rw0^DQ4ORA-&>6A-rj(G2T- zLtSA_I`?@#)jm^4a}vHM?4P%M2!OYIw4E5Gc{Wj;?0jaqn^@O%T52Pfg<8b%dX{y7OxSUWd85LVk&nGD|YQCVmXPQts0i>1huq|K_q zDpR+T$0_u_Rxzb$xAw)qEYR_$lVp#s3l7n8Jn?3t>j|^zD0Kt~`&M?k$k~DGRr$6a)icu8dE*EYW>q_mH~Oc~46L%G zmv<_c3yNIssBGl2io5S(Rp5gCAiCEUUau*Xxf-QYMx{4VD3A9rM@JA_50@*Xf?i3p zIL>R0^AgX)Ec?9EPqC&pH<_{Nnz2RzAfHj5+9i{_5H@JiRhs zF|#o9P0J|t>@D#)@jH%5Qo_%+?>=wTuY9{nH6y#wOk;UmkBdiNs?0=aKB`pv3Pqc4 zMtElmzdVfd7#)F$9O-ty2CW=LzQA4^)#TBKj?t+{lf_OH@Z3+M5fZ5p+;=xv_q}kW zBk$7FnKp&@5-#DFBAG4-zBR~%HJp54H?q!wqs$t)PA?AarFcOd-Su)YVZoO!v3L?U zYwpweE*$t*eq5Zw znX|rd=vLeXt5g@$Fx;|EBY0h;jjUjgz`Sm7aA9KT6H^(#1Y5@GrYzhRhWa zERN^W76Eg&Oguk?h<2x+C2$fTQxokn(M}Bye>+d#XHV*y|4#5!ZT>Uy#L4*69Fy_{ z3)kr#eNJC1QKQ<#TXQ?{Ag_Px6|C386$j?ZxH;4Ls-xXU2k#}{S($VpyjSencMH|$ zQyxAFBMFLeKao+;+7%X|0C$VYnWI(ECr)PEOtW;$=yC|>%Iu4NP|;EnIwE(jpyy-T zsL0!@BvRxvCaj(>q3PyLy;+wSPIuE2rW6XzLhXbXKlVvXuxJxt^Xy!FC$j+@m>`Fi%&!=<8axbPY7wnG4NSuQ-dyN*Kwj&Iiw& z!B;oGWx%@C6g%z~M%|}H8>2;_ZwJ34sF1=D)M@cf?nD05T2+@b`x0XIl2q~KQ<)U; z&p$F2zA#Lh8H&;*)i%0TVl~bZA$${OfZbB-vAL+bb%FHL)42@OKDsvvX{yNzW;)Nu zT5Ht2J(m8~9OjA(bG-m_Rlob-G!7woT-X=W{WnIU(PB-d+)NQBm*@*=Za*LyFW%i` zGQ)Od7+y?h$HO-B!P)g&ulI8^Wu@HW3qF6l>+S%SwN{&JV#)J;^lJbK5ALNzKRz8?Q8*(o(c@6n4aRdzWQ8d3MA}?&8etzKn8R zmPC6MqYqNPa{fI0#14GTi_cu@t{zkL)SF?vnmiFPD5oY}--!qi%7lxCT%$)|fFQE~WVt%YJFZE+^)un?;{LrdzgtiUeiYi7Y_%jUDUj(CRTCstOB?a;{Y zLgE_pYxcXZuiL%q^@~TmO`o;@x?pfN)il$^PgEg;F*j>6`c67RIxkm*hyL6x_-;Gb z+7-gWo(ZecjBhZnJfWzY;dI7t2wccU@>0gPgUZCOl^n70Qw^aRghW`Lll>5<)a*4O zmPg_Jo{^VYK50z{q7Eb$9JWoe>h z0web0xBg*?w2il(2ymZW=X4e{O)lgeexO6y7L((0+CaH)u83c4w*SrT&+l*boaV5U zduYX~z@hNm(G|bdJe;6JHq$3Lg(Iu$lhw7y5;yMlUUGOPa7RX+$F3@(Z@;X$Y)41k zDqGG%T<2c#ZU(E8j$;+5V%`$j#qnv+eh;n8pHrjW`>q~Ls8d18{@o^sqGzypqJ(&2O9bK(o&3*ifb!#z}uDwR-8noaz_{XT z$q}E}WGZW?mYH7r@<>^UB*lG>W)5O9mLMGM8-b-Hyr(KND2U=|Vi_Bzq~9_&a}_J_ zo_m2qZvN8QAS0sH1aUguxi!64?j7A^OU#mHqOM9g$AAjkMK#uYgxpcYkYVf$X0gKc z9O-woyhjMQYaa)SI+HekqKav}YEK%Q?gN36UX{K=!nyKBQkSd zsBEN5`=qD$O?!H^r=2ld#Va$6IJJ3M^=2078G7!QRq6XjFRI{)pJS6G*=8gqv$<52 zfptptme-TBupAbS$m6V>v+vJc>!Ea9;k{3)pFd6sBcda!yAg>sd$EcCC?21?q^h_d zPELX(PeNPTed(hiwYBMG3apT{Q<7r%OSu8}Dd`g*5#Bf_Lcx-s{$$CM?KHDyx|C05 zdSOetmYLx>wO9fgwQH-<1=A5pjMYhmi6hv2`I6?0Gz57!yt^cIuTz>B2Qze^Eaxvc zsoZ^y#LST4dT}hem(XGOutY#ma#m0}v5J zG3Ns};_h^lz+&Im%Vpg3I7ab79Y4C^s!TCXlS&*OWm@4;qT-&;v%Ug)SD0AxJJkrA z^n5gB*m$*PYtPQq-ty6uB7wsgU*XfFbCki3B-V~+&IRK`y=LpW>RpSVTI+jW9s zA*q6bI*@{l_d;_;C=T}N0eC>5`YZzza}7J=t^9)f2_ZPao0R7Gaj_wWiY3RwFSN%7 zP$*Ttz2Ur)lE<>bCrcD}o1~tUF(D+O5+|B*#VpV-B!f1ck(*@&_ri`^yPTZ6F@Jx} z89v_W>ktJpMh>OZ%lGOEE4(L66SJ$8>*I4YtWN}mI@l=(T=_Ihwl7swO@ug&CtT?x zEZO+!U0;ZaNm0}4>FASc^p4R%IK~XUr)sAg282(m$Pe@429B`egKP9JN7h|a3YNYc z-av*|AIYM0cK8l$U9jncHD7%ErmTmxV{a4JdQXkG=PhCLU1=JTNs=voTIF0~;H+v~gXj=*>5R52w2 z^7e?u`E-#cE3Abc2t;PRtN6K8O{J+|P_v%*C+F_Oo#mTW9sVkLPZb{(BR#{{L|Qa8 zH?zq}>Y83Bi|=k!5SA|0cZ78$%o}V!x=`Iy!jsJ=G~)6EYPQs0y5hy#mR+?`O%5et zvX(c6R!H4Jh?;7Nzjk2UDv85-bZYVDE%0h^Xw}R@&a$jb2jybDJXE;%M2mYni%;^F z!}p3$9U5&CAIwkctaawnK*AmZ>`uH*KLvbTe>LCnQ_XqRy;R5NmS$e1TEiY zpJcSH#Kp98{Mi;S0eA6xa> z(0H=ZHuz)3Na5Bv!&^An-dO0yq>KHMV>n(Jmfx1Uk+fN;-$kv~=-BT?3!^ntUPY2G zx=t=O?NQ@mlRw}b4<+fCIdO#VY+ety=Z%;4!!5Q`WHfc^^P$lmw!?P*TGh!$e&nJP z$3N@I#i)yu?Q6VAA2HZPmpn5F$h`F^BztH^nN9CKV-zlgHD;xBpBb{f#6)fdb2pz+&%9~jB z-&aE3^(!RDex}wC9d2k4@S`Ay&fb2Ib1mtS^xT?O)ST1ZHqo6YrTSIoHU7fk9c^MX z!?*fjlZdBoTJ)Nzu%zI)VD)_`8C4pSQoQDsyQhc+Rtz8V|fmX74V&8tB-Imj4Rb0L)E5dCy)c0J# zCDYsUTc7Zo+pj!(BQH@rZ*hR#Js!XY7eeB(DBl)7D12xU=r_EZw%@sQ?M+jVUCFI-QQk}IUo?WR7 z$k%Lj8y}_>DU@A&5tx@s^@TgF5}Vu4e3;=4o2zl9BH!lTw15s z>6u_}s!V0>p6#yVw43?e<2tX!ZtT>3GVR%u!#}I~VumqCOxRe@WjZKtb}!BPlCVYW z_e^8ygm_A?4?)CM8lg9De}&e#3Hq>H4Ap;eROt9z2cnovL$Q%dQn0k?Go4~Y@s+oY ze7tv|Ne{DAw;#GBCL2UII2Bd1ST(d3dtyE5GJ7SMk`W?l63RT%r~S%*Uov86FlykO zlUnV%fuGQ&`Tm^GTm93YC1`|66Jwxz+^)D;OHHo^t1ip!@5Bv+A`INtLLcKp*}v)! zr_P)_yGUB1KpMt7|6*oupwFm6VM13K$sAKZd6vc1(y;QfuF|e`IPAr@8rtmpuE_SW zN5qX@4r_I5)hBbW&Am;mxlyd#xTxYYq_^{0Ob&nH7<9wq$TYUny(@zR^iwnm6Lw2J z_eVtE7R;%^Ucj}DQ_sn^X1I;J4YR+9Kc5vql`BK+k%ya{nx3+mk>dYk>br=SVcE1l z(x}??HK%RaME+n7Fj{%e0yd8?&R><1tWqf7GS}_HHd>W^^=&k_zuukP1aJdpQkt%Z7N@cvlUUT(`-P8r#+ zJrvIVE{g4pTBM>r9Z%_K&8kN%M7m+7)URQ4wt(^{%REUN2+z_hf2FIQw7v_ynlhFQyla+`4d_tkfM2{RwO5TGfzlf3LT zsKRyVV==R~GW^7^+t55(!08 z)TR5palME8l2tZBgu2^A9<_Y*m@9xY3=Le)S#c$Jc*gnJgvYq)?vRpmSG4+$sYMdA z!8&Voz;n+Bk%>+1%OUOwNpEYQXT8dBN z>siM+6M;}isykx_HUrcjI3A~%+B_@1*$Kzf>D{ewITd2SdwL^Fim8#E1nKd>wXU}X z4;NwMJkEZnENiwsb*M<~dzOP}?0m=kqrnvCez_LY0gHPsES`qxgI{$nXN7*AJo38m z<4uifx6il|{;hQV&1RzG5*19+6Dl@*&ckVjii`gHRs;6-`C%Is_Zfz$G_BhkHw$CJ zWmvo$u&xP~=TU0OuiIogSIhOU?K~cwVlQ(|5c>S$110lLfmZm1F>i3rr6oz!%+=ql zKvSts?9p8O3e&S^Px?5woJGxNcf79kynT-R$nE#VL<#KCmWoEy>@D9m$YK|?6k0Wy zt&x-b_8mL>zNdt7^R8%6fcjhWk?X=V$z1KEvNee#mbUiEH0@X~PQQKga!hc{-R@gC zy&g}PZ*XnH@TeWWFqYET_YK8G3Dnta%zE&hhNBS3IvxbV^7q-SgT1-skGZU-$1Rdg zn(EdIj96Z>$AicsEsg|;%JJA6lk(j6O+4-s7EeIB>U!UsA<&7Os!PW&h`p>`gjqT3 zW{l8`H1iYW+*Nk6E={Rf!U4kV_gZW_?)s0g&Q%XAx?JAAyR^3J4qbHH z-sfW2C0{wom~{Q4`STLX*Hm6YPV<=y6&}ATGGcP8FFcJk zx{3oYf~mr9j5P{|+kb+gM3pJ-!hDpen)RusJ(gO7#yAFk)eDRZ-Aq9xJCS+`+P5F$ zN5@V*A^m{E(sWWvj|xiBM5{7USiw>&*=H4Y0ghvF%bxD_*XlmC`e&IOs+l)#$6D-L z9x`mJD_55D&m5!&6A!-l_ij6d}93tNpNxY5WE2OK#?iyaMG3QBrZ)eKZ zMSoz)cj2WQ!4Z+9mvlIp{5(|B4#&;=O>7Tg57iNG0kL-{hH$9`-ku_IbPb_D?r+gu zeYGS&FViuHv0UbH&6N^1pJ!K{1C+vUC#6aSyk)Hykkvgk(Z-L{&{dE?7Hx!IaErndlv&#&p<4^ydsOgg&D@2=pz{8Dsn z404)=PAY@tXs{Pa)=46)x>op%n03Mq8?)&PtSxL?d3Okfz_qD* zdT2;r=(In-a$UeEwYuoBN`J`om)zFx!Wl0H&v|Ok8r zyIo*Z2yx@(I>&W4#X(qG@?x^WZQs2DpI%MDYP$UQ7hl!A5mtQmg_uk>HaY{ZZ#aX7 z%nMe2Jt5!6J_sRu=24oy<0UC}1E=?~1W7y(%(}gJ6Z9G3nz!&DG+!$sD7Z8+qN9-BntNIIwV1&u8U7lVe)_BvtPBRB7DfA7+h z@ru7N6p8)qz0a<#snpG{rY)J>yPod!c_O3pUv}x(zCP^a4(}z3d=<_}`=x)`g>HKr znk)Ml#}4^X-0egTgVQw*;#U%51ujl9cTegjlCkPKF%Z#;Gl&jRh`l<;HmtfTsi7i7 zdpbXRwlm`$XN{bPFYj2hkn|M%#b*8$rv2)z&$Uv<7?p4zrP+2z)aH_lZDIZx0ee^1ez}GXa4w_8u9Y@G=kYhdd7+1@}_) zonMoXR(7)4eWJtJE84@Wrm@{{m6pH4zuaMT{_R31vQzn5RMr4f^@@!$>5H=N1}2^E z-qEfH9mE5V+s6y2^e(v;Y($@2n~)Vz?wzi^M{u%+lY(JS4_ihQ-?CPRhr>E{N*?Ch|^L-JUbl7=O zQo8X;KVNVxa=WUnm~gjyZjbvSX9IJz=wMz_)@qh=?wzU=(8VST<${ey4y)evk=_S& z=~YWj(sG=}(Tg>u&2!Nnsv_=wnNwETLUipX*u@1AA1doyxtW$Tk=ju? z5v|#C$S|ST(8BDsPL9x40dh{2Z*aO)yo=L=5}lpuC6*gAqT`>RYGqsJT^8$!yVVzcD=69M>0UA4 z>Xbv9_oGcwBvYz;)sCXa_s+%%K3xaw`e#Vp%cbn|jD)GWmuC=Nw_Z%K7i*7U!lxD#SWM3Lyn) z4-e8zz@W~Yx=uO?erv*lKxn~#QJbNml>^cqW@HBEh8vn&bN}}{7Ytl-aERq%?NeY# z1A&xqLm&rdF#c=j0sX(v{>Czd!>kU&nmFHYZ3Dt4_$bAHB=A!Wkkbf`us1g`|3Uis z3p$bNDK1sv1!6&Z0!Xj<7;2dXhK49uW{b{s;te{=bidpVlS;!QKpt zfWwSohL%5#<=6iQU3aXW-bW!WMgFuGqQ&w&ES?l%Cp0o zCQwSO{thh19^4Oc@WRjkn#1y6@g^{HOB-uT7qp7d8Y$3UBZfd2fhmBCCw^(K@sIpP z5l|qnEgbRV1@VVPuKd(j5(27HegH?+$PW2m!Im&nI09-2GqQkN8>5vwP83f*3Rp2e z_!9@)IRCY7`oH3>ZICb|dQIcZ@JEz^fs6qI36%Xydv@WkT+9QA^yYsWfenH50H@>p z1qy-WbN&@;kAPVtO>8ijG86JqnlO-rk)NPkWUz>l=&A7 z1hOT31OhhFoL~s}fw5ZISR;SD=NQeS8y^I-Z zWMvGswE3~^cG$4gVsh0>!IY<*00N;$AqvX;foScBw$s!O-%cJ(paOvQP~~G)`~wYm zthwcn7wR6C&to8pDiQ?bN)VjRp~%OhfthFwvqz5;7E0Eu1cqJ$l!%Ih*#7}%ZiIe3 zylEVhg}@+h0UYWe?>he(XKrH+L!b{Lr~JduhXIFqLv>h2r@NS;CYUt1IlFL`2*}6- z4DkYr2BpI=<4g^q_6Rr}eKc~Vsbwz#!^{Yb26dRDqyK<3w}(0+t&KAr-B;3jojy{ADEY5iZ zgN=Ps;3=qC!S>VNfKXc)0*Qg^aAWk+5nzoaAeo^$;niu(Tzi=1k4u^khlnW!i8wuA zI~>4v=ut+-XBjgNlO<+EkBI7HK_K{m$bv$nUB^U24d&=7nu^Yh066fNas0#7nhij8 zum-+ykdt8cpvd}}4nSFLV`UDr1cd?27OmI3!P{Y50y3@vc~J+*at{;r@ZUlw?T7gN z_6QJtmO*kwP1}$6|ID>T*q9>VNc2uQOWq&V4#WjjH-rpDwXPJ{5L39ljjjEUO!(tx zbfQV>uf=`24Qg!%2!tGk;ZBK`fv)1^ETz5l1dQ)8h!Chndx$GG1oXkt-1vXP@b9l^ zN8s42-5aGq3adARiEEQHyt+ zNpvtH8w7f(Z0nFc?iwKT1s@*Qh&gm1P|ic`Vd%5yY<72=dN9D}o@Xq7TmtDYTrUULNxK-RE=TtH5iVK@EpG3eZ=7 zU_p&x=oe?2iQi=Tft3IsFtVt;NU-$vOX2m;kN@i@6mE+?=yMBrD)@pScp`Y1rv<8n zKkyLfm-h_(=6R5ygc1hP6;-~oct`)hvobeCn?mq0N#GB_zfgl)wjo*+dKb-ziV^h%b;?PwxIvH7$*V}T7^FQE za|E%mNPR;K`o{yJ2&zy=-O$kB7?wKk3FAbng6!A@%0$#ar0b0igRnIEpM#=RmS=cg zn&Ho0qNbFEVl+S#xV;g2t-F7@u|)-XW(%h7sOk!+KnDWh><{WH&m`W)12b)5U|y&` zH2e__%@izTfCT^>2ZRy&3O4D~U^m!dgq#HG2Lk@mSmrSBkPcwc3-M=cNNRLc5pX62 zkhD;fjLjMv?7^fC0k^e5pJa@co#py~`I~{N1+_TV$2#_VTr)HMvuu&)RRY{WNV^SO z0d-^@Pol%w*jS*Ki&4xdQyLWQI6!}>Hpfnl4s=kiL&3(IEm%}SYjfRESX>bR*7KV$ z6w;#sV%kKQ6ei+o0Qx%U9qM%2i4_e7Ec2l6pUknz>SZv9#$XUpLytY!lld(_+1T5H znK}AY=YMDUbuMs%E?{G*1x%_88r0AE1A4K9bjP2Z25DpuXbP3(dmAka0ZL&w`jnaT z$Qxe+q>yA_q^P#=(F85a-VD7^&+VOkW`M5lfl3zDFK;`e16lmVNb7rv$gTl1ILPIw zx)1b2$Fp=WHODZexfBx#mpWL81~nS0FXBg|Lm?cYFiUe7`hF4y@J!$W<-Y^UXZ|Hx zKp_4pm|(X5Rk!HZS`@QlPtbw%I}8+vn#emdFhS9aN4mW9!2m?BfOeq3Z8lDF&tySYbiGv+|we&a(j_pg-Ni6~bCICfGlll3=?Z z!y;bwPHx8;AQ+GE;qXWTHo|^$Q(G{;Kg(vc-DPTP(8>n5<=@s0Ov&*u;V?~H+B>`m z{J~g=fmn;`tMWn^V8(D;^kX|4bwB(IFuQ)>7O3I&_?17f{@FM~+tZG4=E+hPu=*)^ z*k{?~F#&&8Y-o88lfnr>27#!64x^eeojoQV`Z?NIxkdg}U~*l+AyCz3?uLN`H?~2) z7L?&we%TCE3^AZ$K;3(r_QAwL8X?SW?af`$*9wiv2$YK+c8I8COvHmN6|_p5 zy0UCMgAKm23KA)5;1qp>0S2}spct*Bt^7^y3lN|*fcj8XXH<`YcW}}Jt!&vrUF9Eu z>Qq3aLyaakTQRUe5C%JAmYC(U9Osr20J718p+ya#mSY&0mNrIU+vz76t)RShbVsp( zTSNdiLxoPx{}Jk73#JRk=!f}pa&n9ZFy~~DJ5V*rv5gsuepB$f5_Y#gGwI0psOliSXoiB871eRanL^vEWR_A7w5qu7jP3) zDJQ@r7;VD%)1Co-_Y?^`z!3o)YJOA|!;Eu4?{bdxxY&~*$lnGUq(|xUOG%6{TN?!W z;G({sEps1;=KPyz19E?$q0c|wY6?1Pz`M*O4)^nc5(XINGgFxF@O<6*D7VpmyK=rOIR}3&r+aos$zEC^_7Tg5P4pslgo)}OL)*wKkcY6H7J5F<8$o1fz*MgL8a|h6TLS87+rFCvfvD zFbqauWvDXUZbQrY!%Bfi{q5`;;F$-Tw5aMT@B9M`>Ua^YXyI;nnm0k;#yJkpyvqB~ z;6PTzaE9!B@J&`27(y{18*0@hyMY$;zdJ7upIpHwdq~X-5W}2@9ei{L4apvEWorqf zLO++U`ZS3n2t=|6fedwBONE@^_aN(lK)?ZtKzT^N=T z09(&Ght*vmhK_@A#Xr-)hb$i~f^)DPRyPOYUyv=r+>!fV^&q(wm!AL^ZOYRZa)mHgH?}z?qWebvafTijDH%Cc#a(Q7)mfFLMzn)>0iYi7A(Tg zpdQQ`AvWLvwfrwlG5|9Utc4wHycyXXEPfwG^2LR*0)v29f(I1zzqCP2NFysS1{h`3 zo6b480x&e7%cwHC1Y(d8{$sL%5t&BPyrT|~7T{s}MM4OqAn4CXD8?~P6S$I}3|M_w zhv!7n!GB>|*%+f6>&??I$D#lc2M|$9weul=A^vHA;Nf3R!2vc9JgA1fiwO&se8F}( zI7)GNu&=xv*IEM{g5S(BITVA4mSATHlR3VxBf&Yy0|yTXP`|YHFbp^hx^u2xZ9W){ zBfpIXYd8kdziW*L{(?jp9qwwTS%pymAohZX@fXP;kYf>lARcrV198P+`N)Ce<%0*c z$nC^LwEd^DM`tYSgESX507wvw1gdx*kr>4L3BxoP%Pww~3xIeJs1VifN}~Qq#Ox!Q zpMren04@jA4+mrXUmK6cg#39_4_%*G{3g2(Ld=15sJP>C7;t}bj6q*48c84>D@Y)y z9k#`c`*H3GlMW-RFY?y`1f3TLzp5Dd+$Suq&o-SU%CX`1C;x}G`5rjlBM&H^Ns(My}(}& zf4)-Qx+_3kg#rMh5B@$_n!#|^ zVk%eeBy$*$r1&ssujMxo5}f@8-^oH-E%!g{dR)Q_fh0&Bt|s-g34c`ykmyIMM~e}} zW*emjyQCW8hf6Nm;KP`MI_nP`k!%_2XZ?WrKyVKq+j&@V7=>x0>MIL_vlI{oPxWwd ztM&RY1s#xerGbXPl;W56e)lj37!AhLk1=0VlA^(S-+N%cV6X9) zW_W?IuN=%pQ0E~W!M{^5&W&c;>urj`;>R?Yhk%8$Um8!;VGO3V1@3-20v4bY z9MCDC8nP01s+)5HgE_ z=U{GWZ*C1W16$QlTl3$hG=y^tw}5Lvzy{Hw{eAqvj99{>kTSMXf?j}3l0vhaV9`G0svD=3g3VSku! zO}Hv_pbu&ApvL$Y82AV0AkD4K4})ZjL`};M1O$3OEzwyP(F=M2`Z4J_%)(-xUwjHC z)>lFCN`JuoU!z*Wz;d<+-y($@L(y0{eydI&6r{16fXMPc(!mc$sfd4svqP=||AmIh z+$+X|6?8#jj0dX;>?qVc=Knhtjomj9N=K(3hd}&<4uh42(S!fpZ27s^4gEQlJgn6n zgm|+$SY!wQH34d6A}Wg>Y;9u3VM<)@*t8O z=6vF_Ja;ew2>Q)t?r5RsAYG6@6Z>J7U7&h$69_+}pu|Kq#B10T;=_5x|_#9IQQnXFSWWc>$0WpvT~E{Ldl-2;k`T+ap|Ah#454`^`Oz6S20vNyNeef3=CM2(bWp9WxSj0n(aYw;2 z=wEKvHF2nyPv`72Jgab083D;2u zP!S0O4@FgX&eUJY;AY{&Rq+Ay@a4k)34HR@@xLkKm#c<i;G+bEC# diff --git a/src/app_helper.erl b/src/app_helper.erl deleted file mode 100644 index f90490bc8..000000000 --- a/src/app_helper.erl +++ /dev/null @@ -1,151 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core: Core Riak Application -%% -%% Copyright (c) 2007-2012 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(app_helper). - --export([get_env/1, - get_env/2, - get_env/3, - get_prop_or_env/3, - get_prop_or_env/4, - try_envs/1, - try_envs/2]). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - -%% =================================================================== -%% Public API -%% =================================================================== - -%% @spec get_env(App :: atom()) -> [{Key :: atom(), Value :: term()}] -%% @doc Retrieve all Key/Value pairs in the env for the specified app. -get_env(App) -> - application:get_all_env(App). - -%% @spec get_env(App :: atom(), Key :: atom()) -> term() -%% @doc The official way to get a value from the app's env. -%% Will return the 'undefined' atom if that key is unset. -get_env(App, Key) -> - get_env(App, Key, undefined). - -%% @spec get_env(App :: atom(), Key :: atom(), Default :: term()) -> term() -%% @doc The official way to get a value from this application's env. -%% Will return Default if that key is unset. -get_env(App, Key, Default) -> - case application:get_env(App, Key) of - {ok, Value} -> - Value; - _ -> - Default - end. - -%% @doc Retrieve value for Key from Properties if it exists, otherwise -%% return from the application's env. --spec get_prop_or_env(atom(), [{atom(), term()}], atom()) -> term(). -get_prop_or_env(Key, Properties, App) -> - get_prop_or_env(Key, Properties, App, undefined). - -%% @doc Return the value for Key in Properties if it exists, otherwise return -%% the value from the application's env, or Default. --spec get_prop_or_env(atom(), [{atom(), term()}], atom(), term()) -> term(). -get_prop_or_env(Key, Properties, App, Default) -> - case proplists:get_value(Key, Properties) of - undefined -> - get_env(App, Key, Default); - Value -> - Value - end. - -%% @doc Like `get_env' but try multiple `{App, Key}' combos before -%% returning `{default, Default}'. The return value is `{App, -%% Key, Value}' so that the caller may distinguish where the -%% value came from. This is useful for scenarios when the config -%% app/key has changed between releases and you need to check for -%% both. --spec try_envs([{atom(), atom()}], term()) -> {atom(), atom(), term()}. -try_envs([{App, Key}|T], Default) -> - case get_env(App, Key) of - undefined -> - try_envs(T, Default); - Value -> - {App, Key, Value} - end; -try_envs([], Default) -> - {default, Default}. - -try_envs(Pairs) -> - try_envs(Pairs, undefined). - -%% =================================================================== -%% EUnit tests -%% =================================================================== --ifdef(TEST). - -app_helper_test_() -> - { setup, - fun setup/0, - fun cleanup/1, - [ - fun get_prop_or_env_default_value_test_case/0, - fun get_prop_or_env_undefined_value_test_case/0, - fun get_prop_or_env_from_env_test_case/0, - fun get_prop_or_env_from_prop_test_case/0, - fun get_prop_or_env_from_prop_with_default_test_case/0, - fun try_envs_test_case/0 - ] - }. - -setup() -> - application:set_env(bogus_app, envkeyone, value), - application:set_env(bogus_app, envkeytwo, valuetwo). - -cleanup(_Ctx) -> - ok. - -get_prop_or_env_default_value_test_case() -> - ?assertEqual(default, get_prop_or_env(key, [], bogus, default)). - -get_prop_or_env_undefined_value_test_case() -> - ?assertEqual(undefined, get_prop_or_env(key, [], bogus)). - -get_prop_or_env_from_env_test_case() -> - ?assertEqual(value, get_prop_or_env(envkeyone, [], bogus_app)). - -get_prop_or_env_from_prop_test_case() -> - Properties = [{envkeyone, propvalue}], - ?assertEqual(propvalue, get_prop_or_env(envkeyone, Properties, bogus_app)). - -get_prop_or_env_from_prop_with_default_test_case() -> - Properties = [{envkeyone, propvalue}], - ?assertEqual(propvalue, get_prop_or_env(envkeyone, Properties, bogus_app, default)). - -try_envs_test_case() -> - Val = try_envs([{noapp, nokey}, {bogus_app, envkeyone}], failed), - ?assertEqual({bogus_app, envkeyone, value}, Val), - Val2 = try_envs([{bogus_app, envkeytwo}, {noapp, nokey}], failed), - ?assertEqual({bogus_app, envkeytwo, valuetwo}, Val2), - Val3 = try_envs([{noapp, nokey}, {blah, blah}], default), - ?assertEqual({default, default}, Val3). - --endif. diff --git a/src/bloom.erl b/src/bloom.erl deleted file mode 100644 index 4e51bee16..000000000 --- a/src/bloom.erl +++ /dev/null @@ -1,235 +0,0 @@ -% ``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. -%% --module(bloom). --author("Paulo Sergio Almeida "). --export([sbf/1, sbf/2, sbf/3, sbf/4, - bloom/1, bloom/2, - member/2, add/2, - size/1, capacity/1]). --export([is_element/2, add_element/2]). % alternative names --import(math, [log/1, pow/2]). - -is_element(E, B) -> member(E, B). -add_element(E, B) -> add(E, B). - -%% Based on -%% Scalable Bloom Filters -%% Paulo Sérgio Almeida, Carlos Baquero, Nuno Preguiça, David Hutchison -%% Information Processing Letters -%% Volume 101, Issue 6, 31 March 2007, Pages 255-261 -%% -%% Provides scalable bloom filters that can grow indefinitely while -%% ensuring a desired maximum false positive probability. Also provides -%% standard partitioned bloom filters with a maximum capacity. Bit arrays -%% are dimensioned as a power of 2 to enable reusing hash values across -%% filters through bit operations. Double hashing is used (no need for -%% enhanced double hashing for partitioned bloom filters). - -%% modified slightly by Justin Sheehy to make it a single file -%% (incorporated the array-based bitarray internally) - --define(W, 27). - --record(bloom, { - e, % error probability - n, % maximum number of elements - mb, % 2^mb = m, the size of each slice (bitvector) - size, % number of elements - a % list of bitvectors -}). - --record(sbf, { - e, % error probability - r, % error probability ratio - s, % log 2 of growth ratio - size, % number of elements - b % list of plain bloom filters -}). - -%% Constructors for (fixed capacity) bloom filters -%% -%% N - capacity -%% E - error probability - -bloom(N) -> bloom(N, 0.001). -bloom(N, E) when is_number(N), N > 0, - is_float(E), E > 0, E < 1, - N >= 4/E -> % rule of thumb; due to double hashing - bloom(size, N, E). - -bloom(Mode, Dim, E) -> - K = 1 + trunc(log2(1/E)), - P = pow(E, 1 / K), - case Mode of - size -> Mb = 1 + trunc(-log2(1 - pow(1 - P, 1 / Dim))); - bits -> Mb = Dim - end, - M = 1 bsl Mb, - N = trunc(log(1-P) / log(1-1/M)), - #bloom{e=E, n=N, mb=Mb, size = 0, - a = [bitarray_new(1 bsl Mb) || _ <- lists:seq(1, K)]}. - -log2(X) -> log(X) / log(2). - -%% Constructors for scalable bloom filters -%% -%% N - initial capacity before expanding -%% E - error probability -%% S - growth ratio when full (log 2) can be 1, 2 or 3 -%% R - tightening ratio of error probability - -sbf(N) -> sbf(N, 0.001). -sbf(N, E) -> sbf(N, E, 1). -sbf(N, E, 1) -> sbf(N, E, 1, 0.85); -sbf(N, E, 2) -> sbf(N, E, 2, 0.75); -sbf(N, E, 3) -> sbf(N, E, 3, 0.65). -sbf(N, E, S, R) when is_number(N), N > 0, - is_float(E), E > 0, E < 1, - is_integer(S), S > 0, S < 4, - is_float(R), R > 0, R < 1, - N >= 4/(E*(1-R)) -> % rule of thumb; due to double hashing - #sbf{e=E, s=S, r=R, size=0, b=[bloom(N, E*(1-R))]}. - -%% Returns number of elements -%% -size(#bloom{size=Size}) -> Size; -size(#sbf{size=Size}) -> Size. - -%% Returns capacity -%% -capacity(#bloom{n=N}) -> N; -capacity(#sbf{}) -> infinity. - -%% Test for membership -%% -member(Elem, #bloom{mb=Mb}=B) -> - Hashes = make_hashes(Mb, Elem), - hash_member(Hashes, B); -member(Elem, #sbf{b=[H|_]}=Sbf) -> - Hashes = make_hashes(H#bloom.mb, Elem), - hash_member(Hashes, Sbf). - -hash_member(Hashes, #bloom{mb=Mb, a=A}) -> - Mask = 1 bsl Mb -1, - {I1, I0} = make_indexes(Mask, Hashes), - all_set(Mask, I1, I0, A); -hash_member(Hashes, #sbf{b=B}) -> - lists:any(fun(X) -> hash_member(Hashes, X) end, B). - -make_hashes(Mb, E) when Mb =< 16 -> - erlang:phash2({E}, 1 bsl 32); -make_hashes(Mb, E) when Mb =< 32 -> - {erlang:phash2({E}, 1 bsl 32), erlang:phash2([E], 1 bsl 32)}. - -make_indexes(Mask, {H0, H1}) when Mask > 1 bsl 16 -> masked_pair(Mask, H0, H1); -make_indexes(Mask, {H0, _}) -> make_indexes(Mask, H0); -make_indexes(Mask, H0) -> masked_pair(Mask, H0 bsr 16, H0). - -masked_pair(Mask, X, Y) -> {X band Mask, Y band Mask}. - -all_set(_Mask, _I1, _I, []) -> true; -all_set(Mask, I1, I, [H|T]) -> - case bitarray_get(I, H) of - true -> all_set(Mask, I1, (I+I1) band Mask, T); - false -> false - end. - -%% Adds element to set -%% -add(Elem, #bloom{mb=Mb} = B) -> - Hashes = make_hashes(Mb, Elem), - hash_add(Hashes, B); -add(Elem, #sbf{size=Size, r=R, s=S, b=[H|T]=Bs}=Sbf) -> - #bloom{mb=Mb, e=E, n=N, size=HSize} = H, - Hashes = make_hashes(Mb, Elem), - case hash_member(Hashes, Sbf) of - true -> Sbf; - false -> - case HSize < N of - true -> Sbf#sbf{size=Size+1, b=[hash_add(Hashes, H)|T]}; - false -> - B = add(Elem, bloom(bits, Mb + S, E * R)), - Sbf#sbf{size=Size+1, b=[B|Bs]} - end - end. - -hash_add(Hashes, #bloom{mb=Mb, a=A, size=Size} = B) -> - Mask = 1 bsl Mb -1, - {I1, I0} = make_indexes(Mask, Hashes), - case all_set(Mask, I1, I0, A) of - true -> B; - false -> B#bloom{size=Size+1, a=set_bits(Mask, I1, I0, A, [])} - end. - -set_bits(_Mask, _I1, _I, [], Acc) -> lists:reverse(Acc); -set_bits(Mask, I1, I, [H|T], Acc) -> - set_bits(Mask, I1, (I+I1) band Mask, T, [bitarray_set(I, H) | Acc]). - -bitarray_new(N) -> array:new((N-1) div ?W + 1, {default, 0}). - -bitarray_set(I, A) -> - AI = I div ?W, - V = array:get(AI, A), - V1 = V bor (1 bsl (I rem ?W)), - array:set(AI, V1, A). - -bitarray_get(I, A) -> - AI = I div ?W, - V = array:get(AI, A), - V band (1 bsl (I rem ?W)) =/= 0. - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - -simple_shuffle(L, N) -> - lists:sublist(simple_shuffle(L), 1, N). -simple_shuffle(L) -> - N = 1000 * length(L), - L2 = [{rand:uniform(N), E} || E <- L], - {_, L3} = lists:unzip(lists:keysort(1, L2)), - L3. - -fixed_case_test_() -> - {timeout, 100, fun() -> fixed_case(bloom(5000), 5000, 0.001) end}. - -fixed_case(Bloom, Size, FalseRate) -> - ?assert(bloom:capacity(Bloom) > Size), - ?assertEqual(0, bloom:size(Bloom)), - RandomList = simple_shuffle(lists:seq(1,100*Size), Size), - [?assertEqual(false, bloom:is_element(E, Bloom)) || E <- RandomList], - Bloom2 = - lists:foldl(fun(E, Bloom0) -> - bloom:add_element(E, Bloom0) - end, Bloom, RandomList), - [?assertEqual(true, bloom:is_element(E, Bloom2)) || E <- RandomList], - - ?assert(bloom:size(Bloom2) > ((1-FalseRate)*Size)), - ok. - -scalable_case(Bloom, Size, FalseRate) -> - ?assertEqual(infinity, bloom:capacity(Bloom)), - ?assertEqual(0, bloom:size(Bloom)), - RandomList = simple_shuffle(lists:seq(1,100*Size), 10*Size), - [?assertEqual(false, bloom:is_element(E, Bloom)) || E <- RandomList], - Bloom2 = - lists:foldl(fun(E, Bloom0) -> - bloom:add_element(E, Bloom0) - end, Bloom, RandomList), - [?assertEqual(true, bloom:is_element(E, Bloom2)) || E <- RandomList], - ?assert(bloom:size(Bloom2) > ((1-FalseRate)*Size)), - ok. - -bloom_test() -> - scalable_case(sbf(1000, 0.2), 1000, 0.2), - ok. - --endif. diff --git a/src/chash.erl b/src/chash.erl deleted file mode 100644 index b77649372..000000000 --- a/src/chash.erl +++ /dev/null @@ -1,272 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% 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. - --ifndef(old_hash). -sha(Bin) -> - crypto:hash(sha, Bin). --else. -sha(Bin) -> - crypto:sha(Bin). --endif. - -%% @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 deleted file mode 100644 index 13ef4d1dd..000000000 --- a/src/chashbin.erl +++ /dev/null @@ -1,274 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% 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 --define(UNIT, 176). --define(ENTRY, binary-unit:?UNIT). - --type owners_bin() :: <<_:_*?UNIT>>. --type index() :: chash:index_as_int(). --type pred_fun() :: fun(({index(), node()}) -> boolean()). --type chash_key() :: index() | chash:index(). - --record(chashbin, {size :: pos_integer(), - owners :: owners_bin(), - nodes :: tuple()}). - --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:?UNIT, 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/?ENTRY, Bin2:N/?ENTRY, _/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}. - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - -basic_test_() -> - {spawn, - {timeout, 120, - fun() -> - [basic_test_body(Size, NumNodes) - || Size <- [8, 16, 32, 64, 128], - NumNodes <- [1, 2, 3, 4, 5, 8, Size div 2, Size]] - end - }}. - -basic_test_body(Size, NumNodes) -> - RingTop = 1 bsl 160, - Ring = riak_core_test_util:fake_ring(Size, NumNodes), - CHash = riak_core_ring:chash(Ring), - CHBin = create(CHash), - Inc = chash:ring_increment(Size), - Owners = riak_core_ring:all_owners(Ring), - {Indices, _} = lists:unzip(Owners), - HashKeys = [<> || X <- lists:seq(0, RingTop, Inc div 4)], - ?assertEqual(CHash, to_chash(CHBin)), - ?assertEqual(riak_core_ring:all_owners(Ring), to_list(CHBin)), - ?assertEqual(riak_core_ring:num_partitions(Ring), num_partitions(CHBin)), - [?assertEqual(riak_core_ring:index_owner(Ring, Idx), index_owner(Idx, CHBin)) - || Idx <- Indices], - [begin - ?assertEqual(riak_core_ring:responsible_index(HashKey, Ring), - responsible_index(HashKey, CHBin)), - Itr = iterator(HashKey, CHBin), - {Idx, Owner} = itr_value(Itr), - ?assertEqual(responsible_index(HashKey, CHBin), Idx), - ?assertEqual(index_owner(Idx, CHBin), Owner), - ?assertEqual(lists:keyfind(Idx, 1, Owners), {Idx,Owner}), - ItrTests = min(Size-1, 10), - lists:foldl(fun(_, {LastIdx, LastItr}) -> - ExpectedIdx = (LastIdx + Inc) rem RingTop, - NextItr = itr_next(LastItr), - {NextIdx, _} = itr_value(NextItr), - ?assertEqual(ExpectedIdx, NextIdx), - {ExpectedIdx, NextItr} - end, {Idx, Itr}, lists:seq(1,ItrTests)), - [begin - ExpectedPL = lists:sublist(riak_core_ring:preflist(HashKey, Ring), N), - {PL, Itr2} = itr_pop(N, Itr), - ?assertEqual(ExpectedPL, PL), - ExpectedIdx2 = (Idx + (Inc * N)) rem RingTop, - {Idx2, _} = itr_value(Itr2), - ?assertEqual(ExpectedIdx2, Idx2), - ok - end || N <- [1, 2, 3, 4, Size div 2, Size]], - ok - end || HashKey <- HashKeys], - ok. - --endif. diff --git a/src/dvvset.erl b/src/dvvset.erl deleted file mode 100644 index dabb5f106..000000000 --- a/src/dvvset.erl +++ /dev/null @@ -1,460 +0,0 @@ -%%------------------------------------------------------------------- -%% -%% File: dvvset.erl -%% -%% @author Ricardo Tomé Gonçalves -%% @author Paulo Sérgio Almeida -% -%% @copyright The MIT License (MIT) -%% Copyright (C) 2013 -%% -%% Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -%% associated documentation files (the "Software"), to deal in the Software without restriction, -%% including without limitation the rights to use, copy, modify, merge, publish, distribute, -%% sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -%% furnished to do so, subject to the following conditions: -%% -%% The above copyright notice and this permission notice shall be included in all copies or -%% substantial portions of the Software. -%% -%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -%% BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -%% DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -%% -%% @doc -%% An Erlang implementation of *compact* Dotted Version Vectors, which -%% provides a container for a set of concurrent values (siblings) with causal -%% order information. -%% -%% For further reading, visit the -%% github page. -%% @end -%% -%% @reference -%% -%% Dotted Version Vectors: Logical Clocks for Optimistic Replication -%% -%% @end -%% -%%------------------------------------------------------------------- --module(dvvset). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - --export([new/1, - new/2, - sync/1, - join/1, - update/2, - update/3, - size/1, - ids/1, - values/1, - equal/2, - less/2, - map/2, - last/2, - lww/2, - reconcile/2 - ]). - --export_type([clock/0, vector/0, id/0, value/0]). - -% % @doc -%% STRUCTURE details: -%% * entries() are sorted by id() -%% * each counter() also includes the number of values in that id() -%% * the values in each triple of entries() are causally ordered and each new value goes to the head of the list - --type clock() :: {entries(), values()}. --type vector() :: [{id(), counter()}]. --type entries() :: [{id(), counter(), values()}]. --type id() :: any(). --type values() :: [value()]. --type value() :: any(). --type counter() :: non_neg_integer(). - - -%% @doc Constructs a new clock set without causal history, -%% and receives a list of values that gos to the anonymous list. --spec new(value() | [value()]) -> clock(). -new(Vs) when is_list(Vs) -> {[], Vs}; -new(V) -> {[], [V]}. - -%% @doc Constructs a new clock set with the causal history -%% of the given version vector / vector clock, -%% and receives a list of values that gos to the anonymous list. -%% The version vector SHOULD BE a direct result of join/1. --spec new(vector(), value() | [value()]) -> clock(). -new(VV, Vs) when is_list(Vs) -> - VVS = lists:sort(VV), % defense against non-order preserving serialization - {[{I, N, []} || {I, N} <- VVS], Vs}; -new(VV, V) -> new(VV, [V]). - -%% @doc Synchronizes a list of clocks using sync/2. -%% It discards (causally) outdated values, -%% while merging all causal histories. --spec sync([clock()]) -> clock(). -sync(L) -> lists:foldl(fun sync/2, {}, L). - -%% Private function --spec sync(clock(), clock()) -> clock(). -sync({}, C) -> C; -sync(C ,{}) -> C; -sync(C1={E1,V1},C2={E2,V2}) -> - V = case less(C1,C2) of - true -> V2; % C1 < C2 => return V2 - false -> case less(C2,C1) of - true -> V1; % C2 < C1 => return V1 - false -> % keep all unique anonymous values and sync entries() - sets:to_list(sets:from_list(V1++V2)) - end - end, - {sync2(E1,E2),V}. - -%% Private function --spec sync2(entries(), entries()) -> entries(). -sync2([], C) -> C; -sync2(C, []) -> C; -sync2([{I1, N1, L1}=H1 | T1]=C1, [{I2, N2, L2}=H2 | T2]=C2) -> - if - I1 < I2 -> [H1 | sync2(T1, C2)]; - I1 > I2 -> [H2 | sync2(T2, C1)]; - true -> [merge(I1, N1, L1, N2, L2) | sync2(T1, T2)] - end. - -%% Private function --spec merge(id(), counter(), values(), counter(), values()) -> {id(), counter(), values()}. -merge(I, N1, L1, N2, L2) -> - LL1 = length(L1), - LL2 = length(L2), - case N1 >= N2 of - true -> - case N1 - LL1 >= N2 - LL2 of - true -> {I, N1, L1}; - false -> {I, N1, lists:sublist(L1, N1 - N2 + LL2)} - end; - false -> - case N2 - LL2 >= N1 - LL1 of - true -> {I, N2, L2}; - false -> {I, N2, lists:sublist(L2, N2 - N1 + LL1)} - end - end. - - -%% @doc Return a version vector that represents the causal history. --spec join(clock()) -> vector(). -join({C,_}) -> [{I, N} || {I, N, _} <- C]. - -%% @doc Advances the causal history with the given id. -%% The new value is the *anonymous dot* of the clock. -%% The client clock SHOULD BE a direct result of new/2. --spec update(clock(), id()) -> clock(). -update({C,[V]}, I) -> {event(C, I, V), []}. - -%% @doc Advances the causal history of the -%% first clock with the given id, while synchronizing -%% with the second clock, thus the new clock is -%% causally newer than both clocks in the argument. -%% The new value is the *anonymous dot* of the clock. -%% The first clock SHOULD BE a direct result of new/2, -%% which is intended to be the client clock with -%% the new value in the *anonymous dot* while -%% the second clock is from the local server. --spec update(clock(), clock(), id()) -> clock(). -update({Cc,[V]}, Cr, I) -> - %% Sync both clocks without the new value - {C,Vs} = sync({Cc,[]}, Cr), - %% We create a new event on the synced causal history, - %% with the id I and the new value. - %% The anonymous values that were synced still remain. - {event(C, I, V), Vs}. - -%% Private function --spec event(entries(), id(), value()) -> entries(). -event([], I, V) -> [{I, 1, [V]}]; -event([{I, N, L} | T], I, V) -> [{I, N+1, [V | L]} | T]; -event([{I1, _, _} | _]=C, I, V) when I1 > I -> [{I, 1, [V]} | C]; -event([H | T], I, V) -> [H | event(T, I, V)]. - -%% @doc Returns the total number of values in this clock set. --spec size(clock()) -> non_neg_integer(). -size({C,Vs}) -> lists:sum([length(L) || {_,_,L} <- C]) + length(Vs). - -%% @doc Returns all the ids used in this clock set. --spec ids(clock()) -> [id()]. -ids({C,_}) -> ([I || {I,_,_} <- C]). - -%% @doc Returns all the values used in this clock set, -%% including the anonymous values. --spec values(clock()) -> [value()]. -values({C,Vs}) -> Vs ++ lists:append([L || {_,_,L} <- C]). - -%% @doc Compares the equality of both clocks, regarding -%% only the causal histories, thus ignoring the values. --spec equal(clock() | vector(), clock() | vector()) -> boolean(). -equal({C1,_},{C2,_}) -> equal2(C1,C2); % DVVSet -equal(C1,C2) when is_list(C1) and is_list(C2) -> equal2(C1,C2). %vector clocks - -%% Private function --spec equal2(vector(), vector()) -> boolean(). -equal2([], []) -> true; -equal2([{I, C, L1} | T1], [{I, C, L2} | T2]) - when length(L1) =:= length(L2) -> - equal2(T1, T2); -equal2(_, _) -> false. - -%% @doc Returns True if the first clock is causally older than -%% the second clock, thus values on the first clock are outdated. -%% Returns False otherwise. --spec less(clock(), clock()) -> boolean(). -less({C1,_}, {C2,_}) -> greater(C2, C1, false). - -%% Private function --spec greater(vector(), vector(), boolean()) -> boolean(). -greater([], [], Strict) -> Strict; -greater([_|_], [], _) -> true; -greater([], [_|_], _) -> false; -greater([{I, N1, _} | T1], [{I, N2, _} | T2], Strict) -> - if - N1 == N2 -> greater(T1, T2, Strict); - N1 > N2 -> greater(T1, T2, true); - N1 < N2 -> false - end; -greater([{I1, _, _} | T1], [{I2, _, _} | _]=C2, _) when I1 < I2 -> greater(T1, C2, true); -greater(_, _, _) -> false. - -%% @doc Maps (applies) a function on all values in this clock set, -%% returning the same clock set with the updated values. --spec map(fun((value()) -> value()), clock()) -> clock(). -map(F, {C,Vs}) -> - {[ {I, N, lists:map(F, V)} || {I, N, V} <- C], lists:map(F, Vs)}. - - -%% @doc Return a clock with the same causal history, but with only one -%% value in the anonymous placeholder. This value is the result of -%% the function F, which takes all values and returns a single new value. --spec reconcile(Winner::fun(([value()]) -> value()), clock()) -> clock(). -reconcile(F, C) -> - V = F(values(C)), - new(join(C),[V]). - -%% @doc Returns the latest value in the clock set, -%% according to function F(A,B), which returns *true* if -%% A compares less than or equal to B, false otherwise. --spec last(LessOrEqual::fun((value(),value()) -> boolean()), clock()) -> value(). -last(F, C) -> - {_ ,_ , V2} = find_entry(F, C), - V2. - -%% @doc Return a clock with the same causal history, but with only one -%% value in its original position. This value is the newest value -%% in the given clock, according to function F(A,B), which returns *true* -%% if A compares less than or equal to B, false otherwise. --spec lww(LessOrEqual::fun((value(),value()) -> boolean()), clock()) -> clock(). -lww(F, C={E,_}) -> - case find_entry(F, C) of - {id, I, V} -> {join_and_replace(I, V, E),[]}; - {anonym, _, V} -> new(join(C),[V]) - end. - -%% find_entry/2 - Private function -find_entry(F, {[], [V|T]}) -> find_entry(F, null, V, {[],T}, anonym); -find_entry(F, {[{_, _, []} | T], Vs}) -> find_entry(F, {T,Vs}); -find_entry(F, {[{I, _, [V|_]} | T], Vs}) -> find_entry(F, I, V, {T,Vs}, id). - -%% find_entry/5 - Private function -find_entry(F, I, V, C, Flag) -> - Fun = fun (A,B) -> - case F(A,B) of - false -> {left,A}; % A is newer than B - true -> {right,B} % A is older than B - end - end, - find_entry2(Fun, I, V, C, Flag). - -%% find_entry2/5 - Private function -find_entry2(_, I, V, {[], []}, anonym) -> {anonym, I , V}; -find_entry2(_, I, V, {[], []}, id) -> {id, I, V}; -find_entry2(F, I, V, {[], [V1 | T]}, Flag) -> - case F(V, V1) of - {left,V2} -> find_entry2(F, I, V2, {[],T}, Flag); - {right,V2} -> find_entry2(F, I, V2, {[],T}, anonym) - end; -find_entry2(F, I, V, {[{_, _, []} | T], Vs}, Flag) -> find_entry2(F, I, V, {T, Vs}, Flag); -find_entry2(F, I, V, {[{I1, _, [V1|_]} | T], Vs}, Flag) -> - case F(V, V1) of - {left,V2} -> find_entry2(F, I, V2, {T, Vs}, Flag); - {right,V2} -> find_entry2(F, I1, V2, {T, Vs}, Flag) - end. - -%% Private function -join_and_replace(Ir, V, C) -> - [if - I == Ir -> {I, N, [V]}; - true -> {I, N, []} - end - || {I, N, _} <- C]. - - -%% =================================================================== -%% EUnit tests -%% =================================================================== --ifdef(TEST). - - -join_test() -> - A = new([v1]), - A1 = update(A,a), - B = new(join(A1),[v2]), - B1 = update(B, A1, b), - ?assertEqual( join(A) , [] ), - ?assertEqual( join(A1) , [{a,1}] ), - ?assertEqual( join(B1) , [{a,1},{b,1}] ), - ok. - -update_test() -> - A0 = update(new([v1]),a), - A1 = update(new(join(A0),[v2]), A0, a), - A2 = update(new(join(A1),[v3]), A1, b), - A3 = update(new(join(A0),[v4]), A1, b), - A4 = update(new(join(A0),[v5]), A1, a), - ?assertEqual( A0 , {[{a,1,[v1]}],[]} ), - ?assertEqual( A1 , {[{a,2,[v2]}],[]} ), - ?assertEqual( A2 , {[{a,2,[]}, {b,1,[v3]}],[]} ), - ?assertEqual( A3 , {[{a,2,[v2]}, {b,1,[v4]}],[]} ), - ?assertEqual( A4 , {[{a,3,[v5,v2]}],[]} ), - ok. - -sync_test() -> - X = {[{x,1,[]}],[]}, - A = update(new([v1]),a), - Y = update(new([v2]),b), - A1 = update(new(join(A),[v2]), a), - A3 = update(new(join(A1),[v3]), b), - A4 = update(new(join(A1),[v3]), c), - F = fun (L,R) -> L>R end, - W = {[{a,1,[]}],[]}, - Z = {[{a,2,[v2,v1]}],[]}, - ?assertEqual( sync([W,Z]) , {[{a,2,[v2]}],[]} ), - ?assertEqual( sync([W,Z]) , sync([Z,W]) ), - ?assertEqual( sync([A,A1]) , sync([A1,A]) ), - ?assertEqual( sync([A4,A3]) , sync([A3,A4]) ), - ?assertEqual( sync([A4,A3]) , {[{a,2,[]}, {b,1,[v3]}, {c,1,[v3]}],[]} ), - ?assertEqual( sync([X,A]) , {[{a,1,[v1]},{x,1,[]}],[]} ), - ?assertEqual( sync([X,A]) , sync([A,X]) ), - ?assertEqual( sync([X,A]) , sync([A,X]) ), - ?assertEqual( sync([A,Y]) , {[{a,1,[v1]},{b,1,[v2]}],[]} ), - ?assertEqual( sync([Y,A]) , sync([A,Y]) ), - ?assertEqual( sync([Y,A]) , sync([A,Y]) ), - ?assertEqual( sync([A,X]) , sync([X,A]) ), - ?assertEqual( lww(F,A4) , sync([A4,lww(F,A4)]) ), - ok. - -syn_update_test() -> - A0 = update(new([v1]), a), % Mary writes v1 w/o VV - VV1 = join(A0), % Peter reads v1 with version vector (VV) - A1 = update(new([v2]), A0, a), % Mary writes v2 w/o VV - A2 = update(new(VV1,[v3]), A1, a), % Peter writes v3 with VV from v1 - ?assertEqual( VV1 , [{a,1}] ), - ?assertEqual( A0 , {[{a,1,[v1]}],[]} ), - ?assertEqual( A1 , {[{a,2,[v2,v1]}],[]} ), - %% now A2 should only have v2 and v3, since v3 was causally newer than v1 - ?assertEqual( A2 , {[{a,3,[v3,v2]}],[]} ), - ok. - -event_test() -> - {A,_} = update(new([v1]),a), - ?assertEqual( event(A,a,v2) , [{a,2,[v2,v1]}] ), - ?assertEqual( event(A,b,v2) , [{a,1,[v1]}, {b,1,[v2]}] ), - ok. - -lww_last_test() -> - F = fun (A,B) -> A =< B end, - F2 = fun ({_,TS1}, {_,TS2}) -> TS1 =< TS2 end, - X = {[{a,4,[5,2]},{b,1,[]},{c,1,[3]}],[]}, - Y = {[{a,4,[5,2]},{b,1,[]},{c,1,[3]}],[10,0]}, - Z = {[{a,4,[5,2]}, {b,1,[1]}], [3]}, - A = {[{a,4,[{5, 1002345}, {7, 1002340}]}, {b,1,[{4, 1001340}]}], [{2, 1001140}]}, - ?assertEqual( last(F,X) , 5 ), - ?assertEqual( last(F,Y) , 10 ), - ?assertEqual( lww(F,X) , {[{a,4,[5]},{b,1,[]},{c,1,[]}],[]} ), - ?assertEqual( lww(F,Y) , {[{a,4,[]},{b,1,[]},{c,1,[]}],[10]} ), - ?assertEqual( lww(F,Z) , {[{a,4,[5]},{b,1,[]}],[]} ), - ?assertEqual( lww(F2,A) , {[{a,4,[{5, 1002345}]}, {b,1,[]}], []} ), - ok. - -reconcile_test() -> - F1 = fun (L) -> lists:sum(L) end, - F2 = fun (L) -> hd(lists:sort(L)) end, - X = {[{a,4,[5,2]},{b,1,[]},{c,1,[3]}],[]}, - Y = {[{a,4,[5,2]},{b,1,[]},{c,1,[3]}],[10,0]}, - ?assertEqual( reconcile(F1,X) , {[{a,4,[]},{b,1,[]},{c,1,[]}],[10]} ), - ?assertEqual( reconcile(F1,Y) , {[{a,4,[]},{b,1,[]},{c,1,[]}],[20]} ), - ?assertEqual( reconcile(F2,X) , {[{a,4,[]},{b,1,[]},{c,1,[]}],[2]} ), - ?assertEqual( reconcile(F2,Y) , {[{a,4,[]},{b,1,[]},{c,1,[]}],[0]} ), - ok. - -less_test() -> - A = update(new(v1),[a]), - B = update(new(join(A),[v2]), a), - B2 = update(new(join(A),[v2]), b), - B3 = update(new(join(A),[v2]), z), - C = update(new(join(B),[v3]), A, c), - D = update(new(join(C),[v4]), B2, d), - ?assert( less(A,B) ), - ?assert( less(A,C) ), - ?assert( less(B,C) ), - ?assert( less(B,D) ), - ?assert( less(B2,D) ), - ?assert( less(A,D) ), - ?assertNot( less(B2,C) ), - ?assertNot( less(B,B2) ), - ?assertNot( less(B2,B) ), - ?assertNot( less(A,A) ), - ?assertNot( less(C,C) ), - ?assertNot( less(D,B2) ), - ?assertNot( less(B3,D) ), - ok. - -equal_test() -> - A = {[{a,4,[v5,v0]},{b,0,[]},{c,1,[v3]}], [v0]}, - B = {[{a,4,[v555,v0]}, {b,0,[]}, {c,1,[v3]}], []}, - C = {[{a,4,[v5,v0]},{b,0,[]}], [v6,v1]}, - % compare only the causal history - ?assert( equal(A,B) ), - ?assert( equal(B,A) ), - ?assertNot( equal(A,C) ), - ?assertNot( equal(B,C) ), - ok. - -size_test() -> - ?assertEqual( 1 , ?MODULE:size(new([v1])) ), - ?assertEqual( 5 , ?MODULE:size({[{a,4,[v5,v0]},{b,0,[]},{c,1,[v3]}],[v4,v1]}) ), - ok. - -ids_values_test() -> - A = {[{a,4,[v0,v5]},{b,0,[]},{c,1,[v3]}], [v1]}, - B = {[{a,4,[v0,v555]}, {b,0,[]}, {c,1,[v3]}], []}, - C = {[{a,4,[]},{b,0,[]}], [v1,v6]}, - ?assertEqual( ids(A) , [a,b,c] ), - ?assertEqual( ids(B) , [a,b,c] ), - ?assertEqual( ids(C) , [a,b] ), - ?assertEqual( lists:sort(values(A)) , [v0,v1,v3,v5] ), - ?assertEqual( lists:sort(values(B)) , [v0,v3,v555] ), - ?assertEqual( lists:sort(values(C)) , [v1,v6] ), - ok. - -map_test() -> - A = {[{a,4,[]},{b,0,[]},{c,1,[]}],[10]}, - B = {[{a,4,[5,0]},{b,0,[]},{c,1,[2]}],[20,10]}, - F = fun (X) -> X*2 end, - ?assertEqual( map(F,A) , {[{a,4,[]},{b,0,[]},{c,1,[]}],[20]} ), - ?assertEqual( map(F,B) , {[{a,4,[10,0]},{b,0,[]},{c,1,[4]}],[40,20]} ), - ok. - --endif. diff --git a/src/gen_nb_server.erl b/src/gen_nb_server.erl index 863e9f897..caf855f6e 100644 --- a/src/gen_nb_server.erl +++ b/src/gen_nb_server.erl @@ -31,8 +31,6 @@ -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). --include_lib("kernel/include/logger.hrl"). - -define(SERVER, ?MODULE). -record(state, {cb, @@ -177,6 +175,6 @@ listen_on(CallbackModule, IpAddrStr, Port) -> {ok, IpAddr} -> listen_on(CallbackModule, IpAddr, Port); Err -> - ?LOG_CRITICAL("Cannot start listener for ~p on invalid address ~p:~p", [CallbackModule, IpAddrStr, Port]), + logger:critical("Cannot start listener for ~p on invalid address ~p:~p", [CallbackModule, IpAddrStr, Port]), Err end. diff --git a/src/hashtree.erl b/src/hashtree.erl deleted file mode 100644 index 1a430b3c6..000000000 --- a/src/hashtree.erl +++ /dev/null @@ -1,1694 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2012-2015 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 -%% This module implements a persistent, on-disk hash tree that is used -%% predominately for active anti-entropy exchange in Riak. The tree consists -%% of two parts, a set of unbounded on-disk segments and a fixed size hash -%% tree (that may be on-disk or in-memory) constructed over these segments. -%% -%% A graphical description of this design can be found in: docs/hashtree.md -%% -%% Each segment logically represents an on-disk list of (key, hash) pairs. -%% Whereas the hash tree is represented as a set of levels and buckets, with a -%% fixed width (or fan-out) between levels that determines how many buckets of -%% a child level are grouped together and hashed to represent a bucket at the -%% parent level. Each leaf in the tree corresponds to a hash of one of the -%% on-disk segments. For example, a tree with a width of 4 and 16 segments -%% would look like the following: -%% -%% level buckets -%% 1: [0] -%% 2: [0 1 2 3] -%% 3: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] -%% -%% With each bucket entry of the form ``{bucket-id, hash}'', eg. ``{0, -%% binary()}''. The hash for each of the entries at level 3 would come from -%% one of the 16 segments, while the hashes for entries at level 1 and 2 are -%% derived from the lower levels. -%% -%% Specifically, the bucket entries in level 2 would come from level 3: -%% 0: hash([ 0 1 2 3]) -%% 1: hash([ 4 5 6 7]) -%% 2: hash([ 8 9 10 11]) -%% 3: hash([12 13 14 15]) -%% -%% And the bucket entries in level 1 would come from level 2: -%% 1: hash([hash([ 0 1 2 3]) -%% hash([ 4 5 6 7]) -%% hash([ 8 9 10 11]) -%% hash([12 13 14 15])]) -%% -%% When a (key, hash) pair is added to the tree, the key is hashed to -%% determine which segment it belongs to and inserted/upserted into the -%% segment. Rather than update the hash tree on every insert, a dirty bit is -%% set to note that a given segment has changed. The hashes are then updated -%% in bulk before performing a tree exchange -%% -%% To update the hash tree, the code iterates over each dirty segment, -%% building a list of (key, hash) pairs. A hash is computed over this list, -%% and the leaf node in the hash tree corresponding to the given segment is -%% updated. After iterating over all dirty segments, and thus updating all -%% leaf nodes, the update then continues to update the tree bottom-up, -%% updating only paths that have changed. As designed, the update requires a -%% single sparse scan over the on-disk segments and a minimal traversal up the -%% hash tree. -%% -%% The heavy-lifting of this module is provided by LevelDB. What is logically -%% viewed as sorted on-disk segments is in reality a range of on-disk -%% (segment, key, hash) values written to LevelDB. Each insert of a (key, -%% hash) pair therefore corresponds to a single LevelDB write (no read -%% necessary). Likewise, the update operation is performed using LevelDB -%% iterators. -%% -%% When used for active anti-entropy in Riak, the hash tree is built once and -%% then updated in real-time as writes occur. A key design goal is to ensure -%% that adding (key, hash) pairs to the tree is non-blocking, even during a -%% tree update or a tree exchange. This is accomplished using LevelDB -%% snapshots. Inserts into the tree always write directly to the active -%% LevelDB instance, however updates and exchanges operate over a snapshot of -%% the tree. -%% -%% In order to improve performance, writes are buffered in memory and sent -%% to LevelDB using a single batch write. Writes are flushed whenever the -%% buffer becomes full, as well as before updating the hashtree. -%% -%% Tree exchange is provided by the ``compare/4'' function. -%% The behavior of this function is determined through a provided function -%% that implements logic to get buckets and segments for a given remote tree, -%% as well as a callback invoked as key differences are determined. This -%% generic interface allows for tree exchange to be implemented in a variety -%% of ways, including directly against to local hash tree instances, over -%% distributed Erlang, or over a custom protocol over a TCP socket. See -%% ``local_compare/2'' and ``do_remote/1'' for examples (-ifdef(TEST) only). - --module(hashtree). --export([new/0, - new/2, - new/3, - insert/3, - insert/4, - estimate_keys/1, - delete/2, - update_tree/1, - update_snapshot/1, - update_perform/1, - rehash_tree/1, - flush_buffer/1, - close/1, - destroy/1, - read_meta/2, - write_meta/3, - compare/4, - top_hash/1, - get_bucket/3, - key_hashes/2, - levels/1, - segments/1, - width/1, - mem_levels/1, - path/1, - next_rebuild/1, - set_next_rebuild/2, - mark_open_empty/2, - mark_open_and_check/2, - mark_clean_close/2]). --export([compare2/4]). --export([multi_select_segment/3, safe_decode/1]). - --include_lib("kernel/include/logger.hrl"). - --ifdef(namespaced_types). --type hashtree_dict() :: dict:dict(). --type hashtree_array() :: array:array(). --else. --type hashtree_dict() :: dict(). --type hashtree_array() :: array(). --endif. - --define(ALL_SEGMENTS, ['*', '*']). --define(BIN_TO_INT(B), list_to_integer(binary_to_list(B))). - --ifdef(TEST). --export([fake_close/1, local_compare/2, local_compare1/2]). --export([run_local/0, - run_local/1, - run_concurrent_build/0, - run_concurrent_build/1, - run_concurrent_build/2, - run_multiple/2, - run_remote/0, - run_remote/1]). - --ifdef(EQC). --export([prop_correct/0, prop_sha/0, prop_est/0]). --include_lib("eqc/include/eqc.hrl"). --endif. - --include_lib("eunit/include/eunit.hrl"). --endif. %% TEST - --define(NUM_SEGMENTS, (1024*1024)). --define(WIDTH, 1024). --define(MEM_LEVELS, 0). - --define(NUM_KEYS_REQUIRED, 1000). - --type tree_id_bin() :: <<_:176>>. --type segment_bin() :: <<_:256, _:_*8>>. --type bucket_bin() :: <<_:320>>. --type meta_bin() :: <<_:8, _:_*8>>. - --type proplist() :: proplists:proplist(). --type orddict() :: orddict:orddict(). --type index() :: non_neg_integer(). --type index_n() :: {index(), pos_integer()}. - --type keydiff() :: {missing | remote_missing | different, binary()}. - --type remote_fun() :: fun((get_bucket | key_hashes | start_exchange_level | - start_exchange_segments | init | final, - {integer(), integer()} | integer() | term()) -> any()). - --type acc_fun(Acc) :: fun(([keydiff()], Acc) -> Acc). - --type select_fun(T) :: fun((orddict()) -> T). - --type next_rebuild() :: full | incremental. - --record(state, {id :: tree_id_bin(), - index :: index(), - levels :: pos_integer(), - segments :: pos_integer(), - width :: pos_integer(), - mem_levels :: integer(), - tree :: hashtree_dict(), - ref :: term(), - path :: string(), - itr :: term(), - next_rebuild :: next_rebuild(), - write_buffer :: [{put, binary(), binary()} | - {delete, binary()}], - write_buffer_count :: integer(), - dirty_segments :: hashtree_array() - }). - --record(itr_state, {itr :: term(), - id :: tree_id_bin(), - current_segment :: '*' | integer(), - remaining_segments :: ['*' | integer()], - acc_fun :: fun(([{binary(),binary()}]) -> any()), - segment_acc :: [{binary(), binary()}], - final_acc :: [{integer(), any()}], - prefetch=false :: boolean() - }). - --opaque hashtree() :: #state{}. --export_type([hashtree/0, - tree_id_bin/0, - keydiff/0, - remote_fun/0, - acc_fun/1]). - -%%%=================================================================== -%%% API -%%%=================================================================== - --spec new() -> hashtree(). -new() -> - new({0,0}). - --spec new({index(), tree_id_bin() | non_neg_integer()}) -> hashtree(). -new(TreeId) -> - {DB, Path} = new_segment_store([]), - new(TreeId, DB, Path, []). - --spec new({index(), tree_id_bin() | non_neg_integer()}, proplist()) -> hashtree(); - ({index(), tree_id_bin() | non_neg_integer()}, hashtree()) -> hashtree(). -new(TreeId, Options) when is_list(Options) -> - {DB, Path} = new_segment_store(Options), - new(TreeId, DB, Path, Options); -new(TreeId, LinkedStore = #state{}) -> - new(TreeId, LinkedStore, []). - --spec new({index(), tree_id_bin() | non_neg_integer()}, - hashtree(), proplist()) -> hashtree(). -new(TreeId, LinkedStore, Options) -> - new(TreeId, LinkedStore#state.ref, LinkedStore#state.path, Options). - --spec new({index(), tree_id_bin() | non_neg_integer()}, - term(), string(), - proplist()) -> hashtree(). -new({Index,TreeId}, DB, Path, Options) -> - NumSegments = proplists:get_value(segments, Options, ?NUM_SEGMENTS), - Width = proplists:get_value(width, Options, ?WIDTH), - MemLevels = proplists:get_value(mem_levels, Options, ?MEM_LEVELS), - NumLevels = erlang:trunc(math:log(NumSegments) / math:log(Width)) + 1, - #state{id=encode_id(TreeId), - index=Index, - levels=NumLevels, - segments=NumSegments, - width=Width, - mem_levels=MemLevels, - %% dirty_segments=gb_sets:new(), - dirty_segments=bitarray_new(NumSegments), - next_rebuild=full, - write_buffer=[], - write_buffer_count=0, - tree=dict:new(), - ref = DB, - path = Path}. - --spec close(hashtree()) -> hashtree(). -close(State) -> - close_iterator(State#state.itr), - catch eleveldb:close(State#state.ref), - State#state{itr=undefined}. - -close_iterator(Itr) -> - try - eleveldb:iterator_close(Itr) - catch - _:_ -> - ok - end. - --spec destroy(string() | hashtree()) -> ok | hashtree(). -destroy(Path) when is_list(Path) -> - ok = eleveldb:destroy(Path, []); -destroy(State) -> - %% Assumption: close was already called on all hashtrees that - %% use this LevelDB instance, - ok = eleveldb:destroy(State#state.path, []), - State. - --spec insert(binary(), binary(), hashtree()) -> hashtree(). -insert(Key, ObjHash, State) -> - insert(Key, ObjHash, State, []). - --spec insert(binary(), binary(), hashtree(), proplist()) -> hashtree(). -insert(Key, ObjHash, State, Opts) -> - Hash = erlang:phash2(Key), - Segment = Hash rem State#state.segments, - HKey = encode(State#state.id, Segment, Key), - case should_insert(HKey, Opts, State) of - true -> - State2 = enqueue_action({put, HKey, ObjHash}, State), - %% Dirty = gb_sets:add_element(Segment, State2#state.dirty_segments), - Dirty = bitarray_set(Segment, State2#state.dirty_segments), - State2#state{dirty_segments=Dirty}; - false -> - State - end. - -enqueue_action(Action, State) -> - WBuffer = [Action|State#state.write_buffer], - WCount = State#state.write_buffer_count + 1, - State2 = State#state{write_buffer=WBuffer, - write_buffer_count=WCount}, - State3 = maybe_flush_buffer(State2), - State3. - -maybe_flush_buffer(State=#state{write_buffer_count=WCount}) -> - Threshold = 200, - case WCount > Threshold of - true -> - flush_buffer(State); - false -> - State - end. - --spec flush_buffer(hashtree()) -> hashtree(). -flush_buffer(State=#state{write_buffer=[], write_buffer_count=0}) -> - State; -flush_buffer(State=#state{write_buffer=WBuffer}) -> - %% Write buffer is built backwards, reverse to build update list - Updates = lists:reverse(WBuffer), - ok = eleveldb:write(State#state.ref, Updates, []), - State#state{write_buffer=[], - write_buffer_count=0}. - --spec delete(binary(), hashtree()) -> hashtree(). -delete(Key, State) -> - Hash = erlang:phash2(Key), - Segment = Hash rem State#state.segments, - HKey = encode(State#state.id, Segment, Key), - State2 = enqueue_action({delete, HKey}, State), - %% Dirty = gb_sets:add_element(Segment, State2#state.dirty_segments), - Dirty = bitarray_set(Segment, State2#state.dirty_segments), - State2#state{dirty_segments=Dirty}. - --spec should_insert(segment_bin(), proplist(), hashtree()) -> boolean(). -should_insert(HKey, Opts, State) -> - IfMissing = proplists:get_value(if_missing, Opts, false), - case IfMissing of - true -> - %% Only insert if object does not already exist - %% TODO: Use bloom filter so we don't always call get here - case eleveldb:get(State#state.ref, HKey, []) of - not_found -> - true; - _ -> - false - end; - _ -> - true - end. - --spec update_snapshot(hashtree()) -> {hashtree(), hashtree()}. -update_snapshot(State=#state{segments=NumSegments}) -> - State2 = flush_buffer(State), - SnapState = snapshot(State2), - State3 = SnapState#state{dirty_segments=bitarray_new(NumSegments)}, - {SnapState, State3}. - --spec update_tree(hashtree()) -> hashtree(). -update_tree(State) -> - State2 = flush_buffer(State), - State3 = snapshot(State2), - update_perform(State3). - --spec update_perform(hashtree()) -> hashtree(). -update_perform(State=#state{dirty_segments=Dirty, segments=NumSegments}) -> - NextRebuild = State#state.next_rebuild, - Segments = case NextRebuild of - full -> - ?ALL_SEGMENTS; - incremental -> - %% gb_sets:to_list(Dirty), - bitarray_to_list(Dirty) - end, - State2 = maybe_clear_buckets(NextRebuild, State), - State3 = update_tree(Segments, State2), - %% State2#state{dirty_segments=gb_sets:new()} - State3#state{dirty_segments=bitarray_new(NumSegments), - next_rebuild=incremental}. - -%% Clear buckets if doing a full rebuild -maybe_clear_buckets(full, State) -> - clear_buckets(State); -maybe_clear_buckets(incremental, State) -> - State. - -%% Fold over the 'live' data (outside of the snapshot), removing all -%% bucket entries for the tree. -clear_buckets(State=#state{id=Id, ref=Ref}) -> - Fun = fun({K,_V},Acc) -> - try - case decode_bucket(K) of - {Id, _, _} -> - ok = eleveldb:delete(Ref, K, []), - Acc + 1; - _ -> - throw({break, Acc}) - end - catch - _:_ -> % not a decodable bucket - throw({break, Acc}) - end - end, - Opts = [{first_key, encode_bucket(Id, 0, 0)}], - Removed = - try - eleveldb:fold(Ref, Fun, 0, Opts) - catch - {break, AccFinal} -> - AccFinal - end, - ?LOG_DEBUG("Tree ~p cleared ~p segments.\n", [Id, Removed]), - - %% Mark the tree as requiring a full rebuild (will be fixed - %% reset at end of update_trees) AND dump the in-memory - %% tree. - State#state{next_rebuild = full, - tree = dict:new()}. - - --spec update_tree([integer()], hashtree()) -> hashtree(). -update_tree([], State) -> - State; -update_tree(Segments, State=#state{next_rebuild=NextRebuild, width=Width, - levels=Levels}) -> - LastLevel = Levels, - Hashes = orddict:from_list(hashes(State, Segments)), - %% Paranoia to make sure all of the hash entries are updated as expected - ?LOG_DEBUG("segments ~p -> hashes ~p\n", [Segments, Hashes]), - case Segments == ?ALL_SEGMENTS orelse - length(Segments) == length(Hashes) of - true -> - Groups = group(Hashes, Width), - update_levels(LastLevel, Groups, State, NextRebuild); - false -> - %% At this point the hashes are no longer sufficient to update - %% the upper trees. Alternative is to crash here, but that would - %% lose updates and is the action taken on repair anyway. - %% Save the customer some pain by doing that now and log. - ?LOG_WARNING("Incremental AAE hash was unable to find all required data, " - "forcing full rebuild of ~p", [State#state.path]), - update_perform(State#state{next_rebuild = full}) - end. - --spec rehash_tree(hashtree()) -> hashtree(). -rehash_tree(State) -> - State2 = flush_buffer(State), - State3 = snapshot(State2), - rehash_perform(State3). - --spec rehash_perform(hashtree()) -> hashtree(). -rehash_perform(State) -> - Hashes = orddict:from_list(hashes(State, ?ALL_SEGMENTS)), - case Hashes of - [] -> - State; - _ -> - Groups = group(Hashes, State#state.width), - LastLevel = State#state.levels, - %% Always do a full rebuild on rehash - NewState = update_levels(LastLevel, Groups, State, full), - NewState - end. - -%% @doc Mark/clear metadata for tree-id opened/closed. -%% Set next_rebuild to be incremental. --spec mark_open_empty(index_n()|binary(), hashtree()) -> hashtree(). -mark_open_empty(TreeId, State) when is_binary(TreeId) -> - State1 = write_meta(TreeId, [{opened, 1}, {closed, 0}], State), - State1#state{next_rebuild=incremental}; -mark_open_empty(TreeId, State) -> - mark_open_empty(term_to_binary(TreeId), State). - -%% @doc Check if shutdown/closing of tree-id was clean/dirty by comparing -%% `closed' to `opened' metadata count for the hashtree, and, -%% increment opened count for hashtree-id. -%% -%% -%% If it was a clean shutdown, set `next_rebuild' to be an incremental one. -%% Otherwise, if it was a dirty shutdown, set `next_rebuild', instead, -%% to be a full one. --spec mark_open_and_check(index_n()|binary(), hashtree()) -> hashtree(). -mark_open_and_check(TreeId, State) when is_binary(TreeId) -> - MetaTerm = read_meta_term(TreeId, [], State), - OpenedCnt = proplists:get_value(opened, MetaTerm, 0), - ClosedCnt = proplists:get_value(closed, MetaTerm, -1), - _ = write_meta(TreeId, lists:keystore(opened, 1, MetaTerm, - {opened, OpenedCnt + 1}), State), - case ClosedCnt =/= OpenedCnt orelse State#state.mem_levels > 0 of - true -> - State#state{next_rebuild = full}; - false -> - State#state{next_rebuild = incremental} - end; -mark_open_and_check(TreeId, State) -> - mark_open_and_check(term_to_binary(TreeId), State). - -%% @doc Call on a clean-close to update the meta for a tree-id's `closed' count -%% to match the current `opened' count, which is checked on new/reopen. --spec mark_clean_close(index_n()|binary(), hashtree()) -> hashtree(). -mark_clean_close(TreeId, State) when is_binary(TreeId) -> - MetaTerm = read_meta_term(TreeId, [], State), - OpenedCnt = proplists:get_value(opened, MetaTerm, 0), - _ = write_meta(TreeId, lists:keystore(closed, 1, MetaTerm, - {closed, OpenedCnt}), State); -mark_clean_close(TreeId, State) -> - mark_clean_close(term_to_binary(TreeId), State). - --spec top_hash(hashtree()) -> [] | [{0, binary()}]. -top_hash(State) -> - get_bucket(1, 0, State). - -compare(Tree, Remote, AccFun, Acc) -> - compare(1, 0, Tree, Remote, AccFun, Acc). - --spec levels(hashtree()) -> pos_integer(). -levels(#state{levels=L}) -> - L. - --spec segments(hashtree()) -> pos_integer(). -segments(#state{segments=S}) -> - S. - --spec width(hashtree()) -> pos_integer(). -width(#state{width=W}) -> - W. - --spec mem_levels(hashtree()) -> integer(). -mem_levels(#state{mem_levels=M}) -> - M. - --spec path(hashtree()) -> string(). -path(#state{path=P}) -> - P. - --spec next_rebuild(hashtree()) -> next_rebuild(). -next_rebuild(#state{next_rebuild=NextRebuild}) -> - NextRebuild. - --spec set_next_rebuild(hashtree(), next_rebuild()) -> hashtree(). -set_next_rebuild(Tree, NextRebuild) -> - Tree#state{next_rebuild = NextRebuild}. - -%% Note: meta is currently a one per file thing, even if there are multiple -%% trees per file. This is intentional. If we want per tree metadata -%% this will need to be added as a separate thing. --spec write_meta(binary(), binary()|term(), hashtree()) -> hashtree(). -write_meta(Key, Value, State) when is_binary(Key) and is_binary(Value) -> - HKey = encode_meta(Key), - ok = eleveldb:put(State#state.ref, HKey, Value, []), - State; -write_meta(Key, Value0, State) when is_binary(Key) -> - Value = term_to_binary(Value0), - write_meta(Key, Value, State). - --spec read_meta(binary(), hashtree()) -> {ok, binary()} | undefined. -read_meta(Key, State) when is_binary(Key) -> - HKey = encode_meta(Key), - case eleveldb:get(State#state.ref, HKey, []) of - {ok, Value} -> - {ok, Value}; - _ -> - undefined - end. - --spec read_meta_term(binary(), term(), hashtree()) -> term(). -read_meta_term(Key, Default, State) when is_binary(Key) -> - case read_meta(Key, State) of - {ok, Value} -> - binary_to_term(Value); - _ -> - Default - end. - -%% @doc -%% Estimate number of keys stored in the AAE tree. This is determined -%% by sampling segments to to calculate an estimated keys-per-segment -%% value, which is then multiplied by the number of segments. Segments -%% are sampled until either 1% of segments have been visited or 1000 -%% keys have been observed. -%% -%% Note: this function must be called on a tree with a valid iterator, -%% such as the snapshotted tree returned from update_snapshot/1 -%% or a recently updated tree returned from update_tree/1 (which -%% internally creates a snapshot). Using update_tree/1 is the best -%% choice since that ensures segments are updated giving a better -%% estimate. --spec estimate_keys(hashtree()) -> {ok, integer()}. -estimate_keys(State) -> - estimate_keys(State, 0, 0, ?NUM_KEYS_REQUIRED). - -estimate_keys(#state{segments=Segments}, CurrentSegment, Keys, MaxKeys) - when (CurrentSegment * 100) >= Segments; - Keys >= MaxKeys -> - {ok, (Keys * Segments) div CurrentSegment}; - -estimate_keys(State, CurrentSegment, Keys, MaxKeys) -> - [{_, KeyHashes2}] = key_hashes(State, CurrentSegment), - estimate_keys(State, CurrentSegment + 1, Keys + length(KeyHashes2), MaxKeys). - --spec key_hashes(hashtree(), integer()) -> [{integer(), orddict()}]. -key_hashes(State, Segment) -> - multi_select_segment(State, [Segment], fun(X) -> X end). - --spec get_bucket(integer(), integer(), hashtree()) -> orddict(). -get_bucket(Level, Bucket, State) -> - case Level =< State#state.mem_levels of - true -> - get_memory_bucket(Level, Bucket, State); - false -> - get_disk_bucket(Level, Bucket, State) - end. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - --ifndef(old_hash). -md5(Bin) -> - crypto:hash(md5, Bin). - --ifdef(TEST). -esha(Bin) -> - crypto:hash(sha, Bin). --endif. - -esha_init() -> - crypto:hash_init(sha). - -esha_update(Ctx, Bin) -> - crypto:hash_update(Ctx, Bin). - -esha_final(Ctx) -> - crypto:hash_final(Ctx). --else. -md5(Bin) -> - crypto:md5(Bin). - --ifdef(TEST). -esha(Bin) -> - crypto:sha(Bin). --endif. - -esha_init() -> - crypto:sha_init(). - -esha_update(Ctx, Bin) -> - crypto:sha_update(Ctx, Bin). - -esha_final(Ctx) -> - crypto:sha_final(Ctx). - --endif. - --spec set_bucket(integer(), integer(), any(), hashtree()) -> hashtree(). -set_bucket(Level, Bucket, Val, State) -> - case Level =< State#state.mem_levels of - true -> - set_memory_bucket(Level, Bucket, Val, State); - false -> - set_disk_bucket(Level, Bucket, Val, State) - end. - --spec del_bucket(integer(), integer(), hashtree()) -> hashtree(). -del_bucket(Level, Bucket, State) -> - case Level =< State#state.mem_levels of - true -> - del_memory_bucket(Level, Bucket, State); - false -> - del_disk_bucket(Level, Bucket, State) - end. - --spec new_segment_store(proplist()) -> {term(), string()}. -new_segment_store(Opts) -> - DataDir = case proplists:get_value(segment_path, Opts) of - undefined -> - Root = "/tmp/anti/level", - <> = md5(term_to_binary({os:timestamp(), make_ref()})), - filename:join(Root, integer_to_list(P)); - SegmentPath -> - SegmentPath - end, - - DefaultWriteBufferMin = 4 * 1024 * 1024, - DefaultWriteBufferMax = 14 * 1024 * 1024, - ConfigVars = get_env(anti_entropy_leveldb_opts, - [{write_buffer_size_min, DefaultWriteBufferMin}, - {write_buffer_size_max, DefaultWriteBufferMax}]), - Config = orddict:from_list(ConfigVars), - - %% Use a variable write buffer size to prevent against all buffers being - %% flushed to disk at once when under a heavy uniform load. - WriteBufferMin = proplists:get_value(write_buffer_size_min, Config, DefaultWriteBufferMin), - WriteBufferMax = proplists:get_value(write_buffer_size_max, Config, DefaultWriteBufferMax), - Offset = rand:uniform(1 + WriteBufferMax - WriteBufferMin), - WriteBufferSize = WriteBufferMin + Offset, - Config2 = orddict:store(write_buffer_size, WriteBufferSize, Config), - Config3 = orddict:erase(write_buffer_size_min, Config2), - Config4 = orddict:erase(write_buffer_size_max, Config3), - Config5 = orddict:store(is_internal_db, true, Config4), - Config6 = orddict:store(use_bloomfilter, true, Config5), - Options = orddict:store(create_if_missing, true, Config6), - - ok = filelib:ensure_dir(DataDir), - {ok, Ref} = eleveldb:open(DataDir, Options), - {Ref, DataDir}. - --spec hash(term()) -> empty | binary(). -hash([]) -> - empty; -hash(X) -> - %% erlang:phash2(X). - sha(term_to_binary(X)). - -sha(Bin) -> - Chunk = get_env(anti_entropy_sha_chunk, 4096), - sha(Chunk, Bin). - -sha(Chunk, Bin) -> - Ctx1 = esha_init(), - Ctx2 = sha(Chunk, Bin, Ctx1), - SHA = esha_final(Ctx2), - SHA. - -sha(Chunk, Bin, Ctx) -> - case Bin of - <> -> - Ctx2 = esha_update(Ctx, Data), - sha(Chunk, Rest, Ctx2); - Data -> - Ctx2 = esha_update(Ctx, Data), - Ctx2 - end. - -get_env(Key, Default) -> - CoreEnv = app_helper:get_env(riak_core, Key, Default), - app_helper:get_env(riak_kv, Key, CoreEnv). - --spec update_levels(integer(), - [{integer(), [{integer(), binary()}]}], - hashtree(), next_rebuild()) -> hashtree(). -update_levels(0, _, State, _) -> - State; -update_levels(Level, Groups, State, Type) -> - {_, _, NewState, NewBuckets} = rebuild_fold(Level, Groups, State, Type), - ?LOG_DEBUG("level ~p hashes ~w\n", [Level, NewBuckets]), - Groups2 = group(NewBuckets, State#state.width), - update_levels(Level - 1, Groups2, NewState, Type). - --spec rebuild_fold(integer(), - [{integer(), [{integer(), binary()}]}], hashtree(), - next_rebuild()) -> {integer(), next_rebuild(), - hashtree(), [{integer(), binary()}]}. -rebuild_fold(Level, Groups, State, Type) -> - lists:foldl(fun rebuild_folder/2, {Level, Type, State, []}, Groups). - -rebuild_folder({Bucket, NewHashes}, {Level, Type, StateAcc, BucketsAcc}) -> - Hashes = case Type of - full -> - orddict:from_list(NewHashes); - incremental -> - Hashes1 = get_bucket(Level, Bucket, - StateAcc), - Hashes2 = orddict:from_list(NewHashes), - orddict:merge( - fun(_, _, New) -> New end, - Hashes1, - Hashes2) - end, - %% All of the segments that make up this bucket, trim any - %% newly emptied hashes (likely result of deletion) - PopHashes = [{S, H} || {S, H} <- Hashes, H /= [], H /= empty], - - case PopHashes of - [] -> - %% No more hash entries, if a full rebuild then disk - %% already clear. If not, remove the empty bucket. - StateAcc2 = case Type of - full -> - StateAcc; - incremental -> - del_bucket(Level, Bucket, StateAcc) - end, - %% Although not written to disk, propagate hash up to next level - %% to mark which entries of the tree need updating. - NewBucket = {Bucket, []}, - {Level, Type, StateAcc2, [NewBucket | BucketsAcc]}; - _ -> - %% Otherwise, at least one hash entry present, update - %% and propagate - StateAcc2 = set_bucket(Level, Bucket, Hashes, StateAcc), - NewBucket = {Bucket, hash(PopHashes)}, - {Level, Type, StateAcc2, [NewBucket | BucketsAcc]} - end. - - -%% Takes a list of bucket-hash entries from level X and groups them together -%% into groups representing entries at parent level X-1. -%% -%% For example, given bucket-hash entries at level X: -%% [{1,H1}, {2,H2}, {3,H3}, {4,H4}, {5,H5}, {6,H6}, {7,H7}, {8,H8}] -%% -%% The grouping at level X-1 with a width of 4 would be: -%% [{1,[{1,H1}, {2,H2}, {3,H3}, {4,H4}]}, -%% {2,[{5,H5}, {6,H6}, {7,H7}, {8,H8}]}] -%% --spec group([{integer(), binary()}], pos_integer()) - -> [{integer(), [{integer(), binary()}]}]. -group([], _) -> - []; -group(L, Width) -> - {FirstId, _} = hd(L), - FirstBucket = FirstId div Width, - {LastBucket, LastGroup, Groups} = - lists:foldl(fun(X={Id, _}, {LastBucket, Acc, Groups}) -> - Bucket = Id div Width, - case Bucket of - LastBucket -> - {LastBucket, [X|Acc], Groups}; - _ -> - {Bucket, [X], [{LastBucket, Acc} | Groups]} - end - end, {FirstBucket, [], []}, L), - [{LastBucket, LastGroup} | Groups]. - --spec get_memory_bucket(integer(), integer(), hashtree()) -> any(). -get_memory_bucket(Level, Bucket, #state{tree=Tree}) -> - case dict:find({Level, Bucket}, Tree) of - error -> - orddict:new(); - {ok, Val} -> - Val - end. - --spec set_memory_bucket(integer(), integer(), any(), hashtree()) -> hashtree(). -set_memory_bucket(Level, Bucket, Val, State) -> - Tree = dict:store({Level, Bucket}, Val, State#state.tree), - State#state{tree=Tree}. - --spec del_memory_bucket(integer(), integer(), hashtree()) -> hashtree(). -del_memory_bucket(Level, Bucket, State) -> - Tree = dict:erase({Level, Bucket}, State#state.tree), - State#state{tree=Tree}. - --spec get_disk_bucket(integer(), integer(), hashtree()) -> any(). -get_disk_bucket(Level, Bucket, #state{id=Id, ref=Ref}) -> - HKey = encode_bucket(Id, Level, Bucket), - case eleveldb:get(Ref, HKey, []) of - {ok, Bin} -> - binary_to_term(Bin); - _ -> - orddict:new() - end. - --spec set_disk_bucket(integer(), integer(), any(), hashtree()) -> hashtree(). -set_disk_bucket(Level, Bucket, Val, State=#state{id=Id, ref=Ref}) -> - HKey = encode_bucket(Id, Level, Bucket), - Bin = term_to_binary(Val), - ok = eleveldb:put(Ref, HKey, Bin, []), - State. - -del_disk_bucket(Level, Bucket, State = #state{id = Id, ref = Ref}) -> - HKey = encode_bucket(Id, Level, Bucket), - ok = eleveldb:delete(Ref, HKey, []), - State. - --spec encode_id(binary() | non_neg_integer()) -> tree_id_bin(). -encode_id(TreeId) when is_integer(TreeId) -> - if (TreeId >= 0) andalso - (TreeId < ((1 bsl 160)-1)) -> - <>; - true -> - erlang:error(badarg) - end; -encode_id(TreeId) when is_binary(TreeId) and (byte_size(TreeId) == 22) -> - TreeId; -encode_id(_) -> - erlang:error(badarg). - --spec encode(tree_id_bin(), integer(), binary()) -> segment_bin(). -encode(TreeId, Segment, Key) -> - <<$t,TreeId:22/binary,$s,Segment:64/integer,Key/binary>>. - --spec safe_decode(binary()) -> {tree_id_bin() | bad, integer(), binary()}. -safe_decode(Bin) -> - case Bin of - <<$t,TreeId:22/binary,$s,Segment:64/integer,Key/binary>> -> - {TreeId, Segment, Key}; - _ -> - {bad, -1, <<>>} - end. - --spec decode(segment_bin()) -> {tree_id_bin(), non_neg_integer(), binary()}. -decode(Bin) -> - <<$t,TreeId:22/binary,$s,Segment:64/integer,Key/binary>> = Bin, - {TreeId, Segment, Key}. - --spec encode_bucket(tree_id_bin(), integer(), integer()) -> bucket_bin(). -encode_bucket(TreeId, Level, Bucket) -> - <<$b,TreeId:22/binary,$b,Level:64/integer,Bucket:64/integer>>. - --spec decode_bucket(bucket_bin()) -> {tree_id_bin(), integer(), integer()}. -decode_bucket(Bin) -> - <<$b,TreeId:22/binary,$b,Level:64/integer,Bucket:64/integer>> = Bin, - {TreeId, Level, Bucket}. - --spec encode_meta(binary()) -> meta_bin(). -encode_meta(Key) -> - <<$m,Key/binary>>. - --spec hashes(hashtree(), list('*'|integer())) -> [{integer(), binary()}]. -hashes(State, Segments) -> - multi_select_segment(State, Segments, fun hash/1). - --spec snapshot(hashtree()) -> hashtree(). -snapshot(State) -> - %% Abuse eleveldb iterators as snapshots - catch eleveldb:iterator_close(State#state.itr), - {ok, Itr} = eleveldb:iterator(State#state.ref, []), - State#state{itr=Itr}. - --spec multi_select_segment(hashtree(), list('*'|integer()), select_fun(T)) - -> [{integer(), T}]. -multi_select_segment(#state{id=Id, itr=Itr}, Segments, F) -> - [First | Rest] = Segments, - IS1 = #itr_state{itr=Itr, - id=Id, - current_segment=First, - remaining_segments=Rest, - acc_fun=F, - segment_acc=[], - final_acc=[]}, - Seek = case First of - '*' -> - encode(Id, 0, <<>>); - _ -> - encode(Id, First, <<>>) - end, - IS2 = try - iterate(iterator_move(Itr, Seek), IS1) - after - %% Always call prefetch stop to ensure the iterator - %% is safe to use in the compare. Requires - %% eleveldb > 2.0.16 or this may segv/hang. - _ = iterator_move(Itr, prefetch_stop) - end, - #itr_state{remaining_segments = LeftOver, - current_segment=LastSegment, - segment_acc=LastAcc, - final_acc=FA} = IS2, - - %% iterate completes without processing the last entries in the state. Compute - %% the final visited segment, and add calls to the F([]) for all of the segments - %% that do not exist at the end of the file (due to deleting the last entry in the - %% segment). - Result = [{LeftSeg, F([])} || LeftSeg <- lists:reverse(LeftOver), - LeftSeg =/= '*'] ++ - [{LastSegment, F(LastAcc)} | FA], - case Result of - [{'*', _}] -> - %% Handle wildcard select when all segments are empty - []; - _ -> - Result - end. - -iterator_move(undefined, _Seek) -> - {error, invalid_iterator}; -iterator_move(Itr, Seek) -> - try - - eleveldb:iterator_move(Itr, Seek) - catch - _:badarg -> - {error, invalid_iterator} - end. - --spec iterate({'error','invalid_iterator'} | {'ok',binary(),binary()}, - #itr_state{}) -> #itr_state{}. - -%% Ended up at an invalid_iterator likely due to encountering a missing dirty -%% segment - e.g. segment dirty, but removed last entries for it -iterate({error, invalid_iterator}, IS=#itr_state{current_segment='*'}) -> - IS; -iterate({error, invalid_iterator}, IS=#itr_state{itr=Itr, - id=Id, - current_segment=CurSeg, - remaining_segments=Segments, - acc_fun=F, - segment_acc=Acc, - final_acc=FinalAcc}) -> - case Segments of - [] -> - IS; - ['*'] -> - IS; - [NextSeg | Remaining] -> - Seek = encode(Id, NextSeg, <<>>), - IS2 = IS#itr_state{current_segment=NextSeg, - remaining_segments=Remaining, - segment_acc=[], - final_acc=[{CurSeg, F(Acc)} | FinalAcc]}, - iterate(iterator_move(Itr, Seek), IS2) - end; -iterate({ok, K, V}, IS=#itr_state{itr=Itr, - id=Id, - current_segment=CurSeg, - remaining_segments=Segments, - acc_fun=F, - segment_acc=Acc, - final_acc=FinalAcc}) -> - {SegId, Seg, _} = safe_decode(K), - Segment = case CurSeg of - '*' -> - Seg; - _ -> - CurSeg - end, - case {SegId, Seg, Segments, IS#itr_state.prefetch} of - {bad, -1, _, _} -> - %% Non-segment encountered, end traversal - IS; - {Id, Segment, _, _} -> - %% Still reading existing segment - IS2 = IS#itr_state{current_segment=Segment, - segment_acc=[{K,V} | Acc], - prefetch=true}, - iterate(iterator_move(Itr, prefetch), IS2); - {Id, _, [Seg|Remaining], _} -> - %% Pointing at next segment we are interested in - IS2 = IS#itr_state{current_segment=Seg, - remaining_segments=Remaining, - segment_acc=[{K,V}], - final_acc=[{Segment, F(Acc)} | FinalAcc], - prefetch=true}, - iterate(iterator_move(Itr, prefetch), IS2); - {Id, _, ['*'], _} -> - %% Pointing at next segment we are interested in - IS2 = IS#itr_state{current_segment=Seg, - remaining_segments=['*'], - segment_acc=[{K,V}], - final_acc=[{Segment, F(Acc)} | FinalAcc], - prefetch=true}, - iterate(iterator_move(Itr, prefetch), IS2); - {Id, _, [NextSeg | Remaining], true} -> - %% Pointing at uninteresting segment, but need to halt the - %% prefetch to ensure the iterator can be reused - IS2 = IS#itr_state{current_segment=NextSeg, - segment_acc=[], - remaining_segments=Remaining, - final_acc=[{Segment, F(Acc)} | FinalAcc], - prefetch=true}, % will be after second move - _ = iterator_move(Itr, prefetch_stop), % ignore the pre-fetch, - Seek = encode(Id, NextSeg, <<>>), % and risk wasting a reseek - iterate(iterator_move(Itr, Seek), IS2);% to get to the next segment - {Id, _, [NextSeg | Remaining], false} -> - %% Pointing at uninteresting segment, seek to next interesting one - Seek = encode(Id, NextSeg, <<>>), - IS2 = IS#itr_state{current_segment=NextSeg, - remaining_segments=Remaining, - segment_acc=[], - final_acc=[{Segment, F(Acc)} | FinalAcc]}, - iterate(iterator_move(Itr, Seek), IS2); - {_, _, _, true} -> - %% Done with traversal, but need to stop the prefetch to - %% ensure the iterator can be reused. The next operation - %% with this iterator is a seek so no need to be concerned - %% with the data returned here. - _ = iterator_move(Itr, prefetch_stop), - IS#itr_state{prefetch=false}; - {_, _, _, false} -> - %% Done with traversal - IS - end. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% level-by-level exchange (BFS instead of DFS) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -compare2(Tree, Remote, AccFun, Acc) -> - Final = Tree#state.levels + 1, - Local = fun(get_bucket, {L, B}) -> - get_bucket(L, B, Tree); - (key_hashes, Segment) -> - [{_, KeyHashes2}] = key_hashes(Tree, Segment), - KeyHashes2 - end, - Opts = [], - exchange(1, [0], Final, Local, Remote, AccFun, Acc, Opts). - -exchange(_Level, [], _Final, _Local, _Remote, _AccFun, Acc, _Opts) -> - Acc; -exchange(Level, Diff, Final, Local, Remote, AccFun, Acc, Opts) -> - if Level =:= Final -> - exchange_final(Level, Diff, Local, Remote, AccFun, Acc, Opts); - true -> - Diff2 = exchange_level(Level, Diff, Local, Remote, Opts), - exchange(Level+1, Diff2, Final, Local, Remote, AccFun, Acc, Opts) - end. - -exchange_level(Level, Buckets, Local, Remote, _Opts) -> - Remote(start_exchange_level, {Level, Buckets}), - lists:flatmap(fun(Bucket) -> - A = Local(get_bucket, {Level, Bucket}), - B = Remote(get_bucket, {Level, Bucket}), - Delta = riak_core_util:orddict_delta(lists:keysort(1, A), - lists:keysort(1, B)), - ?LOG_DEBUG("Exchange Level ~p Bucket ~p\nA=~p\nB=~p\nD=~p\n", - [Level, Bucket, A, B, Delta]), - - Diffs = Delta, - [BK || {BK, _} <- Diffs] - end, Buckets). - -exchange_final(_Level, Segments, Local, Remote, AccFun, Acc0, _Opts) -> - Remote(start_exchange_segments, Segments), - lists:foldl(fun(Segment, Acc) -> - A = Local(key_hashes, Segment), - B = Remote(key_hashes, Segment), - Delta = riak_core_util:orddict_delta(lists:keysort(1, A), - lists:keysort(1, B)), - ?LOG_DEBUG("Exchange Final\nA=~p\nB=~p\nD=~p\n", - [A, B, Delta]), - Keys = [begin - {_Id, Segment, Key} = decode(KBin), - Type = key_diff_type(Diff), - {Type, Key} - end || {KBin, Diff} <- Delta], - AccFun(Keys, Acc) - end, Acc0, Segments). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - --spec compare(integer(), integer(), hashtree(), remote_fun(), acc_fun(X), X) -> X. -compare(Level, Bucket, Tree, Remote, AccFun, KeyAcc) when Level == Tree#state.levels+1 -> - Keys = compare_segments(Bucket, Tree, Remote), - AccFun(Keys, KeyAcc); -compare(Level, Bucket, Tree, Remote, AccFun, KeyAcc) -> - HL1 = get_bucket(Level, Bucket, Tree), - HL2 = Remote(get_bucket, {Level, Bucket}), - Union = lists:ukeysort(1, HL1 ++ HL2), - Inter = ordsets:intersection(ordsets:from_list(HL1), - ordsets:from_list(HL2)), - Diff = ordsets:subtract(Union, Inter), - ?LOG_DEBUG("Tree ~p level ~p bucket ~p\nL=~p\nR=~p\nD=~p\n", - [Tree, Level, Bucket, HL1, HL2, Diff]), - KeyAcc3 = - lists:foldl(fun({Bucket2, _}, KeyAcc2) -> - compare(Level+1, Bucket2, Tree, Remote, AccFun, KeyAcc2) - end, KeyAcc, Diff), - KeyAcc3. - --spec compare_segments(integer(), hashtree(), remote_fun()) -> [keydiff()]. -compare_segments(Segment, Tree=#state{id=Id}, Remote) -> - [{_, KeyHashes1}] = key_hashes(Tree, Segment), - KeyHashes2 = Remote(key_hashes, Segment), - HL1 = orddict:from_list(KeyHashes1), - HL2 = orddict:from_list(KeyHashes2), - Delta = riak_core_util:orddict_delta(HL1, HL2), - ?LOG_DEBUG("Tree ~p segment ~p diff ~p\n", - [Tree, Segment, Delta]), - Keys = [begin - {Id, Segment, Key} = decode(KBin), - Type = key_diff_type(Diff), - {Type, Key} - end || {KBin, Diff} <- Delta], - Keys. - -key_diff_type({'$none', _}) -> - missing; -key_diff_type({_, '$none'}) -> - remote_missing; -key_diff_type(_) -> - different. - -%%%=================================================================== -%%% bitarray -%%%=================================================================== --define(W, 27). - --spec bitarray_new(integer()) -> hashtree_array(). -bitarray_new(N) -> array:new((N-1) div ?W + 1, {default, 0}). - --spec bitarray_set(integer(), hashtree_array()) -> hashtree_array(). -bitarray_set(I, A) -> - AI = I div ?W, - V = array:get(AI, A), - V1 = V bor (1 bsl (I rem ?W)), - array:set(AI, V1, A). - --spec bitarray_to_list(hashtree_array()) -> [integer()]. -bitarray_to_list(A) -> - lists:reverse( - array:sparse_foldl(fun(I, V, Acc) -> - expand(V, I * ?W, Acc) - end, [], A)). - -%% Convert bit vector into list of integers, with optional offset. -%% expand(2#01, 0, []) -> [0] -%% expand(2#10, 0, []) -> [1] -%% expand(2#1101, 0, []) -> [3,2,0] -%% expand(2#1101, 1, []) -> [4,3,1] -%% expand(2#1101, 10, []) -> [13,12,10] -%% expand(2#1101, 100, []) -> [103,102,100] -expand(0, _, Acc) -> - Acc; -expand(V, N, Acc) -> - Acc2 = - case (V band 1) of - 1 -> - [N|Acc]; - 0 -> - Acc - end, - expand(V bsr 1, N+1, Acc2). - -%%%=================================================================== -%%% Experiments -%%%=================================================================== - --ifdef(TEST). - -run_local() -> - run_local(10000). -run_local(N) -> - timer:tc(fun do_local/1, [N]). - -run_concurrent_build() -> - run_concurrent_build(10000). -run_concurrent_build(N) -> - run_concurrent_build(N, N). -run_concurrent_build(N1, N2) -> - timer:tc(fun do_concurrent_build/2, [N1, N2]). - -run_multiple(Count, N) -> - Tasks = [fun() -> - do_concurrent_build(N, N) - end || _ <- lists:seq(1, Count)], - timer:tc(fun peval/1, [Tasks]). - -run_remote() -> - run_remote(100000). -run_remote(N) -> - timer:tc(fun do_remote/1, [N]). - -do_local(N) -> - A0 = insert_many(N, new()), - A1 = insert(<<"10">>, <<"42">>, A0), - A2 = insert(<<"10">>, <<"42">>, A1), - A3 = insert(<<"13">>, <<"52">>, A2), - - B0 = insert_many(N, new()), - B1 = insert(<<"14">>, <<"52">>, B0), - B2 = insert(<<"10">>, <<"32">>, B1), - B3 = insert(<<"10">>, <<"422">>, B2), - - A4 = update_tree(A3), - B4 = update_tree(B3), - KeyDiff = local_compare(A4, B4), - io:format("KeyDiff: ~p~n", [KeyDiff]), - close(A4), - close(B4), - destroy(A4), - destroy(B4), - ok. - -do_concurrent_build(N1, N2) -> - F1 = fun() -> - A0 = insert_many(N1, new()), - A1 = insert(<<"10">>, <<"42">>, A0), - A2 = insert(<<"10">>, <<"42">>, A1), - A3 = insert(<<"13">>, <<"52">>, A2), - A4 = update_tree(A3), - A4 - end, - - F2 = fun() -> - B0 = insert_many(N2, new()), - B1 = insert(<<"14">>, <<"52">>, B0), - B2 = insert(<<"10">>, <<"32">>, B1), - B3 = insert(<<"10">>, <<"422">>, B2), - B4 = update_tree(B3), - B4 - end, - - [A4, B4] = peval([F1, F2]), - KeyDiff = local_compare(A4, B4), - io:format("KeyDiff: ~p~n", [KeyDiff]), - - close(A4), - close(B4), - destroy(A4), - destroy(B4), - ok. - -do_remote(N) -> - %% Spawn new process for remote tree - Other = - spawn(fun() -> - A0 = insert_many(N, new()), - A1 = insert(<<"10">>, <<"42">>, A0), - A2 = insert(<<"10">>, <<"42">>, A1), - A3 = insert(<<"13">>, <<"52">>, A2), - A4 = update_tree(A3), - message_loop(A4, 0, 0) - end), - - %% Build local tree - B0 = insert_many(N, new()), - B1 = insert(<<"14">>, <<"52">>, B0), - B2 = insert(<<"10">>, <<"32">>, B1), - B3 = insert(<<"10">>, <<"422">>, B2), - B4 = update_tree(B3), - - %% Compare with remote tree through message passing - Remote = fun(get_bucket, {L, B}) -> - Other ! {get_bucket, self(), L, B}, - receive {remote, X} -> X end; - (start_exchange_level, {_Level, _Buckets}) -> - ok; - (start_exchange_segments, _Segments) -> - ok; - (key_hashes, Segment) -> - Other ! {key_hashes, self(), Segment}, - receive {remote, X} -> X end - end, - KeyDiff = compare(B4, Remote), - io:format("KeyDiff: ~p~n", [KeyDiff]), - - %% Signal spawned process to print stats and exit - Other ! done, - ok. - -message_loop(Tree, Msgs, Bytes) -> - receive - {get_bucket, From, L, B} -> - Reply = get_bucket(L, B, Tree), - From ! {remote, Reply}, - Size = byte_size(term_to_binary(Reply)), - message_loop(Tree, Msgs+1, Bytes+Size); - {key_hashes, From, Segment} -> - [{_, KeyHashes2}] = key_hashes(Tree, Segment), - Reply = KeyHashes2, - From ! {remote, Reply}, - Size = byte_size(term_to_binary(Reply)), - message_loop(Tree, Msgs+1, Bytes+Size); - done -> - %% io:format("Exchanged messages: ~b~n", [Msgs]), - %% io:format("Exchanged bytes: ~b~n", [Bytes]), - ok - end. - -insert_many(N, T1) -> - T2 = - lists:foldl(fun(X, TX) -> - insert(bin(-X), bin(X*100), TX) - end, T1, lists:seq(1,N)), - T2. - -bin(X) -> - list_to_binary(integer_to_list(X)). - -peval(L) -> - Parent = self(), - lists:foldl( - fun(F, N) -> - spawn(fun() -> - Parent ! {peval, N, F()} - end), - N+1 - end, 0, L), - L2 = [receive {peval, N, R} -> {N,R} end || _ <- L], - {_, L3} = lists:unzip(lists:keysort(1, L2)), - L3. - -%%%=================================================================== -%%% EUnit -%%%=================================================================== - --spec local_compare(hashtree(), hashtree()) -> [keydiff()]. -local_compare(T1, T2) -> - Remote = fun(get_bucket, {L, B}) -> - get_bucket(L, B, T2); - (start_exchange_level, {_Level, _Buckets}) -> - ok; - (start_exchange_segments, _Segments) -> - ok; - (key_hashes, Segment) -> - [{_, KeyHashes2}] = key_hashes(T2, Segment), - KeyHashes2 - end, - AccFun = fun(Keys, KeyAcc) -> - Keys ++ KeyAcc - end, - compare2(T1, Remote, AccFun, []). - --spec local_compare1(hashtree(), hashtree()) -> [keydiff()]. -local_compare1(T1, T2) -> - Remote = fun(get_bucket, {L, B}) -> - get_bucket(L, B, T2); - (start_exchange_level, {_Level, _Buckets}) -> - ok; - (start_exchange_segments, _Segments) -> - ok; - (key_hashes, Segment) -> - [{_, KeyHashes2}] = key_hashes(T2, Segment), - KeyHashes2 - end, - AccFun = fun(Keys, KeyAcc) -> - Keys ++ KeyAcc - end, - compare(T1, Remote, AccFun, []). - --spec compare(hashtree(), remote_fun()) -> [keydiff()]. -compare(Tree, Remote) -> - compare(Tree, Remote, fun(Keys, KeyAcc) -> - Keys ++ KeyAcc - end). - --spec compare(hashtree(), remote_fun(), acc_fun(X)) -> X. -compare(Tree, Remote, AccFun) -> - compare(Tree, Remote, AccFun, []). - --spec fake_close(hashtree()) -> hashtree(). -fake_close(State) -> - catch eleveldb:close(State#state.ref), - State. - -%% Verify that `update_tree/1' generates a snapshot of the underlying -%% LevelDB store that is used by `compare', therefore isolating the -%% compare from newer/concurrent insertions into the tree. -snapshot_test() -> - A0 = insert(<<"10">>, <<"42">>, new()), - B0 = insert(<<"10">>, <<"52">>, new()), - A1 = update_tree(A0), - B1 = update_tree(B0), - B2 = insert(<<"10">>, <<"42">>, B1), - KeyDiff = local_compare(A1, B1), - close(A1), - close(B2), - destroy(A1), - destroy(B2), - ?assertEqual([{different, <<"10">>}], KeyDiff), - ok. - -delta_test() -> - T1 = update_tree(insert(<<"1">>, esha(term_to_binary(make_ref())), - new())), - T2 = update_tree(insert(<<"2">>, esha(term_to_binary(make_ref())), - new())), - Diff = local_compare(T1, T2), - ?assertEqual([{remote_missing, <<"1">>}, {missing, <<"2">>}], Diff), - Diff2 = local_compare(T2, T1), - ?assertEqual([{missing, <<"1">>}, {remote_missing, <<"2">>}], Diff2), - ok. - -delete_without_update_test() -> - A1 = new({0,0},[{segment_path, "t1"}]), - A2 = insert(<<"k">>, <<1234:32>>, A1), - A3 = update_tree(A2), - - B1 = new({0,0},[{segment_path, "t2"}]), - B2 = insert(<<"k">>, <<1234:32>>, B1), - B3 = update_tree(B2), - - Diff = local_compare(A3, B3), - - C1 = delete(<<"k">>, A3), - C2 = rehash_tree(C1), - C3 = flush_buffer(C2), - close(C3), - - AA1 = new({0,0},[{segment_path, "t1"}]), - AA2 = update_tree(AA1), - Diff2 = local_compare(AA2, B3), - - close(B3), - close(AA2), - destroy(C3), - destroy(B3), - destroy(AA2), - - ?assertEqual([], Diff), - ?assertEqual([{missing, <<"k">>}], Diff2). - -opened_closed_test() -> - TreeId0 = {0,0}, - TreeId1 = term_to_binary({0,0}), - A1 = new(TreeId0, [{segment_path, "t1000"}]), - A2 = mark_open_and_check(TreeId0, A1), - A3 = insert(<<"totes">>, <<1234:32>>, A2), - A4 = update_tree(A3), - - B1 = new(TreeId0, [{segment_path, "t2000"}]), - B2 = mark_open_empty(TreeId0, B1), - B3 = insert(<<"totes">>, <<1234:32>>, B2), - B4 = update_tree(B3), - - StatusA4 = {proplists:get_value(opened, read_meta_term(TreeId1, [], A4)), - proplists:get_value(closed, read_meta_term(TreeId1, [], A4))}, - StatusB4 = {proplists:get_value(opened, read_meta_term(TreeId1, [], B4)), - proplists:get_value(closed, read_meta_term(TreeId1, [], B4))}, - - A5 = set_next_rebuild(A4, incremental), - A6 = mark_clean_close(TreeId0, A5), - StatusA6 = {proplists:get_value(opened, read_meta_term(TreeId1, [], A6)), - proplists:get_value(closed, read_meta_term(TreeId1, [], A6))}, - - close(A6), - close(B4), - - AA1 = new(TreeId0, [{segment_path, "t1000"}]), - AA2 = mark_open_and_check(TreeId0, AA1), - AA3 = update_tree(AA2), - StatusAA3 = {proplists:get_value(opened, read_meta_term(TreeId1, [], AA3)), - proplists:get_value(closed, read_meta_term(TreeId1, [], AA3))}, - - fake_close(AA3), - - AAA1 = new(TreeId0,[{segment_path, "t1000"}]), - AAA2 = mark_open_and_check(TreeId0, AAA1), - StatusAAA2 = {proplists:get_value(opened, read_meta_term(TreeId1, [], AAA2)), - proplists:get_value(closed, read_meta_term(TreeId1, [], AAA2))}, - - AAA3 = mark_clean_close(TreeId0, AAA2), - close(AAA3), - - AAAA1 = new({0,0},[{segment_path, "t1000"}]), - AAAA2 = mark_open_and_check(TreeId0, AAAA1), - StatusAAAA2 = {proplists:get_value(opened, read_meta_term(TreeId1, [], AAAA2)), - proplists:get_value(closed, read_meta_term(TreeId1, [], AAAA2))}, - - AAAA3 = mark_clean_close(TreeId0, AAAA2), - StatusAAAA3 = {proplists:get_value(opened, read_meta_term(TreeId1, [], AAAA3)), - proplists:get_value(closed, read_meta_term(TreeId1, [], AAAA3))}, - close(AAAA3), - destroy(B3), - destroy(A6), - destroy(AA3), - destroy(AAA3), - destroy(AAAA3), - - ?assertEqual({1,undefined}, StatusA4), - ?assertEqual({1,0}, StatusB4), - ?assertEqual(full, A2#state.next_rebuild), - ?assertEqual(incremental, B2#state.next_rebuild), - ?assertEqual(incremental, A5#state.next_rebuild), - ?assertEqual({1,1}, StatusA6), - ?assertEqual({2,1}, StatusAA3), - ?assertEqual(incremental, AA2#state.next_rebuild), - ?assertEqual({3,1}, StatusAAA2), - ?assertEqual(full, AAA1#state.next_rebuild), - ?assertEqual({4,3}, StatusAAAA2), - ?assertEqual({4,4}, StatusAAAA3). - --endif. - -%%%=================================================================== -%%% EQC -%%%=================================================================== - --ifdef(TEST). --ifdef(EQC). -prop_sha() -> - %% NOTE: Generating 1MB (1024 * 1024) size binaries is incredibly slow - %% with EQC and was using over 2GB of memory - ?FORALL({Size, NumChunks}, {choose(1, 1024), choose(1, 16)}, - ?FORALL(Bin, binary(Size), - begin - %% we need at least one chunk, - %% and then we divide the binary size - %% into the number of chunks (as a natural - %% number) - ChunkSize = max(1, (Size div NumChunks)), - sha(ChunkSize, Bin) =:= esha(Bin) - end)). - -objects() -> - ?SIZED(Size, objects(Size+3)). - -objects(N) -> - ?LET(Keys, shuffle(lists:seq(1,N)), - [{bin(K), binary(8)} || K <- Keys] - ). - -lengths(N) -> - ?LET(MissingN1, choose(0,N), - ?LET(MissingN2, choose(0,N-MissingN1), - ?LET(DifferentN, choose(0,N-MissingN1-MissingN2), - {MissingN1, MissingN2, DifferentN}))). - -mutate(Binary) -> - L1 = binary_to_list(Binary), - [X|Xs] = L1, - X2 = (X+1) rem 256, - L2 = [X2|Xs], - list_to_binary(L2). - -prop_correct() -> - ?FORALL(Objects, objects(), - ?FORALL({MissingN1, MissingN2, DifferentN}, lengths(length(Objects)), - begin - {RemoteOnly, Objects2} = lists:split(MissingN1, Objects), - {LocalOnly, Objects3} = lists:split(MissingN2, Objects2), - {Different, Same} = lists:split(DifferentN, Objects3), - - Different2 = [{Key, mutate(Hash)} || {Key, Hash} <- Different], - - Insert = fun(Tree, Vals) -> - lists:foldl(fun({Key, Hash}, Acc) -> - insert(Key, Hash, Acc) - end, Tree, Vals) - end, - - A0 = new(), - B0 = new(), - - [begin - A1 = new({0,Id}, A0), - B1 = new({0,Id}, B0), - - A2 = Insert(A1, Same), - A3 = Insert(A2, LocalOnly), - A4 = Insert(A3, Different), - - B2 = Insert(B1, Same), - B3 = Insert(B2, RemoteOnly), - B4 = Insert(B3, Different2), - - A5 = update_tree(A4), - B5 = update_tree(B4), - - Expected = - [{missing, Key} || {Key, _} <- RemoteOnly] ++ - [{remote_missing, Key} || {Key, _} <- LocalOnly] ++ - [{different, Key} || {Key, _} <- Different], - - KeyDiff = local_compare(A5, B5), - - ?assertEqual(lists:usort(Expected), - lists:usort(KeyDiff)), - - %% Reconcile trees - A6 = Insert(A5, RemoteOnly), - B6 = Insert(B5, LocalOnly), - B7 = Insert(B6, Different), - A7 = update_tree(A6), - B8 = update_tree(B7), - ?assertEqual([], local_compare(A7, B8)), - true - end || Id <- lists:seq(0, 10)], - close(A0), - close(B0), - destroy(A0), - destroy(B0), - true - end)). - -prop_est() -> - %% It's hard to estimate under 10000 keys - ?FORALL(N, choose(10000, 500000), - begin - {ok, EstKeys} = estimate_keys(update_tree(insert_many(N, new()))), - Diff = abs(N - EstKeys), - MaxDiff = N div 5, - ?debugVal(Diff), ?debugVal(EstKeys),?debugVal(MaxDiff), - ?assertEqual(true, MaxDiff > Diff), - true - end). --endif. --endif. diff --git a/src/hashtree_tree.erl b/src/hashtree_tree.erl deleted file mode 100644 index b2d987eb0..000000000 --- a/src/hashtree_tree.erl +++ /dev/null @@ -1,571 +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. -%% -%% ------------------------------------------------------------------- - -%% @doc This module implements a specialized hash tree that is used -%% primarily by cluster metadata's anti-entropy exchanges and by -%% metadata clients for determining when groups of metadata keys have -%% changed locally. The tree can be used, generally, for determining -%% the differences in groups of keys, or to find missing groups, between -%% two stores. -%% -%% Each node of the tree is itself a hash tree, specifically a {@link -%% hashtree}. The tree has a fixed height but each node has a -%% variable amount of children. The height of the tree directly -%% corresponds to the number of prefixes supported by the tree. A list -%% of prefixes, or a "prefix list", represent a group of keys. Each -%% unique prefix list is a node in the tree. The leaves store hashes -%% for the individual keys in the segments of the node's {@link -%% hashtree}. The buckets of the leaves' hashtree provide an efficient -%% way of determining when keys in the segments differ between two -%% trees. The tails of the prefix list are used to roll up groups -%% into parent groups. For example, the prefixes `[a, b]', `[a, c]', -%% `[d, e]' will be rolled up into parent groups `a', containing `c' -%% and `b', and `d', containing only 'e'. The parent group's node has -%% children corresponding to each child group. The top-hashes of the -%% child nodes are stored in the parent nodes' segments. The parent -%% nodes' buckets are used as an efficient method for determining when -%% child groups differ between two trees. The root node corresponds to -%% the empty list and it acts like any other node, storing hashes for -%% the first level of child groups. The top hash of the root node is -%% the top hash of the tree. -%% -%% The tree in the example above might store something like: -%% -%% node parent top-hash segments -%% --------------------------------------------------- -%% root none 1 [{a, 2}, {d, 3}] -%% [a] root 2 [{b, 4}, {c, 5}] -%% [d] root 3 [{e, 6}] -%% [a,b] [a] 4 [{k1, 0}, {k2, 6}, ...] -%% [a,c] [a] 5 [{k1, 1}, {k2, 4}, ...] -%% [d,e] [d] 6 [{k1, 2}, {k2, 3}, ...] -%% -%% -%% When a key is inserted into the tree it is inserted into the leaf -%% corresponding to the given prefix list. The leaf and its parents -%% are not updated at this time. Instead the leaf is added to a dirty -%% set. The nodes are later updated in bulk. -%% -%% Updating the hashtree is a two step process. First, a snapshot of -%% the tree must be obtained. This prevents new writes from affecting -%% the update. Snapshotting the tree will snapshot each dirty -%% leaf. Since writes to nodes other than leaves only occur during -%% updates no snapshot is taken for them. Second, the tree is updated -%% using the snapshot. The update is performed by updating the {@link -%% hashtree} nodes at each level starting with the leaves. The top -%% hash of each node in a level is inserted into its parent node after -%% being updated. The list of dirty parents is then updated, moving up -%% the tree. Once the root is reached and has been updated the process -%% is complete. This process is designed to minimize the traversal of -%% the tree and ensure that each node is only updated once. -%% -%% The typical use for updating a tree is to compare it with another -%% recently updated tree. Comparison is done with the ``compare/4'' -%% function. Compare provides a sort of fold over the differences of -%% the tree allowing for callers to determine what to do with those -%% differences. In addition, the caller can accumulate a value, such -%% as the difference list or stats about differencces. -%% -%% The tree implemented in this module assumes that it will be managed -%% by a single process and that all calls will be made to it synchronously, with -%% a couple exceptions: -%% -%% 1. Updating a tree with a snapshot can be done in another process. The snapshot -%% must be taken by the owning process, synchronously. -%% 2. Comparing two trees may be done by a seperate process. Compares should should use -%% a snapshot and only be performed after an update. -%% -%% The nodes in this tree are backend by LevelDB, however, this is -%% most likely temporary and Cluster Metadata's use of the tree is -%% ephemeral. Trees are only meant to live for the lifetime of a -%% running node and are rebuilt on start. To ensure the tree is fresh -%% each time, when nodes are created the backing LevelDB store is -%% opened, closed, and then re-opened to ensure any lingering files -%% are removed. Additionally, the nodes themselves (references to -%% {@link hashtree}, are stored in {@link ets}. - - --module(hashtree_tree). - --export([new/2, - destroy/1, - insert/4, - insert/5, - update_snapshot/1, - update_perform/1, - local_compare/2, - compare/4, - top_hash/1, - prefix_hash/2, - get_bucket/4, - key_hashes/3]). - --export_type([tree/0, tree_node/0, handler_fun/1, remote_fun/0]). - --ifdef(namespaced_types). --type hashtree_gb_set() :: gb_sets:set(). --else. --type hashtree_gb_set() :: gb_set(). --endif. - --record(hashtree_tree, { - %% the identifier for this tree. used as part of the ids - %% passed to hashtree.erl and in keys used to store nodes in - %% the tree's ets tables. - id :: term(), - - %% directory where nodes are stored on disk - data_root :: file:name_all(), - - %% number of levels in the tree excluding leaves (height - 1) - num_levels :: non_neg_integer(), - - %% ets table that holds hashtree nodes in the tree - nodes :: ets:tab(), - - %% ets table that holds snapshot nodes - snapshot :: ets:tab(), - - %% set of dirty leaves - dirty :: hashtree_gb_set() - }). - --define(ROOT, '$ht_root'). --define(NUM_LEVELS, 2). - --opaque tree() :: #hashtree_tree{}. --type prefix() :: atom() | binary(). --type prefixes() :: [prefix()]. --opaque tree_node() :: prefixes() | ?ROOT. --type prefix_diff() :: {missing_prefix, local | remote, prefixes()}. --type key_diffs() :: {key_diffs, prefixes(),[{missing | - remote_missing | - different, binary()}]}. --type diff() :: prefix_diff() | key_diffs(). --type handler_fun(X) :: fun((diff(), X) -> X). --type remote_fun() :: fun((prefixes(), - {get_bucket, {integer(), integer()}} | - {key_hashses, integer()}) -> orddict:orddict()). - -%%%=================================================================== -%%% API -%%%=================================================================== - -%% @doc Creates a new hashtree. -%% -%% Takes the following options: -%% * num_levels - the height of the tree excluding leaves. corresponds to the -%% length of the prefix list passed to {@link insert/5}. -%% * data_dir - the directory where the LevelDB instances for the nodes will -%% be stored. --type new_opt_num_levels() :: {num_levels, non_neg_integer()}. --type new_opt_data_dir() :: {data_dir, file:name_all()}. --type new_opt() :: new_opt_num_levels() | new_opt_data_dir(). --type new_opts() :: [new_opt()]. --spec new(term(), new_opts()) -> tree(). -new(TreeId, Opts) -> - NumLevels = proplists:get_value(num_levels, Opts, ?NUM_LEVELS), - DataRoot = data_root(Opts), - Tree = #hashtree_tree{id = TreeId, - data_root = DataRoot, - num_levels = NumLevels, - %% table needs to be public to allow async update - nodes = ets:new(undefined, [public]), - snapshot = undefined, - dirty = gb_sets:new()}, - get_node(?ROOT, Tree), - Tree. - -%% @doc Destroys the tree cleaning up any used resources. -%% This deletes the LevelDB files for the nodes. --spec destroy(tree()) -> ok. -destroy(Tree) -> - ets:foldl(fun({_, Node}, _) -> - Node1 = hashtree:close(Node), - hashtree:destroy(Node1) - end, undefined, Tree#hashtree_tree.nodes), - catch ets:delete(Tree#hashtree_tree.nodes), - ok. - -%% @doc an alias for insert(Prefixes, Key, Hash, [], Tree) --spec insert(prefixes(), binary(), binary(), tree()) -> tree() | {error, term()}. -insert(Prefixes, Key, Hash, Tree) -> - insert(Prefixes, Key, Hash, [], Tree). - -%% @doc Insert a hash into the tree. The length of `Prefixes' must -%% correspond to the height of the tree -- the value used for -%% `num_levels' when creating the tree. The hash is inserted into -%% a leaf of the tree and that leaf is marked as dirty. The tree is not -%% updated at this time. Future operations on the tree should used the -%% tree returend by this fucntion. -%% -%% Insert takes the following options: -%% * if_missing - if `true' then the hash is only inserted into the tree -%% if the key is not already present. This is useful for -%% ensuring writes concurrent with building the tree -%% take precedence over older values. `false' is the default -%% value. --type insert_opt_if_missing() :: {if_missing, boolean()}. --type insert_opt() :: insert_opt_if_missing(). --type insert_opts() :: [insert_opt()]. --spec insert(prefixes(), binary(), binary(), insert_opts(), tree()) -> tree() | {error, term()}. -insert(Prefixes, Key, Hash, Opts, Tree) -> - NodeName = prefixes_to_node_name(Prefixes), - case valid_prefixes(NodeName, Tree) of - true -> - insert_hash(Key, Hash, Opts, NodeName, Tree); - false -> - {error, bad_prefixes} - end. - -%% @doc Snapshot the tree for updating. The return tree should be -%% updated using {@link update_perform/1} and to perform future operations -%% on the tree --spec update_snapshot(tree()) -> tree(). -update_snapshot(Tree=#hashtree_tree{dirty=Dirty,nodes=Nodes,snapshot=Snapshot0}) -> - catch ets:delete(Snapshot0), - FoldRes = gb_sets:fold(fun(DirtyName, Acc) -> - DirtyKey = node_key(DirtyName, Tree), - Node = lookup_node(DirtyName, Tree), - {DirtyNode, NewNode} = hashtree:update_snapshot(Node), - [{{DirtyKey, DirtyNode}, {DirtyKey, NewNode}} | Acc] - end, [], Dirty), - {Snaps, NewNodes} = lists:unzip(FoldRes), - Snapshot = ets:new(undefined, []), - ets:insert(Snapshot, Snaps), - ets:insert(Nodes, NewNodes), - Tree#hashtree_tree{dirty=gb_sets:new(),snapshot=Snapshot}. - - -%% @doc Update the tree with a snapshot obtained by {@link -%% update_snapshot/1}. This function may be called by a process other -%% than the one managing the tree. --spec update_perform(tree()) -> ok. -update_perform(Tree=#hashtree_tree{snapshot=Snapshot}) -> - DirtyParents = ets:foldl(fun(DirtyLeaf, DirtyParentsAcc) -> - update_dirty_leaves(DirtyLeaf, DirtyParentsAcc, Tree) - end, - gb_sets:new(), Snapshot), - update_dirty_parents(DirtyParents, Tree), - catch ets:delete(Snapshot), - ok. - -%% @doc Compare two local trees. This function is primarily for -%% local debugging and testing. --spec local_compare(tree(), tree()) -> [diff()]. -local_compare(T1, T2) -> - RemoteFun = fun(Prefixes, {get_bucket, {Level, Bucket}}) -> - hashtree_tree:get_bucket(Prefixes, Level, Bucket, T2); - (Prefixes, {key_hashes, Segment}) -> - [{_, Hashes}] = hashtree_tree:key_hashes(Prefixes, Segment, T2), - Hashes - end, - HandlerFun = fun(Diff, Acc) -> Acc ++ [Diff] end, - compare(T1, RemoteFun, HandlerFun, []). - -%% @doc Compare a local and remote tree. `RemoteFun' is used to -%% access the buckets and segments of nodes in the remote -%% tree. `HandlerFun' will be called for each difference found in the -%% tree. A difference is either a missing local or remote prefix, or a -%% list of key differences, which themselves signify different or -%% missing keys. `HandlerAcc' is passed to the first call of -%% `HandlerFun' and each subsequent call is passed the value returned -%% by the previous call. The return value of this function is the -%% return value from the last call to `HandlerFun'. --spec compare(tree(), remote_fun(), handler_fun(X), X) -> X. -compare(LocalTree, RemoteFun, HandlerFun, HandlerAcc) -> - compare(?ROOT, 1, LocalTree, RemoteFun, HandlerFun, HandlerAcc). - -%% @doc Returns the top-hash of the tree. This is the top-hash of the -%% root node. --spec top_hash(tree()) -> undefined | binary(). -top_hash(Tree) -> - prefix_hash([], Tree). - -%% @doc Returns the top-hash of the node corresponding to the given -%% prefix list. The length of the prefix list can be less than or -%% equal to the height of the tree. If the tree has not been updated -%% or if the prefix list is not found or invalid, then `undefined' is -%% returned. Otherwise the hash value from the most recent update is -%% returned. --spec prefix_hash(prefixes(), tree()) -> undefined | binary(). -prefix_hash(Prefixes, Tree) -> - NodeName = prefixes_to_node_name(Prefixes), - case lookup_node(NodeName, Tree) of - undefined -> undefined; - Node -> extract_top_hash(hashtree:top_hash(Node)) - end. - -%% @doc Returns the {@link hashtree} buckets for a given node in the -%% tree. This is used primarily for accessing buckets of a remote tree -%% during compare. --spec get_bucket(tree_node(), integer(), integer(), tree()) -> orddict:orddict(). -get_bucket(Prefixes, Level, Bucket, Tree) -> - case lookup_node(prefixes_to_node_name(Prefixes), Tree) of - undefined -> orddict:new(); - Node -> hashtree:get_bucket(Level, Bucket, Node) - end. - -%% @doc Returns the {@link hashtree} segment hashes for a given node -%% in the tree. This is used primarily for accessing key hashes of a -%% remote tree during compare. --spec key_hashes(tree_node(), integer(), tree()) -> [{integer(), orddict:orddict()}]. -key_hashes(Prefixes, Segment, Tree) -> - case lookup_node(prefixes_to_node_name(Prefixes), Tree) of - undefined -> [{Segment, orddict:new()}]; - Node -> hashtree:key_hashes(Node, Segment) - end. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -%% @private -insert_hash(Key, Hash, Opts, NodeName, Tree) -> - Node = get_node(NodeName, Tree), - insert_hash(Key, Hash, Opts, NodeName, Node, Tree). - -%% @private -insert_hash(Key, Hash, Opts, NodeName, Node, Tree=#hashtree_tree{dirty=Dirty}) -> - Node2 = hashtree:insert(Key, Hash, Node, Opts), - Dirty2 = gb_sets:add_element(NodeName, Dirty), - _ = set_node(NodeName, Node2, Tree), - Tree#hashtree_tree{dirty=Dirty2}. - -%% @private -update_dirty_leaves({DirtyKey, DirtyNode}, DirtyParents, Tree) -> - update_dirty(node_key_to_name(DirtyKey), DirtyNode, DirtyParents, Tree). - -%% @private -update_dirty_parents(DirtyParents, Tree) -> - case gb_sets:is_empty(DirtyParents) of - true -> ok; - false -> - NextDirty = gb_sets:fold( - fun(DirtyParent, DirtyAcc) -> - DirtyNode = lookup_node(DirtyParent, Tree), - {DirtySnap, DirtyNode2} = hashtree:update_snapshot(DirtyNode), - NextDirty = update_dirty(DirtyParent, DirtySnap, DirtyAcc, Tree), - _ = set_node(DirtyParent, DirtyNode2, Tree), - NextDirty - end, gb_sets:new(), DirtyParents), - update_dirty_parents(NextDirty, Tree) - end. - -%% @private -update_dirty(DirtyName, DirtyNode, NextDirty, Tree) -> - %% ignore returned tree b/c we are tracking dirty nodes in this fold seperately - _ = hashtree:update_perform(DirtyNode), - case parent_node(DirtyName, Tree) of - undefined -> - NextDirty; - {ParentName, ParentNode} -> - TopHash = extract_top_hash(hashtree:top_hash(DirtyNode)), - ParentKey = to_parent_key(DirtyName), - %% ignore returned tree b/c we are tracking dirty nodes in this fold seperately - _ = insert_hash(ParentKey, TopHash, [], ParentName, ParentNode, Tree), - gb_sets:add_element(ParentName, NextDirty) - end. - -%% @private -compare(NodeName, Level, LocalTree, RemoteFun, HandlerFun, HandlerAcc) - when Level =:= LocalTree#hashtree_tree.num_levels + 1 -> - Prefixes = node_name_to_prefixes(NodeName), - LocalNode = lookup_node(NodeName, LocalTree), - RemoteNode = fun(Action, Info) -> - RemoteFun(Prefixes, {Action, Info}) - end, - AccFun = fun(Diffs, CompareAcc) -> - Res = HandlerFun({key_diffs, Prefixes, Diffs}, - extract_compare_acc(CompareAcc, HandlerAcc)), - [{acc, Res}] - end, - CompareRes = hashtree:compare(LocalNode, RemoteNode, AccFun, []), - extract_compare_acc(CompareRes, HandlerAcc); -compare(NodeName, Level, LocalTree, RemoteFun, HandlerFun, HandlerAcc) -> - Prefixes = node_name_to_prefixes(NodeName), - LocalNode = lookup_node(NodeName, LocalTree), - RemoteNode = fun(Action, Info) -> - RemoteFun(Prefixes, {Action, Info}) - end, - AccFoldFun = fun({missing, NodeKey}, HandlerAcc2) -> - missing_prefix(NodeKey, local, HandlerFun, HandlerAcc2); - ({remote_missing, NodeKey}, HandlerAcc2) -> - missing_prefix(NodeKey, remote, HandlerFun, HandlerAcc2); - ({different, NodeKey}, HandlerAcc2) -> - compare(from_parent_key(NodeKey), Level+1, LocalTree, - RemoteFun, HandlerFun, HandlerAcc2) - end, - AccFun = fun(Diffs, CompareAcc) -> - Res = lists:foldl(AccFoldFun, - extract_compare_acc(CompareAcc, HandlerAcc), Diffs), - [{acc, Res}] - end, - CompareRes = hashtree:compare(LocalNode, RemoteNode, AccFun, []), - extract_compare_acc(CompareRes, HandlerAcc). - - -%% @private -missing_prefix(NodeKey, Type, HandlerFun, HandlerAcc) -> - HandlerFun({missing_prefix, Type, node_name_to_prefixes(from_parent_key(NodeKey))}, - HandlerAcc). -%% @private -extract_compare_acc([], HandlerAcc) -> - HandlerAcc; -extract_compare_acc([{acc, Acc}], _HandlerAcc) -> - Acc. - -%% @private -get_node(NodeName, Tree) -> - Node = lookup_node(NodeName, Tree), - get_node(NodeName, Node, Tree). - -%% @private -get_node(NodeName, undefined, Tree) -> - create_node(NodeName, Tree); -get_node(_NodeName, Node, _Tree) -> - Node. - -%% @private -lookup_node(NodeName, Tree=#hashtree_tree{nodes=Nodes}) -> - NodeKey = node_key(NodeName, Tree), - case ets:lookup(Nodes, NodeKey) of - [] -> undefined; - [{NodeKey, Node}] -> Node - end. - -%% @private -create_node(?ROOT, Tree) -> - NodeId = node_id(?ROOT, Tree), - NodePath = node_path(Tree), - NumSegs = node_num_segs(?ROOT), - Width = node_width(?ROOT), - Opts = [{segment_path, NodePath}, {segments, NumSegs}, {width, Width}], - %% destroy any data that previously existed because its lingering from - %% a tree that was not properly destroyed - ok = hashtree:destroy(NodePath), - Node = hashtree:new(NodeId, Opts), - set_node(?ROOT, Node, Tree); -create_node([], Tree) -> - create_node(?ROOT, Tree); -create_node(NodeName, Tree) -> - NodeId = node_id(NodeName, Tree), - RootNode = get_node(?ROOT, Tree), - NumSegs = node_num_segs(NodeName), - Width = node_width(NodeName), - Opts = [{segments, NumSegs}, {width, Width}], - %% share segment store accross all nodes - Node = hashtree:new(NodeId, RootNode, Opts), - set_node(NodeName, Node, Tree). - -%% @private -set_node(NodeName, Node, Tree) when is_list(NodeName) orelse NodeName =:= ?ROOT -> - set_node(node_key(NodeName, Tree), Node, Tree); -set_node(NodeKey, Node, #hashtree_tree{nodes=Nodes}) when is_tuple(NodeKey) -> - ets:insert(Nodes, [{NodeKey, Node}]), - Node. - -%% @private -parent_node(?ROOT, _Tree) -> - %% root has no parent - undefined; -parent_node([_Single], Tree) -> - %% parent of first level is the root - {?ROOT, get_node(?ROOT, Tree)}; -parent_node([_Prefix | Parent], Tree) -> - %% parent of subsequent level is tail of node name - {Parent, get_node(Parent, Tree)}. - -%% @private -node_width(?ROOT) -> - 256; -node_width(NodeName) -> - case length(NodeName) < 2 of - true -> 512; - false -> 1024 - end. - -%% @private -node_num_segs(?ROOT) -> - 256 * 256; -node_num_segs(NodeName) -> - case length(NodeName) < 2 of - true -> 512 * 512; - false -> 1024 * 1024 - end. - -%% @private -node_path(#hashtree_tree{data_root=DataRoot}) -> - DataRoot. - -%% @private -node_key(NodeName, #hashtree_tree{id=TreeId}) -> - {TreeId, NodeName}. - -%% @private -node_key_to_name({_TreeId, NodeName}) -> - NodeName. - -%% @private -node_id(?ROOT, #hashtree_tree{id=TreeId}) -> - {TreeId, <<0:176/integer>>}; -node_id(NodeName, #hashtree_tree{id=TreeId}) -> - <> = riak_core_util:md5(term_to_binary(NodeName)), - {TreeId, <>}. - -%% @private -to_parent_key(NodeName) -> - term_to_binary(NodeName). - -%% @private -from_parent_key(NodeKey) -> - binary_to_term(NodeKey). - -%% @private -valid_prefixes(NodeName, #hashtree_tree{num_levels=NumLevels}) -> - length(NodeName) =:= NumLevels. - -%% @private -prefixes_to_node_name([]) -> - ?ROOT; -prefixes_to_node_name(Prefixes) -> - lists:reverse(Prefixes). - -%% @private -node_name_to_prefixes(?ROOT) -> - []; -node_name_to_prefixes(NodeName) -> - lists:reverse(NodeName). - -%% @private -extract_top_hash([]) -> - undefined; -extract_top_hash([{0, Hash}]) -> - Hash. - -%% @private -data_root(Opts) -> - case proplists:get_value(data_dir, Opts) of - undefined -> - Base = "/tmp/hashtree_tree", - <> = riak_core_util:md5(term_to_binary(os:timestamp())), - filename:join(Base, riak_core_util:integer_to_list(P, 16)); - Root -> Root - end. diff --git a/src/process_proxy.erl b/src/process_proxy.erl deleted file mode 100644 index 4ad166c44..000000000 --- a/src/process_proxy.erl +++ /dev/null @@ -1,40 +0,0 @@ -%% ------------------------------------------------------------------- -%% 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. -%% -%% ------------------------------------------------------------------- --module(process_proxy). --export([start_link/2, init/1, stop/1]). - -start_link(RegName, ProxyTo) -> - proc_lib:start_link(?MODULE, init, [[self(), RegName, ProxyTo]]). - -init([ParentPid, RegName, ProxyTo]) -> - erlang:register(RegName, self()), - proc_lib:init_ack(ParentPid, {ok, self()}), - loop(ProxyTo). - -stop(Name) -> - Name ! stop. - -loop(ProxyTo) -> - receive - stop -> - exit(normal); - M -> - ProxyTo ! M, - loop(ProxyTo) - end. diff --git a/src/riak_core.app.src b/src/riak_core.app.src index a7b809bc5..7df7a4e4f 100644 --- a/src/riak_core.app.src +++ b/src/riak_core.app.src @@ -1,79 +1,40 @@ -%% -*- tab-width: 4;erlang-indent-level: 4;indent-tabs-mode: nil -*- -%% ex: ts=4 sw=4 et -{application, riak_core, -[ - {description, "Riak Core"}, - {vsn, git}, - {modules, []}, - {registered, []}, - {included_applications, [riak_ensemble]}, - {applications, [ - kernel, - stdlib, - sasl, - crypto, - riak_sysmon, - os_mon, - eleveldb, - pbkdf2, - poolboy, - exometer_core, - clique, - cluster_info, - basho_stats - ]}, - {mod, {riak_core_app, []}}, - {env, [ - %% Cluster name - {cluster_name, "default"}, - - %% Default location for ring, cluster and other data files - {platform_data_dir, "data"}, - - %% Default ring creation size. Make sure it is a power of 2, - %% e.g. 16, 32, 64, 128, 256, 512 etc - {ring_creation_size, 64}, - - %% Default gossip interval (milliseconds) - {gossip_interval, 60000}, - - %% Target N value - {target_n_val, 4}, - - %% Default claims functions - {wants_claim_fun, {riak_core_claim, default_wants_claim}}, - {choose_claim_fun, {riak_core_claim, default_choose_claim}}, - - %% Vnode inactivity timeout (how often to check if fallback vnodes - %% should return their data) in ms. - {vnode_inactivity_timeout, 60000}, - - %% Number of VNodes allowed to do handoff concurrently. - {handoff_concurrency, 2}, - - %% Disable Nagle on HTTP sockets - {disable_http_nagle, true}, - - %% Handoff IP/port - {handoff_port, 8099}, - {handoff_ip, "0.0.0.0"}, - - %% Disterl buffer sizes in bytes. - %% These sizes (3*128*1024 & 6*128*1024) were - %% derived from a limited amount of testing in a - %% 10GE environment, and may need tuning for your - %% network and workload. In particular they're likely - %% too small to be optimal for larger object sizes. - {dist_send_buf_size, 393216}, - {dist_recv_buf_size, 786432}, - - %% Exometer defaults - {exometer_defaults, - [ - {['_'], histogram, [{options, - [{histogram_module, exometer_slot_slide}, - {keep_high, 500}]} - ]} - ]} - ]} - ]}. +{application,riak_core, + [{description,"Riak Core"}, + {vsn,"4.0.0"}, + {modules,[]}, + {registered,[]}, + {included_applications,[chash, syntax_tools, compiler]}, + {applications, + [ + kernel,stdlib,crypto,os_mon, + gen_fsm_compat, + basho_stats,poolboy + ]}, + {mod,{riak_core_app,[]}}, + {env, + [{cluster_name,"default"}, + {platform_data_dir,"data"}, + {ring_state_dir,"data/ring"}, + {ring_creation_size,64}, + {gossip_interval, 60000}, + {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_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, []}, + {stat_mods, []}, + {health_checks, []} +]}, +{pkg_name,"riak_core"}, + {maintainers,["AntidoteDB","Albert Schimpf"]}, + {licenses,["Apache"]}, + {links,[{"Github","https://github.com/AntidoteDB/riak_core"}]}]}. diff --git a/src/riak_core.erl b/src/riak_core.erl index 6484c4d73..f6c7870cc 100644 --- a/src/riak_core.erl +++ b/src/riak_core.erl @@ -20,19 +20,17 @@ %% %% ------------------------------------------------------------------- -module(riak_core). --export([stop/0, stop/1, join/1, join/5, staged_join/1, remove/1, down/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([stat_mods/0]). +-export([stat_mods/0, stat_prefix/0]). -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]}). --include_lib("kernel/include/logger.hrl"). - -define(WAIT_PRINT_INTERVAL, (60 * 1000)). -define(WAIT_POLL_INTERVAL, 100). @@ -42,7 +40,7 @@ stop() -> stop("riak stop requested"). -ifdef(TEST). stop(Reason) -> - ?LOG_NOTICE("~p", [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). @@ -50,7 +48,7 @@ stop(Reason) -> 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. - ?LOG_NOTICE("~p", [Reason]), + logger:notice("~p", [Reason]), init:stop(). -endif. @@ -74,9 +72,9 @@ join(Node, Auto) when is_atom(Node) -> join(Node, Node, _) -> {error, self_join}; join(_, Node, Auto) -> - join(false, node(), Node, false, Auto). + join(node(), Node, false, Auto). -join(false, _, Node, Rejoin, Auto) -> +join(_, Node, Rejoin, Auto) -> case net_adm:ping(Node) of pang -> {error, not_reachable}; @@ -85,29 +83,14 @@ join(false, _, Node, Rejoin, Auto) -> end. get_other_ring(Node) -> - case riak_core_util:safe_rpc(Node, riak_core_ring_manager, get_my_ring, []) of - {ok, Ring} -> - case riak_core_ring:legacy_ring(Ring) of - true -> - {ok, Ring}; - false -> - riak_core_util:safe_rpc(Node, riak_core_ring_manager, get_raw_ring, []) - end; - Error -> - Error - end. + 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} -> - case riak_core_ring:legacy_ring(Ring) of - true -> - legacy_join(Node); - false -> - standard_join(Node, Ring, Rejoin, Auto) - end; + standard_join(Node, Ring, Rejoin, Auto); _ -> {error, unable_to_get_join_ring} end; @@ -141,7 +124,6 @@ standard_join(Node, Ring, Rejoin, Auto) -> {_, _, false} -> {error, different_ring_sizes}; _ -> - GossipVsn = riak_core_gossip:gossip_version(), Ring2 = riak_core_ring:add_member(node(), Ring, node()), Ring3 = riak_core_ring:set_owner(Ring2, node()), @@ -150,14 +132,8 @@ standard_join(Node, Ring, Rejoin, Auto) -> Ring3, node(), gossip_vsn, - GossipVsn), - ParticipateInCoverage = app_helper:get_env(riak_core,participate_in_coverage), - Ring4a = - riak_core_ring:update_member_meta(node(), - Ring4, - node(), - participate_in_coverage, ParticipateInCoverage), - {_, Ring5} = riak_core_capability:update_ring(Ring4a), + 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()) @@ -168,25 +144,6 @@ maybe_auto_join(false, _Node, Ring) -> maybe_auto_join(true, Node, Ring) -> riak_core_ring:update_member_meta(Node, Ring, Node, '$autojoin', true). -legacy_join(Node) when is_atom(Node) -> - {ok, OurRingSize} = application:get_env(riak_core, ring_creation_size), - case net_adm:ping(Node) of - pong -> - case riak_core_util:safe_rpc(Node, - application, - get_env, - [riak_core, ring_creation_size]) of - {ok, OurRingSize} -> - riak_core_gossip:send_ring(Node, node()); - {badrpc, rpc_process_down} -> - {error, not_reachable}; - _ -> - {error, different_ring_sizes} - end; - pang -> - {error, not_reachable} - end. - remove(Node) -> {ok, Ring} = riak_core_ring_manager:get_raw_ring(), case {riak_core_ring:all_members(Ring), @@ -209,8 +166,6 @@ standard_remove(Node) -> ok. down(Node) -> - down(false, Node). -down(false, Node) -> {ok, Ring} = riak_core_ring_manager:get_raw_ring(), case net_adm:ping(Node) of pong -> @@ -262,7 +217,6 @@ standard_leave(Node) -> remove_from_cluster(ExitingNode) when is_atom(ExitingNode) -> remove(ExitingNode). - vnode_modules() -> case application:get_env(riak_core, vnode_modules) of undefined -> []; @@ -347,16 +301,6 @@ register(App, [{permissions, Permissions}|T]) -> register(App, T); register(App, [{auth_mod, {AuthType, AuthMod}}|T]) -> register_proplist({AuthType, AuthMod}, auth_mods), - register(App, T); -register(App, - [{node_worker_pool, - {WorkerMod, PoolSize, WArgs, WProps, node_worker_pool}}|T]) -> - register_pool(App, WorkerMod, PoolSize, WArgs, WProps, node_worker_pool), - register(App, T); -register(App, - [{dscp_worker_pool, - {WorkerMod, PoolSize, WArgs, WProps, PoolType}}|T]) -> - register_pool(App, WorkerMod, PoolSize, WArgs, WProps, PoolType), register(App, T). register_mod(App, Module, Type) when is_atom(Type) -> @@ -364,7 +308,10 @@ register_mod(App, Module, Type) when is_atom(Type) -> vnode_modules -> riak_core_vnode_proxy_sup:start_proxies(Module); stat_mods -> - riak_core_stats_sup:start_server(Module); + %% STATS +%% riak_core_stats_sup:start_server(Module); + logger:warning("Metric collection disabled"), + ok; _ -> ok end, @@ -376,13 +323,6 @@ register_mod(App, Module, Type) when is_atom(Type) -> lists:usort([{App,Module}|Mods])) end. -register_pool(_App, WorkerMod, PoolSize, WorkerArgs, WorkerProps, PoolType) -> - ok = riak_core_node_worker_pool_sup:start_pool(WorkerMod, - PoolSize, - WorkerArgs, - WorkerProps, - PoolType). - register_metadata(App, Value, Type) -> case application:get_env(riak_core, Type) of undefined -> @@ -466,13 +406,13 @@ wait_for_application(App, Elapsed) -> true when Elapsed == 0 -> ok; true when Elapsed > 0 -> - ?LOG_INFO("Wait complete for application ~p (~p seconds)", [App, Elapsed div 1000]), + 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 -> ?LOG_INFO("Waiting for application ~p to start (~p seconds).", [App, Elapsed div 1000]); + true -> logger:info("Waiting for application ~p to start (~p seconds).", [App, Elapsed div 1000]); false -> skip end, timer:sleep(?WAIT_POLL_INTERVAL), @@ -486,15 +426,18 @@ wait_for_service(Service, Elapsed) -> true when Elapsed == 0 -> ok; true when Elapsed > 0 -> - ?LOG_INFO("Wait complete for service ~p (~p seconds)", [Service, Elapsed div 1000]), + 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 -> ?LOG_INFO("Waiting for service ~p to start (~p seconds)", [Service, Elapsed div 1000]); + 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) end. + +stat_prefix() -> + application:get_env(riak_core, stat_prefix, riak). diff --git a/src/riak_core_apl.erl b/src/riak_core_apl.erl index 125905569..b76e40796 100644 --- a/src/riak_core_apl.erl +++ b/src/riak_core_apl.erl @@ -29,7 +29,7 @@ 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, offline_owners/3 + first_up/2, offline_owners/1, offline_owners/2 ]). -export_type([preflist/0, preflist_ann/0, preflist_with_pnum_ann/0]). @@ -174,13 +174,13 @@ offline_owners(Service) -> {ok, CHBin} = riak_core_ring_manager:get_chash_bin(), offline_owners(Service, CHBin). -offline_owners(Service, CHBin) -> - offline_owners(Service, CHBin, []). - -offline_owners(Service, CHBin, OtherDownNodes) -> +offline_owners(Service, CHBin) when is_atom(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}) -> - (not is_up(Node, UpSet) or lists:member(Node,OtherDownNodes)) + not is_up(Node, UpSet) end, CHBin), DownVNodes. @@ -285,8 +285,7 @@ last_in_ring() -> six_node_test() -> %% its non-trivial to create a real 6 node ring, so here's one we made %% earlier - {ok, [Ring0]} = file:consult("test/my_ring"), - Ring = riak_core_ring:upgrade(Ring0), + {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>>, @@ -363,10 +362,9 @@ six_node_test() -> ok. six_node_bucket_key_ann_test() -> - {ok, [Ring0]} = file:consult("test/my_ring"), + {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'], - Ring = riak_core_ring:upgrade(Ring0), Bucket = <<"favorite">>, Key = <<"jethrotull">>, application:set_env(riak_core, default_bucket_props, diff --git a/src/riak_core_app.erl b/src/riak_core_app.erl index e16f6a78b..9d2ce17ab 100644 --- a/src/riak_core_app.erl +++ b/src/riak_core_app.erl @@ -27,93 +27,48 @@ %% Application callbacks -export([start/2, stop/1]). --include_lib("kernel/include/logger.hrl"). - %% =================================================================== %% Application callbacks %% =================================================================== start(_StartType, _StartArgs) -> - %% Don't add our system_monitor event handler here. Instead, let - %% riak_core_sysmon_minder start it, because that process can act - %% on any handler crash notification, whereas we cannot. + ok = validate_ring_state_directory_exists(), + + start_riak_core_sup(). - case application:get_env(riak_core, delayed_start) of - {ok, Delay} -> - ?LOG_INFO("Delaying riak_core startup as requested"), - timer:sleep(Delay); - _ -> - ok - end, +stop(_State) -> + logger:info("Stopped application riak_core", []), + ok. - %% Validate that the ring state directory exists +validate_ring_state_directory_exists() -> riak_core_util:start_app_deps(riak_core), - RingStateDir = app_helper:get_env(riak_core, 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} -> - ?LOG_CRITICAL( - "Ring state directory ~p does not exist, " - "and could not be created: ~p", - [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, - - %% Register our cluster_info app callback modules, with catch if - %% the app is missing or packaging is broken. - catch cluster_info:register_app(riak_core_cinfo_core), + end. - %% add these defaults now to supplement the set that may have been - %% configured in app.config - riak_core_bucket:append_bucket_defaults(riak_core_bucket_type:defaults(default_type)), +start_riak_core_sup() -> %% Spin up the supervisor; prune ring files as necessary case riak_core_sup:start_link() of {ok, Pid} -> - riak_core:register(riak_core, [{stat_mod, riak_core_stat}, - {permissions, [get_bucket, - set_bucket, - get_bucket_type, - set_bucket_type]}]), - ok = riak_core_ring_events:add_guarded_handler(riak_core_ring_handler, []), - - riak_core_capability:register({riak_core, vnode_routing}, - [proxy, legacy], - legacy, - {riak_core, - legacy_vnode_routing, - [{true, legacy}, {false, proxy}]}), - riak_core_capability:register({riak_core, staged_joins}, - [true, false], - false), - riak_core_capability:register({riak_core, resizable_ring}, - [true, false], - false), - riak_core_capability:register({riak_core, fold_req_version}, - [v2, v1], - v1), - riak_core_capability:register({riak_core, security}, - [true, false], - false), - riak_core_capability:register({riak_core, bucket_types}, - [true, false], - false), - riak_core_capability:register({riak_core, net_ticktime}, - [true, false], - false), - - riak_core_cli_registry:load_schema(), - riak_core_cli_registry:register_node_finder(), - riak_core_cli_registry:register_cli(), - - riak_core_throttle:init(), + ok = register_applications(), + ok = add_ring_event_handler(), {ok, Pid}; {error, Reason} -> {error, Reason} end. -stop(_State) -> - ?LOG_INFO("Stopped application riak_core.\n", []), +register_applications() -> ok. + +add_ring_event_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 new file mode 100644 index 000000000..a3e5a4390 --- /dev/null +++ b/src/riak_core_base64url.erl @@ -0,0 +1,95 @@ +%% ------------------------------------------------------------------- +%% +%% 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_bg_manager.erl b/src/riak_core_bg_manager.erl deleted file mode 100644 index 96f6082c1..000000000 --- a/src/riak_core_bg_manager.erl +++ /dev/null @@ -1,949 +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. -%% -%% @doc -%% The background manager allows tokens and locks to be "acquired" by -%% competing processes in a way that limits the total load on the cluster. -%% -%% The model is different than your typical semaphore. Here, we are -%% interested in coordinating background jobs that start, run, and die. -%% -%% The term "given" is a general version of "held", "acquired", or -%% "allocated" for both locks and tokens. Held doesn't make sense for -%% tokens since they aren't held. So, "given" applies to both locks -%% and tokens, but you can think "held" for locks if that's more fun. -%% -%% Resources are defined by their "names", which is the same as "type" -%% or "kind". A lock name might be the atom 'aae_hashtree_lock' or the -%% tuple '{my_ultimate_lock, 42}'. -%% -%% Usage: -%% 1. register your lock/token and set it's max concurrency/rate. -%% 2. "get" a lock/token by it's resource type/name -%% 3. do stuff -%% 4. let your process die, which gives back a lock. -%% -%% @private -%% Internal Notes: -%% We use two ETS tables to store critical data. In the event this process crashes, -%% the tables will be given back to the table manager and we can reclaim them when -%% we restart. Thus, limits and states are maintained across restarts of the -%% module, but not of the application. Since we are supervised by riak_core_sup, -%% that's fine. -%% -%% === Info Table === -%% The table must be a set and is best if private. See ?BG_INFO_ETS_OPTS in MODULE.hrl. -%% Table Schema... -%% KEY Data Notes -%% --- ---- ----- -%% {info, Resource} #resource_info One token object per key. -%% bypassed boolean() -%% enabled boolean() -%% -%% === Entries Table === -%% The table must be a bag and is best if private. See ?BG_ENTRY_ETS_OPTS in MODULE.hrl. -%% KEY Data Notes -%% --- ---- ----- -%% {given, Resource} #resource_entry Multiple objects per key. -%% -%% ------------------------------------------------------------------- --module(riak_core_bg_manager). - --behaviour(gen_server). - --include("riak_core_bg_manager.hrl"). - --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). --endif. - -%% API --export([ - %% Universal - start_link/0, - bypass/1, - bypassed/0, - enabled/0, - enabled/1, - enable/0, - enable/1, - disable/0, - disable/1, - disable/2, - %% Locks - concurrency_limit/1, - set_concurrency_limit/2, - set_concurrency_limit/3, - concurrency_limit_reached/1, - get_lock/1, - get_lock/2, - get_lock/3, - lock_info/0, - lock_info/1, - lock_count/1, - %% Tokens - set_token_rate/2, - token_rate/1, - get_token/1, - get_token/2, - get_token/3, - token_info/0, - token_info/1, - %% Testing - start/0 - ]). - -%% reporting --export([ps/0, - all_resources/0, - all_resources/1, - all_locks/0, - all_locks/1, - all_tokens/0, - all_tokens/1 - ]). - -%% Convenience --export([use_bg_mgr/0, - use_bg_mgr/2 - ]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --define(SERVER, ?MODULE). - --define(NOT_TRANSFERED(S), S#state.info_table == undefined orelse S#state.entry_table == undefined). - -%%%=================================================================== -%%% API -%%%=================================================================== - -%% @doc Starts the server --spec start_link() -> {ok, pid()} | ignore | {error, term}. -start_link() -> - _ = maybe_create_ets(), - gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). - -%% Test entry point to start stand-alone server -start() -> - _ = maybe_create_ets(), - gen_server:start({local, ?SERVER}, ?MODULE, [], []). - -%% @doc Global kill switch - causes all locks/tokens to be given out freely without limits. -%% Nothing will be tracked or recorded. --spec bypass(boolean()) -> ok. -bypass(Switch) -> - gen_server:cast(?SERVER, {bypass, Switch}). - -%% @doc Return bypass state as boolean. --spec bypassed() -> boolean(). -bypassed() -> - gen_server:call(?SERVER, bypassed). - -%% @doc Enable handing out of all locks and tokens --spec enable() -> enabled | bypassed. -enable() -> - gen_server:call(?SERVER, enable). - -%% @doc Disable handing out of all locks and tokens --spec disable() -> disabled | bypassed. -disable() -> - gen_server:call(?SERVER, disable). - -%% @doc Return global enabled status. --spec enabled() -> enabled | disabled | bypassed. -enabled() -> - gen_server:call(?SERVER, enabled). - -%% @doc Enable handing out resources of the kind specified. If the resource -%% has not already been registered, this will have no effect. --spec enable(bg_resource()) -> enabled | unregistered | bypassed. -enable(Resource) -> - gen_server:call(?SERVER, {enable, Resource}). - -%% @doc Disable handing out resource of the given kind. --spec disable(bg_resource()) -> disabled | unregistered | bypassed. -disable(Resource) -> - gen_server:call(?SERVER, {disable, Resource}). - --spec enabled(bg_resource()) -> enabled | disabled | bypassed. -enabled(Resource) -> - gen_server:call(?SERVER, {enabled, Resource}). - -%% @doc Disable handing out resource of the given kind. If kill == true, -%% processes that currently hold the given resource will be killed. --spec disable(bg_resource(), boolean()) -> disabled | unregistered | bypassed. -disable(Resource, Kill) -> - gen_server:call(?SERVER, {disable, Resource, Kill}). - -%%%%%%%%%%% -%% Lock API -%%%%%%%%%%% - -%% @doc Get the current maximum concurrency for the given lock type. -%% If the background manager is unavailable, undefined is returned. --spec concurrency_limit(bg_lock()) -> bg_concurrency_limit() | undefined. -concurrency_limit(Lock) -> - gen_server:call(?MODULE, {concurrency_limit, Lock}, infinity). - -%% @doc same as `set_concurrency_limit(Type, Limit, false)' --spec set_concurrency_limit(bg_lock(), bg_concurrency_limit()) -> - bg_concurrency_limit() | undefined | unregistered. -set_concurrency_limit(Lock, Limit) -> - set_concurrency_limit(Lock, Limit, false). - -%% @doc Set a new maximum concurrency for the given lock type and return -%% the previous maximum or default. If more locks are held than the new -%% limit how they are handled depends on the value of `Kill'. If `true', -%% then the extra locks are released by killing processes with reason `max_concurrency'. -%% If `false', then the processes holding the extra locks are aloud to do so until they -%% are released. --spec set_concurrency_limit(bg_lock(), bg_concurrency_limit(), boolean()) -> - bg_concurrency_limit() | undefined | unregistered. -set_concurrency_limit(Lock, Limit, Kill) -> - gen_server:call(?MODULE, {set_concurrency_limit, Lock, Limit, Kill}, infinity). - -%% @doc Returns true if the number of held locks is at the limit for the given lock type --spec concurrency_limit_reached(bg_lock()) -> boolean(). -concurrency_limit_reached(Lock) -> - gen_server:call(?MODULE, {lock_limit_reached, Lock}, infinity). - -%% @doc Acquire a concurrency lock of the given name, if available, -%% and associate the lock with the calling process. Returns the -%% reference to the monitored process or max_concurrency. --spec get_lock(bg_lock()) -> {ok, reference()} | max_concurrency. -get_lock(Lock) -> - get_lock(Lock, self()). - -%% @doc Acquire a concurrency lock, if available, and associate the -%% lock with the provided pid or metadata. If metadata -%% is provided the lock is associated with the calling process -%% If no locks are available, max_concurrency is returned. --spec get_lock(bg_lock(), pid() | [{atom(), any()}]) -> {ok, reference()} | max_concurrency. -get_lock(Lock, Pid) when is_pid(Pid) -> - get_lock(Lock, Pid, []); -get_lock(Lock, Opts) when is_list(Opts)-> - get_lock(Lock, self(), Opts). - -%% @doc Acquire a concurrency lock, if available, and associate -%% the lock with the provided pid and metadata. --spec get_lock(bg_lock(), pid(), [{atom(), any()}]) -> {ok, reference()} | max_concurrency. -get_lock(Lock, Pid, Meta) -> - gen_server:call(?MODULE, {get_lock, Lock, Pid, Meta}, infinity). - -%% @doc Return the current concurrency count of the given lock type. --spec lock_count(bg_lock()) -> integer() | unregistered. -lock_count(Lock) -> - gen_server:call(?MODULE, {lock_count, Lock}, infinity). - -%% @doc Return list of lock types and associated info. To be returned in this list -%% a lock type must have had its concurrency set or have been enabled/disabled. --spec lock_info() -> [{bg_lock(), boolean(), bg_concurrency_limit()}]. -lock_info() -> - gen_server:call(?MODULE, lock_info, infinity). - -%% @doc Return the registration info for the named Lock --spec lock_info(bg_lock()) -> {boolean(), bg_concurrency_limit()} | unregistered. -lock_info(Lock) -> - gen_server:call(?MODULE, {lock_info, Lock}, infinity). - -%%%%%%%%%%%% -%% Token API -%%%%%%%%%%%% - -%% @doc Set the refill rate of tokens. Return previous value. --spec set_token_rate(bg_token(), bg_rate()) -> bg_rate(). -set_token_rate(_Token, undefined) -> undefined; -set_token_rate(Token, Rate={_Period, _Count}) -> - gen_server:call(?SERVER, {set_token_rate, Token, Rate}, infinity). - -%% @doc Get the current refill rate of named token. -%% If the background manager is unavailable, undefined is returned. --spec token_rate(bg_token()) -> bg_rate() | undefined. -token_rate(Token) -> - gen_server:call(?SERVER, {token_rate, Token}, infinity). - -%% @doc Get a token without blocking. -%% Associate token with provided pid or metadata. If metadata -%% is provided the lock is associated with the calling process. -%% Returns "max_concurrency" if empty. --spec get_token(bg_token(), pid() | [{atom(), any()}]) -> ok | max_concurrency. -get_token(Token, Pid) when is_pid(Pid) -> - get_token(Token, Pid, []); -get_token(Token, Meta) -> - get_token(Token, self(), Meta). - --spec get_token(bg_token()) -> ok | max_concurrency. -get_token(Token) -> - get_token(Token, self()). - --spec get_token(bg_token(), pid(), [{atom(), any()}]) -> ok | max_concurrency. -get_token(Token, Pid, Meta) -> - gen_server:call(?SERVER, {get_token, Token, Pid, Meta}, infinity). - -%% @doc Return list of token kinds and associated info. To be returned in this list -%% a token must have had its rate set. --spec token_info() -> [{bg_token(), boolean(), bg_rate()}]. -token_info() -> - gen_server:call(?MODULE, token_info, infinity). - -%% @doc Return the registration info for the named Token --spec token_info(bg_token()) -> {boolean(), bg_rate()}. -token_info(Token) -> - gen_server:call(?MODULE, {token_info, Token}, infinity). - -%%%%%%%%%%%%%%%% -%% Reporting API -%%%%%%%%%%%%%%%% - -%% @doc Get a list of all resources of all types in all states --spec all_resources() -> [bg_stat_live()]. -all_resources() -> - all_resources(all). - -%% @doc Get a list of all resources named `Resource' --spec all_resources(bg_token() | bg_lock() | all) -> [bg_stat_live()]. -all_resources(Resource) -> - query_resource(Resource, [token, lock]). - -%% @doc Returns all locks. --spec all_locks() -> [bg_stat_live()]. -all_locks() -> - all_locks(all). - -%% @doc Returns all locks named `Name' --spec all_locks(bg_lock() | all) -> [bg_stat_live()]. -all_locks(Lock) -> - query_resource(Lock, [lock]). - -%% @doc Returns all tokens --spec all_tokens() -> [bg_stat_live()]. -all_tokens() -> - all_tokens(all). - -%% @doc Returns all tokens named `Name' --spec all_tokens(bg_token() | all) -> [bg_stat_live()]. -all_tokens(Token) -> - query_resource(Token, [token]). - -%% @doc List most recent requests/grants for all tokens and locks. --spec ps() -> [bg_stat_live()]. -ps() -> - %% NOTE: this will change to include other stats in the future. - %% Update tests when that's done. - all_resources(). - -%% @private -%% @doc Query the current set of registered resources by name and types. -%% The special atom 'all' querys all resources. A list of types allows -%% selective query. This call does not use the gen_server and instead -%% reads ETS tables directly, thus should be respsonsive even when the -%% background manager is busy or overloaded. --spec query_resource(bg_resource() | all, [bg_resource_type()]) -> [bg_stat_live()]. -query_resource(Resource, Types) -> - do_query(Resource, Types). - -%%%=================================================================== -%%% Data Structures -%%%=================================================================== - --type bg_limit() :: bg_concurrency_limit() | bg_rate(). - -%% General settings of a lock type. --record(resource_info, - {type :: bg_resource_type(), - limit :: bg_limit(), - enabled :: boolean()}). - --define(resource_type(X), (X)#resource_info.type). --define(resource_limit(X), (X)#resource_info.limit). --define(resource_enabled(X), (X)#resource_info.enabled). - --define(DEFAULT_CONCURRENCY, 0). %% DO NOT CHANGE. DEFAULT SET TO 0 TO ENFORCE "REGISTRATION" --define(DEFAULT_RATE, undefined).%% DO NOT CHANGE. DEFAULT SET TO 0 TO ENFORCE "REGISTRATION" --define(DEFAULT_LOCK_INFO, #resource_info{type=lock, enabled=true, limit=?DEFAULT_CONCURRENCY}). --define(DEFAULT_TOKEN_INFO, #resource_info{type= token, enabled=true, limit=?DEFAULT_RATE}). - -%% An instance of a resource entry in "given" --record(resource_entry, - {resource :: bg_resource(), - type :: bg_resource_type(), - pid :: pid(), %% owning process - meta :: bg_meta(), %% associated metadata - ref :: reference() %% optional monitor reference to owning process - }). - --define(RESOURCE_ENTRY(Resource, Type, Pid, Meta, Ref), - #resource_entry{resource=Resource, type=Type, pid=Pid, meta=Meta, ref=Ref}). --define(e_resource(X), (X)#resource_entry.resource). --define(e_type(X), (X)#resource_entry.type). --define(e_pid(X), (X)#resource_entry.pid). --define(e_meta(X), (X)#resource_entry.meta). --define(e_ref(X), (X)#resource_entry.ref). - -%%% -%%% Gen Server State record -%%% - --record(state, - {info_table:: ets:tab(), %% TableID of ?BG_INFO_ETS_TABLE - entry_table:: ets:tab(), %% TableID of ?BG_ENTRY_ETS_TABLE - enabled :: boolean(), %% Global enable/disable switch, true at startup - bypassed:: boolean() %% Global kill switch. false at startup - }). - -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== - -%% @private -%% @doc Initializes the server --spec init([]) -> {ok, #state{}} | - {ok, #state{}, non_neg_integer() | infinity} | - ignore | - {stop, term()}. -init([]) -> - ?LOG_DEBUG("Background Manager starting up."), - State = #state{info_table=?BG_INFO_ETS_TABLE, - entry_table=?BG_ENTRY_ETS_TABLE, - enabled=true, - bypassed=false}, - State2 = validate_holds(State), - State3 = restore_enabled(true, State2), - State4 = restore_bypassed(false, State3), - reschedule_token_refills(State4), - {ok, State4}. - -%% @private -%% @doc Handling call messages --spec handle_call(term(), {pid(), term()}, #state{}) -> - {reply, term(), #state{}} | - {reply, term(), #state{}, non_neg_integer()} | - {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), term(), #state{}} | - {stop, term(), #state{}}. - -handle_call(bypassed, _From, State=#state{bypassed=Bypassed}) -> - {reply, Bypassed, State}; -handle_call({enabled, Resource}, _From, State) -> - do_handle_call_exception(fun do_enabled/2, [Resource, State], State); -handle_call({enable, Resource}, _From, State) -> - do_handle_call_exception(fun do_enable_resource/3, [Resource, true, State], State); -handle_call({disable, Resource}, _From, State) -> - do_handle_call_exception(fun do_enable_resource/3, [Resource, false, State], State); -handle_call({disable, Lock, Kill}, _From, State) -> - do_handle_call_exception(fun do_disable_lock/3, [Lock, Kill, State], State); -handle_call(enabled, _From, State) -> - {reply, status_of(true, State), State}; -handle_call(enable, _From, State) -> - State2 = update_enabled(true, State), - {reply, status_of(true, State2), State2}; -handle_call(disable, _From, State) -> - State2 = update_enabled(false, State), - {reply, status_of(true, State2), State2}; -handle_call({get_lock, Lock, Pid, Meta}, _From, State) -> - do_handle_call_exception(fun do_get_resource/5, [Lock, lock, Pid, Meta, State], State); -handle_call({lock_count, Lock}, _From, State) -> - {reply, held_count(Lock, State), State}; -handle_call({lock_limit_reached, Lock}, _From, State) -> - do_handle_call_exception(fun do_lock_limit_reached/2, [Lock, State], State); -handle_call(lock_info, _From, State) -> - do_handle_call_exception(fun do_get_type_info/2, [lock, State], State); -handle_call({lock_info, Lock}, _From, State) -> - do_handle_call_exception(fun do_resource_info/2, [Lock, State], State); -handle_call({concurrency_limit, Lock}, _From, State) -> - do_handle_call_exception(fun do_resource_limit/3, [lock, Lock, State], State); -handle_call({set_concurrency_limit, Lock, Limit, Kill}, _From, State) -> - do_set_concurrency_limit(Lock, Limit, Kill, State); -handle_call({token_rate, Token}, _From, State) -> - do_handle_call_exception(fun do_resource_limit/3, [token, Token, State], State); -handle_call(token_info, _From, State) -> - do_handle_call_exception(fun do_get_type_info/2, [token, State], State); -handle_call({token_info, Token}, _From, State) -> - do_handle_call_exception(fun do_resource_info/2, [Token, State], State); -handle_call({set_token_rate, Token, Rate}, _From, State) -> - do_handle_call_exception(fun do_set_token_rate/3, [Token, Rate, State], State); -handle_call({get_token, Token, Pid, Meta}, _From, State) -> - do_handle_call_exception(fun do_get_resource/5, [Token, token, Pid, Meta, State], State). - -%% @private -%% @doc Handling cast messages --spec handle_cast(term(), #state{}) -> {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), #state{}}. -handle_cast({bypass, false}, State) -> - {noreply, update_bypassed(false,State)}; -handle_cast({bypass, true}, State) -> - {noreply, update_bypassed(true,State)}; -handle_cast({bypass, _Other}, State) -> - {noreply, State}. - -%% @private -%% @doc Handling all non call/cast messages --spec handle_info(term(), #state{}) -> {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), #state{}}. -handle_info({'DOWN', Ref, _, _, _}, State) -> - State2 = release_resource(Ref, State), - {noreply, State2}; -handle_info({refill_tokens, Type}, State) -> - State2 = do_refill_tokens(Type, State), - schedule_refill_tokens(Type, State2), - {noreply, State2}; -handle_info(_Info, State) -> - {noreply, State}. - -%% @private -%% @doc -%% This function is called by a gen_server when it is about to -%% terminate. It should be the opposite of Module:init/1 and do any -%% necessary cleaning up. When it returns, the gen_server terminates -%% with Reason. The return value is ignored. --spec terminate(term(), #state{}) -> term(). -terminate(_Reason, _State) -> - ok. - -%% @private -%% @doc Convert process state when code is changed --spec code_change(term() | {down, term()}, #state{}, term()) -> {ok, #state{}}. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -%% @doc bypass > enable/disable -status_of(_Enabled, #state{bypassed=true}) -> bypassed; -status_of(true, #state{enabled=true}) -> enabled; -status_of(_E,_S) -> disabled. - -%% @private -%% @doc We must have just gotten the table data back after a crash/restart. -%% Walk through the given resources and release any holds by dead processes. -%% Assumes TableId is always valid (called only after transfer) -validate_holds(State=#state{entry_table=TableId}) -> - _ = [validate_hold(Obj, TableId) || Obj <- ets:match_object(TableId, {{given, '_'},'_'})], - State. - -%% @private -%% @doc If the given entry has no alive process associated with it, -%% remove the hold from the ETS table. If it is alive, then we need -%% to re-monitor it and update the table with the new ref. -validate_hold({Key,Entry}=Obj, TableId) when ?e_type(Entry) == lock -> - case is_process_alive(?e_pid(Entry)) of - true -> - %% Still alive. Re-monitor and update table - Ref = monitor(process, ?e_pid(Entry)), - Entry2 = Entry#resource_entry{ref=Ref}, - ets:delete_object(TableId, Obj), - ets:insert(TableId, {Key, Entry2}); - false -> - %% Process is not alive - release the lock - ets:delete_object(TableId, Obj) - end; -validate_hold(_Obj, _TableId) -> %% tokens don't monitor processes - true. - -%% @doc Update state with bypassed status and store to ETS -update_bypassed(_Bypassed, State) when ?NOT_TRANSFERED(State) -> - State; -update_bypassed(Bypassed, State=#state{info_table=TableId}) -> - ets:insert(TableId, {bypassed, Bypassed}), - State#state{bypassed=Bypassed}. - -%% @doc Update state with enabled status and store to ETS -update_enabled(_Enabled, State) when ?NOT_TRANSFERED(State) -> - State; -update_enabled(Enabled, State=#state{info_table=TableId}) -> - ets:insert(TableId, {enabled, Enabled}), - State#state{enabled=Enabled}. - -%% Assumes tables have been transfered. -restore_boolean(Key, Default, #state{info_table=TableId}) -> - case ets:lookup(TableId, Key) of - [] -> - ets:insert(TableId, {Key, Default}), - Default; - [{_Key,Value} | _Rest] -> - Value - end. - -%% Assumes tables have been transfered. -restore_bypassed(Default, State) -> - State#state{bypassed=restore_boolean(bypassed, Default, State)}. - -%% Assumes tables have been transfered. -restore_enabled(Default, State) -> - State#state{enabled=restore_boolean(enabled, Default, State)}. - -%% @private -%% @doc Wrap a call, to a function with args, with a try/catch that handles -%% thrown exceptions, namely '{unregistered, Resource}' and return the -%% failed error response for a gen server call. -do_handle_call_exception(Function, Args, State) -> - try apply(Function, Args) - catch - Error -> - ?LOG_ERROR("Exception: ~p in function ~p", [Error, Function]), - {reply, Error, State} - end. - -%% @doc Throws {unregistered, Resource} for unknown Lock. -do_disable_lock(_Lock, _Kill, State) when ?NOT_TRANSFERED(State) -> - {noreply, State}; -do_disable_lock(Lock, Kill, State) -> - Info = resource_info(Lock, State), - enforce_type_or_throw(Lock, lock, Info), - maybe_honor_limit(Kill, Lock, 0, State), - do_enable_resource(Lock, false, State). - -%% @doc Throws unregistered for unknown Token -do_set_token_rate(Token, Rate, State) -> - try - Info = resource_info(Token, State), %% may throw table_id_undefined or unregistered - OldRate = Info#resource_info.limit, - enforce_type_or_throw(Token, token, Info), %% may throw badtype - State2 = update_limit(Token, Rate, Info, State), - schedule_refill_tokens(Token, State2), - {reply, OldRate, State2} - catch - table_id_undefined -> - %% This could go into a queue to be played when the transfer happens. - {reply, unregistered, State}; - {unregistered, Token} -> - State3 = update_limit(Token, Rate, ?DEFAULT_TOKEN_INFO, State), - schedule_refill_tokens(Token, State3), - {reply, undefined, State3}; - {badtype, _Token}=Error -> - {reply, Error, State} - end. - -do_get_type_info(_Type, State) when ?NOT_TRANSFERED(State) -> - %% Table not trasnferred yet. - []; -do_get_type_info(Type, State) -> - S = fun({R,_T,E,L}) -> {R,E,L} end, - Resources = all_registered_resources(Type, State), - Infos = [S(resource_info_tuple(Resource, State)) || Resource <- Resources], - {reply, Infos, State}. - -%% Returns empty if the ETS table has not been transferred to us yet. -do_resource_limit(_Type, _Resource, State) when ?NOT_TRANSFERED(State) -> - {reply, undefined, state}; -do_resource_limit(_Type, Resource, State) -> - Info = resource_info(Resource, State), - Rate = ?resource_limit(Info), - {reply, Rate, State}. - -enforce_type_or_throw(Resource, Type, Info) -> - case ?resource_type(Info) of - Type -> ok; - _Other -> throw({badtype, Resource}) - end. - -do_set_concurrency_limit(Lock, Limit, Kill, State) -> - try - Info = resource_info(Lock, State), %% may throw table_id_undefined or unregistered - enforce_type_or_throw(Lock, lock, Info), %% may throw badtype - OldLimit = limit(Info), - State2 = update_limit(Lock, Limit, ?DEFAULT_LOCK_INFO, State), - maybe_honor_limit(Kill, Lock, Limit, State2), - {reply, OldLimit, State2} - catch - table_id_undefined -> - %% This could go into a queue to be played when the transfer happens. - {reply, unregistered, State}; - {unregistered, Lock} -> - {reply, undefined, update_limit(Lock, Limit, ?DEFAULT_LOCK_INFO, State)}; - {badtype, _Lock}=Error -> - {reply, Error, State} - end. - -%% @doc Throws unregistered for unknown Lock -do_resource_info(Lock, State) -> - {_R,_T,E,L} = resource_info_tuple(Lock, State), - {reply, {E,L}, State}. - -%% @doc Throws unregistered for unknown Lock -do_lock_limit_reached(Lock, State) -> - Info = resource_info(Lock, State), - enforce_type_or_throw(Lock, lock, Info), - HeldCount = held_count(Lock, State), - Limit = limit(Info), - {reply, HeldCount >= Limit, State}. - -%% @private -%% @doc Return the maximum allowed number of resources for the given -%% info, which considers the type of resource, e.g. lock vs token. -limit(#resource_info{type=lock, limit=Limit}) -> Limit; -limit(#resource_info{type=token, limit={_Period,MaxCount}}) -> MaxCount. - -%% @private -%% @doc Release the resource associated with the given reference. This is mostly -%% meaningful for locks. -release_resource(_Ref, State) when ?NOT_TRANSFERED(State) -> - State; -release_resource(Ref, State=#state{entry_table=TableId}) -> - %% There should only be one instance of the object, but we'll zap all that match. - Given = [Obj || Obj <- ets:match_object(TableId, {{given, '_'},'_'})], - Matches = [Obj || {_Key,Entry}=Obj <- Given, ?e_ref(Entry) == Ref], - _ = [ets:delete_object(TableId, Obj) || Obj <- Matches], - State. - -maybe_honor_limit(true, Lock, Limit, #state{entry_table=TableId}) -> - Entries = all_given_entries(all, TableId), - Held = [Entry || Entry <- Entries, ?e_type(Entry) == lock, ?e_resource(Entry) == Lock], - case Limit < length(Held) of - true -> - {_Keep, Discards} = lists:split(Limit, Held), - %% killing of processes will generate 'DOWN' messages and release the locks - _ = [erlang:exit(?e_pid(Discard), max_concurrency) || Discard <- Discards], - ok; - false -> - ok - end; -maybe_honor_limit(false, _LockType, _Limit, _State) -> - ok. - -held_count(Resource, State) -> - length(all_given_entries(Resource, State#state.entry_table)). - -do_enabled(Resource, State) -> - Info = resource_info(Resource, State), - {reply, status_of(?resource_enabled(Info), State), State}. - -do_enable_resource(Resource, Enabled, State) -> - Info = resource_info(Resource, State), - State2 = update_resource_enabled(Resource, Enabled, Info, State), - {reply, status_of(Enabled, State2), State2}. - -update_resource_enabled(Resource, Value, Default, State) -> - update_resource_info(Resource, - fun(Info) -> Info#resource_info{enabled=Value} end, - Default#resource_info{enabled=Value}, - State). - -update_limit(Resource, Limit, Default, State) -> - update_resource_info(Resource, - fun(Info) -> Info#resource_info{limit=Limit} end, - Default#resource_info{limit=Limit}, - State). - -update_resource_info(Resource, Fun, Default, State=#state{info_table=TableId}) -> - Key = {info, Resource}, - NewInfo = case ets:lookup(TableId, Key) of - [] -> Default; - [{_Key,Info} | _Rest] -> Fun(Info) - end, - ets:insert(TableId, {Key, NewInfo}), - State. - -%% @doc Throws unregistered for unknown Resource -resource_info(_Resource, State) when ?NOT_TRANSFERED(State) -> - throw(table_id_undefined); -resource_info(Resource, #state{info_table=TableId}) -> - Key = {info,Resource}, - case ets:lookup(TableId, Key) of - [] -> throw({unregistered, Resource}); - [{_Key,Info}] -> Info; - [{_Key,_Info} | _Rest] -> throw({too_many_info_objects, Resource}) - end. - -%% @doc Throws unregistered for unknown Resource -resource_info_tuple(Resource, State) -> - Info = resource_info(Resource, State), - {Resource, ?resource_type(Info), ?resource_enabled(Info), ?resource_limit(Info)}. - -%% @private -%% @doc -%% Get existing token type info from ETS table and schedule all for refill. -%% This is needed because we just reloaded our saved persisent state data -%% after a crash. Assumes table is available. Called only after Transfer. -reschedule_token_refills(State) -> - Tokens = all_registered_resources(token, State), - _ = [schedule_refill_tokens(Token, State) || Token <- Tokens], - ok. - -%% Schedule a timer event to refill tokens of given type -schedule_refill_tokens(_Token, State) when ?NOT_TRANSFERED(State) -> - ok; -schedule_refill_tokens(Token, State) -> - case ?resource_limit(resource_info(Token, State)) of - undefined -> - ok; - {Period, _Count} -> - erlang:send_after(Period, self(), {refill_tokens, Token}), - ok - end. - -%% @private -%% @doc Add a Resource Entry to the "given" table. Here, we really do want -%% to allow multiple entries because each Resource "name" can be given multiple -%% times. -add_given_entry(Resource, Entry, TableId) -> - Key = {given, Resource}, - ets:insert(TableId, {Key, Entry}). - -remove_given_entries(Resource, State=#state{entry_table=TableId}) -> - Key = {given, Resource}, - ets:delete(TableId, Key), - State. - -%% @private -%% @doc Add a resource queue entry to our given set. -give_resource(Entry, State=#state{entry_table=TableId}) -> - Resource = ?e_resource(Entry), - add_given_entry(Resource, Entry, TableId), - State. - -%% @private -%% @doc Add Resource to our given set. -give_resource(Resource, Type, Pid, Ref, Meta, State) -> - Entry = ?RESOURCE_ENTRY(Resource, Type, Pid, Meta, Ref), - give_resource(Entry, State). - --spec try_get_resource(boolean(), bg_resource(), bg_resource_type(), pid(), [{atom(), any()}], #state{}) -> - {max_concurrency, #state{}} - | {ok, #state{}} - | {{ok, reference()}, #state{}}. -try_get_resource(false, _Resource, _Type, _Pid, _Meta, State) -> - {max_concurrency, State}; -try_get_resource(true, Resource, Type, Pid, Meta, State) -> - case Type of - token -> - Ref = random_bogus_ref(), - {ok, give_resource(Resource, Type, Pid, Ref, Meta, State)}; - lock -> - Ref = monitor(process, Pid), - {{ok,Ref}, give_resource(Resource, Type, Pid, Ref, Meta, State)} - end. - -%% @private -%% @doc reply now if resource is available. Returns max_concurrency -%% if resource not available or globally or specifically disabled. --spec do_get_resource(bg_resource(), bg_resource_type(), pid(), [{atom(), any()}], #state{}) -> - {reply, max_concurrency, #state{}} - | {reply, {ok, #state{}}} - | {reply, {{ok, reference()}, #state{}}}. -do_get_resource(_Resource, _Type, _Pid, _Meta, State) when ?NOT_TRANSFERED(State) -> - %% Table transfer has not occurred yet. Reply "max_concurrency" so that callers - %% will try back later, hopefully when we have our table back. - {reply, max_concurrency, State}; -%% @doc When the API is bypassed, we ignore concurrency limits. -do_get_resource(Resource, Type, Pid, Meta, State=#state{bypassed=true}) -> - {Result, State2} = try_get_resource(true, Resource, Type, Pid, Meta, State), - {reply, Result, State2}; -do_get_resource(_Resource, _Type, _Pid, _Meta, State=#state{enabled=false}) -> - {reply, max_concurrency, State}; -do_get_resource(Resource, Type, Pid, Meta, State) -> - Info = resource_info(Resource, State), - enforce_type_or_throw(Resource, Type, Info), - Enabled = ?resource_enabled(Info), - Limit = limit(Info), - Given = length(all_given_entries(Resource, State#state.entry_table)), - {Result, State2} = try_get_resource(Enabled andalso not (Given >= Limit), - Resource, Type, Pid, Meta, State), - {reply, Result, State2}. - -%% @private -%% @doc This should create a unique reference every time it's called; and should -%% not repeat across process restarts since our ETS table lives across process -%% lifetimes. This is needed to create unique entries in the "given" table. -random_bogus_ref() -> - make_ref(). - -all_registered_resources(Type, #state{info_table=TableId}) -> - [Resource || {{info, Resource}, Info} <- ets:match_object(TableId, {{info, '_'},'_'}), - ?resource_type(Info) == Type]. - -%% @private -%% @doc Token refill timer event handler. -%% Capture stats of what was given in the previous period, -%% Clear all tokens of this type from the given set, -do_refill_tokens(Token, State) -> - remove_given_entries(Token, State). - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Query API...does not use gen_server -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% @private -all_given_entries(all, TableId) -> - [Entry || {{given, _R}, Entry} <- ets:match_object(TableId, {{given, '_'},'_'})]; -all_given_entries(Resource, TableId) -> - [Entry || {{given, _R}, Entry} <- ets:match_object(TableId, {{given, Resource},'_'})]. - -%% @private -format_entry(Entry) -> - #bg_stat_live - { - resource = ?e_resource(Entry), - type = ?e_type(Entry), - owner = {?e_pid(Entry), ?e_meta(Entry)} - }. - -%% @private -fmt_live_entries(Entries) -> - [format_entry(Entry) || Entry <- Entries]. - -%% @private --spec do_query(all | bg_token() | bg_lock(), [bg_resource_type()]) -> [bg_stat_live()]. -do_query(Resource, Types) -> - Entries = all_given_entries(Resource, ?BG_ENTRY_ETS_TABLE), - E = lists:flatten([Entry || Entry <- Entries, - lists:member(?e_type(Entry), Types)]), - fmt_live_entries(E). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Configuration Switch Helpers -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% @doc Return true iff the riak_core "use background manager" configuration -%% setting is not false; defaults to true. --spec use_bg_mgr() -> boolean(). -use_bg_mgr() -> - app_helper:get_env(riak_core, use_background_manager, true). - -%% @doc Return true iff both the global configuration switch is on (see @link use_bg_mgr/0) -%% the setting of the supplied Dependency/Key is not false. Defaults to true. --spec use_bg_mgr(atom(), atom()) -> boolean(). -use_bg_mgr(Dependency, Key) -> - use_bg_mgr() andalso app_helper:get_env(Dependency, Key, true). - -maybe_create_ets() -> - TableSpecs = [ - {?BG_INFO_ETS_TABLE, ?BG_INFO_ETS_OPTS}, - {?BG_ENTRY_ETS_TABLE, ?BG_ENTRY_ETS_OPTS} - ], - lists:map(fun maybe_create_ets/1, TableSpecs). - -maybe_create_ets({Name, Options}) -> - case ets:info(Name) of - undefined -> - ets:new(Name, Options); - _ -> - ok - end. - diff --git a/src/riak_core_broadcast.erl b/src/riak_core_broadcast.erl deleted file mode 100644 index a8e612a18..000000000 --- a/src/riak_core_broadcast.erl +++ /dev/null @@ -1,624 +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_broadcast). - --behaviour(gen_server). - -%% API --export([start_link/0, - start_link/4, - broadcast/2, - ring_update/1, - broadcast_members/0, - broadcast_members/1, - exchanges/0, - exchanges/1, - cancel_exchanges/1]). - -%% Debug API --export([debug_get_peers/2, - debug_get_peers/3, - debug_get_tree/2]). - - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --define(SERVER, ?MODULE). - --type nodename() :: any(). --type message_id() :: any(). --type message_round() :: non_neg_integer(). --type outstanding() :: {message_id(), module(), message_round(), nodename()}. --type exchange() :: {module(), node(), reference(), pid()}. --type exchanges() :: [exchange()]. - --record(state, { - %% Initially trees rooted at each node are the same. - %% Portions of that tree belonging to this node are - %% shared in this set. - common_eagers = ordsets:new() :: ordsets:ordset(nodename()), - - %% Initially trees rooted at each node share the same lazy links. - %% Typically this set will contain a single element. However, it may - %% contain more in large clusters and may be empty for clusters with - %% less than three nodes. - common_lazys = ordsets:new() :: ordsets:ordset(nodename()), - - %% A mapping of sender node (root of each broadcast tree) - %% to this node's portion of the tree. Elements are - %% added to this structure as messages rooted at a node - %% propogate to this node. Nodes that are never the - %% root of a message will never have a key added to - %% `eager_sets' - eager_sets = [] :: [{nodename(), ordsets:ordset(nodename())}], - - %% A Mapping of sender node (root of each spanning tree) - %% to this node's set of lazy peers. Elements are added - %% to this structure as messages rooted at a node - %% propogate to this node. Nodes that are never the root - %% of a message will never have a key added to `lazy_sets' - lazy_sets = [] :: [{nodename(), ordsets:ordset(nodename())}], - - %% Lazy messages that have not been acked. Messages are added to - %% this set when a node is sent a lazy message (or when it should be - %% sent one sometime in the future). Messages are removed when the lazy - %% pushes are acknowleged via graft or ignores. Entries are keyed by their - %% destination - outstanding = orddict:new() :: [{nodename(), outstanding()}], - - %% Set of registered modules that may handle messages that - %% have been broadcast - mods :: [module()], - - %% List of outstanding exchanges - exchanges = [] :: exchanges(), - - %% Set of all known members. Used to determine - %% which members have joined and left during a membership update - all_members = ordsets:new() :: ordsets:ordset(nodename()) - }). - -%%%=================================================================== -%%% API -%%%=================================================================== - -%% @doc Starts the broadcast server on this node. The initial membership list is -%% fetched from the ring. If the node is a singleton then the initial eager and lazy -%% sets are empty. If there are two nodes, each will be in the others eager set and the -%% lazy sets will be empty. When number of members is less than 5, each node will initially -%% have one other node in its eager set and lazy set. If there are more than five nodes -%% each node will have at most two other nodes in its eager set and one in its lazy set, initally. -%% In addition, after the broadcast server is started, a callback is registered with ring_events -%% to generate membership updates as the ring changes. --spec start_link() -> {ok, pid()} | ignore | {error, term()}. -start_link() -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - Members = all_broadcast_members(Ring), - {InitEagers, InitLazys} = init_peers(Members), - Mods = app_helper:get_env(riak_core, broadcast_mods, [riak_core_metadata_manager]), - Res = start_link(Members, InitEagers, InitLazys, Mods), - riak_core_ring_events:add_sup_callback(fun ?MODULE:ring_update/1), - Res. - -%% @doc Starts the broadcast server on this node. `InitMembers' must be a list -%% of all members known to this node when starting the broadcast server. -%% `InitEagers' are the initial peers of this node for all broadcast trees. -%% `InitLazys' is a list of random peers not in `InitEagers' that will be used -%% as the initial lazy peer shared by all trees for this node. If the number -%% of nodes in the cluster is less than 3, `InitLazys' should be an empty list. -%% `InitEagers' and `InitLazys' must also be subsets of `InitMembers'. `Mods' is -%% a list of modules that may be handlers for broadcasted messages. All modules in -%% `Mods' should implement the `riak_core_broadcast_handler' behaviour. -%% -%% NOTE: When starting the server using start_link/2 no automatic membership update from -%% ring_events is registered. Use start_link/0. --spec start_link([nodename()], [nodename()], [nodename()], [module()]) -> - {ok, pid()} | ignore | {error, term}. -start_link(InitMembers, InitEagers, InitLazys, Mods) -> - gen_server:start_link({local, ?SERVER}, ?MODULE, - [InitMembers, InitEagers, InitLazys, Mods], []). - -%% @doc Broadcasts a message originating from this node. The message will be delivered to -%% each node at least once. The `Mod' passed is responsible for handling the message on remote -%% nodes as well as providing some other information both locally and and on other nodes. -%% `Mod' must be loaded on all members of the clusters and implement the -%% `riak_core_broadcast_handler' behaviour. --spec broadcast(any(), module()) -> ok. -broadcast(Broadcast, Mod) -> - {MessageId, Payload} = Mod:broadcast_data(Broadcast), - gen_server:cast(?SERVER, {broadcast, MessageId, Payload, Mod}). - - -%% @doc Notifies broadcast server of membership update given a new ring --spec ring_update(riak_core_ring:riak_core_ring()) -> ok. -ring_update(Ring) -> - gen_server:cast(?SERVER, {ring_update, Ring}). - -%% @doc Returns the broadcast servers view of full cluster membership. -%% Wait indefinitely for a response is returned from the process --spec broadcast_members() -> ordsets:ordset(nodename()). -broadcast_members() -> - broadcast_members(infinity). - -%% @doc Returns the broadcast servers view of full cluster membership. -%% Waits `Timeout' ms for a response from the server --spec broadcast_members(infinity | pos_integer()) -> ordsets:ordset(nodename()). -broadcast_members(Timeout) -> - gen_server:call(?SERVER, broadcast_members, Timeout). - -%% @doc return a list of exchanges, started by broadcast on thisnode, that are running --spec exchanges() -> exchanges(). -exchanges() -> - exchanges(node()). - -%% @doc returns a list of exchanges, started by broadcast on `Node', that are running --spec exchanges(node()) -> exchanges(). -exchanges(Node) -> - gen_server:call({?SERVER, Node}, exchanges, infinity). - -%% @doc cancel exchanges started by this node. --spec cancel_exchanges(all | - {peer, node()} | - {mod, module()} | - reference() | - pid()) -> exchanges(). -cancel_exchanges(WhichExchanges) -> - gen_server:call(?SERVER, {cancel_exchanges, WhichExchanges}, infinity). - -%%%=================================================================== -%%% Debug API -%%%=================================================================== - -%% @doc return the peers for `Node' for the tree rooted at `Root'. -%% Wait indefinitely for a response is returned from the process --spec debug_get_peers(node(), node()) -> {ordsets:ordset(node()), ordsets:ordset(node())}. -debug_get_peers(Node, Root) -> - debug_get_peers(Node, Root, infinity). - -%% @doc return the peers for `Node' for the tree rooted at `Root'. -%% Waits `Timeout' ms for a response from the server --spec debug_get_peers(node(), node(), infinity | pos_integer()) -> - {ordsets:ordset(node()), ordsets:ordset(node())}. -debug_get_peers(Node, Root, Timeout) -> - gen_server:call({?SERVER, Node}, {get_peers, Root}, Timeout). - -%% @doc return peers for all `Nodes' for tree rooted at `Root' -%% Wait indefinitely for a response is returned from the process --spec debug_get_tree(node(), [node()]) -> - [{node(), {ordsets:ordset(node()), ordsets:ordset(node())}}]. -debug_get_tree(Root, Nodes) -> - [begin - Peers = try debug_get_peers(Node, Root) - catch _:_ -> down - end, - {Node, Peers} - end || Node <- Nodes]. - -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== - -%% @private --spec init([[nodename()]]) -> {ok, #state{}} | - {ok, #state{}, non_neg_integer() | infinity} | - ignore | - {stop, term()}. -init([AllMembers, InitEagers, InitLazys, Mods]) -> - schedule_lazy_tick(), - schedule_exchange_tick(), - State1 = #state{mods = lists:usort(Mods)}, - State2 = reset_peers(AllMembers, InitEagers, InitLazys, State1), - {ok, State2}. - -%% @private --spec handle_call(term(), {pid(), term()}, #state{}) -> - {reply, term(), #state{}} | - {reply, term(), #state{}, non_neg_integer()} | - {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), term(), #state{}} | - {stop, term(), #state{}}. -handle_call({get_peers, Root}, _From, State) -> - EagerPeers = all_peers(Root, State#state.eager_sets, State#state.common_eagers), - LazyPeers = all_peers(Root, State#state.lazy_sets, State#state.common_lazys), - {reply, {EagerPeers, LazyPeers}, State}; -handle_call(broadcast_members, _From, State=#state{all_members=AllMembers}) -> - {reply, AllMembers, State}; -handle_call(exchanges, _From, State=#state{exchanges=Exchanges}) -> - {reply, Exchanges, State}; -handle_call({cancel_exchanges, WhichExchanges}, _From, State) -> - Cancelled = cancel_exchanges(WhichExchanges, State#state.exchanges), - {reply, Cancelled, State}. - -%% @private --spec handle_cast(term(), #state{}) -> {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), #state{}}. -handle_cast({broadcast, MessageId, Message, Mod}, State) -> - State1 = eager_push(MessageId, Message, Mod, State), - State2 = schedule_lazy_push(MessageId, Mod, State1), - {noreply, State2}; -handle_cast({broadcast, MessageId, Message, Mod, Round, Root, From}, State) -> - Valid = Mod:merge(MessageId, Message), - State1 = handle_broadcast(Valid, MessageId, Message, Mod, Round, Root, From, State), - {noreply, State1}; -handle_cast({prune, Root, From}, State) -> - State1 = add_lazy(From, Root, State), - {noreply, State1}; -handle_cast({i_have, MessageId, Mod, Round, Root, From}, State) -> - Stale = Mod:is_stale(MessageId), - State1 = handle_ihave(Stale, MessageId, Mod, Round, Root, From, State), - {noreply, State1}; -handle_cast({ignored_i_have, MessageId, Mod, Round, Root, From}, State) -> - State1 = ack_outstanding(MessageId, Mod, Round, Root, From, State), - {noreply, State1}; -handle_cast({graft, MessageId, Mod, Round, Root, From}, State) -> - Result = Mod:graft(MessageId), - State1 = handle_graft(Result, MessageId, Mod, Round, Root, From, State), - {noreply, State1}; -handle_cast({ring_update, Ring}, State=#state{all_members=BroadcastMembers}) -> - CurrentMembers = ordsets:from_list(all_broadcast_members(Ring)), - New = ordsets:subtract(CurrentMembers, BroadcastMembers), - Removed = ordsets:subtract(BroadcastMembers, CurrentMembers), - State1 = case ordsets:size(New) > 0 of - false -> State; - true -> - {EagerPeers, LazyPeers} = init_peers(CurrentMembers), - reset_peers(CurrentMembers, EagerPeers, LazyPeers, State) - end, - State2 = neighbors_down(Removed, State1), - {noreply, State2}. - -%% @private --spec handle_info(term(), #state{}) -> {noreply, #state{}} | - {noreply, #state{}, non_neg_integer()} | - {stop, term(), #state{}}. -handle_info(lazy_tick, State) -> - schedule_lazy_tick(), - _ = send_lazy(State), - {noreply, State}; -handle_info(exchange_tick, State) -> - schedule_exchange_tick(), - State1 = maybe_exchange(State), - {noreply, State1}; -handle_info({'DOWN', Ref, process, _Pid, _Reason}, State=#state{exchanges=Exchanges}) -> - Exchanges1 = lists:keydelete(Ref, 3, Exchanges), - {noreply, State#state{exchanges=Exchanges1}}. - -%% @private --spec terminate(term(), #state{}) -> term(). -terminate(_Reason, _State) -> - ok. - -%% @private --spec code_change(term() | {down, term()}, #state{}, term()) -> {ok, #state{}}. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== -handle_broadcast(false, _MessageId, _Message, _Mod, _Round, Root, From, State) -> %% stale msg - State1 = add_lazy(From, Root, State), - _ = send({prune, Root, node()}, From), - State1; -handle_broadcast(true, MessageId, Message, Mod, Round, Root, From, State) -> %% valid msg - State1 = add_eager(From, Root, State), - State2 = eager_push(MessageId, Message, Mod, Round+1, Root, From, State1), - schedule_lazy_push(MessageId, Mod, Round+1, Root, From, State2). - -handle_ihave(true, MessageId, Mod, Round, Root, From, State) -> %% stale i_have - _ = send({ignored_i_have, MessageId, Mod, Round, Root, node()}, From), - State; -handle_ihave(false, MessageId, Mod, Round, Root, From, State) -> %% valid i_have - %% TODO: don't graft immediately - _ = send({graft, MessageId, Mod, Round, Root, node()}, From), - add_eager(From, Root, State). - -handle_graft(stale, MessageId, Mod, Round, Root, From, State) -> - %% There has been a subsequent broadcast that is causally newer than this message - %% according to Mod. We ack the outstanding message since the outstanding entry - %% for the newer message exists - ack_outstanding(MessageId, Mod, Round, Root, From, State); -handle_graft({ok, Message}, MessageId, Mod, Round, Root, From, State) -> - %% we don't ack outstanding here because the broadcast may fail to be delivered - %% instead we will allow the i_have to be sent once more and let the subsequent - %% ignore serve as the ack. - State1 = add_eager(From, Root, State), - _ = send({broadcast, MessageId, Message, Mod, Round, Root, node()}, From), - State1; -handle_graft({error, Reason}, _MessageId, Mod, _Round, _Root, _From, State) -> - ?LOG_ERROR("unable to graft message from ~p. reason: ~p", [Mod, Reason]), - State. - -neighbors_down(Removed, State=#state{common_eagers=CommonEagers,eager_sets=EagerSets, - common_lazys=CommonLazys,lazy_sets=LazySets, - outstanding=Outstanding}) -> - NewCommonEagers = ordsets:subtract(CommonEagers, Removed), - NewCommonLazys = ordsets:subtract(CommonLazys, Removed), - %% TODO: once we have delayed grafting need to remove timers - NewEagerSets = ordsets:from_list([{Root, ordsets:subtract(Existing, Removed)} || - {Root, Existing} <- ordsets:to_list(EagerSets)]), - NewLazySets = ordsets:from_list([{Root, ordsets:subtract(Existing, Removed)} || - {Root, Existing} <- ordsets:to_list(LazySets)]), - %% delete outstanding messages to removed peers - NewOutstanding = ordsets:fold(fun(RPeer, OutstandingAcc) -> - orddict:erase(RPeer, OutstandingAcc) - end, - Outstanding, Removed), - State#state{common_eagers=NewCommonEagers, - common_lazys=NewCommonLazys, - eager_sets=NewEagerSets, - lazy_sets=NewLazySets, - outstanding=NewOutstanding}. - -eager_push(MessageId, Message, Mod, State) -> - eager_push(MessageId, Message, Mod, 0, node(), node(), State). - -eager_push(MessageId, Message, Mod, Round, Root, From, State) -> - Peers = eager_peers(Root, From, State), - _ = send({broadcast, MessageId, Message, Mod, Round, Root, node()}, Peers), - State. - -schedule_lazy_push(MessageId, Mod, State) -> - schedule_lazy_push(MessageId, Mod, 0, node(), node(), State). - -schedule_lazy_push(MessageId, Mod, Round, Root, From, State) -> - Peers = lazy_peers(Root, From, State), - add_all_outstanding(MessageId, Mod, Round, Root, Peers, State). - -send_lazy(#state{outstanding=Outstanding}) -> - [send_lazy(Peer, Messages) || {Peer, Messages} <- orddict:to_list(Outstanding)]. - -send_lazy(Peer, Messages) -> - [send_lazy(MessageId, Mod, Round, Root, Peer) || - {MessageId, Mod, Round, Root} <- ordsets:to_list(Messages)]. - -send_lazy(MessageId, Mod, Round, Root, Peer) -> - send({i_have, MessageId, Mod, Round, Root, node()}, Peer). - -maybe_exchange(State) -> - Root = random_root(State), - Peer = random_peer(Root, State), - maybe_exchange(Peer, State). - -maybe_exchange(undefined, State) -> - State; -maybe_exchange(Peer, State=#state{mods=[Mod | _],exchanges=Exchanges}) -> - %% limit the number of exchanges this node can start concurrently. - %% the exchange must (currently?) implement any "inbound" concurrency limits - ExchangeLimit = app_helper:get_env(riak_core, broadcast_start_exchange_limit, 1), - BelowLimit = not (length(Exchanges) >= ExchangeLimit), - FreeMod = lists:keyfind(Mod, 1, Exchanges) =:= false, - case BelowLimit and FreeMod of - true -> exchange(Peer, State); - false -> State - end. - -exchange(Peer, State=#state{mods=[Mod | Mods],exchanges=Exchanges}) -> - State1 = case Mod:exchange(Peer) of - {ok, Pid} -> - ?LOG_DEBUG("started ~p exchange with ~p (~p)", [Mod, Peer, Pid]), - Ref = monitor(process, Pid), - State#state{exchanges=[{Mod, Peer, Ref, Pid} | Exchanges]}; - {error, _Reason} -> - State - end, - State1#state{mods=Mods ++ [Mod]}. - -cancel_exchanges(all, Exchanges) -> - kill_exchanges(Exchanges); -cancel_exchanges(WhichProc, Exchanges) when is_reference(WhichProc) orelse - is_pid(WhichProc) -> - KeyPos = case is_reference(WhichProc) of - true -> 3; - false -> 4 - end, - case lists:keyfind(WhichProc, KeyPos, Exchanges) of - false -> []; - Exchange -> - kill_exchange(Exchange), - [Exchange] - end; -cancel_exchanges(Which, Exchanges) -> - Filter = exchange_filter(Which), - ToCancel = [Ex || Ex <- Exchanges, Filter(Ex)], - kill_exchanges(ToCancel). - -kill_exchanges(Exchanges) -> - _ = [kill_exchange(Exchange) || Exchange <- Exchanges], - Exchanges. - -kill_exchange({_, _, _, ExchangePid}) -> - exit(ExchangePid, cancel_exchange). - - -exchange_filter({peer, Peer}) -> - fun({_, ExchangePeer, _, _}) -> - Peer =:= ExchangePeer - end; -exchange_filter({mod, Mod}) -> - fun({ExchangeMod, _, _, _}) -> - Mod =:= ExchangeMod - end. - - -%% picks random root uniformly -random_root(#state{all_members=Members}) -> - random_other_node(Members). - -%% picks random peer favoring peers not in eager or lazy set and ensuring -%% peer is not this node -random_peer(Root, State=#state{all_members=All}) -> - Eagers = all_eager_peers(Root, State), - Lazys = all_lazy_peers(Root, State), - Union = ordsets:union([Eagers, Lazys]), - Other = ordsets:del_element(node(), ordsets:subtract(All, Union)), - case ordsets:size(Other) of - 0 -> - random_other_node(ordsets:del_element(node(), All)); - _ -> - random_other_node(Other) - end. - -%% picks random node from ordset -random_other_node(OrdSet) -> - Size = ordsets:size(OrdSet), - case Size of - 0 -> undefined; - _ -> - lists:nth(rand:uniform(Size), - ordsets:to_list(OrdSet)) - end. - -ack_outstanding(MessageId, Mod, Round, Root, From, State=#state{outstanding=All}) -> - Existing = existing_outstanding(From, All), - Updated = set_outstanding(From, - ordsets:del_element({MessageId, Mod, Round, Root}, Existing), - All), - State#state{outstanding=Updated}. - -add_all_outstanding(MessageId, Mod, Round, Root, Peers, State) -> - lists:foldl(fun(Peer, SAcc) -> add_outstanding(MessageId, Mod, Round, Root, Peer, SAcc) end, - State, - ordsets:to_list(Peers)). - -add_outstanding(MessageId, Mod, Round, Root, Peer, State=#state{outstanding=All}) -> - Existing = existing_outstanding(Peer, All), - Updated = set_outstanding(Peer, - ordsets:add_element({MessageId, Mod, Round, Root}, Existing), - All), - State#state{outstanding=Updated}. - -set_outstanding(Peer, Outstanding, All) -> - case ordsets:size(Outstanding) of - 0 -> orddict:erase(Peer, All); - _ -> orddict:store(Peer, Outstanding, All) - end. - -existing_outstanding(Peer, All) -> - case orddict:find(Peer, All) of - error -> ordsets:new(); - {ok, Outstanding} -> Outstanding - end. - -add_eager(From, Root, State) -> - update_peers(From, Root, fun ordsets:add_element/2, fun ordsets:del_element/2, State). - -add_lazy(From, Root, State) -> - update_peers(From, Root, fun ordsets:del_element/2, fun ordsets:add_element/2, State). - -update_peers(From, Root, EagerUpdate, LazyUpdate, State) -> - CurrentEagers = all_eager_peers(Root, State), - CurrentLazys = all_lazy_peers(Root, State), - NewEagers = EagerUpdate(From, CurrentEagers), - NewLazys = LazyUpdate(From, CurrentLazys), - set_peers(Root, NewEagers, NewLazys, State). - -set_peers(Root, Eagers, Lazys, State=#state{eager_sets=EagerSets,lazy_sets=LazySets}) -> - NewEagers = orddict:store(Root, Eagers, EagerSets), - NewLazys = orddict:store(Root, Lazys, LazySets), - State#state{eager_sets=NewEagers, lazy_sets=NewLazys}. - -all_eager_peers(Root, State) -> - all_peers(Root, State#state.eager_sets, State#state.common_eagers). - -all_lazy_peers(Root, State) -> - all_peers(Root, State#state.lazy_sets, State#state.common_lazys). - -eager_peers(Root, From, #state{eager_sets=EagerSets, common_eagers=CommonEagers}) -> - all_filtered_peers(Root, From, EagerSets, CommonEagers). - -lazy_peers(Root, From, #state{lazy_sets=LazySets, common_lazys=CommonLazys}) -> - all_filtered_peers(Root, From, LazySets, CommonLazys). - -all_filtered_peers(Root, From, Sets, Common) -> - All = all_peers(Root, Sets, Common), - ordsets:del_element(From, All). - -all_peers(Root, Sets, Default) -> - case orddict:find(Root, Sets) of - error -> Default; - {ok, Peers} -> Peers - end. - -send(Msg, Peers) when is_list(Peers) -> - [send(Msg, P) || P <- Peers]; -send(Msg, P) -> - %% TODO: add debug logging - gen_server:cast({?SERVER, P}, Msg). - -schedule_lazy_tick() -> - schedule_tick(lazy_tick, broadcast_lazy_timer, 1000). - -schedule_exchange_tick() -> - schedule_tick(exchange_tick, broadcast_exchange_timer, 10000). - -schedule_tick(Message, Timer, Default) -> - TickMs = app_helper:get_env(riak_core, Timer, Default), - erlang:send_after(TickMs, ?MODULE, Message). - -reset_peers(AllMembers, EagerPeers, LazyPeers, State) -> - State#state{ - common_eagers = ordsets:del_element(node(), ordsets:from_list(EagerPeers)), - common_lazys = ordsets:del_element(node(), ordsets:from_list(LazyPeers)), - eager_sets = orddict:new(), - lazy_sets = orddict:new(), - all_members = ordsets:from_list(AllMembers) - }. - -all_broadcast_members(Ring) -> - riak_core_ring:all_members(Ring). - -init_peers(Members) -> - case length(Members) of - 1 -> - %% Single member, must be ourselves - InitEagers = [], - InitLazys = []; - 2 -> - %% Two members, just eager push to the other - InitEagers = Members -- [node()], - InitLazys = []; - N when N < 5 -> - %% 2 to 4 members, start with a fully connected tree - %% with cycles. it will be adjusted as needed - Tree = riak_core_util:build_tree(1, Members, [cycles]), - InitEagers = orddict:fetch(node(), Tree), - InitLazys = [lists:nth(rand:uniform(N - 2), Members -- [node() | InitEagers])]; - N when N < 10 -> - %% 5 to 9 members, start with gossip tree used by - %% riak_core_gossip. it will be adjusted as needed - Tree = riak_core_util:build_tree(2, Members, [cycles]), - InitEagers = orddict:fetch(node(), Tree), - InitLazys = [lists:nth(rand:uniform(N - 3), Members -- [node() | InitEagers])]; - N -> - %% 10 or more members, use a tree similar to riak_core_gossip - %% but with higher fanout (larger initial eager set size) - NEagers = round(math:log(N) + 1), - Tree = riak_core_util:build_tree(NEagers, Members, [cycles]), - InitEagers = orddict:fetch(node(), Tree), - InitLazys = [lists:nth(rand:uniform(N - (NEagers + 1)), Members -- [node() | InitEagers])] - end, - {InitEagers, InitLazys}. diff --git a/src/riak_core_broadcast_handler.erl b/src/riak_core_broadcast_handler.erl deleted file mode 100644 index f7797f066..000000000 --- a/src/riak_core_broadcast_handler.erl +++ /dev/null @@ -1,43 +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_broadcast_handler). - -%% Return a two-tuple of message id and payload from a given broadcast --callback broadcast_data(any()) -> {any(), any()}. - -%% Given the message id and payload, merge the message in the local state. -%% If the message has already been received return `false', otherwise return `true' --callback merge(any(), any()) -> boolean(). - -%% Return true if the message (given the message id) has already been received. -%% `false' otherwise --callback is_stale(any()) -> boolean(). - -%% Return the message associated with the given message id. In some cases a message -%% has already been sent with information that subsumes the message associated with the given -%% message id. In this case, `stale' is returned. --callback graft(any()) -> stale | {ok, any()} | {error, any()}. - -%% Trigger an exchange between the local handler and the handler on the given node. -%% How the exchange is performed is not defined but it should be performed as a background -%% process and ensure that it delivers any messages missing on either the local or remote node. -%% The exchange does not need to account for messages in-flight when it is started or broadcast -%% during its operation. These can be taken care of in future exchanges. --callback exchange(node()) -> {ok, pid()} | {error, term()}. diff --git a/src/riak_core_bucket.erl b/src/riak_core_bucket.erl index 5dbf2e0d0..e37627375 100644 --- a/src/riak_core_bucket.erl +++ b/src/riak_core_bucket.erl @@ -31,12 +31,10 @@ get_buckets/1, bucket_nval_map/1, default_object_nval/0, - all_n/1, merge_props/2, name/1, - n_val/1, get_value/2]). - --include_lib("kernel/include/logger.hrl"). + n_val/1, + get_value/2]). -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). @@ -46,14 +44,12 @@ -type properties() :: [property()]. -type riak_core_ring() :: riak_core_ring:riak_core_ring(). --type bucket_type() :: riak_core_bucket_type:bucket_type(). +-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]). --define(METADATA_PREFIX, {core, buckets}). - %% @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 @@ -69,13 +65,6 @@ append_bucket_defaults(Items) when is_list(Items) -> ok | {error, no_type | [{atom(), atom()}]}. set_bucket({<<"default">>, Name}, BucketProps) -> set_bucket(Name, BucketProps); -set_bucket({Type, _Name}=Bucket, BucketProps0) -> - case riak_core_bucket_type:get(Type) of - undefined -> - ?LOG_ERROR("Attempt to set properties of non-existent bucket type ~p", [Bucket]), - {error, no_type}; - _ -> set_bucket(fun set_bucket_in_metadata/2, Bucket, BucketProps0) - end; set_bucket(Name, BucketProps0) -> set_bucket(fun set_bucket_in_ring/2, Name, BucketProps0). @@ -86,13 +75,10 @@ set_bucket(StoreFun, Bucket, BucketProps0) -> NewBucket = merge_props(BucketProps, OldBucket), StoreFun(Bucket, NewBucket); {error, Details} -> - ?LOG_ERROR("Bucket properties validation failed ~p~n", [Details]), + logger:error("Bucket properties validation failed ~p~n", [Details]), {error, Details} end. -set_bucket_in_metadata(Bucket, BucketMeta) -> - riak_core_metadata:put(?METADATA_PREFIX, bucket_key(Bucket), BucketMeta). - set_bucket_in_ring(Bucket, BucketMeta) -> F = fun(Ring, _Args) -> {new_ring, riak_core_ring:update_meta(bucket_key(Bucket), @@ -121,16 +107,6 @@ merge_props(Overriding, Other) -> %% get_bucket({<<"default">>, Name}) -> get_bucket(Name); -get_bucket({Type, _Name}=Bucket) -> - TypeMeta = riak_core_bucket_type:get(Type), - BucketMeta = riak_core_metadata:get(?METADATA_PREFIX, bucket_key(Bucket), - [{resolver, fun riak_core_bucket_props:resolve/2}]), - case merge_type_props(TypeMeta, BucketMeta) of - {error, _}=Error -> - ?LOG_ERROR("~p getting properties of bucket ~p",[Error,Bucket]), - Error; - Props -> [{name, Bucket} | Props] - end; get_bucket(Name) -> Meta = riak_core_ring_manager:get_bucket_meta(Name), get_bucket_props(Name, Meta). @@ -142,31 +118,18 @@ 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(Bucket, Ring) -> - Meta = riak_core_ring:get_meta(bucket_key(Bucket), Ring), - get_bucket_props(Bucket, Meta). + get_bucket(Bucket). get_bucket_props(Name, undefined) -> [{name, Name} | riak_core_bucket_props:defaults()]; get_bucket_props(_Name, {ok, Bucket}) -> Bucket. -merge_type_props(undefined, _) -> - {error, no_type}; -merge_type_props(TypeMeta, undefined) when is_list(TypeMeta) -> - TypeMeta; -merge_type_props(TypeMeta, BucketMeta) when is_list(TypeMeta) andalso - is_list(BucketMeta) -> - merge_props(BucketMeta, TypeMeta). - %% @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({_Type, _Name}=Bucket) -> - riak_core_metadata:delete(?METADATA_PREFIX, bucket_key(Bucket)); reset_bucket(Bucket) -> F = fun(Ring, _Args) -> {new_ring, riak_core_ring:remove_meta(bucket_key(Bucket), Ring)} @@ -181,15 +144,7 @@ reset_bucket(Bucket) -> get_buckets(Ring) -> RingNames = riak_core_ring:get_buckets(Ring), RingBuckets = [get_bucket(Name, Ring) || Name <- RingNames], - MetadataBuckets = riak_core_metadata:fold(fun({_, undefined}, Acc) -> - Acc; - ({_Key, Props}, Acc) -> - [Props | Acc] - end, - [], ?METADATA_PREFIX, - [{resolver, fun riak_core_bucket_props:resolve/2}, - {default, undefined}]), - RingBuckets ++ MetadataBuckets. + RingBuckets. %% @doc returns a proplist containing all buckets and their respective N values -spec bucket_nval_map(riak_core_ring()) -> [{binary(),integer()}]. @@ -202,24 +157,6 @@ bucket_nval_map(Ring) -> default_object_nval() -> riak_core_bucket:n_val(riak_core_bucket_props:defaults()). --spec all_n(riak_core_ring()) -> [pos_integer(),...]. -all_n(Ring) -> - BucketNVals = bucket_nvals(Ring), - BucketTypeNVals = riak_core_bucket_type:all_n(), - ordsets:to_list( - ordsets:union(BucketNVals, BucketTypeNVals) - ). - -%% @private --spec bucket_nvals(riak_core_ring()) -> nval_set(). -bucket_nvals(Ring) -> - BucketNs = bucket_nval_map(Ring), - DefaultN = default_object_nval(), - AllN = lists:foldl(fun({_, N}, Acc) -> - ordsets:add_element(N, Acc) - end, [DefaultN], BucketNs), - AllN. - name(BProps) -> get_value(name, BProps). @@ -249,6 +186,7 @@ bucket_key(Name) -> 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), diff --git a/src/riak_core_bucket_props.erl b/src/riak_core_bucket_props.erl index 2a9aedde3..352c5c264 100644 --- a/src/riak_core_bucket_props.erl +++ b/src/riak_core_bucket_props.erl @@ -36,7 +36,7 @@ merge(Overriding, Other) -> -spec validate(create | update, - {riak_core_bucket_type:bucket_type(), undefined | binary()} | binary(), + {riak_core_bucket:bucket_type(), undefined | binary()} | binary(), undefined | [{atom(), any()}], [{atom(), any()}]) -> {ok, [{atom(), any()}]} | {error, [{atom(), atom()}]}. validate(CreateOrUpdate, Bucket, ExistingProps, BucketProps) -> @@ -77,6 +77,16 @@ validate_core_prop(create, {_Bucket, undefined}, Existing, {claimant, Claimant}) 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; @@ -107,11 +117,11 @@ validate_reserved_name(_) -> -spec defaults() -> [{atom(), any()}]. defaults() -> - app_helper:get_env(riak_core, default_bucket_props). + application:get_env(riak_core, default_bucket_props, undefined). -spec append_defaults([{atom(), any()}]) -> ok. append_defaults(Items) when is_list(Items) -> - OldDefaults = app_helper:get_env(riak_core, default_bucket_props, []), + OldDefaults = application:get_env(riak_core, default_bucket_props, []), NewDefaults = merge(OldDefaults, Items), FixedDefaults = case riak_core:bucket_fixups() of [] -> NewDefaults; @@ -126,6 +136,7 @@ append_defaults(Items) when is_list(Items) -> 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), @@ -168,8 +179,6 @@ resolve_prop({precommit, PC1}, {precommit, PC2}) -> resolve_hooks(PC1, PC2); resolve_prop({pw, PW1}, {pw, PW2}) -> max(PW1, PW2); -resolve_prop({node_confirms, NodeConfirms1}, {node_confirms, NodeConfirms2}) -> - max(NodeConfirms1, NodeConfirms2); resolve_prop({r, R1}, {r, R2}) -> max(R1, R2); resolve_prop({rw, RW1}, {rw, RW2}) -> @@ -216,7 +225,6 @@ simple_resolve_test() -> {pr,0}, {precommit,[{a, b}]}, {pw,0}, - {node_confirms,0}, {r,quorum}, {rw,quorum}, {small_vclock,50}, @@ -238,7 +246,6 @@ simple_resolve_test() -> {pr,1}, {precommit,[{c, d}]}, {pw,3}, - {node_confirms,3}, {r,3}, {rw,3}, {w,1}, @@ -259,7 +266,6 @@ simple_resolve_test() -> {pr,1}, {precommit,[{a, b}, {c, d}]}, {pw,3}, - {node_confirms,3}, {r,quorum}, {rw,quorum}, {small_vclock,50}, diff --git a/src/riak_core_bucket_type.erl b/src/riak_core_bucket_type.erl deleted file mode 100644 index f1597be70..000000000 --- a/src/riak_core_bucket_type.erl +++ /dev/null @@ -1,316 +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. -%% -%% ------------------------------------------------------------------- - -%% @doc Bucket Types allow groups of buckets to share configuration -%% details. Each bucket belongs to a type and inherits its -%% properties. Buckets can override the properties they inherit using -%% {@link riak_core_bucket}. The "Default Bucket Type" always -%% exists. The Default Type's properties come from the riak_core -%% `default_bucket_props' application config, so the Default Type and -%% its buckets continue to act as they had prior to the existence of -%% Bucket Types. -%% -%% Unlike Buckets, Bucket Types must be explicitly created. In -%% addition, types support setting some properties only on creation -%% (via {@link riak_core_bucket_props:validate/4}). Since, types are -%% stored using {@link riak_core_metadata}, in order to provide safe -%% creation semantics the following invariant must be satisfied: all -%% nodes in the cluster either see no type or a single version of the -%% type for the lifetime of the cluster (nodes need not see the single -%% version at the same time). As part of ensuring this invariant, creation -%% is a two-step process: -%% -%% 1. The type is created and is inactive. To the node an inactive type -%% does not exist -%% 2. When the creation has propogated to all nodes, the type may be activated. -%% As the activation propogates, nodes will be able to use the type -%% -%% The first step is performed using {@link create/2}. The second by -%% {@link activate/1}. After the type has been activated, some -%% properties may be updated using {@link update/2}. All operations are -%% serialized through {@link riak_core_claimant} except reading bucket -%% type properties with {@link get/1}. -%% -%% Bucket types can be in one of four states. The -%% state of a type can be queried using {@link status/1}. -%% -%% 1. undefined - the type has not been created -%% 2. created - the type has been created but has not propogated to all nodes -%% 3. ready - the type has been created and has propogated to all nodes but -%% has not been activated -%% 4. active - the Bucket Type has been activated, but the activation may -%% not have propogated to all nodes yet -%% -%% In order for the invariant to hold, additional restrictions are -%% placed on the operations, generally and based on the state of the -%% Bucket Type. These restrictions are in-place to ensure safety -%% during cases where membership changes or node failures change the -%% {@link riak_core_claimant} to a new node -- ensuring concurrent -%% updates do not break the invariant. -%% -%% * calling {@link create/1} multiple times before a Bucket Type -%% is active is allowed. The newer creation will supersede any -%% previous ones. In addition, the type will be "claimed" by the -%% {@link riak_core_claimant} node writing the property. Future -%% calls to {@link create/1} must be serialized through the same -%% claimant node or the call will not succeed. In the case where -%% the claimed type fails to propogate to a new claimant during a -%% a failure the potential concurrent update is resolved with -%% last-write-wins. Since nodes can not use inactive types, this is -%% safe. -%% * A type may only be activated if it is in the `ready' state. This means -%% all nodes must be reachable from the claimant -%% * {@link create/1} will fail if the type is active. Activation concurrent -%% with creation is not possible due to the previous restriction -%% * {@link update/1} will fail unless the type is updated. {@link update/1} does -%% not allow modifications to properties for which the invariant must hold -%% (NOTE: this is up to the implementor of the riak_core bucket_validator). -%% -%% There is one known case where this invariant does not hold: -%% * in the case where a singleton cluster activates a type before being joined -%% to a cluster that has activated the same type. This is a case poorly handled -%% by most riak_core applications and is considered acceptable (so dont do it!). --module(riak_core_bucket_type). - --include("riak_core_bucket_type.hrl"). - --export([defaults/0, - defaults/1, - create/2, - status/1, - activate/1, - update/2, - get/1, - reset/1, - fold/2, - iterator/0, - itr_next/1, - itr_done/1, - itr_value/1, - itr_close/1, - property_hash/2, - property_hash/3, all_n/0]). - --export_type([bucket_type/0]). --type bucket_type() :: binary(). --type bucket_type_props() :: riak_core_bucket:properties(). - --define(IF_CAPABLE(X, E), case riak_core_capability:get({riak_core, bucket_types}) of - true -> X; - false -> E - end). - -%% @doc The hardcoded defaults for all bucket types. --spec defaults() -> bucket_type_props(). -defaults() -> - v225_defaults() ++ custom_type_defaults(). - -%% @private default propeties added for v2.2.5 --spec v225_defaults() -> bucket_type_props(). -v225_defaults() -> - [{node_confirms, 0}]. - -%% @doc The hardcoded defaults for the legacy, default bucket -%% type. These find their way into the `default_bucket_props' -%% environment variable --spec defaults(default_type) -> bucket_type_props(). -defaults(default_type) -> - v225_defaults() ++ default_type_defaults(). - -default_type_defaults() -> - [{dvv_enabled, false}, - {allow_mult, false}] ++ - common_defaults(). - -custom_type_defaults() -> - %% @HACK dvv is a riak_kv only thing, yet there is nowhere else - %% to put it (except maybe fixups?) - [{dvv_enabled, true}, - {allow_mult, true}] ++ - common_defaults(). - -common_defaults() -> - [{linkfun, {modfun, riak_kv_wm_link_walker, mapreduce_linkfun}}, - {old_vclock, 86400}, - {young_vclock, 20}, - {big_vclock, 50}, - {small_vclock, 50}, - {pr, 0}, - {r, quorum}, - {w, quorum}, - {pw, 0}, - {dw, quorum}, - {rw, quorum}, - {sync_on_write, backend}, - {basic_quorum, false}, - {notfound_ok, true}, - {n_val,3}, - {last_write_wins,false}, - {precommit, []}, - {postcommit, []}, - {chash_keyfun, {riak_core_util, chash_std_keyfun}}]. - -%% @doc Create the type. The type is not activated (available to nodes) at this time. This -%% function may be called arbitratily many times if the claimant does not change between -%% calls and the type is not active. An error will also be returned if the properties -%% are not valid. Properties not provided will be taken from those returned by -%% @see defaults/0. --spec create(bucket_type(), bucket_type_props()) -> ok | {error, term()}. -create(?DEFAULT_TYPE, _Props) -> - {error, default_type}; -create(BucketType, Props) when is_binary(BucketType) -> - ?IF_CAPABLE(riak_core_claimant:create_bucket_type(BucketType, - riak_core_bucket_props:merge(Props, defaults())), - {error, not_capable}). - -%% @doc Returns the state the type is in. --spec status(bucket_type()) -> undefined | created | ready | active. -status(?DEFAULT_TYPE) -> - active; -status(BucketType) when is_binary(BucketType) -> - ?IF_CAPABLE(riak_core_claimant:bucket_type_status(BucketType), undefined). - -%% @doc Activate the type. This will succeed only if the type is in the `ready' state. Otherwise, -%% an error is returned. --spec activate(bucket_type()) -> ok | {error, undefined | not_ready}. -activate(?DEFAULT_TYPE) -> - ok; -activate(BucketType) when is_binary(BucketType) -> - ?IF_CAPABLE(riak_core_claimant:activate_bucket_type(BucketType), {error, undefined}). - -%% @doc Update an existing bucket type. Updates may only be performed -%% on active types. Properties not provided will keep their existing -%% values. --spec update(bucket_type(), bucket_type_props()) -> ok | {error, term()}. -update(?DEFAULT_TYPE, _Props) -> - {error, no_default_update}; %% default props are in the app.config -update(BucketType, Props) when is_binary(BucketType)-> - ?IF_CAPABLE(riak_core_claimant:update_bucket_type(BucketType, Props), {error, not_capable}). - -%% @doc Return the properties associated with the given bucket type. --spec get(bucket_type()) -> undefined | bucket_type_props(). -get(<<"default">>) -> - riak_core_bucket_props:defaults(); -get(BucketType) when is_binary(BucketType) -> - riak_core_claimant:get_bucket_type(BucketType, undefined). - -%% @doc Reset the properties of the bucket. This only affects properties that -%% can be set using {@link update/2} and can only be performed on an active -%% type. -%% -%% This is not currently hooked into `riak-admin' but can be invoked -%% from the console. --spec reset(bucket_type()) -> ok | {error, term()}. -reset(BucketType) -> - update(BucketType, defaults()). - -%% @doc iterate over bucket types and find any active buckets. --spec all_n() -> riak_core_bucket:nval_set(). -all_n() -> - riak_core_bucket_type:fold(fun bucket_type_prop_nval_fold/2, ordsets:new()). - -%% @private --spec bucket_type_prop_nval_fold({bucket_type(), riak_core_bucket:properties()}, - riak_core_bucket:nval_set()) -> riak_core_bucket:nval_set(). -bucket_type_prop_nval_fold({_BType, BProps}, Accum) -> - case riak_core_bucket:get_value(active, BProps) of - true -> - bucket_prop_nval_fold(BProps, Accum); - _ -> - Accum - end. - --spec bucket_prop_nval_fold(riak_core_bucket:properties(), riak_core_bucket:nval_set()) -> - riak_core_bucket:nval_set(). -bucket_prop_nval_fold(BProps, Accum) -> - case riak_core_bucket:get_value(n_val, BProps) of - undefined -> - Accum; - NVal -> - ordsets:add_element(NVal, Accum) - end. - -%% @doc Fold over all bucket types, storing result in accumulator --spec fold(fun(({bucket_type(), bucket_type_props()}, any()) -> any()), - Accumulator::any()) -> - any(). -fold(Fun, Accum) -> - fold(iterator(), Fun, Accum). - --spec fold( - riak_core_metadata:iterator(), - fun(({bucket_type(), bucket_type_props()}, any()) -> any()), - any() -) -> - any(). -fold(It, Fun, Accum) -> - case riak_core_bucket_type:itr_done(It) of - true -> - riak_core_bucket_type:itr_close(It), - Accum; - _ -> - NewAccum = Fun(itr_value(It), Accum), - fold(riak_core_bucket_type:itr_next(It), Fun, NewAccum) - end. - -%% @doc Return an iterator that can be used to walk through all existing bucket types -%% and their properties --spec iterator() -> riak_core_metadata:iterator(). -iterator() -> - riak_core_claimant:bucket_type_iterator(). - -%% @doc Advance the iterator to the next bucket type. itr_done/1 should always be called -%% before this function --spec itr_next(riak_core_metadata:iterator()) -> - riak_core_metadata:iterator(). -itr_next(It) -> - riak_core_metadata:itr_next(It). - -%% @doc Returns true if there are no more bucket types to iterate over --spec itr_done(riak_core_metadata:iterator()) -> boolean(). -itr_done(It) -> - riak_core_metadata:itr_done(It). - -%% @doc Returns the type and properties that the iterator points too. Any siblings, -%% are resolved at this time. itr_done/1 should be checked before calling this function. --spec itr_value(riak_core_metadata:iterator()) -> - {bucket_type(), bucket_type_props()}. -itr_value(It) -> - {BucketType, Props} = riak_core_metadata:itr_key_values(It), - {BucketType, Props}. - - --spec itr_close(riak_core_metadata:iterator()) -> ok. -itr_close(It) -> - riak_core_metadata:itr_close(It). - -%% @doc Returns a hash of a specified set of bucket type properties -%% whose values may have implications on the treatment or handling of -%% buckets created using the bucket type. --spec property_hash(bucket_type(), [term()]) -> undefined | integer(). -property_hash(Type, PropKeys) -> - property_hash(Type, PropKeys, ?MODULE:get(Type)). - --spec property_hash(bucket_type(), [term()], undefined | bucket_type_props()) -> - undefined | integer(). -property_hash(_Type, _PropKeys, undefined) -> - undefined; -property_hash(_Type, PropKeys, Props) -> - erlang:phash2([lists:keyfind(PropKey, 1, Props) || PropKey <- PropKeys]). diff --git a/src/riak_core_capability.erl b/src/riak_core_capability.erl deleted file mode 100644 index 139d2beb4..000000000 --- a/src/riak_core_capability.erl +++ /dev/null @@ -1,670 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core: Core Riak Application -%% -%% Copyright (c) 2007-2012 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 -%% This module implements a cluster capability system that tracks the modes -%% supported by different nodes in the cluster and automatically determines -%% the most preferred mode for each capability that is supported by all nodes. -%% The primary use of this system is to support seamless transitions between -%% different node versions during a rolling upgrade -- such as speaking an -%% old protocol while the cluster still contains older nodes, and then -%% switching to a newer protocol after all nodes have been upgraded. -%% -%% The capability system exposes a simple `register' and `get' API, that -%% allows applications to register a given capability and set of supported -%% modes, and then retrieve the current mode that has been safely negotiated -%% across the cluster. The system also allows overriding negotiation through -%% application environment variables (eg. in app.config). -%% -%% To register a capability and set of supported modes: -%% Use {@link register/3} or {@link register/4} -%% -%% To query the current negotiated capability: -%% Use {@link get/1} or {@link get/2} -%% -%% The capability system implements implicit mode preference. When registering -%% modes, the modes listed earlier in the list are preferred over modes listed -%% later in the list. -%% -%% Users can override capabilities by setting the `override_capability' app -%% variable for the appropriate application. For example, to override the -%% `{riak_core, vnode_routing}' capability, the user could add the following -%% to `riak_core' section of `app.config': -%% -%% {override_capability, -%% [{vnode_routing, -%% [{use, some_mode}, -%% {prefer, some_other_mode}] -%% }] -%% } -%% -%% The two override parameters are `use' and `prefer'. The `use' parameter -%% specifies a mode that will always be used for the given capability, -%% ignoring negotiation. It is a forced override. The `prefer' parameter -%% specifies a mode that will be used if safe across the entire cluster. -%% This overrides the built-in mode preference, but still only selects the -%% mode if safe. When both `use' and `prefer' are specified, `use' takes -%% precedence. -%% -%% There is no inherent upgrading/downgrading of protocols in this system. -%% The system is designed with the assumption that all supported modes can -%% be used at any time (even concurrently), and is concerned solely with -%% selecting the most preferred mode common across the cluster at a given -%% point in time. - --module(riak_core_capability). --behaviour(gen_server). - -%% API --export([start_link/0, - register/4, - register/3, - get/1, - get/2, - all/0, - update_ring/1]). - --export([make_capability/4, - preferred_modes/4]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include_lib("kernel/include/logger.hrl"). - --type capability() :: atom() | {atom(), atom()}. --type mode() :: term(). - --record(capability, {supported :: [mode()], - default :: mode(), - legacy}). - --type registered() :: [{capability(), #capability{}}]. - --record(state, {registered :: registered(), - last_ring_id :: term(), - supported :: [{node(), [{capability(), [mode()]}]}], - unknown :: [node()], - negotiated :: [{capability(), mode()}] - }). - --define(ETS, riak_capability_ets). --define(CAPS, '$riak_capabilities'). - -%%%=================================================================== -%%% API -%%%=================================================================== - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). - -%% @doc Register a new capability providing a list of supported modes, the -%% default mode, and an optional mapping of how a legacy application variable -%% maps to different modes. The order of modes in `Supported' determines the -%% mode preference -- modes listed earlier are more preferred. -register(Capability, Supported, Default, LegacyVar) -> - Info = capability_info(Supported, Default, LegacyVar), - gen_server:call(?MODULE, {register, Capability, Info}, infinity), - ok. - -%% @doc Register a new capability providing a list of supported modes as well -%% as the default value. The order of modes in `Supported' determines the mode -%% preference -- modes listed earlier are more preferred. -register(Capability, Supported, Default) -> - register(Capability, Supported, Default, undefined). - -%% @doc Query the current negotiated mode for a given capability, throwing an -%% exception if the capability is unknown or the capability system is -%% unavailable. -get(Capability) -> - case get(Capability, '$unknown') of - '$unknown' -> - throw({unknown_capability, Capability}); - Result -> - Result - end. - -%% @doc Query the current negotiated mode for a given capability, returning -%% `Default' if the capability system is unavailable. -get(Capability, Default) -> - try - case ets:lookup(?ETS, Capability) of - [] -> - Default; - [{Capability, Choice}] -> - Choice - end - catch - _:_ -> - Default - end. - -%% @doc Return a list of all negotiated capabilities -all() -> - ets:tab2list(?ETS). - -%% @doc Add the local node's supported capabilities to the given -%% ring. Currently used during the `riak-admin join' process -update_ring(Ring) -> - %% If a join occurs immediately after a node has started, it is - %% possible that the ETS table does not yet exist, or that the - %% '$supported' key has not yet been written. Therefore, we catch - %% any errors and return an unmodified ring. - Supported = try - [{_, Sup}] = ets:lookup(?ETS, '$supported'), - Sup - catch - _:_ -> - error - end, - case Supported of - error -> - {false, Ring}; - _ -> - add_supported_to_ring(node(), Supported, Ring) - end. - -%% @doc -%% Make a capbility from a capability atom, a list of supported modes, -%% the default mode, and a mapping from a legacy var to it's capabilities. --spec make_capability(capability(), [mode()], mode(), term()) - -> {capability(), #capability{}}. -make_capability(Capability, Supported, Default, Legacy) -> - {Capability, capability_info(Supported, Default, Legacy)}. - -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== - -init([]) -> - ?ETS = ets:new(?ETS, [named_table, {read_concurrency, true}]), - schedule_tick(), - Registered = load_registered(), - State = init_state(Registered), - State2 = reload(State), - {ok, State2}. - -init_state(Registered) -> - #state{registered=Registered, - supported=[], - unknown=[], - negotiated=[]}. - -handle_call({register, Capability, Info}, _From, State) -> - State2 = register_capability(node(), Capability, Info, State), - State3 = update_supported(State2), - State4 = renegotiate_capabilities(State3), - publish_supported(State4), - update_local_cache(State4), - save_registered(State4#state.registered), - {reply, ok, State4}. - -handle_cast(_Msg, State) -> - {noreply, State}. - -handle_info(tick, State) -> - schedule_tick(), - State2 = maybe_update_supported(State), - State3 = - lists:foldl(fun(Node, StateAcc) -> - add_node(Node, [], StateAcc) - end, State2, State2#state.unknown), - State4 = renegotiate_capabilities(State3), - {noreply, State4}; - -handle_info(_Info, State) -> - {noreply, State}. - -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== - -maybe_update_supported(State=#state{last_ring_id=LastID}) -> - case riak_core_ring_manager:get_ring_id() of - LastID -> - State; - RingID -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - State2 = update_supported(Ring, State), - State2#state{last_ring_id=RingID} - end. - -capability_info(Supported, Default, Legacy) -> - #capability{supported=Supported, default=Default, legacy=Legacy}. - -schedule_tick() -> - Tick = app_helper:get_env(riak_core, - capability_tick, - 10000), - erlang:send_after(Tick, ?MODULE, tick). - -%% Capabilities are re-initialized if riak_core_capability server crashes -reload(State=#state{registered=[]}) -> - State; -reload(State) -> - ?LOG_INFO("Reloading capabilities"), - State2 = - orddict:fold( - fun(Capability, Info, S) -> - S2 = add_registered(Capability, Info, S), - S3 = add_supported(node(), Capability, - Info#capability.supported, S2), - S3 - end, State, State#state.registered), - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - State3 = update_supported(Ring, State2), - update_local_cache(State3), - save_registered(State3#state.registered), - State3. - -update_supported(State) -> - {ok, Ring} = riak_core_ring_manager:get_raw_ring(), - update_supported(Ring, State). - -%% Update this node's view of cluster capabilities based on a received ring -update_supported(Ring, State) -> - AllSupported = get_supported_from_ring(Ring), - State2 = remove_members(Ring, State), - State3 = - lists:foldl(fun({Node, _}, StateAcc) when Node == node() -> - StateAcc; - ({Node, Supported}, StateAcc) -> - Known = get_supported(Node, StateAcc), - case {Supported, Known} of - {[], []} -> - add_node(Node, Supported, StateAcc); - {[], _} -> - add_node(Node, Supported, StateAcc); - {Same, Same} -> - StateAcc; - {_, _} -> - add_node(Node, Supported, StateAcc) - end - end, State2, AllSupported), - State4 = renegotiate_capabilities(State3), - State4. - -register_capability(Node, Capability, Info, State) -> - State2 = add_registered(Capability, Info, State), - State3 = - add_supported(Node, Capability, Info#capability.supported, State2), - State3. - -add_registered(Capability, Info, State) -> - Registered = orddict:store(Capability, Info, State#state.registered), - State#state{registered=Registered}. - -get_supported(Node, #state{supported=Supported}) -> - case orddict:find(Node, Supported) of - {ok, Caps} -> - Caps; - error -> - orddict:new() - end. - -add_supported(Node, Capability, Supported, State) -> - Sup = get_supported(Node, State), - Sup2 = orddict:store(Capability, Supported, Sup), - NodeSupported = orddict:store(Node, Sup2, State#state.supported), - State2 = State#state{supported=NodeSupported}, - State2. - -%% Clear any capability information associated with nodes that are no longer -%% members of the cluster -remove_members(Ring, State=#state{supported=Supported}) -> - Members = riak_core_ring:all_members(Ring), - Supported2 = - orddict:filter(fun(Node, _) -> - lists:member(Node, Members) - end, Supported), - State2 = State#state{supported=Supported2}, - State2. - -%% Add another member to the local view of cluster capabilities. If the node -%% has published capability information in the ring, use it. Otherwise, try -%% to determine capabilities through RPC to the node. If RPC fails, use -%% default values. However, unresolved nodes will be marked as such and RPC -%% re-attempted at the next server tick. -add_node(Node, [], State=#state{unknown=Unknown}) -> - {Capabilities, Resolved} = query_capabilities(Node, State), - Unknown2 = case Resolved of - true -> - ordsets:del_element(Node, Unknown); - false -> - ordsets:add_element(Node, Unknown) - end, - State2 = State#state{unknown=Unknown2}, - add_node_capabilities(Node, Capabilities, State2); -add_node(Node, Capabilities, State) -> - add_node_capabilities(Node, Capabilities, State). - -add_node_capabilities(Node, Capabilities, State) -> - lists:foldl(fun({Capability, Supported}, StateAcc) -> - add_supported(Node, Capability, Supported, StateAcc) - end, State, Capabilities). - -%% We maintain a cached-copy of the local node's supported capabilities -%% in our existing capability ETS table. This allows update_ring/1 -%% to update rings without going through the capability server. -update_local_cache(State) -> - Supported = get_supported(node(), State), - ets:insert(?ETS, {'$supported', Supported}), - ok. - -%% Publish the local node's supported modes in the ring -publish_supported(State) -> - Node = node(), - Supported = get_supported(Node, State), - F = fun(Ring, _) -> - {Changed, Ring2} = - add_supported_to_ring(Node, Supported, Ring), - case Changed of - true -> - {new_ring, Ring2}; - false -> - ignore - end - end, - riak_core_ring_manager:ring_trans(F, ok), - ok. - -%% Add a node's capabilities to the provided ring -add_supported_to_ring(Node, Supported, Ring) -> - Current = riak_core_ring:get_member_meta(Ring, Node, ?CAPS), - case Current of - Supported -> - {false, Ring}; - _ -> - Ring2 = riak_core_ring:update_member_meta(Node, Ring, Node, - ?CAPS, Supported), - {true, Ring2} - end. - -%% @doc -%% Given my node's capabilities, my node's registered default modes, the -%% list of application env overrides, and the current view of all node's -%% supported capabilities, determine the most preferred mode for each capability -%% that is supported by all nodes. --spec preferred_modes([{capability(), [mode()]}], - [{node(), [{capability(), [mode()]}]}], - registered(), - [{capability(), [mode()]}]) - -> [{capability(), mode()}]. -preferred_modes(MyCaps, Capabilities, Registered, Override) -> - N1 = reformat_capabilities(Registered, Capabilities), - N2 = intersect_capabilities(N1), - N3 = order_by_preference(MyCaps, N2), - N4 = override_capabilities(N3, Override), - N5 = [{Cap, hd(Common)} || {Cap, Common} <- N4], - N5. - -%% Given the current view of each node's supported capabilities, determine -%% the most preferred mode for each capability that is supported by all nodes -%% in the cluster. -negotiate_capabilities(Node, Override, State=#state{registered=Registered, - supported=Capabilities}) -> - case orddict:find(Node, Capabilities) of - error -> - State; - {ok, MyCaps} -> - N = preferred_modes(MyCaps, Capabilities, Registered, Override), - State#state{negotiated=N} - end. - -renegotiate_capabilities(State=#state{supported=[]}) -> - State; -renegotiate_capabilities(State) -> - Caps = orddict:fetch(node(), State#state.supported), - Overrides = get_overrides(Caps), - State2 = negotiate_capabilities(node(), Overrides, State), - process_capability_changes(State#state.negotiated, - State2#state.negotiated), - State2. - -%% Known capabilities are tracked based on node: -%% -%% [{Node1, [{capability1, [x,y,z]}, -%% {capability2, [x,y,z]}]}, -%% {Node2, [{capability1, [a,b,z]}]}]. -%% -%% Here we convert this data into a capability-centric structure: -%% -%% [{capability1, [{Node1, [x,y,z,default]}, {Node2, [a,b,c,default]}]}, -%% {capability2, [{Node1, [x,y,z,default]}, {Node2, [default]}]}] -%% --spec reformat_capabilities(registered(), - [{node(), [{capability(), [mode()]}]}]) - -> [{capability(), [{node(), [mode()]}]}]. -reformat_capabilities(Registered, Capabilities) -> - DefaultsL = [{Cap, [Info#capability.default]} || {Cap,Info} <- Registered], - Defaults = orddict:from_list(DefaultsL), - lists:foldl(fun({Node, NodeCaps}, Acc) -> - update_capability(Node, NodeCaps, Defaults, Acc) - end, orddict:new(), Capabilities). - -update_capability(Node, NodeCaps, Defaults, Acc0) -> - NodeCaps2 = extend(orddict:from_list(NodeCaps), Defaults), - lists:foldl(fun({Cap, Supported}, Acc) -> - S = ordsets:from_list(Supported), - orddict:append(Cap, {Node, S}, Acc) - end, Acc0, NodeCaps2). - -extend(A, B) -> - orddict:merge(fun(_, L, X) -> X++L end, A, B). - -%% For each capability, determine the modes supported by all nodes --spec intersect_capabilities([{capability(), [{node(), [mode()]}]}]) - -> [{capability(), [mode()]}]. -intersect_capabilities(Capabilities) -> - lists:map(fun intersect_supported/1, Capabilities). - -intersect_supported({Capability, NodeSupported}) -> - {_, Supported0} = hd(NodeSupported), - Common = - lists:foldl(fun({_Node, Supported}, Acc) -> - ordsets:intersection(Acc, Supported) - end, Supported0, tl(NodeSupported)), - {Capability, Common}. - -%% For each capability, re-order the computed mode list by local preference. -%% In reality, this is just an order-sensitive intersection between the local -%% node's list of supported modes and the computed list. -order_by_preference(MyCapabilities, Common) -> - [order_by_preference(Cap, Pref, Common) || {Cap, Pref} <- MyCapabilities]. - -order_by_preference(Capability, Preferred, Common) -> - Modes = orddict:fetch(Capability, Common), - Preferred2 = [Mode || Mode <- Preferred, - lists:member(Mode, Modes)], - {Capability, Preferred2}. - -%% Override computed capabilities based on app.config settings -override_capabilities(Caps, AppOver) -> - [override_capability(Cap, Modes, AppOver) || {Cap, Modes} <- Caps]. - -override_capability(Capability={App, CapName}, Modes, AppOver) -> - Over = orddict:fetch(App, AppOver), - case orddict:find(CapName, Over) of - error -> - {Capability, Modes}; - {ok, Opts} -> - {Capability, override_capability(Opts, Modes)} - end. - -override_capability(Opts, Modes) -> - Use = proplists:get_value(use, Opts), - Prefer = proplists:get_value(prefer, Opts), - case {Use, Prefer} of - {undefined, undefined} -> - Modes; - {undefined, Val} -> - case lists:member(Val, Modes) of - true -> - [Val]; - false -> - Modes - end; - {Val, _} -> - [Val] - end. - -get_overrides(Caps) -> - Apps = lists:usort([App || {{App, _}, _} <- Caps]), - AppOver = [{App, get_app_overrides(App)} || App <- Apps], - AppOver. - -get_app_overrides(App) -> - case application:get_env(App, override_capability) of - undefined -> - []; - {ok, L} -> - orddict:from_list(L) - end. - -%% Log capability changes as well as update the capability ETS table. -%% The ETS table allows other processes to query current capabilities -%% without going through the capability server. -process_capability_changes(OldModes, NewModes) -> - Diff = riak_core_util:orddict_delta(OldModes, NewModes), - orddict:fold(fun(Capability, {'$none', New}, _) -> - ets:insert(?ETS, {Capability, New}), - ?LOG_INFO("New capability: ~p = ~p", [Capability, New]); - (Capability, {Old, '$none'}, _) -> - ets:delete(?ETS, Capability), - ?LOG_INFO("Removed capability ~p (previously: ~p)", - [Capability, Old]); - (Capability, {Old, New}, _) -> - ets:insert(?ETS, {Capability, New}), - ?LOG_INFO("Capability changed: ~p / ~p -> ~p", - [Capability, Old, New]) - end, ok, Diff). - -%% Determine the capabilities supported by each cluster member based on the -%% information published in the ring -get_supported_from_ring(Ring) -> - Members = riak_core_ring:all_members(Ring), - [begin - Caps = riak_core_ring:get_member_meta(Ring, Member, ?CAPS), - case Caps of - undefined -> - {Member, []}; - _ -> - {Member, Caps} - end - end || Member <- Members]. - -%% Determine capabilities of legacy nodes based on app.config settings and -%% the provided app-var -> mode mapping associated with capabilities when -%% registered. -query_capabilities(Node, State=#state{registered=Registered}) -> - %% Only query results we do not already have local knowledge of - Known = dict:from_list(get_supported(Node, State)), - lists:mapfoldl(fun({Capability, Info}, ResolvedAcc) -> - {Resv, Cap} = query_capability(Node, - Known, - Capability, - Info#capability.default, - Info#capability.legacy), - {Cap, ResolvedAcc and Resv} - end, true, Registered). - -query_capability(Node, Known, Capability, DefaultSup, LegacyVar) -> - case dict:find(Capability, Known) of - {ok, Supported} -> - {true, {Capability, Supported}}; - error -> - query_capability(Node, Capability, DefaultSup, LegacyVar) - end. - -query_capability(_, Capability, DefaultSup, undefined) -> - Default = {Capability, [DefaultSup]}, - {true, Default}; -query_capability(Node, Capability, DefaultSup, {App, Var, Map}) -> - Default = {Capability, [DefaultSup]}, - Result = riak_core_util:safe_rpc(Node, application, get_env, [App, Var]), - case Result of - {badrpc, _} -> - {false, Default}; - undefined -> - {true, Default}; - {ok, Value} -> - case lists:keyfind(Value, 1, Map) of - false -> - {true, Default}; - {Value, Supported} -> - {true, {Capability, [Supported]}} - end - end. - -save_registered(Registered) -> - application:set_env(riak_core, registered_capabilities, Registered). - -load_registered() -> - case application:get_env(riak_core, registered_capabilities) of - undefined -> []; - {ok, Caps} -> Caps - end. - -%% =================================================================== -%% EUnit tests -%% =================================================================== --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - -basic_test() -> - S1 = init_state([]), - - S2 = register_capability(n1, - {riak_core, test}, - capability_info([x,a,c,y], y, []), - S1), - S3 = add_node_capabilities(n2, - [{{riak_core, test}, [a,b,c,y]}], - S2), - S4 = negotiate_capabilities(n1, [{riak_core, []}], S3), - ?assertEqual([{{riak_core, test}, a}], S4#state.negotiated), - - S5 = negotiate_capabilities(n1, - [{riak_core, [{test, [{prefer, c}]}]}], - S4), - ?assertEqual([{{riak_core, test}, c}], S5#state.negotiated), - - S6 = add_node_capabilities(n3, - [{{riak_core, test}, [b]}], - S5), - S7 = negotiate_capabilities(n1, [{riak_core, []}], S6), - ?assertEqual([{{riak_core, test}, y}], S7#state.negotiated), - - S8 = negotiate_capabilities(n1, - [{riak_core, [{test, [{use, x}]}]}], - S7), - ?assertEqual([{{riak_core, test}, x}], S8#state.negotiated), - ok. - --endif. diff --git a/src/riak_core_cinfo_core.erl b/src/riak_core_cinfo_core.erl deleted file mode 100644 index 2b15a6172..000000000 --- a/src/riak_core_cinfo_core.erl +++ /dev/null @@ -1,77 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Riak: A lightweight, decentralized key-value store. -%% -%% 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. -%% -%% ------------------------------------------------------------------- --module(riak_core_cinfo_core). - --export([cluster_info_init/0, cluster_info_generator_funs/0]). - -%% @spec () -> term() -%% @doc Required callback function for cluster_info: initialization. -%% -%% This function doesn't have to do anything. - -cluster_info_init() -> - ok. - -%% @spec () -> list({string(), fun()}) -%% @doc Required callback function for cluster_info: return list of -%% {NameForReport, FunOfArity_1} tuples to generate ASCII/UTF-8 -%% formatted reports. - -cluster_info_generator_funs() -> - [ - {"Riak Core config files", fun config_files/1}, - {"Riak Core vnode modules", fun vnode_modules/1}, - {"Riak Core ring", fun get_my_ring/1}, - {"Riak Core latest ring file", fun latest_ringfile/1}, - {"Riak Core active partitions", fun active_partitions/1} - ]. - -vnode_modules(CPid) -> % CPid is the data collector's pid. - cluster_info:format(CPid, "~p\n", [riak_core:vnode_modules()]). - -get_my_ring(CPid) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - cluster_info:format(CPid, "~p\n", [Ring]). - -latest_ringfile(CPid) -> - {ok, Path} = riak_core_ring_manager:find_latest_ringfile(), - {ok, Contents} = file:read_file(Path), - cluster_info:format(CPid, "Latest ringfile: ~s\n", [Path]), - cluster_info:format(CPid, "File contents:\n~p\n", [binary_to_term(Contents)]). - -active_partitions(CPid) -> - Vnodes = [{Mod, Idx} || {Mod, Idx, _Pid} <- riak_core_vnode_manager:all_vnodes()], - Partitions = lists:foldl(fun({_,P}, Ps) -> - ordsets:add_element(P, Ps) - end, ordsets:new(), Vnodes), - cluster_info:format(CPid, "~p\n", [Partitions]). - -config_files(C) -> - {ok, [[AppPath]]} = init:get_argument(config), - EtcDir = filename:dirname(AppPath), - VmPath = filename:join(EtcDir, "vm.args"), - [begin - cluster_info:format(C, "File: ~s\n", [os:cmd("ls -l " ++ File)]), - {ok, FileBin} = file:read_file(File), - cluster_info:format(C, "File contents:\n~s\n", [FileBin]) - end || File <- [AppPath, VmPath]]. - diff --git a/src/riak_core_claim.erl b/src/riak_core_claim.erl index c090fe37b..10689c015 100644 --- a/src/riak_core_claim.erl +++ b/src/riak_core_claim.erl @@ -2,7 +2,7 @@ %% %% riak_core: Core Riak Application %% -%% Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved. +%% Copyright (c) 2007-2015 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 @@ -57,63 +57,34 @@ 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_v1/1, wants_claim_v1/2, - wants_claim_v2/1, wants_claim_v2/2, - wants_claim_v3/1, wants_claim_v3/2, - choose_claim_v1/1, choose_claim_v1/2, choose_claim_v1/3, +-export([wants_claim_v2/1, wants_claim_v2/2, choose_claim_v2/1, choose_claim_v2/2, choose_claim_v2/3, - choose_claim_v3/1, choose_claim_v3/2, choose_claim_v3/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]). --ifdef(TEST). --compile(export_all). --ifdef(EQC). --export([prop_claim_ensures_unique_nodes/1, prop_wants/0, prop_wants_counts/0,eqc_check/2, - prop_claim_ensures_unique_nodes_v2/0, % prop_claim_ensures_unique_nodes_v3/0, - prop_take_idxs/0]). --include_lib("eqc/include/eqc.hrl"). --endif. --include_lib("eunit/include/eunit.hrl"). --endif. - --include_lib("kernel/include/logger.hrl"). -define(DEF_TARGET_N, 4). --type delta() :: {node(), Ownership::non_neg_integer(), Delta::integer()}. --type deltas() :: [delta()]. - claim(Ring) -> - Want = app_helper:get_env(riak_core, wants_claim_fun), - Choose = app_helper:get_env(riak_core, choose_claim_fun), - claim(Ring, Want, Choose). + claim(Ring, want, choose). -claim(Ring, Want, Choose) -> +claim(Ring, _, _) -> Members = riak_core_ring:claiming_members(Ring), lists:foldl(fun(Node, Ring0) -> - claim_until_balanced(Ring0, Node, Want, Choose) + claim_until_balanced(Ring0, Node, want, choose) end, Ring, Members). claim_until_balanced(Ring, Node) -> - Want = app_helper:get_env(riak_core, wants_claim_fun), - Choose = app_helper:get_env(riak_core, choose_claim_fun), - claim_until_balanced(Ring, Node, Want, Choose). + claim_until_balanced(Ring, Node, want, choose). -claim_until_balanced(Ring, Node, {WMod, WFun}=Want, Choose) -> - NeedsIndexes = apply(WMod, WFun, [Ring, Node]), +claim_until_balanced(Ring, Node, want, choose) -> + NeedsIndexes = wants_claim_v2(Ring, Node), case NeedsIndexes of - no -> - Ring; + no -> Ring; {yes, _NumToClaim} -> - NewRing = case Choose of - {CMod, CFun} -> - CMod:CFun(Ring, Node); - {CMod, CFun, Params} -> - CMod:CFun(Ring, Node, Params) - end, - claim_until_balanced(NewRing, Node, Want, Choose) + NewRing = choose_claim_v2(Ring, Node), + claim_until_balanced(NewRing, Node, want, choose) end. %% =================================================================== @@ -126,20 +97,10 @@ default_choose_claim(Ring) -> default_choose_claim(Ring, node()). default_choose_claim(Ring, Node) -> - case riak_core_ring:legacy_ring(Ring) of - true -> - choose_claim_v1(Ring, Node); - false -> - choose_claim_v2(Ring, Node) - end. + choose_claim_v2(Ring, Node). default_choose_claim(Ring, Node, Params) -> - case riak_core_ring:legacy_ring(Ring) of - true -> - choose_claim_v1(Ring, Node, Params); - false -> - choose_claim_v2(Ring, Node, Params) - end. + choose_claim_v2(Ring, Node, Params). %% @spec default_wants_claim(riak_core_ring()) -> {yes, integer()} | no %% @doc Want a partition if we currently have less than floor(ringsize/nodes). @@ -147,35 +108,7 @@ default_wants_claim(Ring) -> default_wants_claim(Ring, node()). default_wants_claim(Ring, Node) -> - case riak_core_ring:legacy_ring(Ring) of - true -> - wants_claim_v1(Ring, Node); - false -> - wants_claim_v2(Ring, Node) - end. - -%% @deprecated -wants_claim_v1(Ring) -> - wants_claim_v1(Ring, node()). - -%% @deprecated -wants_claim_v1(Ring0, Node) -> - Ring = riak_core_ring:upgrade(Ring0), - %% Calculate the expected # of partitions for a perfectly balanced ring. Use - %% this expectation to determine the relative balance of the ring. If the - %% ring isn't within +-2 partitions on all nodes, we need to rebalance. - ExpParts = get_expected_partitions(Ring, Node), - PCounts = lists:foldl(fun({_Index, ANode}, Acc) -> - orddict:update_counter(ANode, 1, Acc) - end, [{Node, 0}], riak_core_ring:all_owners(Ring)), - RelativeCounts = [I - ExpParts || {_ANode, I} <- PCounts], - WantsClaim = (lists:min(RelativeCounts) < -2) or (lists:max(RelativeCounts) > 2), - case WantsClaim of - true -> - {yes, 0}; - false -> - no - end. + wants_claim_v2(Ring, Node). wants_claim_v2(Ring) -> wants_claim_v2(Ring, node()). @@ -189,68 +122,8 @@ wants_claim_v2(Ring, Node) -> Avg = RingSize div NodeCount, Count = proplists:get_value(Node, Counts, 0), case Count < Avg of - false -> - case riak_core_ring:has_location_changed(Ring) of - true -> - {yes, 1}; - false -> - no - end; - true -> - {yes, Avg - Count} - end. - -%% Wants claim v3 - calculates the wants the same way as choose_claim_v3 -%% and checks if they have changed since it was last run. -wants_claim_v3(Ring) -> - wants_claim_v3(Ring, node()). - -wants_claim_v3(Ring, _Node) -> - Wants = wants(Ring), - - %% This case will only hold true during claim_until_balanced - %% as only the ownership information is transferred after - %% running claim not the metadata. - case riak_core_ring:get_meta(claimed, Ring) of - {ok, {claim_v3, Wants}} -> - ?LOG_DEBUG("WantsClaim3(~p) no. Current ring claimed for ~p\n", - [_Node, Wants]), - no; - {ok, {claim_v3, CurWants}} -> - ?LOG_DEBUG("WantsClaim3(~p) yes. Current ring claimed for " - "different wants\n~p\n", - [_Node, CurWants]), - {yes, 1}; - undefined -> - %% First time through claim_until_balanced, check for override - %% to recalculate. - case app_helper:get_env(riak_core, force_reclaim, false) of - true -> - application:unset_env(riak_core, force_reclaim), - ?LOG_INFO("Forced rerun of claim algorithm - " - "unsetting force_reclaim"), - {yes, 1}; - false -> - %% Otherwise, base wants decision on whether the current - %% wants versus current ownership if the claim does not - %% manage to claim all requested nodes then the temporary - %% 'claim_v3' metadata will stop the loop - Owns = get_counts(riak_core_ring:claiming_members(Ring), - riak_core_ring:all_owners(Ring)), - Deltas = wants_owns_diff(Wants, Owns), - Diffs = lists:sum([abs(Diff) || {_, Diff} <- Deltas]), - case Diffs of - 0 -> - ?LOG_DEBUG("WantsClaim3(~p) no. All wants met.\n", - [_Node]), - no; - _ -> - ?LOG_DEBUG("WantsClaim3(~p) yes - ~p.\n" - "Does not meet wants - diffs ~p\n", - [_Node, Diffs, Deltas]), - {yes, Diffs} - end - end + false -> no; + true -> {yes, Avg - Count} end. %% Provide default choose parameters if none given @@ -260,36 +133,12 @@ default_choose_params() -> default_choose_params(Params) -> case proplists:get_value(target_n_val, Params) of undefined -> - TN = app_helper:get_env(riak_core, target_n_val, ?DEF_TARGET_N), + TN = application:get_env(riak_core, target_n_val, ?DEF_TARGET_N), [{target_n_val, TN} | Params]; _-> Params end. -%% @deprecated -choose_claim_v1(Ring) -> - choose_claim_v1(Ring, node()). - -%% @deprecated -choose_claim_v1(Ring0, Node) -> - choose_claim_v1(Ring0, Node, []). - -choose_claim_v1(Ring0, Node, Params0) -> - Params = default_choose_params(Params0), - Ring = riak_core_ring:upgrade(Ring0), - TargetN = proplists:get_value(target_n_val, Params), - case meets_target_n(Ring, TargetN) of - {true, TailViolations} -> - %% if target N is met, then it doesn't matter where - %% we claim vnodes, as long as we don't violate the - %% target N with any of our additions - %% (== claim partitions at least N steps apart) - claim_with_n_met(Ring, TailViolations, Node); - false -> - %% we don't meet target N yet, rebalance - claim_rebalance_n(Ring, Node) - end. - choose_claim_v2(Ring) -> choose_claim_v2(Ring, node()). @@ -304,12 +153,12 @@ choose_claim_v2(RingOrig, Node, Params0) -> Active = riak_core_ring:claiming_members(Ring), %% Owners::[{index(), node()}] Owners = riak_core_ring:all_owners(Ring), - %% Ownerships ::[node(), non_neg_integer()] - Ownerships = get_counts(Active, Owners), + %% Counts::[node(), non_neg_integer()] + Counts = get_counts(Active, Owners), RingSize = riak_core_ring:num_partitions(Ring), NodeCount = erlang:length(Active), %% Deltas::[node(), integer()] - Deltas = get_deltas(RingSize, NodeCount, Owners, Ownerships), + 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), @@ -382,14 +231,14 @@ choose_claim_v2(RingOrig, Node, Params0) -> -spec get_deltas(RingSize::pos_integer(), NodeCount::pos_integer(), Owners::[{Index::non_neg_integer(), node()}], - Ownerships::[{node(), non_neg_integer()}]) -> - [{node(), integer()}]. -get_deltas(RingSize, NodeCount, Owners, Ownerships) -> + 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(Avg), - ActiveDeltas = [{Member, Ownership, normalise_delta(Avg - Ownership)} - || {Member, Ownership} <- Ownerships], + Max = ceiling(RingSize / NodeCount), + ActiveDeltas = [{Member, Count, normalise_delta(Avg - Count)} + || {Member, Count} <- Counts], BalancedDeltas = rebalance_deltas(ActiveDeltas, Max, RingSize), add_default_deltas(Owners, BalancedDeltas, 0). @@ -408,28 +257,26 @@ normalise_delta(Delta) -> %% @private so that we don't end up with an imbalanced ring where one %% 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 +%% 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(deltas(), - Max::pos_integer(), RingSize::pos_integer()) -> - [{node(), integer()}]. -rebalance_deltas(ActiveDeltas, Max, RingSize) -> - AppliedDeltas = [Own + Delta || {_, Own, Delta} <- ActiveDeltas], +-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} <- ActiveDeltas]; + [{Node, Delta} || {Node, _Cnt, Delta} <- NodeDeltas]; N when N < 0 -> - increase_keeps(ActiveDeltas, N, Max, []) + 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(), - WantsError::integer(), - Max::pos_integer(), - Acc:: deltas() | []) -> - [{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))]; increase_keeps([], N, Max, Acc) when N < 0 -> @@ -440,16 +287,16 @@ increase_keeps([{Node, Own, Delta} | Rest], N, Max, Acc) when Delta < 0 -> 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(), +-spec increase_takes(Deltas::[{node(), integer()}], WantsError::integer(), Max::pos_integer(), - Acc::deltas() | []) -> + Acc::[{node(), integer()}]) -> Rebalanced::[{node(), integer()}]. increase_takes(Rest, 0, _Max, Acc) -> [{Node, Delta} || {Node, _Own, Delta} <- lists:usort(lists:append(Rest, Acc))]; @@ -497,99 +344,6 @@ meets_target_n([], TargetN, Index, First, Last) -> {true, [ Part || {_, _, Part} <- Violations ]}. -choose_claim_v3(Ring) -> - choose_claim_v3(Ring, node()). - -choose_claim_v3(Ring, ClaimNode) -> - Params = [{target_n_val, app_helper:get_env(riak_core, target_n_val, - ?DEF_TARGET_N)}], - choose_claim_v3(Ring, ClaimNode, Params). - -choose_claim_v3(Ring, _ClaimNode, Params) -> - S = length(riak_core_ring:active_members(Ring)), - Q = riak_core_ring:num_partitions(Ring), - TN = proplists:get_value(target_n_val, Params, ?DEF_TARGET_N), - Wants = wants(Ring), - ?LOG_DEBUG("Claim3 started: S=~p Q=~p TN=~p\n", [S, Q, TN]), - ?LOG_DEBUG(" wants: ~p\n", [Wants]), - {Partitions, Owners} = lists:unzip(riak_core_ring:all_owners(Ring)), - - %% Seed the random number generator for predictable results - %% run the claim, then put it back if possible - OldSeedState = rand:export_seed(), - _ = rand:seed(exs64, proplists:get_value(seed, Params, {1,2,3})), - {NewOwners, NewMetrics} = claim_v3(Wants, Owners, Params), - case OldSeedState of - undefined -> - ok; - _ -> - _ = rand:seed(OldSeedState), - ok - end, - - ?LOG_DEBUG("Claim3 metrics: ~p\n", [NewMetrics]), - %% Build a new ring from it - NewRing = lists:foldl(fun({_P, OldOwn, OldOwn}, R0) -> - R0; - ({P, _OldOwn, NewOwn}, R0) -> - riak_core_ring:transfer_node(P, NewOwn, R0) - end, Ring, - lists:zip3(Partitions, Owners, NewOwners)), - riak_core_ring:update_meta(claimed, {claim_v3, Wants}, NewRing). - -%% -%% Claim V3 - unlike the v1/v2 algorithms, v3 treats claim as an optimization problem. -%% In it's current form it creates a number of possible claim plans and evaluates -%% them for violations, balance and diversity, choosing the 'best' plan. -%% -%% Violations are a count of how many partitions owned by the same node are within target-n -%% of one another. Lower is better, 0 is desired if at all possible. -%% -%% Balance is a measure of the number of partitions owned versus the number of partitions -%% wanted. Want is supplied to the algorithm by the caller as a list of node/counts. The -%% score for deviation is the RMS of the difference between what the node wanted and what it -%% has. Lower is better, 0 if all wants are mets. -%% -%% Diversity measures how often nodes are close to one another in the preference -%% list. The more diverse (spread of distances apart), the more evenly the -%% responsibility for a failed node is spread across the cluster. Diversity is -%% calculated by working out the count of each distance for each node pair -%% (currently distances are limited up to target N) and computing the RMS on that. -%% Lower diversity score is better, 0 if nodes are perfectly diverse. -%% -claim_v3(Wants, Owners, Params) -> - TN = proplists:get_value(target_n_val, Params, ?DEF_TARGET_N), - Q = length(Owners), - Claiming = [N || {N,W} <- Wants, W > 0], - Trials = proplists:get_value(trials, Params, 100), - case length(Claiming) > TN of - true -> - NIs = build_nis(Wants, Owners), - - ?LOG_DEBUG("claim3 - NIs\n",[]), - _ = [?LOG_DEBUG(" ~p\n", [NI]) || NI <- NIs], - - %% Generate plans that resolve violations and overloads - Plans = lists:usort(make_plans(Trials, NIs, Q, TN)), - - %% Work out which plan meets the balance and diversity objectives - {_NewOwners, NewMetrics} = New = evaluate_plans(Plans, Wants, Q, TN), - - case proplists:get_value(violations, NewMetrics) of - 0 -> - New; - _ -> - ?LOG_DEBUG("claimv3: Could not make plan without violations, diversifying\n", - []), - %% If could not build ring without violations, diversify it - claim_diversify(Wants, Owners, Params) - end; - false -> - ?LOG_DEBUG("claimv3: Not enough nodes to run (have ~p need ~p), diagonalized\n", - [length(Claiming), TN+1]), - claim_diagonal(Wants, Owners, Params) - end. - %% 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 %% not honor the counts currently. The algorithm incrementally builds the ownership @@ -636,10 +390,8 @@ sequential_claim(Ring, Node) -> node(), integer()) -> riak_core_ring:riak_core_ring(). -sequential_claim(Ring0, Node, TargetN) -> - Ring = riak_core_ring:upgrade(Ring0), - OrigNodes = lists:usort([Node|riak_core_ring:claiming_members(Ring)]), - Nodes = get_nodes_by_location(OrigNodes, Ring), +sequential_claim(Ring, Node, TargetN) -> + Nodes = lists:usort([Node|riak_core_ring:claiming_members(Ring)]), NodeCount = length(Nodes), RingSize = riak_core_ring:num_partitions(Ring), @@ -679,32 +431,28 @@ ceiling(F) -> end. -%% @private 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(pos_integer(), [node()], non_neg_integer(), pos_integer()) -> [[node()]]. +%% @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 build_nodelist(pos_integer(), [node()], non_neg_integer(), pos_integer(), pos_integer()) - -> [[node()]]. -build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, MinFetchesPerSeq) -> - %% Build the tail with sufficient nodes to satisfy TargetN - NodeCount = length(Nodes), - LastSegLength = (RingSize rem NodeCount) + Shortfall, - NewSeq = lists:sublist(Nodes, 1, LastSegLength), - build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, MinFetchesPerSeq, [NewSeq]). + 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(pos_integer(), [node()], non_neg_integer(), pos_integer(), pos_integer(), [[node()]]) - -> [[node()]]. +-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=[]) -> + %% Build the tail with sufficient nodes to satisfy TargetN + NodeCount = length(Nodes), + 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 rest of list, subtracting minimum of MinFetchesPerSeq, Shortfall %% or (NodeCount - NodeCounter) each time @@ -717,17 +465,15 @@ build_nodelist(RingSize, Nodes, Shortfall, NodeCounter, MinFetchesPerSeq, Acc) - MinFetchesPerSeq, [ NewSeq | Acc]). %% @private Backfill the ring with full sequences --spec backfill_ring(pos_integer(), [node()], integer(), [[node()]]) -> [[node()]]. +-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]). -claim_rebalance_n(Ring0, Node) -> - Ring = riak_core_ring:upgrade(Ring0), - OrigNodes = lists:usort([Node|riak_core_ring:claiming_members(Ring)]), - Nodes = get_nodes_by_location(OrigNodes, Ring), +claim_rebalance_n(Ring, Node) -> + Nodes = lists:usort([Node|riak_core_ring:claiming_members(Ring)]), Zipped = diagonal_stripe(Ring, Nodes), lists:foldl(fun({P, N}, Acc) -> @@ -754,8 +500,7 @@ random_choose_claim(Ring) -> random_choose_claim(Ring, Node) -> random_choose_claim(Ring, Node, []). -random_choose_claim(Ring0, Node, _Params) -> - Ring = riak_core_ring:upgrade(Ring0), +random_choose_claim(Ring, Node, _Params) -> riak_core_ring:transfer_node(riak_core_ring:random_other_index(Ring), Node, Ring). @@ -768,92 +513,6 @@ never_wants_claim(_,_) -> no. %% Private %% =================================================================== -%% @private -claim_hole(Ring, Mine, Owners, Node) -> - Choices = case find_biggest_hole(Mine) of - {I0, I1} when I0 < I1 -> - %% start-middle of the ring - lists:takewhile( - fun({I, _}) -> I /= I1 end, - tl(lists:dropwhile( - fun({I, _}) -> I /= I0 end, - Owners))); - {I0, I1} when I0 > I1 -> - %% wrap-around end-start of the ring - tl(lists:dropwhile( - fun({I, _}) -> I /= I0 end, Owners)) - ++lists:takewhile( - fun({I, _}) -> I /= I1 end, Owners); - {I0, I0} -> - %% node only has one claim - {Start, End} = - lists:splitwith( - fun({I, _}) -> I /= I0 end, - Owners), - tl(End)++Start - end, - Half = length(Choices) div 2, - {I, _} = lists:nth(Half, Choices), - riak_core_ring:transfer_node(I, Node, Ring). - -%% @private -claim_with_n_met(Ring, TailViolations, Node) -> - CurrentOwners = lists:keysort(1, riak_core_ring:all_owners(Ring)), - Nodes = lists:usort([Node|riak_core_ring:claiming_members(Ring)]), - case lists:sort([ I || {I, N} <- CurrentOwners, N == Node ]) of - [] -> - %% node hasn't claimed anything yet - just claim stuff - Spacing = length(Nodes), - [{First,_}|OwnList] = - case TailViolations of - [] -> - %% no wrap-around problems - choose whatever - lists:nthtail(Spacing-1, CurrentOwners); - [TV|_] -> - %% attempt to cure a wrap-around problem - lists:dropwhile( - fun({I, _}) -> I /= TV end, - lists:reverse(CurrentOwners)) - end, - {_, NewRing} = lists:foldl( - fun({I, _}, {0, Acc}) -> - {Spacing, riak_core_ring:transfer_node(I, Node, Acc)}; - (_, {S, Acc}) -> - {S-1, Acc} - end, - {Spacing, riak_core_ring:transfer_node(First, Node, Ring)}, - OwnList), - NewRing; - Mine -> - %% node already has claims - respect them - %% pick biggest hole & sit in the middle - %% rebalance will cure any mistake on the next pass - claim_hole(Ring, Mine, CurrentOwners, Node) - end. - -%% @private -find_biggest_hole(Mine) -> - lists:foldl(fun({I0, I1}, none) -> - {I0, I1}; - ({I0, I1}, {C0, C1}) when I0 < I1-> - %% start-middle of the ring - if I1-I0 > C1-C0 -> - {I0, I1}; - true -> - {C0, C1} - end; - ({I0, I1}, {C0, C1}) -> - %% wrap-around end-start of the ring - Span = I1+trunc(math:pow(2, 160))-1-I0, - if Span > C1-C0 -> - {I0, I1}; - true -> - {C0, C1} - end - end, - none, - lists:zip(Mine, tl(Mine)++[hd(Mine)])). - %% @private %% %% @doc Determines indices that violate the given target_n spacing @@ -877,9 +536,9 @@ find_violations(Ring, TargetN) -> %% @private %% %% @doc Counts up the number of partitions owned by each node. --spec get_counts([node()], [{non_neg_integer(), node()}]) -> - [{node(), pos_integer()}]. -get_counts(Nodes, PartitionOwners) -> +-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) -> case lists:member(Node, Nodes) of @@ -888,7 +547,7 @@ get_counts(Nodes, PartitionOwners) -> false -> Counts end - end, dict:from_list(Empty), PartitionOwners), + end, dict:from_list(Empty), Ring), dict:to_list(Counts). %% @private @@ -898,22 +557,6 @@ add_default_deltas(IdxOwners, Deltas, Default) -> Defaults = [{Member, Default} || Member <- Owners2], lists:ukeysort(1, Deltas ++ Defaults). -%% @private -get_expected_partitions(Ring, Node) -> - riak_core_ring:num_partitions(Ring) div get_member_count(Ring, Node). - -%% @private -get_member_count(Ring, Node) -> - %% Determine how many nodes are involved with the ring; if the requested - %% node is not yet part of the ring, include it in the count. - AllMembers = riak_core_ring:claiming_members(Ring), - case lists:member(Node, AllMembers) of - true -> - length(AllMembers); - false -> - length(AllMembers) + 1 - end. - %% @private %% %% @doc Filter out candidate indices that would violate target_n given @@ -982,15 +625,6 @@ spaced_by_n(NthA, NthB, TargetN, RingSize) -> end, (NFwd >= TargetN) and (NBack >= TargetN). -%% @private -%% -%% @doc Build node info list from Wants and Owners. -build_nis(Wants, Owners) -> - Initial = [{N, orddict:new()} || {N, _W} <- Wants], - {_, Ownership} = lists:foldl(fun(N, {I,A}) -> - {I+1, orddict:append_list(N, [I], A)} - end, {0, Initial}, Owners), - [{Node, Want, Owned} || {Node, Want} <- Wants, {Node1, Owned} <- Ownership, Node == Node1]. %% 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. @@ -1033,260 +667,6 @@ roundup(I) when I >= 0 -> _ -> T end. -%% @private Evaluate a list of plans and return the best. -evaluate_plans(Plans, Wants, Q, TN) -> - {_, FOM} = - lists:foldl(fun(Plan, {Trial, {_RunningOwners, RunningMetrics}=T}) -> - OM = {_Owners, Metrics} = score_plan(Plan, Wants, Q, TN), - case better_plan(Metrics, RunningMetrics) of - true -> - ?LOG_DEBUG("Claim3: Trial ~p found better plan: ~p\n", - [Trial, Metrics]), - {Trial + 1, OM}; - _ -> - {Trial + 1, T} - end - end, {1, {undefined, undefined}}, Plans), - FOM. - -%% @private -%% Return true if plan P1 is better than plan P2, assumes the metrics -%% are ordered [{violations, Violations}, {balance, Balance}, {diversity, Diversity}]}. -%% -better_plan(_M1, undefined) -> - true; %% M1 is a better plan than no plan -better_plan(M1, M2) -> - %% For now, the values we want are in the order we care about, make sure we - %% get minimum violations, best balance, best diversity (0 is best) - V1 = lists:unzip(M1), - V2 = lists:unzip(M2), - V1 < V2. - -%% @private -%% Score the plan - return a tuple of {Owners, Metrics} -%% where metrics scores violations, balance and diversity -score_plan(NIs, Wants, Q, TN) -> - Owners = make_owners(NIs), - AM = riak_core_claim_util:adjacency_matrix(Owners), - Diversity = riak_core_claim_util:score_am(AM, TN), - - Balance = balance(Wants, NIs), - - %% TODO: Change this to an exact count of violations. - %% This is the list of claimable violations per-node - %% so will over-count. The scoring algorithm - %% works as any violations will give a non-zero count - %% and will need to be resolved before any balance or - %% diversity scores are accounted for. - Violations = length(lists:flatten([Vs || {_, _, _, Vs} <- violations(NIs, Q, TN), - length(Vs) > 0])), - - {Owners, [{violations, Violations}, {balance, Balance}, {diversity, Diversity}]}. - -%% @private -%% Convert a nodeinfo list with Nodes and lists of owned indices to an -%% ownership list -make_owners(NIs) -> - IdxNodes = [ [ {Idx, Node} || Idx <- Idxs] || {Node, _Want, Idxs} <- NIs], - [Owner || {_, Owner} <- lists:sort(lists:flatten(IdxNodes))]. - -%% @private -%% Compute the balance score - sum of squared difference from desired count -balance(Wants, NIs) -> - lists:sum([begin - {Node, Want, Idxs} = lists:keyfind(Node, 1, NIs), - Diff = Want - length(Idxs), - Diff * Diff - end || {Node, Want} <- Wants]). - -%% @private -%% Make the number of plans requested -make_plans(NumPlans, NIs, Q, TN) -> - lists:usort([make_plan(NIs, Q, TN) || _ <- lists:seq(1,NumPlans)]). - -%% @private -%% Make a plan to meet the Wants in the NodeInfos -%% First resovle any violations, then resolve any overloads -make_plan(NIs, Q, TN) -> - %% Make a list of all indices that violate target N - %% and allow other nodes to take them until they hit - %% the number they want. Violating nodes should - %% give up to their violation count. - VExchs = violations(NIs, Q, TN), - NIs1 = take_idxs(VExchs, NIs, Q, TN), - - %% Make a list of indices from overloaded nodes - OLExchs = overloads(NIs1), - FinalNIs = take_idxs(OLExchs, NIs1, Q, TN), - - %% TODO: Add step to allow minor perturbations of the ring to improve - %% diversity - lists:sort(FinalNIs). - -%% @private -%% Return a list of exchanges that resolves indices in violation -violations(NIs, Q, TN) -> - NodeViolations = [{Node, indices_within_n(Idxs, Q, TN)} || {Node, _Want, Idxs} <- NIs], - - VIdxs = ordsets:from_list(lists:flatten([CIdxs || {_, CIdxs} <- NodeViolations])), - [begin - Give = length(V), - Take = gt0(Want - length(Idxs)), - {Node, Give, Take, VIdxs} - end || {Node, Want, Idxs} <- NIs, {Node1, V} <- NodeViolations, Node == Node1]. - -%% @private -%% Return a list of exchanges to fix overloads -overloads(NIs) -> - OLIdxs = ordsets:from_list(lists:flatten([Idxs || {_Node, Want, Idxs} <- NIs, - length(Idxs) > Want])), - [begin - Give = gt0(length(Idxs) - Want), - Take = gt0(Want - length(Idxs)), - case Take of - 0 -> - {Node, Give, Take, []}; - _ -> - {Node, Give, Take, OLIdxs} - end - end || {Node, Want, Idxs} <- NIs]. - -%% @private -%% Given a list of Exchanges of the form [{Node, #Give, #Take, ClaimableIdxs}] -%% randomly select from exchanges until there are no more nodes that wish to take -%% indices that can. Update the owned indexes in the provided NodeInfos -%% of the form [{Node, Want, OwnedIdxs]} -%% -take_idxs(Exchanges, NIs, Q, TN) -> - %% work out globally unavailable indexes from nodes that do not wish - %% to give any indices- find OIdxs for all exchanges with give=0 - GUIdxs = ordsets:from_list( - lists:flatten( - [OIdxs || {Node, 0, _Take, _CIdxs} <- Exchanges, - {Node1, _Want, OIdxs} <- NIs, - Node == Node1])), - %% Remove any exchanges in GUIdxs or that would violate TN for the node - Exchanges1 = [{Node, Give, Take, remove_unclaimable(CIdxs, GUIdxs, Node, NIs, Q, TN)} || - {Node, Give, Take, CIdxs} <- Exchanges], - - %% Recursively take indices until all takes are satisfied - take_idxs0(Exchanges1, NIs, Q, TN). - -take_idxs0(Exchanges, NIs, Q, TN) -> - %% Pick a recipient for a claimed index - case [{Node, CIdxs} || {Node, _Give, Take, CIdxs} <- Exchanges, Take > 0, CIdxs /= []] of - [] -> - NIs; - Takers -> - {TNode, TCIdxs} = random_el(Takers), - CIdx = random_el(TCIdxs), - - %% Find the owner of CIdx and remove it from the giving node owned idxs in NIs - [ {GNode, GWant, GOIdxs} ] = [ T || {_Node, _GWant, GIdxs}=T <- NIs, - ordsets:is_element(CIdx, GIdxs) ], - NIs1 = lists:keyreplace(GNode, 1, NIs, - {GNode, GWant, ordsets:del_element(CIdx, GOIdxs)}), - - %% Add CIdx to owned indices in NIs - {TNode, TWant, TOIdxs} = lists:keyfind(TNode, 1, NIs1), - NIs2 = lists:keyreplace(TNode, 1, NIs1, - {TNode, TWant, ordsets:add_element(CIdx, TOIdxs)}), - - %% If the Give count is zero in the recipients it has given up all it is prepared - %% to, so remove all idxs owned by the give node from other claimable indices in - %% the recipients. - %% Also remove the indices within TN of CIdx from the TakeNode - {GNode, GGive, _GTake, _GCIdxs} = lists:keyfind(GNode, 1, Exchanges), - - %% Update the recipients list, removing any nodes that have taken the - %% number they requested from the recipients list, and removing the - %% indices owned by any nodes that have given all they wanted. - - UIdxs = case GGive - 1 > 0 of % unclaimable indices - true -> %% Still idxs to give, just remove claimed idx - [CIdx]; - false -> - GOIdxs - end, - %% Indexes unclaiamble by the take node - TUIdxs = ordsets:union(UIdxs, - ordsets:from_list(expand_idx(CIdx, Q, TN))), - - Exchanges2 = lists:foldl( - fun({Node, Give, Take, CIdxs}, Acc) when Node == TNode -> - [{TNode, Give, Take - 1, ordsets:subtract(CIdxs, TUIdxs)} | Acc]; - ({Node, Give, Take, CIdxs}, Acc) when Node == GNode -> - [{GNode, Give - 1, Take, ordsets:subtract(CIdxs, UIdxs)} | Acc]; - ({Node, Give, Take, CIdxs}, Acc) -> - [{Node, Give, Take, ordsets:subtract(CIdxs, UIdxs)} | Acc] - end, [], Exchanges), - %% TODO: Consider removing reverse, not necessary for algorithm - take_idxs0(lists:reverse(Exchanges2), NIs2, Q, TN) - end. - -%% @private -%% expand Idx by TN-1 in each direction -expand_idx(Idx, Q, TN) -> - [X rem Q || X <- lists:seq(Q + Idx - (TN - 1), Q + Idx + TN - 1)]. - -%% @private -%% Remove unclaimable indexes from CIdxs that are in GUIdxs or within TN of indices -%% owned by Node from CIdxs -remove_unclaimable(CIdxs, GUIdxs, Node, NIs, Q, TN) -> - {_Node, _Want, OIdxs} = lists:keyfind(Node, 1, NIs), - NUIdxs = ordsets:from_list( - lists:flatten([ [(Q + Idx + Off) rem Q, - (Q + Idx - Off) rem Q] || Idx <- OIdxs, - Off <- lists:seq(1, TN - 1) ])), - ordsets:subtract(ordsets:subtract(CIdxs, NUIdxs), GUIdxs). - -%% @private -%% Return the value if greater than zero, otherwise zero -gt0(I) when I > 0 -> - I; -gt0(_) -> - 0. - -%% @private -%% Pick a random element from the list -random_el(L) -> - lists:nth(urand(length(L)), L). - -%% @private -%% Return a random number between Low, High inclusive -%% Abstract away choice of random number generation -urand(High) -> - urand(1, High). - -urand(Low, High) -> - Low + rand:uniform(High - Low + 1) - 1. - -%% @private -%% return all the indices within TN of Indices -indices_within_n([], _Q, _TN) -> - []; -indices_within_n([_I], _Q, _TN) -> - []; -indices_within_n(Indices, Q, TN) -> - indices_within_n(Indices, TN, lists:last(Indices), Q, []). - -indices_within_n([], _TN, _Last, _Q, Acc) -> - lists:usort(Acc); -indices_within_n([This | Indices], TN, Last, Q, Acc) -> - Acc1 = case circular_distance(Last, This, Q) < TN of - true -> - [Last, This| Acc]; - false -> - Acc - end, - indices_within_n(Indices, TN, This, Q, Acc1). - -%% @private -%% Circular distance, indices start at 0 -%% Distance of 0, 1 == 1 -%% [a,b,c,a,b,c] - distance of a apart distance(0, 3) == 3 -circular_distance(I1, I2, Q) -> - min((Q + I1 - I2) rem Q, (Q + I2 - I1) rem Q). %% @private %% Get active nodes ordered by take location parameters into account @@ -1305,6 +685,9 @@ get_nodes_by_location(Nodes, Ring) -> %% Unit tests %% =================================================================== -ifdef(TEST). +-compile(export_all). + +-include_lib("eunit/include/eunit.hrl"). wants_claim_test() -> riak_core_ring_manager:setup_ets(test), @@ -1314,29 +697,6 @@ wants_claim_test() -> riak_core_ring_manager:cleanup_ets(test), riak_core_ring_manager:stop(). -find_biggest_hole_test() -> - Max = trunc(math:pow(2, 160)), - Part16 = Max/16, - - %% single partition claimed - ?assertEqual({Part16*5, Part16*5}, - find_biggest_hole([Part16*5])), - - %% simple hole is in the middle - ?assertEqual({Part16*3, Part16*13}, - find_biggest_hole([Part16*3, Part16*13])), - %% complex hole in the middle - ?assertEqual({Part16*5, Part16*10}, - find_biggest_hole([Part16*3, Part16*5, - Part16*10, Part16*15])), - - %% simple hole is around the end - ?assertEqual({Part16*10, Part16*8}, - find_biggest_hole([Part16*8, Part16*10])), - %% complex hole is around the end - ?assertEqual({Part16*13, Part16*3}, - find_biggest_hole([Part16*3, Part16*7, - Part16*10, Part16*13])). %% @private console helper function to return node lists for claiming %% partitions @@ -1365,6 +725,10 @@ has_violations(Diag) -> -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)). @@ -1382,88 +746,18 @@ test_nodes(Count) -> test_nodes(Count, StartNode) -> [list_to_atom(lists:concat(["n_", N])) || N <- lists:seq(StartNode, StartNode + Count)]. -claim_ensures_unique_nodes_v2_test_() -> - Prop = eqc:testing_time(30, ?QC_OUT(prop_claim_ensures_unique_nodes_v2())), +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}. -claim_ensures_unique_nodes_adding_groups_v2_test_() -> +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}. -claim_ensures_unique_nodes_adding_singly_v2_test_() -> +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}. -%% Run few tests in eunit and more if needed by calling "./rebar3 eqc" -% claim_ensures_unique_nodes_v3_test_() -> -% Prop = eqc:numtests(5, ?QC_OUT(prop_claim_ensures_unique_nodes_old(choose_claim_v3))), -% {timeout, 240, fun() -> ?assert(eqc:quickcheck(Prop)) end}. - -prop_claim_ensures_unique_nodes_v2() -> - prop_claim_ensures_unique_nodes(choose_claim_v2). - -%% No longer test properties of claim_v3. -%% Although claim_v3 continues to exist as a hidden configuration option, it -%% is known to fail to meet the required properties, and claim_v2 should be -%% used in all known circumstances. -%% -%% TODO : Remove claim_v3 from the code base -%% -%% This TODO is currently deferred due to the difficulty of understanding -%% how to test the full possibility of cluster change scenarios. Perhaps -%% there may be circumstances where a probabilistic approach to planning -%% cluster changes may still be beneficial -%% -% prop_claim_ensures_unique_nodes_v3() -> -% prop_claim_ensures_unique_nodes(choose_claim_v3). - -%% NOTE: this is a less than adequate test that has been re-instated -%% so that we don't leave the code worse than we found it. Work that -%% fixed claim_v2's tail violations and vnode balance issues did not -%% fix the same for v3, but the test that v3 ran had been updated for -%% those fixes, leaving a failing v3 test. This test is the original -%% test re-instated to pass. -prop_claim_ensures_unique_nodes_old(ChooseFun) -> - %% NOTE: We know that this doesn't work for the case of {_, 3}. - ?FORALL({PartsPow, NodeCount}, {choose(4,9), choose(4,15)}, %{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), - ?MODULE:ChooseFun(Racc0, Node, Params) - end, R0, RestNodes), - - Preflists = riak_core_ring:all_preflists(Rfinal, Nval), - Counts = 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))}, - {unique_nodes, equals([], Counts)}])) - 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 @@ -1511,10 +805,6 @@ prop_claim_ensures_unique_nodes(ChooseFun) -> {balanced_ring, balanced_ring(Partitions, NodeCount, Rfinal)}])) end). -%% @TODO this fails, we didn't fix v3 -%% prop_claim_ensures_unique_nodes_adding_groups_v3_test_() -> -%% Prop = eqc:numtests(5, ?QC_OUT(prop_claim_ensures_unique_nodes(choose_claim_v3))), -%% {timeout, 240, fun() -> ?assert(eqc:quickcheck(Prop)) end}. prop_claim_ensures_unique_nodes_adding_groups(ChooseFun) -> %% NOTE: We know that this doesn't work for the case of {_, 3}. @@ -1574,11 +864,6 @@ prop_claim_ensures_unique_nodes_adding_groups(ChooseFun) -> end). -%% @TODO take this out (and add issue/comment in commit) not fixed -%% prop_claim_ensures_unique_nodes_adding_singly_v3_test_() -> -%% Prop = eqc:testing_time(30, ?QC_OUT(prop_claim_ensures_unique_nodes_adding_singly(choose_claim_v3))), -%% {timeout, 240, fun() -> ?assert(eqc:quickcheck(Prop)) 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 @@ -1666,6 +951,9 @@ prop_wants_counts() -> {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]))), @@ -1711,6 +999,9 @@ prop_wants() -> 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] diff --git a/src/riak_core_claim_util.erl b/src/riak_core_claim_util.erl index b76b8e9ce..1453ea7d9 100644 --- a/src/riak_core_claim_util.erl +++ b/src/riak_core_claim_util.erl @@ -32,12 +32,8 @@ -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]). - --include_lib("kernel/include/logger.hrl"). - -ifdef(TEST). -ifdef(EQC). --export([prop_adjacency_summary/0]). -include_lib("eqc/include/eqc.hrl"). -endif. -include_lib("eunit/include/eunit.hrl"). @@ -454,7 +450,7 @@ construct(Complete, M, Owners, DAM, NVal) -> case Eligible of [] -> %% No eligible nodes - not enough to meet NVal, use any node - ?LOG_DEBUG("construct -- unable to construct without violating NVal"), + 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); _ -> @@ -614,6 +610,9 @@ substitute(Names, Mapping, L) -> -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)))). diff --git a/src/riak_core_claimant.erl b/src/riak_core_claimant.erl index 41a3bb572..b46b10834 100644 --- a/src/riak_core_claimant.erl +++ b/src/riak_core_claimant.erl @@ -1,6 +1,6 @@ %% ------------------------------------------------------------------- %% -%% Copyright (c) 2012 Basho Technologies, Inc. All Rights Reserved. +%% Copyright (c) 2012-2015 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 @@ -21,8 +21,6 @@ -module(riak_core_claimant). -behaviour(gen_server). --include("riak_core_bucket_type.hrl"). - %% API -export([start_link/0]). -export([leave_member/1, @@ -34,24 +32,14 @@ plan/0, commit/0, clear/0, - ring_changed/2, - pending_close/2, - create_bucket_type/2, - update_bucket_type/2, - bucket_type_status/1, - activate_bucket_type/1, - get_bucket_type/2, - get_bucket_type/3, - bucket_type_iterator/0, - set_node_location/2]). + 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]). --include_lib("kernel/include/logger.hrl"). - -type action() :: leave | remove | {replace, node()} @@ -73,7 +61,7 @@ %% 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, + next_ring :: riak_core_ring() | undefined, %% Random number seed passed to remove_node to ensure the %% current randomized remove algorithm is deterministic @@ -189,67 +177,12 @@ clear() -> ring_changed(Node, Ring) -> internal_ring_changed(Node, Ring). -%% @see riak_core_bucket_type:create/2 --spec create_bucket_type(riak_core_bucket_type:bucket_type(), [{atom(), any()}]) -> - ok | {error, term()}. -create_bucket_type(BucketType, Props) -> - gen_server:call(claimant(), {create_bucket_type, BucketType, Props}, infinity). - -%% @see riak_core_bucket_type:status/1 --spec bucket_type_status(riak_core_bucket_type:bucket_type()) -> - undefined | created | ready | active. -bucket_type_status(BucketType) -> - gen_server:call(claimant(), {bucket_type_status, BucketType}, infinity). - -%% @see riak_core_bucket_type:activate/1 --spec activate_bucket_type(riak_core_bucket_type:bucket_type()) -> - ok | {error, undefined | not_ready}. -activate_bucket_type(BucketType) -> - gen_server:call(claimant(), {activate_bucket_type, BucketType}, infinity). - -%% @doc Lookup the properties for `BucketType'. If there are no properties or -%% the type is inactive, the given `Default' value is returned. --spec get_bucket_type(riak_core_bucket_type:bucket_type(), X) -> [{atom(), any()}] | X. -get_bucket_type(BucketType, Default) -> - get_bucket_type(BucketType, Default, true). - -%% @doc Lookup the properties for `BucketType'. If there are no properties or -%% the type is inactive and `RequireActive' is `true', the given `Default' value is -%% returned. --spec get_bucket_type(riak_core_bucket_type:bucket_type(), X, boolean()) -> - [{atom(), any()}] | X. -get_bucket_type(BucketType, Default, RequireActive) -> - %% we resolve w/ last-write-wins because conflicts only occur - %% during creation when the claimant is changed and create on a - %% new claimant happens before the original propogates. In this - %% case we want the newest create. Updates can also result in - %% conflicts so we choose the most recent as well. - case riak_core_metadata:get(?BUCKET_TYPE_PREFIX, BucketType, - [{default, Default}]) of - Default -> Default; - Props -> maybe_filter_inactive_type(RequireActive, Default, Props) - end. - -%% @see riak_core_bucket_type:update/2 --spec update_bucket_type(riak_core_bucket_type:bucket_type(), [{atom(), any()}]) -> - ok | {error, term()}. -update_bucket_type(BucketType, Props) -> - gen_server:call(claimant(), {update_bucket_type, BucketType, Props}). - -%% @see riak_core_bucket_type:iterator/0 --spec bucket_type_iterator() -> riak_core_metadata:iterator(). -bucket_type_iterator() -> - riak_core_metadata:iterator(?BUCKET_TYPE_PREFIX, [{default, undefined}, - {resolver, fun riak_core_bucket_props:resolve/2}]). - - - %%%=================================================================== %%% Claim sim helpers until refactor %%%=================================================================== reassign_indices(CState) -> - reassign_indices(CState, [], seed(), fun no_log/2). + reassign_indices(CState, [], riak_core_rand:rand_seed(), fun no_log/2). %%%=================================================================== %%% Internal API helpers @@ -262,21 +195,13 @@ claimant() -> {ok, Ring} = riak_core_ring_manager:get_my_ring(), {?MODULE, riak_core_ring:claimant(Ring)}. -maybe_filter_inactive_type(false, _Default, Props) -> - Props; -maybe_filter_inactive_type(true, Default, Props) -> - case type_active(Props) of - true -> Props; - false -> Default - end. - %%%=================================================================== %%% gen_server callbacks %%%=================================================================== init([]) -> schedule_tick(), - {ok, #state{changes=[], seed=seed()}}. + {ok, #state{changes=[], seed=riak_core_rand:rand_seed()}}. handle_call(clear, _From, State) -> State2 = clear_staged(State), @@ -302,47 +227,6 @@ handle_call(commit, _From, State) -> {Reply, State2} = commit_staged(State), {reply, Reply, State2}; -handle_call({create_bucket_type, BucketType, Props0}, _From, State) -> - Existing = get_bucket_type(BucketType, undefined, false), - case can_create_type(BucketType, Existing, Props0) of - {ok, Props} -> - InactiveProps = lists:keystore(active, 1, Props, {active, false}), - ClaimedProps = lists:keystore(claimant, 1, InactiveProps, {claimant, node()}), - riak_core_metadata:put(?BUCKET_TYPE_PREFIX, BucketType, ClaimedProps), - {reply, ok, State}; - Error -> - {reply, Error, State} - end; - -handle_call({update_bucket_type, BucketType, Props0}, _From, State) -> - Existing = get_bucket_type(BucketType, [], false), - case can_update_type(BucketType, Existing, Props0) of - {ok, Props} -> - MergedProps = riak_core_bucket_props:merge(Props, Existing), - riak_core_metadata:put(?BUCKET_TYPE_PREFIX, BucketType, MergedProps), - {reply, ok, State}; - Error -> - {reply, Error, State} - end; - -handle_call({bucket_type_status, BucketType}, _From, State) -> - Existing = get_bucket_type(BucketType, undefined, false), - Reply = get_type_status(BucketType, Existing), - {reply, Reply, State}; - -handle_call({activate_bucket_type, BucketType}, _From, State) -> - Existing = get_bucket_type(BucketType, undefined, false), - Status = get_type_status(BucketType, Existing), - Reply = maybe_activate_type(BucketType, Status, Existing), - {reply, Reply, State}; - -handle_call({pending_close, Ring, RingID}, _From, State) -> - State2 = tick(Ring, RingID, State), - {reply, ok, State2}; - -handle_call(stop, _From, State) -> - {stop, normal, ok, State}; - handle_call(_Request, _From, State) -> Reply = ok, {reply, Reply, State}. @@ -419,7 +303,7 @@ commit_staged(State) -> {ok, _} -> State2 = State#state{next_ring=undefined, changes=[], - seed=seed()}, + seed=riak_core_rand:rand_seed()}, {ok, State2}; not_changed -> {error, State}; @@ -468,7 +352,7 @@ maybe_commit_staged(Ring, NextRing, #state{next_ring=PlannedRing}) -> %% call {@link clear/0}. clear_staged(State) -> remove_joining_nodes(), - State#state{changes=[], seed=seed()}. + State#state{changes=[], seed=riak_core_rand:rand_seed()}. %% @private remove_joining_nodes() -> @@ -596,26 +480,15 @@ valid_force_replace_request(Node, NewNode, Changes, Ring) -> %% @private %% restrictions preventing resize along with other operations are temporary valid_resize_request(NewRingSize, [], Ring) -> - Capable = riak_core_capability:get({riak_core, resizable_ring}, false), IsResizing = riak_core_ring:num_partitions(Ring) =/= NewRingSize, - %% NOTE/TODO: the checks below are a stop-gap measure to limit the changes - %% made by the introduction of ring resizing. future implementation - %% should allow applications to register with some flag indicating support - %% for dynamic ring, if all registered applications support it - %% the cluster is capable. core knowing about search/kv is :( - ControlRunning = app_helper:get_env(riak_control, enabled, false), - SearchRunning = app_helper:get_env(riak_search, enabled, false), NodeCount = length(riak_core_ring:all_members(Ring)), Changes = length(riak_core_ring:pending_changes(Ring)) > 0, - case {ControlRunning, SearchRunning, Capable, IsResizing, NodeCount, Changes} of - {false, false, true, true, N, false} when N > 1 -> true; - {true, _, _, _, _, _} -> {error, control_running}; - {_, true, _, _, _, _} -> {error, search_running}; - {_, _, false, _, _, _} -> {error, not_capable}; - {_, _, _, false, _, _} -> {error, same_size}; - {_, _, _, _, 1, _} -> {error, single_node}; - {_, _, _, _, _, true} -> {error, pending_changes} + case {IsResizing, NodeCount, Changes} of + {true, N, false} when N > 1 -> true; + {false, _, _} -> {error, same_size}; + {_, 1, _} -> {error, single_node}; + {_, _, true} -> {error, pending_changes} end. @@ -674,35 +547,20 @@ same_plan(RingA, RingB) -> (riak_core_ring:pending_changes(RingA) == riak_core_ring:pending_changes(RingB)). schedule_tick() -> - Tick = app_helper:get_env(riak_core, + Tick = application:get_env(riak_core, claimant_tick, 10000), erlang:send_after(Tick, ?MODULE, tick). -tick(PreFetchRing, RingID, State=#state{last_ring_id=LastID}) -> - maybe_enable_ensembles(), - case RingID of +tick(State=#state{last_ring_id=LastID}) -> + case riak_core_ring_manager:get_ring_id() of LastID -> schedule_tick(), State; RingID -> - Ring = - case PreFetchRing of - none -> - {ok, Ring0} = riak_core_ring_manager:get_raw_ring(), - Ring0; - PreFetchRing -> - PreFetchRing - end, - case riak_core_ring:check_lastgasp(Ring) of - true -> - ?LOG_INFO("Ingoring fresh ring as shutting down"), - ok; - false -> - maybe_bootstrap_root_ensemble(Ring), - maybe_force_ring_update(Ring), - schedule_tick() - end, + {ok, Ring} = riak_core_ring_manager:get_raw_ring(), + maybe_force_ring_update(Ring), + schedule_tick(), State#state{last_ring_id=RingID} end. @@ -722,11 +580,11 @@ maybe_force_ring_update(Ring) -> end. do_maybe_force_ring_update(Ring) -> - case compute_next_ring([], seed(), Ring) of + case compute_next_ring([], riak_core_rand:rand_seed(), Ring) of {ok, NextRing} -> case same_plan(Ring, NextRing) of false -> - ?LOG_WARNING("Forcing update of stalled ring"), + logger:warning("Forcing update of stalled ring"), riak_core_ring_manager:force_update(); true -> ok @@ -735,229 +593,6 @@ do_maybe_force_ring_update(Ring) -> ok end. -%% @private -can_create_type(BucketType, undefined, Props) -> - riak_core_bucket_props:validate(create, {BucketType, undefined}, undefined, Props); -can_create_type(BucketType, Existing, Props) -> - Active = type_active(Existing), - Claimed = node() =:= type_claimant(Existing), - case {Active, Claimed} of - %% if type is not active and this claimant has claimed it - %% then we can re-create the type. - {false, true} -> riak_core_bucket_props:validate(create, {BucketType, undefined}, - Existing, Props); - {true, _} -> {error, already_active}; - {_, false} -> {error, not_claimed} - end. - -%% @private -can_update_type(_BucketType, undefined, _Props) -> - {error, undefined}; -can_update_type(BucketType, Existing, Props) -> - case type_active(Existing) of - true -> riak_core_bucket_props:validate(update, {BucketType, undefined}, - Existing, Props); - false -> {error, not_active} - end. - -%% @private -get_type_status(_BucketType, undefined) -> - undefined; -get_type_status(BucketType, Props) -> - case type_active(Props) of - true -> active; - false -> get_remote_type_status(BucketType, Props) - end. - -%% @private -get_remote_type_status(BucketType, Props) -> - {ok, R} = riak_core_ring_manager:get_my_ring(), - Members = riak_core_ring:all_members(R), - {AllProps, BadNodes} = rpc:multicall(lists:delete(node(), Members), - riak_core_metadata, - get, [?BUCKET_TYPE_PREFIX, BucketType, [{default, []}]]), - SortedProps = lists:ukeysort(1, Props), - %% P may be a {badrpc, ...} in addition to a list of properties when there are older nodes involved - DiffProps = [P || P <- AllProps, (not is_list(P) orelse lists:ukeysort(1, P) =/= SortedProps)], - case {DiffProps, BadNodes} of - {[], []} -> ready; - %% unreachable nodes may or may not have correct value, so we assume they dont - {_, _} -> created - end. - -%% @private -maybe_activate_type(_BucketType, undefined, _Props) -> - {error, undefined}; -maybe_activate_type(_BucketType, created, _Props) -> - {error, not_ready}; -maybe_activate_type(_BucketType, active, _Props) -> - ok; -maybe_activate_type(BucketType, ready, Props) -> - ActiveProps = lists:keystore(active, 1, Props, {active, true}), - riak_core_metadata:put(?BUCKET_TYPE_PREFIX, BucketType, ActiveProps). - -%% @private -type_active(Props) -> - {active, true} =:= lists:keyfind(active, 1, Props). - -%% @private -type_claimant(Props) -> - case lists:keyfind(claimant, 1, Props) of - {claimant, Claimant} -> Claimant; - false -> undefined - end. - -%% The consensus subsystem must be enabled by exactly one node in a cluster -%% via a call to riak_ensemble_manager:enable(). We accomplished this by -%% having the claimant be that one node. Likewise, we require that the cluster -%% includes at least three nodes before we enable consensus. This prevents the -%% claimant in a 1-node cluster from enabling consensus before being joined to -%% another cluster. -maybe_enable_ensembles() -> - Desired = riak_core_sup:ensembles_enabled(), - Enabled = riak_ensemble_manager:enabled(), - case Enabled of - Desired -> - ok; - _ -> - {ok, Ring} = riak_core_ring_manager:get_raw_ring(), - IsReady = riak_core_ring:ring_ready(Ring), - IsClaimant = (riak_core_ring:claimant(Ring) == node()), - EnoughNodes = (length(riak_core_ring:ready_members(Ring)) >= 3), - case IsReady and IsClaimant and EnoughNodes of - true -> - enable_ensembles(Ring); - false -> - ok - end - end. - -%% We need to avoid a race where the current claimant enables consensus right -%% before going offline and being replaced by a new claimant. It could be -%% argued that this corner case is not important since changing the claimant -%% requires the user manually marking the current claimant as down. But, it's -%% better to be safe and handle things correctly. -%% -%% To solve this issue, the claimant first marks itself as the "ensemble -%% singleton" in the ring metadata. Once the ring has converged, the claimant -%% see that it previously marked itself as the singleton and will proceed to -%% enable the consensus subsystem. If the claimant goes offline after marking -%% itself the singleton, but before enabling consensus, then future claimants -%% will be unable to enable consensus. Consensus will be enabled once the -%% previous claimant comes back online. -%% -enable_ensembles(Ring) -> - Node = node(), - case ensemble_singleton(Ring) of - undefined -> - become_ensemble_singleton(); - Node -> - %% Ring update is required after enabling consensus to ensure - %% that ensembles are properly bootstrapped. - riak_ensemble_manager:enable(), - riak_core_ring_manager:force_update(), - ?LOG_INFO("Activated consensus subsystem for cluster"); - _ -> - ok - end. - -ensemble_singleton(Ring) -> - case riak_core_ring:get_meta('$ensemble_singleton', Ring) of - undefined -> - undefined; - {ok, Node} -> - Members = riak_core_ring:all_members(Ring), - case lists:member(Node, Members) of - true -> - Node; - false -> - undefined - end - end. - -become_ensemble_singleton() -> - _ = riak_core_ring_manager:ring_trans(fun become_ensemble_singleton_trans/2, - undefined), - ok. - -become_ensemble_singleton_trans(Ring, _) -> - IsClaimant = (riak_core_ring:claimant(Ring) == node()), - NoSingleton = (ensemble_singleton(Ring) =:= undefined), - case IsClaimant and NoSingleton of - true -> - Ring2 = riak_core_ring:update_meta('$ensemble_singleton', node(), Ring), - {new_ring, Ring2}; - false -> - ignore - end. - -maybe_bootstrap_root_ensemble(Ring) -> - IsEnabled = riak_ensemble_manager:enabled(), - IsClaimant = (riak_core_ring:claimant(Ring) == node()), - IsReady = riak_core_ring:ring_ready(Ring), - case IsEnabled and IsClaimant and IsReady of - true -> - bootstrap_root_ensemble(Ring); - false -> - ok - end. - -bootstrap_root_ensemble(Ring) -> - bootstrap_members(Ring), - ok. - -bootstrap_members(Ring) -> - Name = riak_core_ring:cluster_name(Ring), - Members = riak_core_ring:ready_members(Ring), - RootMembers = riak_ensemble_manager:get_members(root), - Known = riak_ensemble_manager:cluster(), - Need = Members -- Known, - L = [riak_core_util:proxy_spawn( - fun() -> riak_ensemble_manager:join(node(), Member) end - ) || Member <- Need, Member =/= node()], - _ = maybe_reset_ring_id(L), - - RootNodes = [Node || {_, Node} <- RootMembers], - RootAdd = Members -- RootNodes, - RootDel = RootNodes -- Members, - - Res = [riak_core_util:proxy_spawn( - fun() -> riak_ensemble_manager:remove(node(), N) end - ) || N <- RootDel, N =/= node()], - _ = maybe_reset_ring_id(Res), - - Changes = - [{add, {Name, Node}} || Node <- RootAdd] ++ - [{del, {Name, Node}} || Node <- RootDel], - case Changes of - [] -> - ok; - _ -> - Self = self(), - spawn_link(fun() -> - async_bootstrap_members(Self, Changes) - end), - ok - end. - -async_bootstrap_members(Claimant, Changes) -> - RootLeader = riak_ensemble_manager:rleader_pid(), - case riak_ensemble_peer:update_members(RootLeader, Changes, 10000) of - ok -> - ok; - _ -> - reset_ring_id(Claimant), - ok - end. - -maybe_reset_ring_id(Results) -> - Failed = [R || R <- Results, R =/= ok], - (Failed =:= []) orelse reset_ring_id(self()). - -%% Reset last_ring_id, ensuring future tick re-examines the ring even if the -%% ring has not changed. -reset_ring_id(Pid) -> - Pid ! reset_ring_id. %% ========================================================================= %% Claimant rebalance/reassign logic @@ -989,10 +624,11 @@ compute_next_ring(Changes, Seed, Ring) -> Ring2 = apply_changes(Ring, Changes), {_, Ring3} = maybe_handle_joining(node(), Ring2), {_, Ring4} = do_claimant_quiet(node(), Ring3, Replacing, Seed), - case maybe_compute_resize(Ring, Ring4) of - {false, _Ring5} -> + {Valid, Ring5} = maybe_compute_resize(Ring, Ring4), + case Valid of + false -> {error, invalid_resize_claim}; - {true, Ring5} -> + true -> {ok, Ring5} end. @@ -1124,6 +760,7 @@ change({abort_resize, _Node}, Ring) -> change({{set_location, Location}, Node}, Ring) -> riak_core_ring:set_node_location(Node, Location, Ring). +%%noinspection ErlangUnboundVariable internal_ring_changed(Node, CState) -> {Changed, CState5} = do_claimant(Node, CState, fun log/2), inform_removed_nodes(Node, CState, CState5), @@ -1143,19 +780,28 @@ internal_ring_changed(Node, CState) -> %% Outer case statement already checks for ring_ready case {IsClaimant, Changed} of {true, true} -> - riak_core_stat:update(converge_timer_end), - riak_core_stat:update(converge_timer_begin); + %% STATS +%% riak_core_stat:update(converge_timer_end), + %% STATS +%% riak_core_stat:update(converge_timer_begin); + ok; {true, false} -> - riak_core_stat:update(converge_timer_end); + %% STATS +%% riak_core_stat:update(converge_timer_end); + ok; _ -> ok end, case {IsClaimant, WasPending, IsPending} of {true, false, true} -> - riak_core_stat:update(rebalance_timer_begin); + %% STATS +%% riak_core_stat:update(rebalance_timer_begin); + ok; {true, true, false} -> - riak_core_stat:update(rebalance_timer_end); + %% STATS +%% riak_core_stat:update(rebalance_timer_end); + ok; _ -> ok end, @@ -1163,7 +809,7 @@ internal_ring_changed(Node, CState) -> %% Set cluster name if it is undefined case {IsClaimant, riak_core_ring:cluster_name(CState5)} of {true, undefined} -> - ClusterName = {Node, seed()}, + ClusterName = {Node, riak_core_rand:rand_seed()}, {_,_} = riak_core_util:rpc_every_member(riak_core_ring_manager, set_cluster_name, [ClusterName], @@ -1197,7 +843,7 @@ do_claimant_quiet(Node, CState, Replacing, Seed) -> do_claimant(Node, CState, Replacing, Seed, fun no_log/2). do_claimant(Node, CState, Log) -> - do_claimant(Node, CState, [], seed(), Log). + do_claimant(Node, CState, [], riak_core_rand:rand_seed(), Log). do_claimant(Node, CState, Replacing, Seed, Log) -> AreJoining = are_joining_nodes(CState), @@ -1262,22 +908,14 @@ maybe_remove_exiting(Node, CState) -> Node -> %% Change exiting nodes to invalid, skipping this node. Exiting = riak_core_ring:members(CState, [exiting]) -- [Node], - RootMembers = riak_ensemble_manager:get_members(root), + Changed = (Exiting /= []), CState2 = lists:foldl(fun(ENode, CState0) -> - L = [N || {_, N} <- RootMembers, N =:= ENode], - case L of - [] -> ClearedCS = riak_core_ring:clear_member_meta(Node, CState0, ENode), riak_core_ring:set_member(Node, ClearedCS, ENode, - invalid, same_vclock); - _ -> - reset_ring_id(self()), - CState0 - end + invalid, same_vclock) end, CState, Exiting), - Changed = (CState2 /= CState), {Changed, CState2}; _ -> {false, CState} @@ -1291,7 +929,7 @@ are_joining_nodes(CState) -> %% @private auto_joining_nodes(CState) -> Joining = riak_core_ring:members(CState, [joining]), - case riak_core_capability:get({riak_core, staged_joins}, false) of + case application:get_env(riak_core, staged_joins, false) of false -> Joining; true -> @@ -1479,7 +1117,7 @@ handle_down_nodes(CState, Next) -> case (OwnerLeaving and NextDown) of true -> Active = riak_core_ring:active_members(CState) -- [O], - RNode = lists:nth(rand:uniform(length(Active)), + RNode = lists:nth(riak_core_rand:uniform(length(Active)), Active), {Idx, O, RNode, Mods, Status}; _ -> @@ -1568,22 +1206,19 @@ no_log(_, _) -> ok. log(debug, {Msg, Args}) -> - ?LOG_DEBUG(Msg, Args); + logger:debug(Msg, Args); log(ownership, {Idx, NewOwner, CState}) -> Owner = riak_core_ring:index_owner(CState, Idx), - ?LOG_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), - ?LOG_DEBUG("(reassign) ~b :: ~p -> ~p~n", [Idx, Owner, NewOwner]); + logger:debug("(reassign) ~b :: ~p -> ~p~n", [Idx, Owner, NewOwner]); log(next, {Idx, Owner, NewOwner}) -> - ?LOG_DEBUG("(pending) ~b :: ~p -> ~p~n", [Idx, Owner, NewOwner]); + logger:debug("(pending) ~b :: ~p -> ~p~n", [Idx, Owner, NewOwner]); log(_, _) -> ok. -%% @private -seed() -> - %% Taken from riak_core_gossip, when no seed is provided, this is the default. - %% - %% Seed must be in the format generated from rand:seed, for the code to successfuly - %% work with rand:uniform_s/2. (riak_core_gossip.erl:58) - rand:seed(exrop, os:timestamp()). +%% =================================================================== +%% EUnit tests +%% =================================================================== + diff --git a/src/riak_core_cli_registry.erl b/src/riak_core_cli_registry.erl deleted file mode 100644 index 3701a85f1..000000000 --- a/src/riak_core_cli_registry.erl +++ /dev/null @@ -1,54 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2014 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 This module tracks registrations for clique integrations. - --module(riak_core_cli_registry). - --define(CLI_MODULES, [ - riak_core_cluster_cli, - riak_core_handoff_cli - ]). - --export([ - register_node_finder/0, - register_cli/0, - load_schema/0 - ]). - --spec register_node_finder() -> true. -register_node_finder() -> - F = fun() -> - {ok, MyRing} = riak_core_ring_manager:get_my_ring(), - riak_core_ring:all_members(MyRing) - end, - clique:register_node_finder(F). - --spec register_cli() -> ok. -register_cli() -> - clique:register(?CLI_MODULES). - --spec load_schema() -> ok. -load_schema() -> - case application:get_env(riak_core, schema_dirs) of - {ok, Directories} -> - ok = clique_config:load_schema(Directories); - _ -> - ok = clique_config:load_schema([code:lib_dir()]) - end. diff --git a/src/riak_core_cluster_cli.erl b/src/riak_core_cluster_cli.erl deleted file mode 100644 index 758849d3b..000000000 --- a/src/riak_core_cluster_cli.erl +++ /dev/null @@ -1,331 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2014 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 This module encapsulates the command line interface for the -%% "new" cluster commands: -%% -%% status, partition-count, partitions, partition-id, partition-index -%% -%% The "old" command implementations for join, leave, plan, commit, -%% etc are in `riak_core_console.erl' - --module(riak_core_cluster_cli). - --behaviour(clique_handler). - --export([ - register_cli/0, - status/3, - partition_count/3, - partitions/3, - partition/3 -]). - --include_lib("kernel/include/logger.hrl"). - -register_cli() -> - register_all_usage(), - register_all_commands(). - -register_all_usage() -> - clique:register_usage(["riak-admin", "cluster"], cluster_usage()), - clique:register_usage(["riak-admin", "cluster", "status"], status_usage()), - clique:register_usage(["riak-admin", "cluster", "partition"], partition_usage()), - clique:register_usage(["riak-admin", "cluster", "partitions"], partitions_usage()), - clique:register_usage(["riak-admin", "cluster", "partition_count"], partition_count_usage()), - clique:register_usage(["riak-admin", "cluster", "partition_count"], partition_count_usage()), - clique:register_usage(["riak-admin", "cluster", "location"], location_usage()). - -register_all_commands() -> - lists:foreach(fun(Args) -> apply(clique, register_command, Args) end, - [status_register(), partition_count_register(), - partitions_register(), partition_register(), location_register()]). - -%%% -%% Cluster status -%%% - -status_register() -> - [["riak-admin", "cluster", "status"], % Cmd - [], % KeySpecs - [], % FlagSpecs - fun status/3]. % Implementation callback. - -cluster_usage() -> - [ - "riak-admin cluster \n\n", - " Display cluster-related status and settings.\n\n", - " Sub-commands:\n", - " status Display a summary of cluster status\n", - " partition Map partition IDs to indexes\n", - " partitions Display partitions on a node\n", - " partition-count Display ring size or node partition count\n\n", - " location Set node location\n\n", - " Use --help after a sub-command for more details.\n" - ]. - -status_usage() -> - ["riak-admin cluster status\n\n", - " Display a summary of cluster status information.\n"]. - -future_claim_percentage([], _Ring, _Node) -> - "--"; -future_claim_percentage(_Changes, Ring, Node) -> - FutureRingSize = riak_core_ring:future_num_partitions(Ring), - NextIndices = riak_core_ring:future_indices(Ring, Node), - io_lib:format("~5.1f", [length(NextIndices) * 100 / FutureRingSize]). - -claim_percent(Ring, Node) -> - RingSize = riak_core_ring:num_partitions(Ring), - Indices = riak_core_ring:indices(Ring, Node), - io_lib:format("~5.1f", [length(Indices) * 100 / RingSize]). - -status(_CmdBase, [], []) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - RingStatus = riak_core_status:ring_status(), - %% {Claimant, RingReady, Down, MarkedDown, Changes} = RingStatus - %% - %% Group like statuses together - AllStatus = lists:keysort(2, riak_core_ring:all_member_status(Ring)), - - Rows = [ format_status(Node, Status, Ring, RingStatus) || - {Node, Status} <- AllStatus ], - - Table = clique_status:table(Rows), - - T0 = clique_status:text("---- Cluster Status ----"), - T1 = clique_status:text(io_lib:format("Ring ready: ~p~n", [element(2, RingStatus)])), - T2 = clique_status:text( - "Key: (C) = Claimant; availability marked with '!' is unexpected"), - [T0,T1,Table,T2]. - -format_status(Node, Status, Ring, RingStatus) -> - NodesLocations = riak_core_ring:get_nodes_locations(Ring), - HasLocationInCluster = riak_core_location:has_location_set_in_cluster(NodesLocations), - format_status(Node, Status, Ring, RingStatus, HasLocationInCluster, NodesLocations). - -format_status(Node, Status, Ring, RingStatus, false, _) -> - {Claimant, _RingReady, Down, MarkedDown, Changes} = RingStatus, - [{node, is_claimant(Node, Claimant)}, - {status, Status}, - {avail, node_availability(Node, Down, MarkedDown)}, - {ring, claim_percent(Ring, Node)}, - {pending, future_claim_percentage(Changes, Ring, Node)}]; -format_status(Node, Status, Ring, RingStatus, true, NodesLocations) -> - Row = format_status(Node, Status, Ring, RingStatus, false, NodesLocations), - Row ++ [{location, riak_core_location:get_node_location(Node, NodesLocations)}]. - -is_claimant(Node, Node) -> - " (C) " ++ atom_to_list(Node) ++ " "; -is_claimant(Node, _Other) -> - " " ++ atom_to_list(Node) ++ " ". - -node_availability(Node, Down, MarkedDown) -> - case {lists:member(Node, Down), lists:member(Node, MarkedDown)} of - {false, false} -> " up "; - {true, true } -> " down "; - {true, false} -> " down! "; - {false, true } -> " up! " - end. - -%%% -%% cluster partition-count -%%% - -partition_count_register() -> - [["riak-admin", "cluster", "partition-count"], % Cmd - [], % KeySpecs - [{node, [{shortname, "n"}, {longname, "node"}, - {typecast, - fun clique_typecast:to_node/1}]}],% FlagSpecs - fun partition_count/3]. % Implementation callback - -partition_count_usage() -> - ["riak-admin cluster partition-count [--node node]\n\n", - " Display the number of partitions (ring-size) for the entire\n", - " cluster or the number of partitions on a specific node.\n\n", - "Options\n", - " -n , --node \n", - " Display the handoffs on the specified node.\n", - " This flag can currently take only one node and be used once\n" - ]. - -partition_count(_CmdBase, [], [{node, Node}]) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - Indices = riak_core_ring:indices(Ring, Node), - Row = [[{node, Node}, {partitions, length(Indices)}, {pct, claim_percent(Ring, Node)}]], - [clique_status:table(Row)]; -partition_count(_CmdBase, [], []) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - [clique_status:text( - io_lib:format("Cluster-wide partition-count: ~p", - [riak_core_ring:num_partitions(Ring)]))]. - -%%% -%% cluster partitions -%%% - -partitions_register() -> - [["riak-admin", "cluster", "partitions"], % Cmd - [], % KeySpecs - [{node, [{shortname, "n"}, {longname, "node"}, - {typecast, - fun clique_typecast:to_node/1}]}],% FlagSpecs - fun partitions/3]. % Implementation callback - - -partitions_usage() -> - ["riak-admin cluster partitions [--node node]\n\n", - " Display the partitions on a node. Defaults to local node.\n\n", - "Options\n", - " -n , --node \n", - " Display the handoffs on the specified node.\n", - " This flag can currently take only one node and be used once\n" - ]. - -partitions(_CmdBase, [], [{node, Node}]) -> - partitions_output(Node); -partitions(_CmdBase, [], []) -> - partitions_output(node()). - -partitions_output(Node) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - RingSize = riak_core_ring:num_partitions(Ring), - {Primary, Secondary, Stopped} = riak_core_status:partitions(Node, Ring), - T0 = clique_status:text(io_lib:format("Partitions owned by ~p:", [Node])), - Rows = generate_rows(RingSize, primary, Primary) - ++ generate_rows(RingSize, secondary, Secondary) - ++ generate_rows(RingSize, stopped, Stopped), - Table = clique_status:table(Rows), - [T0, Table]. - -generate_rows(_RingSize, Type, []) -> - [[{type, Type}, {index, "--"}, {id, "--"}]]; -generate_rows(RingSize, Type, Ids) -> - %% Build a list of proplists, one for each partition id - [ - [ {type, Type}, {index, I}, - {id, hash_to_partition_id(I, RingSize)} ] - || I <- Ids ]. - -%%% -%% cluster partition id=0 -%% cluster partition index=576460752303423500 -%%% - -partition_register() -> - [["riak-admin", "cluster", "partition"], % Cmd - [{id, [{typecast, fun list_to_integer/1}]}, - {index, [{typecast, fun list_to_integer/1}]}], % KeySpecs - [], % FlagSpecs - fun partition/3]. % Implementation callback - -partition_usage() -> - ["riak-admin cluster partition id=0\n", - "riak-admin cluster partition index=228359630832953580969325755111919221821\n\n", - " Display the id for the provided index, or index for the ", - "specified id.\n"]. - -partition(_CmdBase, [{index, Index}], []) when Index >= 0 -> - id_out(index, Index); -partition(_CmdBase, [{id, Id}], []) when Id >= 0 -> - id_out(id, Id); -partition(_CmdBase, [{Op, Value}], []) -> - [make_alert(["ERROR: The given value ", integer_to_list(Value), - " for ", atom_to_list(Op), " is invalid."])]; -partition(_CmdBase, [], []) -> - clique_status:usage(). - -id_out(InputType, Number) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - RingSize = riak_core_ring:num_partitions(Ring), - [id_out1(InputType, Number, Ring, RingSize)]. - -id_out1(index, Index, Ring, RingSize) -> - case riak_core_ring_util:hash_is_partition_boundary(Index, RingSize) of - true -> - Owner = riak_core_ring:index_owner(Ring, Index), - clique_status:table([ - [{index, Index}, - {id, hash_to_partition_id(Index, RingSize)}, - {node, Owner}]]); - false -> - make_alert(["ERROR: Index ", integer_to_list(Index), - " isn't a partition boundary value."]) - end; -id_out1(id, Id, Ring, RingSize) when Id < RingSize -> - Idx = partition_id_to_hash(Id, RingSize), - Owner = riak_core_ring:index_owner(Ring, Idx), - clique_status:table([[{index, Idx}, {id, Id}, {node, Owner}]]); -id_out1(id, Id, _Ring, _RingSize) -> - make_alert(["ERROR: Id ", integer_to_list(Id), " is invalid."]). - - -%%% -%% Location -%%% -location_usage() -> - ["riak-admin cluster location [--node node]\n\n", - " Set the node location parameter\n\n", - "Options\n", - " -n , --node \n", - " Set node location for the specified node.\n" - ]. - -location_register() -> - [["riak-admin", "cluster", "location", '*'], % Cmd - [], % KeySpecs - [{node, [{shortname, "n"}, {longname, "node"}, - {typecast, fun clique_typecast:to_node/1}]}], % FlagSpecs - fun stage_set_location/3]. % Implementation callback - -stage_set_location([_, _, _, Location], _, Flags) -> - Node = proplists:get_value(node, Flags, node()), - try - case riak_core_claimant:set_node_location(Node, Location) of - ok -> - [clique_status:text( - io_lib:format("Success: staged changing location of node ~p to ~s~n", - [Node, Location]))]; - {error, not_member} -> - make_alert( - io_lib:format("Failed: ~p is not a member of the cluster.~n", [Node]) - ) - end - catch - Exception:Reason -> - ?LOG_ERROR("Setting node location failed ~p:~p", [Exception, Reason]), - make_alert("Setting node location failed, see log for details~n") - end. - - -%%% -%% Internal -%%% - -make_alert(Iolist) -> - Text = [clique_status:text(Iolist)], - clique_status:alert(Text). - -hash_to_partition_id(Hash, RingSize) -> - riak_core_ring_util:hash_to_partition_id(Hash, RingSize). - -partition_id_to_hash(Id, RingSize) -> - riak_core_ring_util:partition_id_to_hash(Id, RingSize). - diff --git a/src/riak_core_console.erl b/src/riak_core_console.erl deleted file mode 100644 index a2afea710..000000000 --- a/src/riak_core_console.erl +++ /dev/null @@ -1,1564 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 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. -%% -%% ------------------------------------------------------------------- - --module(riak_core_console). -%% Legacy exports - unless needed by other modules, only expose -%% functionality via command/1 --export([member_status/1, ring_status/1, print_member_status/2, - stage_leave/1, stage_remove/1, stage_replace/1, stage_resize_ring/1, - stage_force_replace/1, print_staged/1, commit_staged/1, - clear_staged/1, transfer_limit/1, pending_claim_percentage/2, - transfers/1, add_user/1, alter_user/1, del_user/1, - add_group/1, alter_group/1, del_group/1, - add_source/1, del_source/1, grant/1, revoke/1, - print_users/1, print_user/1, print_sources/1, - print_groups/1, print_group/1, print_grants/1, - security_enable/1, security_disable/1, security_status/1, ciphers/1, - stat_show/1, stat_info/1, stat_enable/1, stat_disable/1, stat_reset/1]). - -%% New CLI API --export([command/1]). - --include_lib("kernel/include/logger.hrl"). - --spec command([string()]) -> ok. -command(Cmd) -> - clique:run(Cmd). - -%% @doc Return for a given ring and node, percentage currently owned and -%% anticipated after the transitions have been completed. -pending_claim_percentage(Ring, Node) -> - RingSize = riak_core_ring:num_partitions(Ring), - FutureRingSize = riak_core_ring:future_num_partitions(Ring), - Indices = riak_core_ring:indices(Ring, Node), - NextIndices = riak_core_ring:future_indices(Ring, Node), - RingPercent = length(Indices) * 100 / RingSize, - NextPercent = length(NextIndices) * 100 / FutureRingSize, - {RingPercent, NextPercent}. - -member_status([]) -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - print_member_status(Ring, legacy_gossip(Ring)). - -legacy_gossip(Ring) -> - Members = riak_core_ring:all_members(Ring), - LegacyGossip = [{Node, false} || Node <- Members], - % No Nodes should now be using legacy gossip - orddict:from_list(LegacyGossip). - -print_member_status(Ring, LegacyGossip) -> - io:format("~33..=s Membership ~34..=s~n", ["", ""]), - io:format("Status Ring Pending Node~n"), - io:format("~79..-s~n", [""]), - AllStatus = lists:keysort(2, riak_core_ring:all_member_status(Ring)), - IsPending = ([] /= riak_core_ring:pending_changes(Ring)), - Locations = riak_core_ring:get_nodes_locations(Ring), - - {Joining, Valid, Down, Leaving, Exiting} = - lists:foldl(fun({Node, Status}, - {Joining0, Valid0, Down0, Leaving0, Exiting0}) -> - StatusOut = - case orddict:fetch(Node, LegacyGossip) of - false -> Status - end, - - {RingPercent, NextPercent} = - pending_claim_percentage(Ring, Node), - DisplayNode = maybe_add_location(Node, Locations), - - case IsPending of - true -> - io:format("~-8s ~5.1f% ~5.1f% ~s~n", - [StatusOut, RingPercent, - NextPercent, DisplayNode]); - false -> - io:format("~-8s ~5.1f% -- ~s~n", - [StatusOut, RingPercent, DisplayNode]) - end, - case Status of - joining -> - {Joining0 + 1, Valid0, Down0, Leaving0, Exiting0}; - valid -> - {Joining0, Valid0 + 1, Down0, Leaving0, Exiting0}; - down -> - {Joining0, Valid0, Down0 + 1, Leaving0, Exiting0}; - leaving -> - {Joining0, Valid0, Down0, Leaving0 + 1, Exiting0}; - exiting -> - {Joining0, Valid0, Down0, Leaving0, Exiting0 + 1} - end - end, {0,0,0,0,0}, AllStatus), - io:format("~79..-s~n", [""]), - io:format("Valid:~b / Leaving:~b / Exiting:~b / Joining:~b / Down:~b~n", - [Valid, Leaving, Exiting, Joining, Down]), - ok. - -maybe_add_location(Node, Locations) -> - case riak_core_location:get_node_location(Node, Locations) of - undefined -> - atom_to_list(Node); - Location -> - atom_to_list(Node) ++ " (" ++ Location ++ ")" - end. - -ring_status([]) -> - {Claimant, RingReady, Down, MarkedDown, Changes} = - riak_core_status:ring_status(), - claimant_status(Claimant, RingReady), - ownership_status(Down, Changes), - unreachable_status(Down -- MarkedDown), - ok. - -claimant_status(Claimant, RingReady) -> - io:format("~34..=s Claimant ~35..=s~n", ["", ""]), - io:format("Claimant: ~p~n", [Claimant]), - case RingReady of - undefined -> - io:format("Status: down~n" - "Ring Ready: unknown~n", []); - _ -> - io:format("Status: up~n" - "Ring Ready: ~p~n", [RingReady]) - end, - io:format("~n", []). - -ownership_status(Down, Changes) -> - io:format("~30..=s Ownership Handoff ~30..=s~n", ["", ""]), - case Changes of - [] -> - io:format("No pending changes.~n"); - _ -> - orddict:fold(fun print_ownership_status/3, Down, Changes) - end, - io:format("~n", []). - -print_ownership_status({Owner, NextOwner}, Transfers, Down) -> - io:format("Owner: ~s~n" - "Next Owner: ~s~n", [Owner, NextOwner]), - case {lists:member(Owner, Down), - lists:member(NextOwner, Down)} of - {true, true} -> - io:format("~n"), - io:format("!!! ~s is DOWN !!!~n", [Owner]), - io:format("!!! ~s is DOWN !!!~n~n", [NextOwner]), - lists:foreach(fun print_index/1, Transfers); - {true, _} -> - io:format("~n"), - io:format("!!! ~s is DOWN !!!~n~n", [Owner]), - lists:foreach(fun print_index/1, Transfers); - {_, true} -> - io:format("~n"), - io:format("!!! ~s is DOWN !!!~n~n", [NextOwner]), - lists:foreach(fun print_index/1, Transfers); - _ -> - lists:foreach(fun print_transfer_status/1, Transfers) - end, - io:format("~n"), - io:format("~79..-s~n", [""]), - Down. - -print_index({Idx, _Waiting, _Complete, _Status}) -> - io:format("Index: ~b~n", [Idx]). - -print_transfer_status({Idx, Waiting, Complete, Status}) -> - io:format("~nIndex: ~b~n", [Idx]), - case Status of - complete -> - io:format(" All transfers complete. Waiting for " - "claimant to change ownership.~n"); - awaiting -> - io:format(" Waiting on: ~p~n", [Waiting]), - case Complete of - [] -> - ok; - _ -> - io:format(" Complete: ~p~n", [Complete]) - end - end. - -unreachable_status([]) -> - io:format("~30..=s Unreachable Nodes ~30..=s~n", ["", ""]), - io:format("All nodes are up and reachable~n", []), - io:format("~n", []); -unreachable_status(Down) -> - io:format("~30..=s Unreachable Nodes ~30..=s~n", ["", ""]), - io:format("The following nodes are unreachable: ~p~n", [Down]), - io:format("~n", []), - io:format("WARNING: The cluster state will not converge until all nodes~n" - "are up. Once the above nodes come back online, convergence~n" - "will continue. If the outages are long-term or permanent, you~n" - "can either mark the nodes as down (riak-admin down NODE) or~n" - "forcibly remove the nodes from the cluster (riak-admin~n" - "force-remove NODE) to allow the remaining nodes to settle.~n"), - ok. - -%% Provide a list of nodes with pending partition transfers (i.e. any secondary vnodes) -%% and list any owned vnodes that are *not* running --spec(transfers([string()]) -> ok). -transfers([]) -> - try - {DownNodes, Pending} = riak_core_status:transfers(), - case DownNodes of - [] -> ok; - _ -> io:format("Nodes ~p are currently down.\n", [DownNodes]) - end, - F = fun({waiting_to_handoff, Node, Count}, Acc) -> - io:format("~p waiting to handoff ~p partitions\n", [Node, Count]), - Acc + 1; - ({stopped, Node, Count}, Acc) -> - io:format("~p does not have ~p primary partitions running\n", [Node, Count]), - Acc + 1 - end, - case lists:foldl(F, 0, Pending) of - 0 -> - io:format("No transfers active\n"), - ok; - _ -> - error - end - catch - Exception:Reason -> - ?LOG_ERROR("Transfers failed ~p:~p", [Exception, - Reason]), - io:format("Transfers failed, see log for details~n"), - error - end, - - %% Now display active transfers - {Xfers, Down} = riak_core_status:all_active_transfers(), - - DisplayXfer = - fun({{Mod, Partition}, Node, outbound, active, _Status}) -> - print_v1_status(Mod, Partition, Node); - - ({status_v2, Status}) -> - %% Display base status - Type = proplists:get_value(type, Status), - Mod = proplists:get_value(mod, Status), - SrcPartition = proplists:get_value(src_partition, Status), - TargetPartition = proplists:get_value(target_partition, Status), - StartTS = proplists:get_value(start_ts, Status), - SrcNode = proplists:get_value(src_node, Status), - TargetNode = proplists:get_value(target_node, Status), - - print_v2_status(Type, Mod, {SrcPartition, TargetPartition}, StartTS), - - %% Get info about stats if there is any yet - Stats = proplists:get_value(stats, Status), - - print_stats(SrcNode, TargetNode, Stats), - io:format("~n"); - - (_) -> - ignore - end, - DisplayDown = - fun(Node) -> - io:format("Node ~p could not be contacted~n", [Node]) - end, - - io:format("~nActive Transfers:~n~n", []), - _ = [DisplayXfer(Xfer) || Xfer <- lists:flatten(Xfers)], - - io:format("~n"), - _ = [DisplayDown(Node) || Node <- Down], - ok. - -print_v2_status(Type, Mod, {SrcPartition, TargetPartition}, StartTS) -> - StartTSStr = datetime_str(StartTS), - Running = timer:now_diff(os:timestamp(), StartTS), - RunningStr = riak_core_format:human_time_fmt("~.2f", Running), - - io:format("transfer type: ~s~n", [Type]), - io:format("vnode type: ~p~n", [Mod]), - case Type of - repair -> - io:format("source partition: ~p~n", [SrcPartition]), - io:format("target partition: ~p~n", [TargetPartition]); - _ -> - io:format("partition: ~p~n", [TargetPartition]) - end, - io:format("started: ~s [~s ago]~n", [StartTSStr, RunningStr]). - -print_v1_status(Mod, Partition, Node) -> - io:format("vnode type: ~p~n", [Mod]), - io:format("partition: ~p~n", [Partition]), - io:format("target node: ~p~n~n", [Node]). - -print_stats(SrcNode, TargetNode, no_stats) -> - io:format("last update: no updates seen~n"), - print_size(undefined), - io:format("objects transferred: unknown~n~n"), - print_arrowbox(SrcNode, TargetNode, "unknown", "unknown", 0.0); -print_stats(SrcNode, TargetNode, Stats) -> - ObjsS = proplists:get_value(objs_per_s, Stats), - BytesS = proplists:get_value(bytes_per_s, Stats), - LastUpdate = proplists:get_value(last_update, Stats), - Diff = timer:now_diff(os:timestamp(), LastUpdate), - DiffStr = riak_core_format:human_time_fmt("~.2f", Diff), - Objs = proplists:get_value(objs_total, Stats), - ObjsSStr = riak_core_format:fmt("~p Objs/s", [ObjsS]), - ByteStr = riak_core_format:human_size_fmt("~.2f", BytesS) ++ "/s", - TS = datetime_str(LastUpdate), - Size = proplists:get_value(size, Stats), - DonePctDecimal = proplists:get_value(pct_done_decimal, Stats), - io:format("last update: ~s [~s ago]~n", [TS, DiffStr]), - print_size(Size), - io:format("objects transferred: ~p~n~n", [Objs]), - print_arrowbox(SrcNode, TargetNode, ObjsSStr, ByteStr, DonePctDecimal). - -print_size(undefined) -> - io:format("total size: unknown~n"); -print_size({Objs, objects}) -> - io:format("total size: ~p objects~n", [Objs]); -print_size({Bytes, bytes}) -> - io:format("total size: ~p bytes~n", [Bytes]). - --define(ARROW, "=======> "). - -print_arrowbox(SrcAtom, TargetAtom, Objs, Bytes, Progress) -> - Src0 = atom_to_list(SrcAtom), - Target0 = atom_to_list(TargetAtom), - {SCont1, SCont2} = wrap(Src0), - {TCont1, TCont2} = wrap(Target0), - - Src = case SCont1 of - "" -> string:centre(Src0, 25); - _ -> Src0 - end, - Target = case TCont1 of - "" -> string:centre(Target0, 25); - _ -> Target0 - end, - - ToFrom = riak_core_format:fmt("~25s ~10s ~25s", - [Src, ?ARROW, Target]), - Width = length(ToFrom), - - Prog = progress(Progress, 50), - - io:format("~s~n", [string:centre(Objs, Width)]), - io:format("~s~n", [ToFrom]), - Fmt = "~-25s ~10s ~-25s~n", - case SCont1 /= "" orelse TCont1 /= "" of - true -> - io:format(Fmt, [SCont1, "", TCont1]); - _ -> ok - end, - case SCont2 /= "" orelse TCont2 /= "" of - true -> - io:format(Fmt, [SCont2, "", TCont2]); - _ -> ok - end, - io:format("~s~n", [string:centre(" "++Prog, Width)]), - io:format("~s~n", [string:centre(Bytes, Width)]). - - -wrap(String) -> - Len = length(String), - case Len of - N when N > 50 -> - One = lists:sublist(String, 26, 25), - Two = lists:sublist(String, 51, 25), - {One, Two}; - N when N >= 25, - N =< 50-> - One = lists:sublist(String, 26, 25), - {One, ""}; - _ -> - {"", ""} - end. - - -progress(undefined, MaxSize) -> - FormatStr = progress_fmt(progress_size(MaxSize), 0), %% this is wrong, need - 6 refactor - riak_core_format:fmt(FormatStr, ["", "", "N/A"]); -progress(PctDecimal, MaxSize) -> - ProgressTotalSize = progress_size(MaxSize), - ProgressSize = trunc(PctDecimal * ProgressTotalSize), - PadSize = ProgressTotalSize - ProgressSize, - FormatStr = progress_fmt(ProgressSize, PadSize), - riak_core_format:fmt(FormatStr, ["", "", integer_to_list(trunc(PctDecimal * 100))]). - -progress_size(MaxSize) -> - MaxSize - 7. %% 7 fixed characters in progress bar - -progress_fmt(ArrowSize, PadSize) -> - riak_core_format:fmt("|~~~p..=s~~~p.. s| ~~3.. s%", [ArrowSize, PadSize]). - -datetime_str({_Mega, _Secs, _Micro}=Now) -> - datetime_str(calendar:now_to_datetime(Now)); -datetime_str({{Year, Month, Day}, {Hour, Min, Sec}}) -> - riak_core_format:fmt("~4..0B-~2..0B-~2..0B ~2..0B:~2..0B:~2..0B", - [Year,Month,Day,Hour,Min,Sec]). - -stage_leave([]) -> - stage_leave(node()); -stage_leave([NodeStr]) -> - stage_leave(list_to_atom(NodeStr)); -stage_leave(Node) -> - try - case riak_core_claimant:leave_member(Node) of - ok -> - io:format("Success: staged leave request for ~p~n", [Node]), - ok; - {error, already_leaving} -> - io:format("~p is already in the process of leaving the " - "cluster.~n", [Node]), - ok; - {error, not_member} -> - io:format("Failed: ~p is not a member of the cluster.~n", - [Node]), - error; - {error, only_member} -> - io:format("Failed: ~p is the only member.~n", [Node]), - error - end - catch - Exception:Reason -> - ?LOG_ERROR("Leave failed ~p:~p", [Exception, Reason]), - io:format("Leave failed, see log for details~n"), - error - end. - -stage_remove([NodeStr]) -> - stage_remove(list_to_atom(NodeStr)); -stage_remove(Node) -> - try - case riak_core_claimant:remove_member(Node) of - ok -> - io:format("Success: staged remove request for ~p~n", [Node]), - ok; - {error, not_member} -> - io:format("Failed: ~p is not a member of the cluster.~n", - [Node]), - error; - {error, is_claimant} -> - is_claimant_error(Node, "remove"), - error; - {error, only_member} -> - io:format("Failed: ~p is the only member.~n", [Node]), - error - end - catch - Exception:Reason -> - ?LOG_ERROR("Remove failed ~p:~p", [Exception, Reason]), - io:format("Remove failed, see log for details~n"), - error - end. - -stage_replace([NodeStr1, NodeStr2]) -> - stage_replace(list_to_atom(NodeStr1), list_to_atom(NodeStr2)). -stage_replace(Node1, Node2) -> - try - case riak_core_claimant:replace(Node1, Node2) of - ok -> - io:format("Success: staged replacement of ~p with ~p~n", - [Node1, Node2]), - ok; - {error, already_leaving} -> - io:format("~p is already in the process of leaving the " - "cluster.~n", [Node1]), - ok; - {error, not_member} -> - io:format("Failed: ~p is not a member of the cluster.~n", - [Node1]), - error; - {error, invalid_replacement} -> - io:format("Failed: ~p is not a valid replacement candidate.~n" - "Only newly joining nodes can be used for " - "replacement.~n", [Node2]), - error; - {error, already_replacement} -> - io:format("Failed: ~p is already staged to replace another " - "node.~n", [Node2]), - error - end - catch - Exception:Reason -> - ?LOG_ERROR("Node replacement failed ~p:~p", [Exception, Reason]), - io:format("Node replacement failed, see log for details~n"), - error - end. - -stage_force_replace([NodeStr1, NodeStr2]) -> - stage_force_replace(list_to_atom(NodeStr1), list_to_atom(NodeStr2)). -stage_force_replace(Node1, Node2) -> - try - case riak_core_claimant:force_replace(Node1, Node2) of - ok -> - io:format("Success: staged forced replacement of ~p with ~p~n", - [Node1, Node2]), - ok; - {error, not_member} -> - io:format("Failed: ~p is not a member of the cluster.~n", - [Node1]), - error; - {error, is_claimant} -> - is_claimant_error(Node1, "replace"), - error; - {error, invalid_replacement} -> - io:format("Failed: ~p is not a valid replacement candidate.~n" - "Only newly joining nodes can be used for " - "replacement.~n", [Node2]), - error; - {error, already_replacement} -> - io:format("Failed: ~p is already staged to replace another " - "node.~n", [Node2]), - error - end - catch - Exception:Reason -> - ?LOG_ERROR("Forced node replacement failed ~p:~p", - [Exception, Reason]), - io:format("Forced node replacement failed, see log for details~n"), - error - end. - -stage_resize_ring(["abort"]) -> - try - case riak_core_claimant:abort_resize() of - ok -> - io:format("Success: staged abort resize ring request~n"), - ok; - {error, not_resizing} -> - io:format("Failed: ring is not resizing or resize has completed~n"), - error - end - catch - Exception:Reason -> - ?LOG_ERROR("Abort resize ring request failed ~p:~p", - [Exception, Reason]), - io:format("Abort resize ring request failed, see log for details~n"), - error - end; -stage_resize_ring([SizeStr]) -> - try list_to_integer(SizeStr) of - Size -> stage_resize_ring(Size) - catch - error:badarg -> - io:format("Failed: Ring size must be an integer.~n") - end; -stage_resize_ring(NewRingSize) -> - try - case riak_core_claimant:resize_ring(NewRingSize) of - ok -> - io:format("Success: staged resize ring request with new size: ~p~n", - [NewRingSize]), - ok; - {error, not_capable} -> - io:format("Failed: at least one node is not capable of performing the operation~n"), - error; - {error, same_size} -> - io:format("Failed: current ring size is already ~p~n", - [NewRingSize]), - error; - {error, control_running} -> - io:format("Failed: cannot resize ring with Riak Control running~n"), - error; - {error, search_running} -> - io:format("Failed: cannot resize ring with Riak Search~n"), - error; - {error, single_node} -> - io:format("Failed: cannot resize single node~n"), - error; - {error, pending_changes} -> - io:format("Failed: there are pending changes. Try again once completed~n"), - error - end - catch - Exception:Reason -> - ?LOG_ERROR("Resize ring request failed ~p:~p", - [Exception, Reason]), - io:format("Resize ring request failed, see log for details~n"), - error - end. - -clear_staged([]) -> - try - case riak_core_claimant:clear() of - ok -> - io:format("Cleared staged cluster changes~n"), - ok - end - catch - Exception:Reason -> - ?LOG_ERROR("Failed to clear staged cluster changes ~p:~p", - [Exception, Reason]), - io:format("Failed to clear staged cluster changes, see log " - "for details~n"), - error - end. - -is_claimant_error(Node, Action) -> - io:format("Failed: ~p is the claimant (see: riak-admin ring_status).~n", - [Node]), - io:format( - "The claimant is the node responsible for initiating cluster changes,~n" - "and cannot forcefully ~s itself. You can use 'riak-admin down' to~n" - "mark the node as offline, which will trigger a new claimant to take~n" - "over. However, this will clear any staged changes.~n", [Action]). - -print_staged([]) -> - case riak_core_claimant:plan() of - {error, legacy} -> - io:format("The cluster is running in legacy mode and does not " - "support plan/commit.~n"); - {error, ring_not_ready} -> - io:format("Cannot plan until cluster state has converged.~n" - "Check 'Ring Ready' in 'riak-admin ring_status'~n"); - {error, invalid_resize_claim} -> - io:format("Unable to claim some partitions in resized ring.~n" - "Check that there are no pending changes in 'riak-admin ring-status'~n" - "If there are, try again once they are completed~n" - "Otherwise try again shortly.~n"); - {ok, Changes, NextRings} -> - {ok, Ring} = riak_core_ring_manager:get_my_ring(), - %% The last next ring is always the final ring after all changes, - %% which is uninteresting to show. Only print N-1 rings. - NextRings2 = lists:sublist(NextRings, - erlang:max(0, length(NextRings)-1)), - print_plan(Changes, Ring, NextRings2), - ok - end. - -print_plan([], _, _) -> - io:format("There are no staged changes~n"); -print_plan(Changes, Ring, NextRings) -> - io:format("~31..=s Staged Changes ~32..=s~n", ["", ""]), - io:format("Action Details(s)~n"), - io:format("~79..-s~n", [""]), - - lists:foreach(fun({Node, join}) -> - io:format("join ~p~n", [Node]); - ({Node, leave}) -> - io:format("leave ~p~n", [Node]); - ({Node, remove}) -> - io:format("force-remove ~p~n", [Node]); - ({Node, {replace, NewNode}}) -> - io:format("replace ~p with ~p~n", [Node, NewNode]); - ({Node, {force_replace, NewNode}}) -> - io:format("force-replace ~p with ~p~n", [Node, NewNode]); - ({_, {resize, NewRingSize}}) -> - CurrentSize = riak_core_ring:num_partitions(Ring), - io:format("resize-ring ~p to ~p partitions~n",[CurrentSize,NewRingSize]); - ({_, abort_resize}) -> - CurrentSize = riak_core_ring:num_partitions(Ring), - io:format("resize-ring abort. current size: ~p~n", [CurrentSize]); - ({Node, {set_location, Location}}) -> - io:format("set-location ~p to ~s~n", [Node, Location]) - end, Changes), - io:format("~79..-s~n", [""]), - io:format("~n"), - - lists:foreach(fun({Node, remove}) -> - io:format("WARNING: All of ~p replicas will be lost~n", [Node]); - ({Node, {force_replace, _}}) -> - io:format("WARNING: All of ~p replicas will be lost~n", [Node]); - (_) -> - ok - end, Changes), - io:format("~n"), - - Transitions = length(NextRings), - case Transitions of - 1 -> - io:format("NOTE: Applying these changes will result in 1 " - "cluster transition~n~n"); - _ -> - io:format("NOTE: Applying these changes will result in ~b " - "cluster transitions~n~n", [Transitions]) - end, - - Leaves = length(lists:filter(fun({_N, A}) -> A == leave end, Changes)) > 0, - - case Leaves and app_helper:get_env(riak_core, full_rebalance_onleave) of - true -> - io:format("WARNING: Full rebalance forced by non-default " - "option riak_core.full_rebalance_onleave = true~n~n"); - _ -> - ok - end, - - _ = lists:foldl(fun({Ring1, Ring2}, I) -> - io:format("~79..#s~n", [""]), - io:format("~24.. s After cluster transition ~b/~b~n", - ["", I, Transitions]), - io:format("~79..#s~n~n", [""]), - output(Ring1, Ring2), - I+1 - end, 1, NextRings), - ok. - -output(Ring, NextRing) -> - Members = riak_core_ring:all_members(NextRing), - LegacyGossip = orddict:from_list([{Node, false} || Node <- Members]), - riak_core_console:print_member_status(NextRing, LegacyGossip), - io:format("~n"), - - FutureRing = riak_core_ring:future_ring(NextRing), - case riak_core_ring_util:check_ring(FutureRing) of - [] -> - ok; - _ -> - io:format("WARNING: Not all replicas will be on distinct nodes~n~n") - end, - - case riak_core_location:check_ring(FutureRing) of - [] -> - ok; - _ -> - io:format("WARNING: Not all replicas will be on distinct locations~n~n") - end, - - Owners1 = riak_core_ring:all_owners(Ring), - Owners2 = riak_core_ring:all_owners(NextRing), - Owners3 = lists:zip(Owners1, Owners2), - Reassigned = [{Idx, PrevOwner, NewOwner} - || {{Idx, PrevOwner}, {Idx, NewOwner}} <- Owners3, - PrevOwner /= NewOwner], - ReassignedTally = tally(Reassigned), - - Pending = riak_core_ring:pending_changes(NextRing), - Next = [{Idx, PrevOwner, NewOwner} || {Idx, PrevOwner, NewOwner, _, _} <- Pending], - NextTally = tally(Next), - Resizing = riak_core_ring:is_resizing(NextRing), - - case Reassigned of - [] -> - ok; - _ -> - io:format("Partitions reassigned from cluster changes: ~p~n", - [length(Reassigned)]), - _ = [io:format(" ~b reassigned from ~p to ~p~n", [Count, PrevOwner, NewOwner]) - || {{PrevOwner, NewOwner}, Count} <- ReassignedTally], - io:format("~n"), - ok - end, - - case {Resizing, Next} of - {_, []} -> - ok; - {true, _} -> - io:format("Ring is resizing. see riak-admin ring-status for transfer details.~n"); - _ -> - io:format("Transfers resulting from cluster changes: ~p~n", - [length(Next)]), - _ = [io:format(" ~b transfers from ~p to ~p~n", [Count, PrevOwner, NewOwner]) - || {{PrevOwner, NewOwner}, Count} <- NextTally], - ok, - io:format("~n") - end, - ok. - -tally(Changes) -> - Tally = - lists:foldl(fun({_, PrevOwner, NewOwner}, Tally) -> - dict:update_counter({PrevOwner, NewOwner}, 1, Tally) - end, dict:new(), Changes), - dict:to_list(Tally). - -commit_staged([]) -> - case riak_core_claimant:commit() of - ok -> - io:format("Cluster changes committed~n"); - {error, legacy} -> - io:format("The cluster is running in legacy mode and does not " - "support plan/commit.~n"); - {error, nothing_planned} -> - io:format("You must verify the plan with " - "'riak-admin cluster plan' before committing~n"); - {error, ring_not_ready} -> - io:format("Cannot commit until cluster state has converged.~n" - "Check 'Ring Ready' in 'riak-admin ring_status'~n"); - {error, plan_changed} -> - io:format("The plan has changed. Verify with " - "'riak-admin cluster plan' before committing~n"); - {error, invalid_resize_claim} -> - io:format("Unable to commit staged ring changes.~n" - "Check that there are no pending changes in 'riak-admin ring-status'~n" - "If there are, try again once they are completed,~n" - "Otherwise try again shortly.~n"); - _ -> - io:format("Unable to commit cluster changes. Plan " - "may have changed, please verify the~n" - "plan and try to commit again~n") - end. - -transfer_limit([]) -> - {Limits, Down} = - riak_core_util:rpc_every_member_ann(riak_core_handoff_manager, - get_concurrency, [], 5000), - io:format("~s~n", [string:centre(" Transfer Limit ", 79, $=)]), - io:format("Limit Node~n"), - io:format("~79..-s~n", [""]), - lists:foreach(fun({Node, Limit}) -> - io:format("~5b ~p~n", [Limit, Node]) - end, Limits), - lists:foreach(fun(Node) -> - io:format("(offline) ~p~n", [Node]) - end, Down), - io:format("~79..-s~n", [""]), - io:format("Note: You can change transfer limits with " - "'riak-admin transfer_limit '~n" - " and 'riak-admin transfer_limit '~n"), - ok; -transfer_limit([LimitStr]) -> - {Valid, Limit} = check_limit(LimitStr), - case Valid of - false -> - io:format("Invalid limit: ~s~n", [LimitStr]), - error; - true -> - io:format("Setting transfer limit to ~b across the cluster~n", - [Limit]), - {_, Down} = - riak_core_util:rpc_every_member_ann(riak_core_handoff_manager, - set_concurrency, - [Limit], 5000), - (Down == []) orelse - io:format("Failed to set limit for: ~p~n", [Down]), - ok - end; -transfer_limit([NodeStr, LimitStr]) -> - Node = list_to_atom(NodeStr), - {Valid, Limit} = check_limit(LimitStr), - case Valid of - false -> - io:format("Invalid limit: ~s~n", [LimitStr]), - error; - true -> - case riak_core_util:safe_rpc(Node, riak_core_handoff_manager, - set_concurrency, [Limit]) of - {badrpc, _} -> - io:format("Failed to set transfer limit for ~p~n", [Node]); - _ -> - io:format("Set transfer limit for ~p to ~b~n", - [Node, Limit]) - end, - ok - end. - -check_limit(Str) -> - try - Int = list_to_integer(Str), - {Int >= 0, Int} - catch - _:_ -> - {false, 0} - end. - -security_error_xlate({errors, Errors}) -> - string:join( - lists:map(fun(X) -> security_error_xlate({error, X}) end, - Errors), - "~n"); -security_error_xlate({error, unknown_user}) -> - "User not recognized"; -security_error_xlate({error, unknown_group}) -> - "Group not recognized"; -security_error_xlate({error, {unknown_permission, Name}}) -> - io_lib:format("Permission not recognized: ~ts", [Name]); -security_error_xlate({error, {unknown_role, Name}}) -> - io_lib:format("Name not recognized: ~ts", [Name]); -security_error_xlate({error, {unknown_user, Name}}) -> - io_lib:format("User not recognized: ~ts", [Name]); -security_error_xlate({error, {unknown_group, Name}}) -> - io_lib:format("Group not recognized: ~ts", [Name]); -security_error_xlate({error, {unknown_users, Names}}) -> - io_lib:format("User(s) not recognized: ~ts", - [ - string:join( - lists:map(fun(X) -> unicode:characters_to_list(X, utf8) end, Names), - ", ") - ]); -security_error_xlate({error, {unknown_groups, Names}}) -> - io_lib:format("Group(s) not recognized: ~ts", - [ - string:join( - lists:map(fun(X) -> unicode:characters_to_list(X, utf8) end, Names), - ", ") - ]); -security_error_xlate({error, {unknown_roles, Names}}) -> - io_lib:format("Name(s) not recognized: ~ts", - [ - string:join( - lists:map(fun(X) -> unicode:characters_to_list(X, utf8) end, Names), - ", ") - ]); -security_error_xlate({error, {duplicate_roles, Names}}) -> - io_lib:format("Ambiguous names need to be prefixed with 'user/' or 'group/': ~ts", - [ - string:join( - lists:map(fun(X) -> unicode:characters_to_list(X, utf8) end, Names), - ", ") - ]); -security_error_xlate({error, reserved_name}) -> - "This name is reserved for system use"; -security_error_xlate({error, no_matching_sources}) -> - "No matching source"; -security_error_xlate({error, illegal_name_char}) -> - "Illegal character(s) in name"; -security_error_xlate({error, role_exists}) -> - "This name is already in use"; - -%% If we get something we hadn't planned on, better an ugly error -%% message than an ugly RPC call failure -security_error_xlate(Error) -> - io_lib:format("~p", [Error]). - -add_user([Username|Options]) -> - add_role(Username, Options, fun riak_core_security:add_user/2). - -add_group([Groupname|Options]) -> - add_role(Groupname, Options, fun riak_core_security:add_group/2). - -add_role(Name, Options, Fun) -> - try Fun(Name, parse_options(Options)) of - ok -> - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - catch - throw:{error, {invalid_option, Option}} -> - io:format("Invalid option ~p, options are of the form key=value~n", - [Option]), - error - end. - -alter_user([Username|Options]) -> - alter_role(Username, Options, fun riak_core_security:alter_user/2). - -alter_group([Groupname|Options]) -> - alter_role(Groupname, Options, fun riak_core_security:alter_group/2). - -alter_role(Name, Options, Fun) -> - try Fun(Name, parse_options(Options)) of - ok -> - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - catch - throw:{error, {invalid_option, Option}} -> - io:format("Invalid option ~p, options are of the form key=value~n", - [Option]), - error - end. - -del_user([Username]) -> - del_role(Username, fun riak_core_security:del_user/1). - -del_group([Groupname]) -> - del_role(Groupname, fun riak_core_security:del_group/1). - -del_role(Name, Fun) -> - case Fun(Name) of - ok -> - io:format("Successfully deleted ~ts~n", [Name]), - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - end. - -add_source([Users, CIDR, Source | Options]) -> - Unames = case string:tokens(Users, ",") of - ["all"] -> - all; - Other -> - Other - end, - %% Unicode note: atoms are constrained to latin1 until R18, so our - %% sources are as well - try riak_core_security:add_source(Unames, parse_cidr(CIDR), - list_to_atom(string:to_lower(Source)), - parse_options(Options)) of - ok -> - io:format("Successfully added source~n"), - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - catch - throw:{error, {invalid_option, Option}} -> - io:format("Invalid option ~p, options are of the form key=value~n", - [Option]); - error:badarg -> - io:format("Invalid source ~ts, must be latin1, sorry~n", - [Source]) - end. - -del_source([Users, CIDR]) -> - Unames = case string:tokens(Users, ",") of - ["all"] -> - all; - Other -> - Other - end, - riak_core_security:del_source(Unames, parse_cidr(CIDR)), - io:format("Deleted source~n"). - - -parse_roles(Roles) -> - case string:tokens(Roles, ",") of - ["all"] -> - all; - Other -> - Other - end. - -parse_grants(Grants) -> - string:tokens(Grants, ","). - -grant_int(Permissions, Bucket, Roles) -> - case riak_core_security:add_grant(Roles, Bucket, Permissions) of - ok -> - io:format("Successfully granted~n"), - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - end. - - -grant([Grants, "on", "any", "to", Users]) -> - grant_int(parse_grants(Grants), - any, - parse_roles(Users)); -grant([Grants, "on", Type, Bucket, "to", Users]) -> - grant_int(parse_grants(Grants), - { Type, Bucket }, - parse_roles(Users)); -grant([Grants, "on", Type, "to", Users]) -> - grant_int(parse_grants(Grants), - Type, - parse_roles(Users)); -grant(_) -> - io:format("Usage: grant on ( [bucket]|any) to ~n"), - error. - -revoke_int(Permissions, Bucket, Roles) -> - case riak_core_security:add_revoke(Roles, Bucket, Permissions) of - ok -> - io:format("Successfully revoked~n"), - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - end. - -revoke([Grants, "on", "any", "from", Users]) -> - revoke_int(parse_grants(Grants), - any, - parse_roles(Users)); -revoke([Grants, "on", Type, Bucket, "from", Users]) -> - revoke_int(parse_grants(Grants), - { Type, Bucket }, - parse_roles(Users)); -revoke([Grants, "on", Type, "from", Users]) -> - revoke_int(parse_grants(Grants), - Type, - parse_roles(Users)); -revoke(_) -> - io:format("Usage: revoke on [bucket] from ~n"), - error. - -print_grants([Name]) -> - case riak_core_security:print_grants(Name) of - ok -> - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - end. - -print_users([]) -> - riak_core_security:print_users(). - -print_user([User]) -> - case riak_core_security:print_user(User) of - ok -> - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - end. - - -print_groups([]) -> - riak_core_security:print_groups(). - -print_group([Group]) -> - case riak_core_security:print_group(Group) of - ok -> - ok; - Error -> - io:format(security_error_xlate(Error)), - io:format("~n"), - Error - end. - -print_sources([]) -> - riak_core_security:print_sources(). - -ciphers([]) -> - riak_core_security:print_ciphers(); - -ciphers([CipherList]) -> - case riak_core_security:set_ciphers(CipherList) of - ok -> - riak_core_security:print_ciphers(), - ok; - error -> - error - end. - -security_enable([]) -> - riak_core_security:enable(). - -security_disable([]) -> - riak_core_security:disable(). - -security_status([]) -> - case riak_core_security:status() of - enabled -> - io:format("Enabled~n"); - disabled -> - io:format("Disabled~n"); - enabled_but_no_capability -> - io:format("WARNING: Configured to be enabled, but not supported " - "on all nodes so it is disabled!~n") - end. - -parse_options(Options) -> - parse_options(Options, []). - -parse_options([], Acc) -> - Acc; -parse_options([H|T], Acc) -> - case re:split(H, "=", [{parts, 2}, {return, list}]) of - [Key, Value] when is_list(Key), is_list(Value) -> - parse_options(T, [{string:to_lower(Key), Value}|Acc]); - _Other -> - throw({error, {invalid_option, H}}) - end. - --spec parse_cidr(string()) -> {inet:ip_address(), non_neg_integer()}. -parse_cidr(CIDR) -> - [IP, Mask] = string:tokens(CIDR, "/"), - {ok, Addr} = inet_parse:address(IP), - {Addr, list_to_integer(Mask)}. - - -stat_show(Arg) -> - print_stats(find_entries(Arg)). - -find_entries(Arg) -> - find_entries(Arg, enabled). - -find_entries(Arg, Status0) -> - lists:map( - fun(A) -> - {S, Type, Status, DPs} = type_status_and_dps(A, Status0), - case S of - "[" ++ _ -> - {find_entries_1(S, Type, Status), DPs}; - _ -> - case legacy_search(S, Type, Status) of - false -> - {find_entries_1(S, Type, Status), DPs}; - Found -> - {Found, DPs} - end - end - end, Arg). - -type_status_and_dps(S, Status0) -> - [S1|Rest] = re:split(S, "/"), - {Type, Status, DPs} = type_status_and_dps(Rest, '_', Status0, default), - {S1, Type, Status, DPs}. - -type_status_and_dps([<<"type=", T/binary>>|Rest], _Type, Status, DPs) -> - NewType = case T of - <<"*">> -> '_'; - _ -> - try binary_to_existing_atom(T, latin1) - catch error:_ -> T - end - end, - type_status_and_dps(Rest, NewType, Status, DPs); -type_status_and_dps([<<"status=", St/binary>>|Rest], Type, _Status, DPs) -> - NewStatus = case St of - <<"enabled">> -> enabled; - <<"disabled">> -> disabled; - <<"*">> -> '_' - end, - type_status_and_dps(Rest, Type, NewStatus, DPs); -type_status_and_dps([DPsBin|Rest], Type, Status, DPs) -> - NewDPs = merge([binary_to_existing_atom(D,latin1) - || D <- re:split(DPsBin, ",")], DPs), - type_status_and_dps(Rest, Type, Status, NewDPs); -type_status_and_dps([], Type, Status, DPs) -> - {Type, Status, DPs}. - -merge([_|_] = DPs, default) -> - DPs; -merge([H|T], DPs) -> - case lists:member(H, DPs) of - true -> merge(T, DPs); - false -> merge(T, DPs ++ [H]) - end; -merge([], DPs) -> - DPs. - - -find_entries_1(S, Type, Status) -> - Patterns = lists:flatten([parse_stat_entry(S, Type, Status)]), - exometer:select(Patterns). - - -legacy_search(S, Type, Status) -> - case re:run(S, "\\.", []) of - {match,_} -> - false; - nomatch -> - Re = <<"^", (make_re(S))/binary, "$">>, - [{S, legacy_search_1(Re, Type, Status)}] - end. - -make_re(S) -> - repl(split_pattern(S, [])). - - -repl([single|T]) -> - <<"[^_]*", (repl(T))/binary>>; -repl([double|T]) -> - <<".*", (repl(T))/binary>>; -repl([H|T]) -> - <>; -repl([]) -> - <<>>. - - -split_pattern(<<>>, Acc) -> - lists:reverse(Acc); -split_pattern(<<"**", T/binary>>, Acc) -> - split_pattern(T, [double|Acc]); -split_pattern(<<"*", T/binary>>, Acc) -> - split_pattern(T, [single|Acc]); -split_pattern(B, Acc) -> - case binary:match(B, <<"*">>) of - {Pos,_} -> - <> = B, - split_pattern(Rest, [Bef|Acc]); - nomatch -> - lists:reverse([B|Acc]) - end. - -legacy_search_1(N, Type, Status) -> - Found = exometer_alias:regexp_foldr(N, fun(Alias, Entry, DP, Acc) -> - orddict:append(Entry, {DP,Alias}, Acc) - end, orddict:new()), - lists:foldr( - fun({Entry, DPs}, Acc) -> - case match_type(Entry, Type) of - true -> - DPnames = [D || {D,_} <- DPs], - case exometer:get_value(Entry, DPnames) of - {ok, Values} when is_list(Values) -> - [{Entry, zip_values(Values, DPs)} | Acc]; - {ok, disabled} when Status=='_'; - Status==disabled -> - [{Entry, zip_disabled(DPs)} | Acc]; - _ -> - [{Entry, [{D,undefined} || D <- DPnames]}|Acc] - end; - false -> - Acc - end - end, [], orddict:to_list(Found)). - -match_type(_, '_') -> - true; -match_type(Name, T) -> - T == exometer:info(Name, type). - -zip_values([{D,V}|T], DPs) -> - {_,N} = lists:keyfind(D, 1, DPs), - [{D,V,N}|zip_values(T, DPs)]; -zip_values([], _) -> - []. - -zip_disabled(DPs) -> - [{D,disabled,N} || {D,N} <- DPs]. - -print_stats([]) -> - io:fwrite("No matching stats~n", []); -print_stats(Entries) -> - lists:foreach( - fun({[{LP, []}], _}) -> - io:fwrite( - "== ~s (Legacy pattern): No matching stats ==~n", [LP]); - ({[{LP, Matches}], _}) -> - io:fwrite("== ~s (Legacy pattern): ==~n", [LP]), - [[io:fwrite("~p: ~p (~p/~p)~n", [N, V, E, DP]) - || {DP,V,N} <- DPs] || {E, DPs} <- Matches]; - ({[], _}) -> - io:fwrite("No matching stats~n", []); - ({Entries1, DPs}) -> - [io:fwrite("~p: ~p~n", [E, get_value(E, Status, DPs)]) - || {E, _, Status} <- Entries1] - end, Entries). - -get_value(_, disabled, _) -> - disabled; -get_value(E, _Status, DPs) -> - case exometer:get_value(E, DPs) of - {ok, V} -> V; - {error,_} -> unavailable - end. - -stat_change(Arg, ToStatus) -> - lists:foreach( - fun({[{LP, []}], _}) -> - io:fwrite( - "== ~s (Legacy pattern): No matching stats ==~n", [LP]); - ({[{LP, Matches}], _}) -> - io:fwrite("== ~s (Legacy pattern): ==~n", [LP]), - [io:fwrite("~p: ~p~n", [N, change_status(N, ToStatus)]) - || {N, _} <- Matches]; - ({[], _}) -> - io:fwrite("No matching stats~n", []); - ({Entries, _}) -> - [io:fwrite("~p: ~p~n", [N, change_status(N, ToStatus)]) - || {N, _, _} <- Entries] - end, find_entries(Arg, '_')). - -stat_enable(Arg) -> - stat_change(Arg, enabled). - -stat_disable(Arg) -> - stat_change(Arg, disabled). - -stat_reset(Arg) -> - lists:foreach( - fun({[{LP, []}], _}) -> - io:fwrite( - "== ~s (Legacy pattern): No matching stats ==~n", [LP]); - ({[{LP, Matches}], _}) -> - io:fwrite("== ~s (Legacy pattern): ==~n", [LP]), - [io:fwrite("~p: ~p~n", [N, exometer:reset(N)]) - || {N, _} <- Matches]; - ({Entries, _}) -> - [io:fwrite("~p: ~p~n", [N, exometer:reset(N)]) - || {N, _, _} <- Entries] - end, find_entries(Arg, enabled)). - -change_status(N, St) -> - case exometer:setopts(N, [{status, St}]) of - ok -> - St; - Error -> - Error - end. - -stat_info(Arg) -> - {Attrs, RestArg} = pick_info_attrs(split_arg(Arg)), - [print_info(E, Attrs) || E <- find_entries(RestArg, '_')]. - -pick_info_attrs(Arg) -> - case lists:foldr( - fun("-name" , {As, Ps}) -> {[name |As], Ps}; - ("-type" , {As, Ps}) -> {[type |As], Ps}; - ("-module" , {As, Ps}) -> {[module |As], Ps}; - ("-value" , {As, Ps}) -> {[value |As], Ps}; - ("-cache" , {As, Ps}) -> {[cache |As], Ps}; - ("-status" , {As, Ps}) -> {[status |As], Ps}; - ("-timestamp", {As, Ps}) -> {[timestamp|As], Ps}; - ("-options" , {As, Ps}) -> {[options |As], Ps}; - (P, {As, Ps}) -> {As, [P|Ps]} - end, {[], []}, Arg) of - {[], Rest} -> - {[name, type, module, value, cache, status, timestamp, options], Rest}; - Other -> - Other - end. - -print_info({[{LP, []}], _}, _) -> - io:fwrite("== ~s (Legacy pattern): No matching stats ==~n", [LP]); -print_info({[{LP, Matches}], _}, Attrs) -> - io:fwrite("== ~s (Legacy pattern): ==~n", [LP]), - lists:foreach( - fun({N, _}) -> - print_info_1(N, Attrs) - end, Matches); -print_info({[], _}, _) -> - io_lib:fwrite("No matching stats~n", []); -print_info({Entries, _}, Attrs) -> - lists:foreach( - fun({N,_,_}) -> - print_info_1(N, Attrs) - end, Entries). - -print_info_1(N, [A|Attrs]) -> - Hdr = lists:flatten(io_lib:fwrite("~p: ", [N])), - Pad = lists:duplicate(length(Hdr), $\s), - Info = exometer:info(N), - Status = proplists:get_value(status, Info, enabled), - Body = [io_lib:fwrite("~w = ~p~n", [A, proplists:get_value(A, Info)]) - | lists:map(fun(value) -> - io_lib:fwrite(Pad ++ "~w = ~p~n", - [value, get_value(N, Status, default)]); - (Ax) -> - io_lib:fwrite(Pad ++ "~w = ~p~n", - [Ax, proplists:get_value(Ax, Info)]) - end, Attrs)], - io:put_chars([Hdr, Body]). - -split_arg([Str]) -> - re:split(Str, "\\s", [{return,list}]). - -parse_stat_entry([], Type, Status) -> - {{[riak_core_stat:prefix()] ++ '_', Type, '_'}, [{'=:=','$status',Status}], ['$_']}; -parse_stat_entry("*", Type, Status) -> - parse_stat_entry([], Type, Status); -parse_stat_entry("[" ++ _ = Expr, _Type, _Status) -> - case erl_scan:string(ensure_trailing_dot(Expr)) of - {ok, Toks, _} -> - case erl_parse:parse_exprs(Toks) of - {ok, [Abst]} -> - partial_eval(Abst); - Error -> - io:fwrite("(Parse error for ~p: ~p~n", [Expr, Error]), - [] - end; - ScanErr -> - io:fwrite("(Scan error for ~p: ~p~n", [Expr, ScanErr]), - [] - end; -parse_stat_entry(Str, Type, Status) when Status==enabled; Status==disabled -> - Parts = re:split(Str, "\\.", [{return,list}]), - Heads = replace_parts(Parts), - [{{H,Type,Status}, [], ['$_']} || H <- Heads]; -parse_stat_entry(Str, Type, '_') -> - Parts = re:split(Str, "\\.", [{return,list}]), - Heads = replace_parts(Parts), - [{{H,Type,'_'}, [], ['$_']} || H <- Heads]; -parse_stat_entry(_, _, Status) -> - io:fwrite("(Illegal status: ~p~n", [Status]). - - -ensure_trailing_dot(Str) -> - case lists:reverse(Str) of - "." ++ _ -> - Str; - _ -> - Str ++ "." - end. - -partial_eval({cons,_,H,T}) -> - [partial_eval(H) | partial_eval(T)]; -%% partial_eval({nil,_}) -> -%% []; -partial_eval({tuple,_,Elems}) -> - list_to_tuple([partial_eval(E) || E <- Elems]); -%% partial_eval({T,_,X}) when T==atom; T==integer; T==float -> -%% X; -partial_eval({op,_,'++',L1,L2}) -> - partial_eval(L1) ++ partial_eval(L2); -partial_eval(X) -> - erl_parse:normalise(X). - -replace_parts(Parts) -> - case split("**", Parts) of - {_, []} -> - [replace_parts_1(Parts)]; - {Before, After} -> - Head = replace_parts_1(Before), - Tail = replace_parts_1(After), - [Head ++ Pad ++ Tail || Pad <- pads()] - end. - -pads() -> - [['_'], - ['_','_'], - ['_','_','_'], - ['_','_','_','_'], - ['_','_','_','_','_'], - ['_','_','_','_','_','_'], - ['_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_','_','_','_','_','_','_','_'], - ['_','_','_','_','_','_','_','_','_','_','_','_','_','_','_','_']]. - -split(X, L) -> - split(L, X, []). - -split([H|T], H, Acc) -> - {lists:reverse(Acc), T}; -split([H|T], X, Acc) -> - split(T, X, [H|Acc]); -split([], _, Acc) -> - {lists:reverse(Acc), []}. - - - -replace_parts_1([H|T]) -> - R = replace_part(H), - case T of - ["**"] -> [R] ++ '_'; - _ -> [R|replace_parts_1(T)] - end; -replace_parts_1([]) -> - []. - -replace_part(H) -> - case H of - "*" -> '_'; - "'" ++ _ -> - case erl_scan:string(H) of - {ok, [{atom, _, A}], _} -> - A; - Error -> - error(Error) - end; - [C|_] when C >= $0, C =< $9 -> - try list_to_integer(H) - catch - error:_ -> list_to_atom(H) - end; - _ -> list_to_atom(H) - end. diff --git a/src/riak_core_console_table.erl b/src/riak_core_console_table.erl deleted file mode 100644 index 76f9ad903..000000000 --- a/src/riak_core_console_table.erl +++ /dev/null @@ -1,165 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% Copyright (c) 2013 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(riak_core_console_table). - -%% API --export([print/2, print/3, - create_table/2]). - --spec print(list(), list()) -> ok. -print(_Spec, []) -> - ok; -print(Spec, Rows) -> - Table = create_table(Spec, Rows), - io:format("~n~ts~n", [Table]). - - --spec print(list(), list(), list()) -> ok. -print(_Hdr, _Spec, []) -> - ok; -print(Header, Spec, Rows) -> - Table = create_table(Spec, Rows), - io:format("~ts~n~n~ts~n", [Header, Table]). - --spec create_table(list(), list()) -> iolist(). -create_table(Spec, Rows) -> - Lengths = get_row_length(Spec, Rows), - Length = lists:sum(Lengths)+2, - AdjustedSpec = [{Field, NewLength} || {{Field, _DefaultLength}, NewLength} - <- lists:zip(Spec, Lengths)], - create_table(AdjustedSpec, Rows, Length, []). - --spec create_table(list(), list(), non_neg_integer(), iolist()) -> iolist(). -create_table(Spec, Rows, Length, []) -> - FirstThreeRows = [vertical_border(Spec), titles(Spec), - vertical_border(Spec)], - create_table(Spec, Rows, Length, FirstThreeRows); -create_table(_Spec, [], _Length, IoList) when length(IoList) == 3 -> - %% table had no rows, no final row needed - lists:reverse(IoList); -create_table(Spec, [], _Length, IoList) -> - BottomBorder = vertical_border(Spec), - %% There are no more rows to print so return the table - lists:reverse([BottomBorder | IoList]); -create_table(Spec, [Row | Rows], Length, IoList) -> - create_table(Spec, Rows, Length, [row(Spec, Row) | IoList]). - --spec get_row_length(list(tuple()), list()) -> list(non_neg_integer()). -get_row_length(Spec, Rows) -> - Res = lists:foldl(fun({_Name, MinSize}, Total) -> - Longest = find_longest_field(Rows, length(Total)+1), - Size = erlang:max(MinSize, Longest), - [Size | Total] - end, [], Spec), - lists:reverse(Res). - --spec row(list(), list(string())) -> iolist(). -row(Spec, Row0) -> - %% handle multiline fields - Rows = expand_row(Row0), - [ - [ $| | lists:reverse( - ["\n" | lists:foldl(fun({{_, Size}, Str}, Acc) -> - [align(Str, Size) | Acc] - end, [], lists:zip(Spec, Row))])] || Row <- Rows]. - --spec titles(list()) -> iolist(). -titles(Spec) -> - [ $| | lists:reverse( - ["\n" | lists:foldl(fun({Title, Size}, TitleRow) -> - [align(atom_to_list(Title), Size) | TitleRow] - end, [], Spec)])]. - --spec align(string(), non_neg_integer()) -> iolist(). -align(undefined, Size) -> - align("", Size); -align(Str, Size) when is_integer(Str) -> - align(integer_to_list(Str), Size); -align(Str, Size) when is_binary(Str) -> - align(unicode:characters_to_list(Str, utf8), Size); -align(Str, Size) when is_atom(Str) -> - align(atom_to_list(Str), Size); -%align(Str, Size) when is_list(Str), length(Str) > Size -> - %Truncated = lists:sublist(Str, Size), - %Truncated ++ " |"; -%align(Str, Size) when is_list(Str), length(Str) =:= Size -> - %Str ++ " |"; -align(Str, Size) when is_list(Str) -> - string:centre(Str, Size) ++ "|"; -align(Term, Size) -> - Str = lists:flatten(io_lib:format("~p", [Term])), - align(Str, Size). - --spec vertical_border(list(tuple())) -> string(). -vertical_border(Spec) -> - lists:reverse([$\n, [[char_seq(Length, $-), $+] || - {_Name, Length} <- Spec], $+]). - -%-spec spaces(non_neg_integer()) -> string(). -%spaces(Length) -> - %char_seq(Length, $\s). - --spec char_seq(non_neg_integer(), char()) -> string(). -char_seq(Length, Char) -> - [Char || _ <- lists:seq(1, Length)]. - --spec find_longest_field(list(), pos_integer()) -> non_neg_integer(). -find_longest_field(Rows, ColumnNo) -> - lists:foldl(fun(Row, Longest) -> - erlang:max(Longest, - field_length(lists:nth(ColumnNo, Row))) - end, 0, Rows). - -field_length(Field) when is_atom(Field) -> - field_length(atom_to_list(Field)); -field_length(Field) when is_binary(Field) -> - field_length(unicode:characters_to_list(Field, utf8)); -field_length(Field) when is_list(Field) -> - Lines = string:tokens(lists:flatten(Field), "\n"), - lists:foldl(fun(Line, Longest) -> - erlang:max(Longest, - length(Line)) - end, 0, Lines); -field_length(Field) -> - field_length(io_lib:format("~p", [Field])). - -expand_field(Field) when is_atom(Field) -> - expand_field(atom_to_list(Field)); -expand_field(Field) when is_binary(Field) -> - expand_field(unicode:characters_to_list(Field, utf8)); -expand_field(Field) when is_list(Field) -> - string:tokens(lists:flatten(Field), "\n"); -expand_field(Field) -> - expand_field(io_lib:format("~p", [Field])). - -expand_row(Row) -> - {ExpandedRow, MaxHeight} = lists:foldl(fun(Field, {Fields, Max}) -> - EF = expand_field(Field), - {[EF|Fields], erlang:max(Max, length(EF))} - end, {[], 0}, lists:reverse(Row)), - PaddedRow = [pad_field(Field, MaxHeight) || Field <- ExpandedRow], - [ [ lists:nth(N, Field) || Field <- PaddedRow] - || N <- lists:seq(1, MaxHeight)]. - -pad_field(Field, MaxHeight) when length(Field) < MaxHeight -> - Field ++ ["" || _ <- lists:seq(1, MaxHeight - length(Field))]; -pad_field(Field, _MaxHeight) -> - Field. diff --git a/src/riak_core_coverage_fsm.erl b/src/riak_core_coverage_fsm.erl deleted file mode 100644 index 394531815..000000000 --- a/src/riak_core_coverage_fsm.erl +++ /dev/null @@ -1,341 +0,0 @@ -%% ------------------------------------------------------------------- -%% -%% riak_core_coverage_fsm: Distribute work to a covering set of VNodes. -%% -%% -%% 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 The coverage fsm is a behavior used to create -%% a plan to cover a set of VNodes, distribute -%% a specified command to each VNode in the plan -%% and then compile the results. -%% -%% The number of VNodes required for full coverage -%% is based on the number of partitions, the bucket -%% n_val, and the number of primary VNodes from the -%% preference list that are configured to be used by -%% the module implementing this behavior. -%% -%% Modules implementing this behavior should return -%% a 5 member tuple from their init function that looks -%% like this: -%% -%% `{Request, VNodeSelector, NVal, PrimaryVNodeCoverage, -%% NodeCheckService, VNodeMaster, Timeout, State}' -%% -%% The description of the tuple members is as follows: -%% -%%

hvg1Jk_$rB|0yK>WW^Ada0V~1sNxhmX7 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�Pb(SYTo2RGx%rg;tbQTyG4(MU4F61fd6lYes0E* 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�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