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)); } }