int replication_app_base::dispatch_rpc_call(int code, message_ptr& request, bool ack_client) { auto it = _handlers.find(code); if (it != _handlers.end()) { if (ack_client) { message_ptr response = request->create_response(); int err = 0; marshall(response->writer(), err); it->second(request, response); } else { message_ptr response(nullptr); it->second(request, response); } } else if (ack_client) { message_ptr response = request->create_response(); error_code err = ERR_HANDLER_NOT_FOUND; marshall(response->writer(), (int)err); rpc::reply(response); } return 0; }
void meta_service::on_request(message_ptr& msg) { meta_request_header hdr; unmarshall(msg, hdr); meta_response_header rhdr; bool is_primary = _state->get_meta_server_primary(rhdr.primary_address); if (is_primary) is_primary = (primary_address() == rhdr.primary_address); rhdr.err = ERR_SUCCESS; message_ptr resp = msg->create_response(); if (!is_primary) { rhdr.err = ERR_TALK_TO_OTHERS; marshall(resp, rhdr); } else if (hdr.rpc_tag == RPC_CM_QUERY_NODE_PARTITIONS) { configuration_query_by_node_request request; configuration_query_by_node_response response; unmarshall(msg, request); query_configuration_by_node(request, response); marshall(resp, rhdr); marshall(resp, response); } else if (hdr.rpc_tag == RPC_CM_QUERY_PARTITION_CONFIG_BY_INDEX) { configuration_query_by_index_request request; configuration_query_by_index_response response; unmarshall(msg, request); query_configuration_by_index(request, response); marshall(resp, rhdr); marshall(resp, response); } else if (hdr.rpc_tag == RPC_CM_UPDATE_PARTITION_CONFIGURATION) { update_configuration(msg, resp); return; } else { dassert(false, "unknown rpc tag %x (%s)", hdr.rpc_tag, task_code(hdr.rpc_tag).to_string()); } rpc::reply(resp); }
void replica::response_client_message(message_ptr& request, error_code error, decree d/* = invalid_decree*/) { if (nullptr == request) return; message_ptr resp = request->create_response(); resp->writer().write(error); dassert(error != ERR_OK, ""); dinfo("handle replication request with rpc_id = %016llx failed, err = %s", request->header().rpc_id, error.to_string()); rpc::reply(resp); }
void command_manager::on_remote_cli(message_ptr& request) { std::string cmd; unmarshall(request->reader(), cmd); std::vector<std::string> args; unmarshall(request->reader(), args); std::string result; run_command(cmd, args, result); auto resp = request->create_response(); marshall(resp->writer(), result); ::dsn::service::rpc::reply(resp); }