blob: d3103ee474a90ff775d41f644d9ae6d2b25b22ea [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// 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.
#include <memory>
#include <string>
#include "common/partition_split_common.h"
#include "partition_split_types.h"
#include "runtime/task/task.h"
#include "server_state.h"
namespace dsn {
class error_code;
class zrwlock_nr;
namespace replication {
class app_state;
class meta_service;
class meta_split_service
{
public:
explicit meta_split_service(meta_service *meta);
private:
// client -> meta to start split
void start_partition_split(start_split_rpc rpc);
void do_start_partition_split(std::shared_ptr<app_state> app, start_split_rpc rpc);
// client -> meta to query split
void query_partition_split(query_split_rpc rpc) const;
// client -> meta to pause/restart/cancel split
void control_partition_split(control_split_rpc rpc);
// pause/restart specific one partition
void do_control_single(std::shared_ptr<app_state> app, control_split_rpc rpc);
// pause all splitting partitions or restart all paused partitions or cancel all partitions
void do_control_all(std::shared_ptr<app_state> app, control_split_rpc rpc);
// primary parent -> meta_server to register child
void register_child_on_meta(register_child_rpc rpc);
// meta -> remote storage to update child replica config
dsn::task_ptr add_child_on_remote_storage(register_child_rpc rpc, bool create_new);
void
on_add_child_on_remote_storage_reply(error_code ec, register_child_rpc rpc, bool create_new);
// primary replica -> meta to notify group pause or cancel split succeed
void notify_stop_split(notify_stop_split_rpc rpc);
void do_cancel_partition_split(std::shared_ptr<app_state> app, notify_stop_split_rpc rpc);
// primary replica -> meta to query child state
void query_child_state(query_child_state_rpc rpc);
static const std::string control_type_str(split_control_type::type type)
{
std::string str = "";
if (type == split_control_type::PAUSE) {
str = "pause";
} else if (type == split_control_type::RESTART) {
str = "restart";
} else if (type == split_control_type::CANCEL) {
str = "cancel";
}
return str;
}
private:
friend class meta_service;
friend class meta_split_service_test;
meta_service *_meta_svc;
server_state *_state;
zrwlock_nr &app_lock() const { return _state->_lock; }
};
} // namespace replication
} // namespace dsn