Пример #1
0
bool meta_server_failure_detector::acquire_leader_lock()
{
    error_code err;
    auto tasks = 
    _lock_svc->lock(
        _primary_lock_id,
        _local_owner_id,
        true,

        // lock granted
        LPC_META_SERVER_LEADER_LOCK_CALLBACK,
        [this, &err](error_code ec, const std::string& owner, uint64_t version)
        {
            err = ec;
        },

        // lease expire
        LPC_META_SERVER_LEADER_LOCK_CALLBACK,
        [this](error_code ec, const std::string& owner, uint64_t version)
        {
            // let's take the easy way right now
            dsn_terminate();

            // reset primary
            //rpc_address addr;
            //set_primary(addr);
            //_state->on_become_non_leader();

            //// set another round of service
            //acquire_leader_lock();            
        }
    );

    _lock_grant_task = tasks.first;
    _lock_expire_task = tasks.second;

    _lock_grant_task->wait();
    if (err == ERR_OK)
    {
        rpc_address addr;
        if (addr.from_string_ipv4(_local_owner_id.c_str()))
        {
            dassert(primary_address() == addr, "");            
            set_primary(addr);
            return true;
        }
    }

    return false;
}
Пример #2
0
void meta_server_failure_detector::acquire_leader_lock()
{
    //
    // try to get the leader lock until it is done
    //
    dsn::dist::distributed_lock_service::lock_options opt = {true, true};
    std::string local_owner_id;
    while (true)
    {
        error_code err;
        auto tasks =
            _lock_svc->lock(
            _primary_lock_id,
            primary_address().to_std_string(), 
            // lock granted
            LPC_META_SERVER_LEADER_LOCK_CALLBACK,
            [this, &err, &local_owner_id](error_code ec, const std::string& owner, uint64_t version)
            {
                err = ec;
                local_owner_id = owner;
            },

            // lease expire
            LPC_META_SERVER_LEADER_LOCK_CALLBACK,
            [this](error_code ec, const std::string& owner, uint64_t version)
            {
                // let's take the easy way right now
                dsn_exit(0);
            },
            opt
        );

        _lock_grant_task = tasks.first;
        _lock_expire_task = tasks.second;

        _lock_grant_task->wait();
        if (err == ERR_OK)
        {
            rpc_address addr;
            if (addr.from_string_ipv4(local_owner_id.c_str()))
            {
                dassert(primary_address() == addr, "");
                set_primary(addr);
                break;
            }
        }
    }
}
Пример #3
0
Service::Service(BLE_Handler * handler) :
		characteristics(0), handler(handler),
		handle(0) {

	set_primary(true);
}