コード例 #1
0
ファイル: task.cpp プロジェクト: zjc95/rDSN
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
}
コード例 #2
0
ファイル: rpc.cpp プロジェクト: am11/rDSN
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);
}
コード例 #3
0
ファイル: task.cpp プロジェクト: am11/rDSN
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
}
コード例 #4
0
ファイル: rpc.cpp プロジェクト: am11/rDSN
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);
}