From 9a2638b1f1a9faa1e9a19c297a9bb4dca8075eea Mon Sep 17 00:00:00 2001 From: Marc Hesse Date: Mon, 17 Jun 2013 17:11:04 -0700 Subject: [PATCH] adding auth metadata to vector clock conflict tracker, and fixing command in admin cli --- .../administration/admin_tracker.cc | 17 ++++++----- .../administration/admin_tracker.hpp | 3 +- .../administration/cli/admin_cluster_link.cc | 10 +++---- .../cli/admin_command_parser.cc | 4 +-- .../issues/vector_clock_conflict.cc | 30 +++++++++++++------ .../issues/vector_clock_conflict.hpp | 6 ++-- src/clustering/administration/main/import.cc | 5 ++-- src/clustering/administration/main/serve.cc | 5 ++-- 8 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/clustering/administration/admin_tracker.cc b/src/clustering/administration/admin_tracker.cc index e9a21105b60..d9183586514 100644 --- a/src/clustering/administration/admin_tracker.cc +++ b/src/clustering/administration/admin_tracker.cc @@ -7,7 +7,8 @@ #include "rpc/semilattice/view/field.hpp" admin_tracker_t::admin_tracker_t( - boost::shared_ptr > semilattice_view, + boost::shared_ptr > cluster_view, + boost::shared_ptr > auth_view, const clone_ptr_t > > &directory_view) : issue_aggregator(), @@ -19,28 +20,28 @@ admin_tracker_t::admin_tracker_t( remote_issue_tracker_feed(&issue_aggregator, &remote_issue_tracker), machine_down_issue_tracker( - semilattice_view, + cluster_view, directory_view->subview( field_getter_t(&cluster_directory_metadata_t::machine_id))), machine_down_issue_tracker_feed(&issue_aggregator, &machine_down_issue_tracker), - name_conflict_issue_tracker(semilattice_view), + name_conflict_issue_tracker(cluster_view), name_conflict_issue_tracker_feed(&issue_aggregator, &name_conflict_issue_tracker), - vector_clock_conflict_issue_tracker(semilattice_view), + vector_clock_conflict_issue_tracker(cluster_view, auth_view), vector_clock_issue_tracker_feed(&issue_aggregator, &vector_clock_conflict_issue_tracker), - mc_pinnings_shards_mismatch_issue_tracker(metadata_field(&cluster_semilattice_metadata_t::memcached_namespaces, semilattice_view)), + mc_pinnings_shards_mismatch_issue_tracker(metadata_field(&cluster_semilattice_metadata_t::memcached_namespaces, cluster_view)), mc_pinnings_shards_mismatch_issue_tracker_feed(&issue_aggregator, &mc_pinnings_shards_mismatch_issue_tracker), - dummy_pinnings_shards_mismatch_issue_tracker(metadata_field(&cluster_semilattice_metadata_t::dummy_namespaces, semilattice_view)), + dummy_pinnings_shards_mismatch_issue_tracker(metadata_field(&cluster_semilattice_metadata_t::dummy_namespaces, cluster_view)), dummy_pinnings_shards_mismatch_issue_tracker_feed(&issue_aggregator, &dummy_pinnings_shards_mismatch_issue_tracker), - unsatisfiable_goals_issue_tracker(semilattice_view), + unsatisfiable_goals_issue_tracker(cluster_view), unsatisfiable_goals_issue_tracker_feed(&issue_aggregator, &unsatisfiable_goals_issue_tracker), last_seen_tracker( - metadata_field(&cluster_semilattice_metadata_t::machines, semilattice_view), + metadata_field(&cluster_semilattice_metadata_t::machines, cluster_view), directory_view->subview( field_getter_t(&cluster_directory_metadata_t::machine_id))) { diff --git a/src/clustering/administration/admin_tracker.hpp b/src/clustering/administration/admin_tracker.hpp index 925086a7508..50c17bdc402 100644 --- a/src/clustering/administration/admin_tracker.hpp +++ b/src/clustering/administration/admin_tracker.hpp @@ -25,7 +25,8 @@ template class watchable_t; struct admin_tracker_t { admin_tracker_t( - boost::shared_ptr > semilattice_view, + boost::shared_ptr > cluster_view, + boost::shared_ptr > auth_view, const clone_ptr_t > > &directory_view); ~admin_tracker_t(); diff --git a/src/clustering/administration/cli/admin_cluster_link.cc b/src/clustering/administration/cli/admin_cluster_link.cc index 1c6bc6e7663..aacc0b99f0e 100644 --- a/src/clustering/administration/cli/admin_cluster_link.cc +++ b/src/clustering/administration/cli/admin_cluster_link.cc @@ -287,7 +287,7 @@ admin_cluster_link_t::admin_cluster_link_t(const peer_address_set_t &joins, int directory_manager_client_run(&directory_manager_client, directory_read_manager.get()), message_multiplexer_run(&message_multiplexer), connectivity_cluster_run(&connectivity_cluster, ip_address_t::get_local_addresses(std::set(), false), 0, &message_multiplexer_run, client_port, &heartbeat_manager), - admin_tracker(cluster_metadata_view, directory_read_manager->get_root_view()), + admin_tracker(cluster_metadata_view, auth_metadata_view, directory_read_manager->get_root_view()), initial_joiner(&connectivity_cluster, &connectivity_cluster_run, joins, 5000) { wait_interruptible(initial_joiner.get_ready_signal(), interruptor); @@ -2332,11 +2332,12 @@ void admin_cluster_link_t::do_admin_set_auth(const admin_command_parser_t::comma auth_semilattice_metadata_t auth_metadata = change_request.get(); std::string key = guarantee_param_0(data.params, "key"); - if (!auth_metadata.auth_key.get_mutable().assign_value(key)) { + auth_key_t new_auth_key; + if (!new_auth_key.assign_value(key)) { throw admin_cluster_exc_t(strprintf("the provided authorization key is too long, max length: %i", auth_key_t::max_length)); } - auth_metadata.auth_key.upgrade_version(change_request_id); + auth_metadata.auth_key = auth_metadata.auth_key.make_resolving_version(new_auth_key, change_request_id); if (!change_request.update(auth_metadata)) { throw admin_retry_exc_t(); @@ -2348,8 +2349,7 @@ void admin_cluster_link_t::do_admin_unset_auth(const admin_command_parser_t::com change_request(&mailbox_manager, choose_auth_sync_peer()); auth_semilattice_metadata_t auth_metadata = change_request.get(); - auth_metadata.auth_key.get_mutable() = auth_key_t(); - auth_metadata.auth_key.upgrade_version(change_request_id); + auth_metadata.auth_key = auth_metadata.auth_key.make_resolving_version(auth_key_t(), change_request_id); if (!change_request.update(auth_metadata)) { throw admin_retry_exc_t(); diff --git a/src/clustering/administration/cli/admin_command_parser.cc b/src/clustering/administration/cli/admin_command_parser.cc index ee207c56f7e..7488b48795d 100644 --- a/src/clustering/administration/cli/admin_command_parser.cc +++ b/src/clustering/administration/cli/admin_command_parser.cc @@ -557,8 +557,8 @@ void admin_command_parser_t::build_command_descriptions() { info->add_positional("split-points", -1, true); // TODO: list possible shards info = add_command(resolve_command, resolve_command, resolve_usage, &admin_cluster_link_t::do_admin_resolve, &commands); - info->add_positional("id", 1, false)->add_option("!conflict"); - info->add_positional("field", 1, true); // TODO: list the conflicted fields in the previous id + info->add_positional("field", 1, true); + info->add_positional("id", 1, false)->add_option("!conflict"); // TODO: list the conflicted fields in the previous id info = add_command(set_name_command, set_name_command, set_name_usage, &admin_cluster_link_t::do_admin_set_name, &commands); info->add_positional("id", 1, true)->add_option("!id"); diff --git a/src/clustering/administration/issues/vector_clock_conflict.cc b/src/clustering/administration/issues/vector_clock_conflict.cc index 8f6ed170bea..a56ccc8be13 100644 --- a/src/clustering/administration/issues/vector_clock_conflict.cc +++ b/src/clustering/administration/issues/vector_clock_conflict.cc @@ -39,41 +39,53 @@ void check_namespaces_for_protocol( } /* anonymous namespace */ -vector_clock_conflict_issue_tracker_t::vector_clock_conflict_issue_tracker_t(boost::shared_ptr > _semilattice_view) - : semilattice_view(_semilattice_view) { } +vector_clock_conflict_issue_tracker_t::vector_clock_conflict_issue_tracker_t( + boost::shared_ptr > _cluster_view, + boost::shared_ptr > _auth_view) : + cluster_view(_cluster_view), + auth_view(_auth_view) { } + vector_clock_conflict_issue_tracker_t::~vector_clock_conflict_issue_tracker_t() { } std::list > vector_clock_conflict_issue_tracker_t::get_vector_clock_issues() { - cluster_semilattice_metadata_t metadata = semilattice_view->get(); + cluster_semilattice_metadata_t cluster_metadata = cluster_view->get(); + auth_semilattice_metadata_t auth_metadata = auth_view->get(); std::list > issues; - check_namespaces_for_protocol(metadata.memcached_namespaces, &issues); - check_namespaces_for_protocol(metadata.dummy_namespaces, &issues); - check_namespaces_for_protocol(metadata.rdb_namespaces, &issues); + // Check cluster metadata + check_namespaces_for_protocol(cluster_metadata.memcached_namespaces, &issues); + check_namespaces_for_protocol(cluster_metadata.dummy_namespaces, &issues); + check_namespaces_for_protocol(cluster_metadata.rdb_namespaces, &issues); for (datacenters_semilattice_metadata_t::datacenter_map_t::const_iterator it = - metadata.datacenters.datacenters.begin(); it != metadata.datacenters.datacenters.end(); it++) { + cluster_metadata.datacenters.datacenters.begin(); + it != cluster_metadata.datacenters.datacenters.end(); it++) { if (!it->second.is_deleted()) { check("datacenter", it->first, "name", it->second.get().name, &issues); } } for (databases_semilattice_metadata_t::database_map_t::const_iterator it = - metadata.databases.databases.begin(); it != metadata.databases.databases.end(); it++) { + cluster_metadata.databases.databases.begin(); + it != cluster_metadata.databases.databases.end(); it++) { if (!it->second.is_deleted()) { check("database", it->first, "name", it->second.get().name, &issues); } } for (machines_semilattice_metadata_t::machine_map_t::const_iterator it = - metadata.machines.machines.begin(); it != metadata.machines.machines.end(); it++) { + cluster_metadata.machines.machines.begin(); + it != cluster_metadata.machines.machines.end(); it++) { if (!it->second.is_deleted()) { check("machine", it->first, "datacenter_uuid", it->second.get().datacenter, &issues); check("machine", it->first, "name", it->second.get().name, &issues); } } + // Check auth metadata + check("auth_key", nil_uuid(), "auth_key", auth_metadata.auth_key, &issues); + return issues; } diff --git a/src/clustering/administration/issues/vector_clock_conflict.hpp b/src/clustering/administration/issues/vector_clock_conflict.hpp index 6abd84b76d8..ef1402734a2 100644 --- a/src/clustering/administration/issues/vector_clock_conflict.hpp +++ b/src/clustering/administration/issues/vector_clock_conflict.hpp @@ -55,14 +55,16 @@ class vector_clock_conflict_issue_t : public global_issue_t { class vector_clock_conflict_issue_tracker_t : public global_issue_tracker_t { public: - explicit vector_clock_conflict_issue_tracker_t(boost::shared_ptr > _semilattice_view); + explicit vector_clock_conflict_issue_tracker_t(boost::shared_ptr > _cluster_view, + boost::shared_ptr > _auth_view); ~vector_clock_conflict_issue_tracker_t(); std::list > get_issues(); std::list > get_vector_clock_issues(); private: - boost::shared_ptr > semilattice_view; + boost::shared_ptr > cluster_view; + boost::shared_ptr > auth_view; DISABLE_COPYING(vector_clock_conflict_issue_tracker_t); }; diff --git a/src/clustering/administration/main/import.cc b/src/clustering/administration/main/import.cc index 3fee756dc27..e2785e69750 100644 --- a/src/clustering/administration/main/import.cc +++ b/src/clustering/administration/main/import.cc @@ -144,8 +144,9 @@ bool run_json_import(extproc::spawner_info_t *spawner_info, // Skipped field_copier_t, for fun. - admin_tracker_t admin_tracker( - semilattice_manager_cluster.get_root_view(), directory_read_manager.get_root_view()); + admin_tracker_t admin_tracker(semilattice_manager_cluster.get_root_view(), + auth_manager_cluster.get_root_view(), + directory_read_manager.get_root_view()); perfmon_collection_t proc_stats_collection; perfmon_membership_t proc_stats_membership(&get_global_perfmon_collection(), &proc_stats_collection, "proc"); diff --git a/src/clustering/administration/main/serve.cc b/src/clustering/administration/main/serve.cc index 0de06cfbae0..686b0d33bfe 100644 --- a/src/clustering/administration/main/serve.cc +++ b/src/clustering/administration/main/serve.cc @@ -173,8 +173,9 @@ bool do_serve( local_issue_tracker.get_issues_watchable(), &our_root_directory_variable); - admin_tracker_t admin_tracker( - semilattice_manager_cluster.get_root_view(), directory_read_manager.get_root_view()); + admin_tracker_t admin_tracker(semilattice_manager_cluster.get_root_view(), + auth_manager_cluster.get_root_view(), + directory_read_manager.get_root_view()); perfmon_collection_t proc_stats_collection; perfmon_membership_t proc_stats_membership(&get_global_perfmon_collection(), &proc_stats_collection, "proc");