rpc_request_task::rpc_request_task(message_ex* request, rpc_handler_ptr& h, service_node* node) : task(dsn_task_code_t(request->local_rpc_code), request->header->client.hash, node), _request(request), _handler(h) { 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"); _request->add_ref(); // released in dctor }
TEST(core, group_address_change_leader) { ::dsn::rpc_address addr = build_group(); error_code rpc_err; auto typed_callback = [addr, &rpc_err](error_code err_code, const std::string& result)->void { rpc_err = err_code; if (ERR_OK == err_code) { ::dsn::rpc_address addr_got; ddebug("talk to others callback, result: %s", result.c_str()); EXPECT_TRUE(addr_got.from_string_ipv4(result.c_str())); EXPECT_EQ(TEST_PORT_END, addr_got.port()); } }; ::dsn::task_ptr resp_task; // not update leader on forwarding addr.group_address()->set_update_leader_automatically(false); dsn_group_set_leader(addr.group_handle(), ::dsn::rpc_address("localhost", TEST_PORT_BEGIN).c_addr()); resp_task = ::dsn::rpc::call(addr, dsn_task_code_t(RPC_TEST_STRING_COMMAND), std::string("expect_talk_to_others"), nullptr, typed_callback); resp_task->wait(); if (rpc_err == ERR_OK) { EXPECT_EQ(::dsn::rpc_address("localhost", TEST_PORT_BEGIN), ::dsn::rpc_address(dsn_group_get_leader(addr.group_handle()))); } // update leader on forwarding addr.group_address()->set_update_leader_automatically(true); dsn_group_set_leader(addr.group_handle(), ::dsn::rpc_address("localhost", TEST_PORT_BEGIN).c_addr()); resp_task = ::dsn::rpc::call(addr, dsn_task_code_t(RPC_TEST_STRING_COMMAND), std::string("expect_talk_to_others"), nullptr, typed_callback); resp_task->wait(); ddebug("addr.leader=%s", ::dsn::rpc_address(dsn_group_get_leader(addr.group_handle())).to_string()); if (rpc_err == ERR_OK) { EXPECT_EQ(TEST_PORT_END, ::dsn::rpc_address(dsn_group_get_leader(addr.group_handle())).port()); } destroy_group(addr); }
rpc_request_task::rpc_request_task(message_ex* request, rpc_handler_info* h, service_node* node) : task(dsn_task_code_t(request->local_rpc_code), nullptr, [](void*) { dassert(false, "rpc request task cannot be cancelled"); }, static_cast<int>(request->header->client.hash), node), _request(request), _handler(h), _enqueue_ts_ns(0) { dbg_dassert (TASK_TYPE_RPC_REQUEST == spec().type, "%s is not a RPC_REQUEST task, please use DEFINE_TASK_CODE_RPC to define the task code", spec().name.c_str() ); _request->add_ref(); // released in dctor }
TEST(core, group_address_talk_to_others) { ::dsn::rpc_address addr = build_group(); auto typed_callback = [addr](error_code err_code, const std::string& result) { EXPECT_EQ(ERR_OK, err_code); ::dsn::rpc_address addr_got; ddebug("talk to others callback, result: %s", result.c_str()); EXPECT_TRUE(addr_got.from_string_ipv4(result.c_str())); EXPECT_EQ(TEST_PORT_END, addr_got.port()); }; std::vector<task_ptr> resp_tasks; for (unsigned int i=0; i<10; ++i) { ::dsn::task_ptr resp_task = ::dsn::rpc::call(addr, dsn_task_code_t(RPC_TEST_STRING_COMMAND), std::string("expect_talk_to_others"), nullptr, typed_callback); resp_tasks.push_back(resp_task); } for (unsigned int i=0; i<10; ++i) resp_tasks[i]->wait(); destroy_group(addr); }