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; }
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; } } } }
Service::Service(BLE_Handler * handler) : characteristics(0), handler(handler), handle(0) { set_primary(true); }