use of io.etcd.jetcd.election.LeaderResponse in project jetcd by coreos.
the class ElectionTest method testRetryCampaignWithDifferentValue.
@Test
public void testRetryCampaignWithDifferentValue() throws Exception {
ByteSequence electionName = ByteSequence.from(randomString(), StandardCharsets.UTF_8);
long leaseId = leaseClient.grant(10).get().getID();
ByteSequence firstProposal = ByteSequence.from("proposal1", StandardCharsets.UTF_8);
CampaignResponse campaignResponse1 = electionClient.campaign(electionName, leaseId, firstProposal).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
ByteSequence secondProposal = ByteSequence.from("proposal2", StandardCharsets.UTF_8);
CampaignResponse campaignResponse2 = electionClient.campaign(electionName, leaseId, secondProposal).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
// check that for sure we are the leader
LeaderResponse leaderResponse = electionClient.leader(electionName).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
assertThat(leaderResponse.getKv().getKey()).isEqualTo(campaignResponse1.getLeader().getKey());
assertThat(campaignResponse1.getLeader().getKey()).isEqualTo(campaignResponse2.getLeader().getKey());
assertThat(campaignResponse1.getLeader().getRevision()).isEqualTo(campaignResponse2.getLeader().getRevision());
// latest proposal should be persisted
GetOption getOption = GetOption.newBuilder().isPrefix(true).build();
List<KeyValue> keys = kvClient.get(electionName, getOption).get().getKvs();
assertThat(keys.size()).isEqualTo(1);
assertThat(keys.get(0).getValue()).isEqualTo(secondProposal);
electionClient.resign(campaignResponse1.getLeader()).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
leaseClient.revoke(leaseId).get();
}
use of io.etcd.jetcd.election.LeaderResponse in project jetcd by coreos.
the class ElectionTest method testIsolatedElection.
@Test
public void testIsolatedElection() throws Exception {
ByteSequence electionName = ByteSequence.from(randomString(), StandardCharsets.UTF_8);
// register lease
long leaseId = leaseClient.grant(10).get().getID();
// start new campaign
ByteSequence firstProposal = ByteSequence.from("proposal1", StandardCharsets.UTF_8);
CampaignResponse campaignResponse = electionClient.campaign(electionName, leaseId, firstProposal).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
assertThat(campaignResponse.getLeader()).isNotNull();
assertThat(campaignResponse.getLeader().getLease()).isEqualTo(leaseId);
assertThat(campaignResponse.getLeader().getName()).isEqualTo(electionName);
// election is backed by standard key in etcd. let us examine it
GetOption getOption = GetOption.newBuilder().isPrefix(true).build();
List<KeyValue> keys = kvClient.get(electionName, getOption).get().getKvs();
assertThat(keys.size()).isEqualTo(1);
assertThat(keys.get(0).getKey().toString()).isEqualTo(campaignResponse.getLeader().getKey().toString());
assertThat(keys.get(0).getValue()).isEqualTo(firstProposal);
// check that we really are the leader (just to test API)
LeaderResponse leaderResponse = electionClient.leader(electionName).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
assertThat(leaderResponse.getKv().getKey()).isEqualTo(campaignResponse.getLeader().getKey());
assertThat(leaderResponse.getKv().getValue()).isEqualTo(firstProposal);
assertThat(leaderResponse.getKv().getLease()).isEqualTo(leaseId);
assertThat(leaderResponse.getKv().getCreateRevision()).isEqualTo(campaignResponse.getLeader().getRevision());
// as a leader change your proposal
ByteSequence secondProposal = ByteSequence.from("proposal2", StandardCharsets.UTF_8);
electionClient.proclaim(campaignResponse.getLeader(), secondProposal).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
keys = kvClient.get(electionName, getOption).get().getKvs();
assertThat(keys.size()).isEqualTo(1);
assertThat(keys.get(0).getValue()).isEqualTo(secondProposal);
// finally resign
electionClient.resign(campaignResponse.getLeader()).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
keys = kvClient.get(electionName, getOption).get().getKvs();
assertThat(keys).isEmpty();
leaseClient.revoke(leaseId).get();
}
use of io.etcd.jetcd.election.LeaderResponse in project jetcd by coreos.
the class ElectionImpl method leader.
@Override
public CompletableFuture<LeaderResponse> leader(ByteSequence electionName) {
checkNotNull(electionName, "election name should not be null");
LeaderRequest request = LeaderRequest.newBuilder().setName(Util.prefixNamespace(electionName, namespace)).build();
return completable(stub.leader(request), r -> new LeaderResponse(r, namespace), this::convertException);
}
use of io.etcd.jetcd.election.LeaderResponse in project jetcd by coreos.
the class ElectionTest method testObserveElections.
@Test
public void testObserveElections() throws Exception {
int electionCount = 3;
final AtomicInteger electionsSeen = new AtomicInteger(0);
ByteSequence electionName = ByteSequence.from(randomString(), StandardCharsets.UTF_8);
electionClient.observe(electionName, new Election.Listener() {
@Override
public void onNext(LeaderResponse response) {
electionsSeen.incrementAndGet();
}
@Override
public void onError(Throwable error) {
}
@Override
public void onCompleted() {
}
});
long leaseId = leaseClient.grant(10).get().getID();
for (int i = 0; i < electionCount; ++i) {
ByteSequence proposal = ByteSequence.from(randomString(), StandardCharsets.UTF_8);
CampaignResponse campaignResponse = electionClient.campaign(electionName, leaseId, proposal).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
Thread.sleep(100);
electionClient.resign(campaignResponse.getLeader()).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
}
TestUtil.waitForCondition(() -> electionsSeen.get() == electionCount, OPERATION_TIMEOUT * 1000, "Observer did not receive expected notifications, got: " + electionsSeen.get());
leaseClient.revoke(leaseId).get();
}
use of io.etcd.jetcd.election.LeaderResponse in project jetcd by coreos.
the class ElectionImpl method observe.
@Override
public void observe(ByteSequence electionName, Listener listener) {
checkNotNull(electionName, "election name should not be null");
checkNotNull(listener, "listener should not be null");
LeaderRequest request = LeaderRequest.newBuilder().setName(ByteString.copyFrom(electionName.getBytes())).build();
stub.observe(request).handler(value -> listener.onNext(new LeaderResponse(value, namespace))).endHandler(ignored -> listener.onCompleted()).exceptionHandler(error -> listener.onError(EtcdExceptionFactory.toEtcdException(error)));
}
Aggregations