use of org.apache.ignite.internal.metastorage.client.Entry in project ignite-3 by apache.
the class WatchAggregatorTest method testEventsRouting.
@Test
public void testEventsRouting() {
var watchAggregator = new WatchAggregator();
var lsnr1 = mock(WatchListener.class);
var lsnr2 = mock(WatchListener.class);
watchAggregator.add(new ByteArray("1"), lsnr1);
watchAggregator.add(new ByteArray("2"), lsnr2);
var entryEvt1 = new EntryEvent(entry("1", "value1", 1, 1), entry("1", "value1n", 1, 1));
var entryEvt2 = new EntryEvent(entry("2", "value2", 1, 1), entry("2", "value2n", 1, 1));
watchAggregator.watch(1, (v1, v2) -> {
}).get().listener().onUpdate(new WatchEvent(List.of(entryEvt1, entryEvt2)));
var watchEvt1Res = ArgumentCaptor.forClass(WatchEvent.class);
verify(lsnr1).onUpdate(watchEvt1Res.capture());
assertEquals(List.of(entryEvt1), watchEvt1Res.getValue().entryEvents());
var watchEvt2Res = ArgumentCaptor.forClass(WatchEvent.class);
verify(lsnr2).onUpdate(watchEvt2Res.capture());
assertEquals(List.of(entryEvt2), watchEvt2Res.getValue().entryEvents());
}
use of org.apache.ignite.internal.metastorage.client.Entry in project ignite-3 by apache.
the class DistributedConfigurationStorage method registerConfigurationListener.
/**
* {@inheritDoc}
*/
@Override
public synchronized void registerConfigurationListener(@NotNull ConfigurationStorageListener lsnr) {
if (this.lsnr == null) {
this.lsnr = lsnr;
// TODO: registerWatchByPrefix could throw OperationTimeoutException and CompactedException and we should
// TODO: properly handle such cases https://issues.apache.org/jira/browse/IGNITE-14604
metaStorageMgr.registerWatchByPrefix(DST_KEYS_START_RANGE, new WatchListener() {
@Override
public boolean onUpdate(@NotNull WatchEvent events) {
Map<String, Serializable> data = new HashMap<>();
Entry masterKeyEntry = null;
for (EntryEvent event : events.entryEvents()) {
Entry e = event.newEntry();
if (e.key().equals(MASTER_KEY)) {
masterKeyEntry = e;
} else {
String key = e.key().toString().substring(DISTRIBUTED_PREFIX.length());
Serializable value = e.value() == null ? null : ConfigurationSerializationUtil.fromBytes(e.value());
data.put(key, value);
}
}
// That means that masterKey update must be included in the batch.
assert masterKeyEntry != null;
long newChangeId = masterKeyEntry.revision();
assert newChangeId > changeId.get();
changeId.set(newChangeId);
lsnr.onEntriesChanged(new Data(data, newChangeId)).join();
return true;
}
@Override
public void onError(@NotNull Throwable e) {
// TODO: need to handle this case and there should some mechanism for registering new watch as far as
// TODO: onError unregisters failed watch https://issues.apache.org/jira/browse/IGNITE-14604
LOG.error("Meta storage listener issue", e);
}
});
} else {
LOG.warn("Configuration listener has already been set.");
}
}
use of org.apache.ignite.internal.metastorage.client.Entry in project ignite-3 by apache.
the class DistributedConfigurationStorage method readAllLatest.
/**
* {@inheritDoc}
*/
@Override
public Map<String, Serializable> readAllLatest(String prefix) {
var data = new HashMap<String, Serializable>();
var rangeStart = new ByteArray(DISTRIBUTED_PREFIX + prefix);
var rangeEnd = new ByteArray(incrementLastChar(DISTRIBUTED_PREFIX + prefix));
try (Cursor<Entry> entries = metaStorageMgr.range(rangeStart, rangeEnd)) {
for (Entry entry : entries) {
ByteArray key = entry.key();
byte[] value = entry.value();
if (entry.tombstone()) {
continue;
}
// Meta Storage should not return nulls as values
assert value != null;
if (key.equals(MASTER_KEY)) {
continue;
}
String dataKey = key.toString().substring(DISTRIBUTED_PREFIX.length());
data.put(dataKey, ConfigurationSerializationUtil.fromBytes(value));
}
} catch (Exception e) {
throw new StorageException("Exception when closing a Meta Storage cursor", e);
}
return data;
}
use of org.apache.ignite.internal.metastorage.client.Entry in project ignite-3 by apache.
the class WatchAggregatorTest method testCancel.
@Test
public void testCancel() {
var watchAggregator = new WatchAggregator();
var lsnr1 = mock(WatchListener.class);
when(lsnr1.onUpdate(any())).thenReturn(true);
var lsnr2 = mock(WatchListener.class);
when(lsnr2.onUpdate(any())).thenReturn(true);
final var id1 = watchAggregator.add(new ByteArray("1"), lsnr1);
var id2 = watchAggregator.add(new ByteArray("2"), lsnr2);
var entryEvt1 = new EntryEvent(entry("1", "value1", 1, 1), entry("1", "value1n", 1, 1));
var entryEvt2 = new EntryEvent(entry("2", "value2", 1, 1), entry("2", "value2n", 1, 1));
watchAggregator.watch(1, (v1, v2) -> {
}).get().listener().onUpdate(new WatchEvent(List.of(entryEvt1, entryEvt2)));
verify(lsnr1, times(1)).onUpdate(any());
verify(lsnr2, times(1)).onUpdate(any());
watchAggregator.cancel(id1);
watchAggregator.watch(1, (v1, v2) -> {
}).get().listener().onUpdate(new WatchEvent(List.of(entryEvt1, entryEvt2)));
verify(lsnr1, times(1)).onUpdate(any());
verify(lsnr2, times(2)).onUpdate(any());
}
use of org.apache.ignite.internal.metastorage.client.Entry in project ignite-3 by apache.
the class WatchAggregatorTest method testCancelByFalseFromListener.
@Test
public void testCancelByFalseFromListener() {
var watchAggregator = new WatchAggregator();
var lsnr1 = mock(WatchListener.class);
when(lsnr1.onUpdate(any())).thenReturn(false);
var lsnr2 = mock(WatchListener.class);
when(lsnr2.onUpdate(any())).thenReturn(true);
var id1 = watchAggregator.add(new ByteArray("1"), lsnr1);
var id2 = watchAggregator.add(new ByteArray("2"), lsnr2);
var entryEvt1 = new EntryEvent(entry("1", "value1", 1, 1), entry("1", "value1n", 1, 1));
var entryEvt2 = new EntryEvent(entry("2", "value2", 1, 1), entry("2", "value2n", 1, 1));
watchAggregator.watch(1, (v1, v2) -> {
}).get().listener().onUpdate(new WatchEvent(List.of(entryEvt1, entryEvt2)));
verify(lsnr1, times(1)).onUpdate(any());
verify(lsnr2, times(1)).onUpdate(any());
watchAggregator.watch(1, (v1, v2) -> {
}).get().listener().onUpdate(new WatchEvent(List.of(entryEvt1, entryEvt2)));
verify(lsnr1, times(1)).onUpdate(any());
verify(lsnr2, times(2)).onUpdate(any());
}
Aggregations