void LeaderContenderProcess::cancelled(const Future<bool>& result) { CHECK_READY(candidacy); LOG(INFO) << "Membership cancelled: " << candidacy->id(); // Can be called as a result of either withdraw() or server side // expiration. CHECK(withdrawing.isSome() || watching.isSome()); CHECK(!result.isDiscarded()); if (result.isFailed()) { if (withdrawing.isSome()) { withdrawing.get()->fail(result.failure()); } if (watching.isSome()) { watching.get()->fail(result.failure()); } } else { if (withdrawing.isSome()) { withdrawing.get()->set(result); } if (watching.isSome()) { watching.get()->set(Nothing()); } } }
void LeaderContenderProcess::cancel() { if (!candidacy.isReady()) { // Nothing to cancel. if (withdrawing.isSome()) { withdrawing.get()->set(false); } return; } LOG(INFO) << "Now cancelling the membership: " << candidacy->id(); group->cancel(candidacy.get()) .onAny(defer(self(), &Self::cancelled, lambda::_1)); }
void LeaderContenderProcess::joined() { CHECK(!candidacy.isDiscarded()); // Cannot be watching because the candidacy is not obtained yet. CHECK_NONE(watching); CHECK_SOME(contending); if (candidacy.isFailed()) { // The promise 'withdrawing' will be set to false in cancel(). contending.get()->fail(candidacy.failure()); return; } if (withdrawing.isSome()) { LOG(INFO) << "Joined group after the contender started withdrawing"; // The promise 'withdrawing' will be set to 'false' in subsequent // 'cancel()' call. return; } LOG(INFO) << "New candidate (id='" << candidacy->id() << "') has entered the contest for leadership"; // Transition to 'watching' state. watching = new Promise<Nothing>(); // Notify the client. if (contending.get()->set(watching.get()->future())) { // Continue to watch that our membership is not removed (if the // client still cares about it). candidacy->cancelled() .onAny(defer(self(), &Self::cancelled, lambda::_1)); } }