use of org.apache.ignite.lang.ByteArray in project ignite-3 by apache.
the class VaultServiceTest method testRemove.
/**
* Tests regular behaviour of the {@link VaultService#remove} method.
*/
@Test
public void testRemove() throws Exception {
ByteArray key = getKey(1);
// Remove non-existent value.
doAwait(() -> vaultService.remove(key));
assertThat(vaultService.get(key), willBe(equalTo(new VaultEntry(key, null))));
byte[] val = getValue(1);
doAwait(() -> vaultService.put(key, val));
assertThat(vaultService.get(key), willBe(equalTo(new VaultEntry(key, val))));
// Remove existing value.
doAwait(() -> vaultService.remove(key));
assertThat(vaultService.get(key), willBe(equalTo(new VaultEntry(key, null))));
}
use of org.apache.ignite.lang.ByteArray in project ignite-3 by apache.
the class VaultServiceTest method testPutWithNull.
/**
* Tests that the {@link VaultService#put} method removes the given {@code key} if {@code value} equalTo {@code null}.
*/
@Test
public void testPutWithNull() throws Exception {
ByteArray key = getKey(1);
byte[] val = getValue(1);
doAwait(() -> vaultService.put(key, val));
assertThat(vaultService.get(key), willBe(equalTo(new VaultEntry(key, val))));
doAwait(() -> vaultService.put(key, null));
assertThat(vaultService.get(key), willBe(equalTo(new VaultEntry(key, null))));
}
use of org.apache.ignite.lang.ByteArray in project ignite-3 by apache.
the class ItPersistencePropertiesVaultServiceTest method testPersistentRestart.
/**
* Tests that the Vault Service correctly persists data after multiple service restarts.
*/
@Test
void testPersistentRestart() throws Exception {
var data = Map.of(new ByteArray("key" + 1), fromString("value" + 1), new ByteArray("key" + 2), fromString("value" + 2), new ByteArray("key" + 3), fromString("value" + 3));
try (var vaultService = new PersistentVaultService(vaultDir)) {
vaultService.start();
vaultService.putAll(data).get(TIMEOUT_SECONDS, TimeUnit.SECONDS);
}
try (var vaultService = new PersistentVaultService(vaultDir)) {
vaultService.start();
assertThat(vaultService.get(new ByteArray("key" + 1)), willBe(equalTo(new VaultEntry(new ByteArray("key" + 1), fromString("value" + 1)))));
}
try (var vaultService = new PersistentVaultService(vaultDir)) {
vaultService.start();
try (var cursor = vaultService.range(new ByteArray("key" + 1), new ByteArray("key" + 4))) {
var actualData = new ArrayList<VaultEntry>();
cursor.forEachRemaining(actualData::add);
List<VaultEntry> expectedData = data.entrySet().stream().map(e -> new VaultEntry(e.getKey(), e.getValue())).sorted(Comparator.comparing(VaultEntry::key)).collect(Collectors.toList());
assertThat(actualData, is(expectedData));
}
}
}
use of org.apache.ignite.lang.ByteArray in project ignite-3 by apache.
the class ItMetaStorageRaftGroupTest method testRangeNextWorksCorrectlyAfterLeaderChange.
/**
* Tests that {@link MetaStorageService#range(ByteArray, ByteArray, long)}} next command works correctly
* after leader changing.
*
* @throws Exception If failed.
*/
@Test
public void testRangeNextWorksCorrectlyAfterLeaderChange() throws Exception {
final AtomicInteger replicatorStartedCounter = new AtomicInteger(0);
final AtomicInteger replicatorStoppedCounter = new AtomicInteger(0);
when(mockStorage.range(EXPECTED_RESULT_ENTRY1.key().bytes(), new byte[] { 4 })).thenAnswer(invocation -> {
List<org.apache.ignite.internal.metastorage.server.Entry> entries = new ArrayList<>(List.of(EXPECTED_SRV_RESULT_ENTRY1, EXPECTED_SRV_RESULT_ENTRY2));
return new Cursor<org.apache.ignite.internal.metastorage.server.Entry>() {
private final Iterator<org.apache.ignite.internal.metastorage.server.Entry> it = entries.iterator();
@Override
public void close() {
}
@NotNull
@Override
public Iterator<org.apache.ignite.internal.metastorage.server.Entry> iterator() {
return it;
}
@Override
public boolean hasNext() {
return it.hasNext();
}
@Override
public org.apache.ignite.internal.metastorage.server.Entry next() {
return it.next();
}
};
});
List<Pair<RaftServer, RaftGroupService>> raftServersRaftGroups = prepareJraftMetaStorages(replicatorStartedCounter, replicatorStoppedCounter);
List<RaftServer> raftServers = raftServersRaftGroups.stream().map(p -> p.key).collect(Collectors.toList());
NetworkAddress oldLeader = raftServersRaftGroups.get(0).value.leader().address();
Optional<RaftServer> oldLeaderServer = raftServers.stream().filter(s -> s.clusterService().topologyService().localMember().address().equals(oldLeader)).findFirst();
// Server that will be alive after we stop leader.
Optional<RaftServer> liveServer = raftServers.stream().filter(s -> !s.clusterService().topologyService().localMember().address().equals(oldLeader)).findFirst();
if (oldLeaderServer.isEmpty() || liveServer.isEmpty()) {
fail();
}
RaftGroupService raftGroupServiceOfLiveServer = raftServersRaftGroups.stream().filter(p -> p.key.equals(liveServer.get())).findFirst().get().value;
MetaStorageService metaStorageSvc = new MetaStorageServiceImpl(raftGroupServiceOfLiveServer, "some_node");
Cursor<Entry> cursor = metaStorageSvc.range(EXPECTED_RESULT_ENTRY1.key(), new ByteArray(new byte[] { 4 }));
assertTrue(TestUtils.waitForCondition(() -> replicatorStartedCounter.get() == 2, 5_000), replicatorStartedCounter.get() + "");
assertTrue(cursor.hasNext());
assertEquals(EXPECTED_RESULT_ENTRY1, (cursor.iterator().next()));
// Ensure that leader has not been changed.
// In a stable topology unexpected leader election shouldn't happen.
assertTrue(TestUtils.waitForCondition(() -> replicatorStartedCounter.get() == 2, 5_000), replicatorStartedCounter.get() + "");
// stop leader
oldLeaderServer.get().stopRaftGroup(METASTORAGE_RAFT_GROUP_NAME);
oldLeaderServer.get().stop();
cluster.stream().filter(c -> c.topologyService().localMember().address().equals(oldLeader)).findFirst().get().stop();
raftGroupServiceOfLiveServer.refreshLeader().get();
assertNotSame(oldLeader, raftGroupServiceOfLiveServer.leader().address());
// ensure that leader has been changed only once
assertTrue(TestUtils.waitForCondition(() -> replicatorStartedCounter.get() == 4, 5_000), replicatorStartedCounter.get() + "");
assertTrue(TestUtils.waitForCondition(() -> replicatorStoppedCounter.get() == 2, 5_000), replicatorStoppedCounter.get() + "");
assertTrue(cursor.hasNext());
assertEquals(EXPECTED_RESULT_ENTRY2, (cursor.iterator().next()));
}
use of org.apache.ignite.lang.ByteArray in project ignite-3 by apache.
the class ItMetaStorageServicePersistenceTest method snapshotCheckClosure.
/**
* {@inheritDoc}
*/
@Override
public BooleanSupplier snapshotCheckClosure(JraftServerImpl restarted, boolean interactedAfterSnapshot) {
KeyValueStorage storage = getListener(restarted, raftGroupId()).getStorage();
byte[] lastKey = interactedAfterSnapshot ? SECOND_KEY.bytes() : FIRST_KEY.bytes();
byte[] lastValue = interactedAfterSnapshot ? SECOND_VALUE : FIRST_VALUE;
int expectedRevision = interactedAfterSnapshot ? 4 : 3;
int expectedUpdateCounter = interactedAfterSnapshot ? 4 : 3;
EntryImpl expectedLastEntry = new EntryImpl(new ByteArray(lastKey), lastValue, expectedRevision, expectedUpdateCounter);
return () -> {
org.apache.ignite.internal.metastorage.server.Entry e = storage.get(lastKey);
return e.empty() == expectedLastEntry.empty() && e.tombstone() == expectedLastEntry.tombstone() && e.revision() == expectedLastEntry.revision() && e.updateCounter() == expectedLastEntry.revision() && Arrays.equals(e.key(), expectedLastEntry.key().bytes()) && Arrays.equals(e.value(), expectedLastEntry.value());
};
}
Aggregations