rpc_request_task::rpc_request_task(message_ptr& request, service_node* node) : task(task_code(request->header().local_rpc_code), request->header().client.hash, node), _request(request) { dbg_dassert (TASK_TYPE_RPC_REQUEST == spec().type, "task type must be RPC_REQUEST, please use DEFINE_TASK_CODE_RPC to define the task code"); }
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); }