use of io.etcd.jetcd.options.GetOption 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.options.GetOption 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.options.GetOption in project jetcd by coreos.
the class KVTest method testGetWithRev.
@Test
public void testGetWithRev() throws Exception {
CompletableFuture<PutResponse> feature = kvClient.put(SAMPLE_KEY_3, SAMPLE_VALUE);
PutResponse putResp = feature.get();
kvClient.put(SAMPLE_KEY_3, SAMPLE_VALUE_2).get();
GetOption option = GetOption.newBuilder().withRevision(putResp.getHeader().getRevision()).build();
CompletableFuture<GetResponse> getFeature = kvClient.get(SAMPLE_KEY_3, option);
GetResponse response = getFeature.get();
assertThat(response.getKvs()).hasSize(1);
assertThat(response.getKvs().get(0).getValue().toString(UTF_8)).isEqualTo(SAMPLE_VALUE.toString(UTF_8));
}
use of io.etcd.jetcd.options.GetOption in project jetcd by coreos.
the class ElectionTest method testProposeValueNotBeingLeader.
@Test
public void testProposeValueNotBeingLeader() throws Exception {
ByteSequence electionName = ByteSequence.from(randomString(), StandardCharsets.UTF_8);
LeaderKey leaderKey = new LeaderKey(electionName, randomByteSequence(), 1, 1);
ByteSequence proposal = ByteSequence.from("proposal", StandardCharsets.UTF_8);
try {
electionClient.proclaim(leaderKey, proposal).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
fail("Cannot proclaim proposal not being a leader");
} catch (ExecutionException e) {
assertThat(e.getCause()).isInstanceOf(NotLeaderException.class);
}
GetOption getOption = GetOption.newBuilder().isPrefix(true).build();
List<KeyValue> keys = kvClient.get(electionName, getOption).get().getKvs();
assertThat(keys).isEmpty();
}
use of io.etcd.jetcd.options.GetOption in project jetcd by coreos.
the class ElectionTest method testSynchronizationBarrier.
@Test
public void testSynchronizationBarrier() throws Exception {
final int threadCount = 5;
final Random random = new Random();
ByteSequence electionName = ByteSequence.from(randomString(), StandardCharsets.UTF_8);
final AtomicInteger sharedVariable = new AtomicInteger(0);
// create separate clients so they will compete for access to shared resource
List<Client> clients = new ArrayList<>(threadCount);
List<Long> leases = new ArrayList<>(threadCount);
for (int i = 0; i < threadCount; ++i) {
Client client = TestUtil.client(cluster).build();
long leaseId = client.getLeaseClient().grant(100).get().getID();
clients.add(client);
leases.add(leaseId);
}
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<Future<?>> futures = new ArrayList<>(threadCount);
for (int i = 0; i < threadCount; ++i) {
final int id = i;
final ByteSequence proposal = ByteSequence.from(Integer.toString(id), StandardCharsets.UTF_8);
futures.add(executor.submit(() -> {
try {
Election electionClient = clients.get(id).getElectionClient();
CampaignResponse campaignResponse = electionClient.campaign(electionName, leases.get(id), proposal).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
int localCopy = sharedVariable.get();
Thread.sleep(200 + random.nextInt(300));
sharedVariable.set(localCopy + 1);
electionClient.resign(campaignResponse.getLeader()).get(OPERATION_TIMEOUT, TimeUnit.SECONDS);
} catch (Exception e) {
fail("Unexpected error in thread {}: {}", id, e);
}
}));
}
executor.shutdown();
executor.awaitTermination(threadCount * OPERATION_TIMEOUT, TimeUnit.SECONDS);
futures.forEach(f -> assertThat(f).isDone());
assertThat(sharedVariable.get()).isEqualTo(threadCount);
GetOption getOption = GetOption.newBuilder().isPrefix(true).build();
assertThat(kvClient.get(electionName, getOption).get().getCount()).isEqualTo(0L);
for (int i = 0; i < threadCount; ++i) {
clients.get(i).getLeaseClient().revoke(leases.get(i)).get();
clients.get(i).close();
}
}
Aggregations