@Override public Entry<K, V> next() { Map.Entry<K, V> kv = iterator.next(); return new Entry<>(kv.getKey(), kv.getValue()); }
@Override public void remove(K key, long startTimestamp, long endTimeStamp) { validateRange(startTimestamp, endTimeStamp); TimeSeriesKey<K> fromKey = new TimeSeriesKey(key, startTimestamp, 0); TimeSeriesKey<K> toKey = new TimeSeriesKey(key, endTimeStamp, 0); List<TimeSeriesKey<K>> keysToDelete = new LinkedList<>(); KeyValueIterator<TimeSeriesKey<K>, V> range = kvStore.range(fromKey, toKey); try { while (range.hasNext()) { keysToDelete.add(range.next().getKey()); } } finally { range.close(); } kvStore.deleteAll(keysToDelete); }
new Entry<>("foo1", "bar1"), new Entry<>("foo2", hasDelete ? null : "bar2")); ArgumentCaptor<List> argCaptor = ArgumentCaptor.forClass(List.class); if (sync) { Assert.assertEquals(Arrays.asList("foo2"), delArgCaptor.getValue()); Assert.assertEquals(1, argCaptor.getValue().size()); Assert.assertEquals("foo1", ((Entry) argCaptor.getValue().get(0)).getKey()); verify(table.writeRateLimiter, times(1)).throttle(anyCollection()); } else {
@Override public void remove(K key, long startTimestamp, long endTimeStamp) { validateRange(startTimestamp, endTimeStamp); TimeSeriesKey<K> fromKey = new TimeSeriesKey(key, startTimestamp, 0); TimeSeriesKey<K> toKey = new TimeSeriesKey(key, endTimeStamp, 0); List<TimeSeriesKey<K>> keysToDelete = new LinkedList<>(); KeyValueIterator<TimeSeriesKey<K>, V> range = kvStore.range(fromKey, toKey); try { while (range.hasNext()) { keysToDelete.add(range.next().getKey()); } } finally { range.close(); } kvStore.deleteAll(keysToDelete); }
@Override public Entry<K, V> next() { Map.Entry<K, V> kv = iterator.next(); return new Entry<>(kv.getKey(), kv.getValue()); }
@Override public void remove(K key, long startTimestamp, long endTimeStamp) { validateRange(startTimestamp, endTimeStamp); TimeSeriesKey<K> fromKey = new TimeSeriesKey(key, startTimestamp, 0); TimeSeriesKey<K> toKey = new TimeSeriesKey(key, endTimeStamp, 0); List<TimeSeriesKey<K>> keysToDelete = new LinkedList<>(); KeyValueIterator<TimeSeriesKey<K>, V> range = kvStore.range(fromKey, toKey); try { while (range.hasNext()) { keysToDelete.add(range.next().getKey()); } } finally { range.close(); } kvStore.deleteAll(keysToDelete); }
@Override public Entry<K, V> next() { Map.Entry<K, V> kv = iterator.next(); return new Entry<>(kv.getKey(), kv.getValue()); }
@Override public void remove(K key, long startTimestamp, long endTimeStamp) { validateRange(startTimestamp, endTimeStamp); TimeSeriesKey<K> fromKey = new TimeSeriesKey(key, startTimestamp, 0); TimeSeriesKey<K> toKey = new TimeSeriesKey(key, endTimeStamp, 0); List<TimeSeriesKey<K>> keysToDelete = new LinkedList<>(); KeyValueIterator<TimeSeriesKey<K>, V> range = kvStore.range(fromKey, toKey); try { while (range.hasNext()) { keysToDelete.add(range.next().getKey()); } } finally { range.close(); } kvStore.deleteAll(keysToDelete); }
@Override public Entry<K, V> next() { Map.Entry<K, V> kv = iterator.next(); return new Entry<>(kv.getKey(), kv.getValue()); }
@Override public void remove(K key, long startTimestamp, long endTimeStamp) { validateRange(startTimestamp, endTimeStamp); TimeSeriesKey<K> fromKey = new TimeSeriesKey(key, startTimestamp, 0); TimeSeriesKey<K> toKey = new TimeSeriesKey(key, endTimeStamp, 0); List<TimeSeriesKey<K>> keysToDelete = new LinkedList<>(); KeyValueIterator<TimeSeriesKey<K>, V> range = kvStore.range(fromKey, toKey); try { while (range.hasNext()) { keysToDelete.add(range.next().getKey()); } } finally { range.close(); } kvStore.deleteAll(keysToDelete); }
@Override public Entry<K, V> next() { Map.Entry<K, V> kv = iterator.next(); return new Entry<>(kv.getKey(), kv.getValue()); }
@Test public void testSnapshot() throws Exception { InMemoryKeyValueStore store = new InMemoryKeyValueStore( new KeyValueStoreMetrics("testInMemory", new MetricsRegistryMap())); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); String prefix = "prefix"; for(int i = 0; i < 100; i++) { store.put(genKey(outputStream, prefix, i), genValue()); } byte[] firstKey = genKey(outputStream, prefix, 0); byte[] lastKey = genKey(outputStream, prefix, 100); KeyValueSnapshot<byte[], byte[]> snapshot = store.snapshot(firstKey, lastKey); // Make sure the cached Iterable won't change when new elements are added store.put(genKey(outputStream, prefix, 200), genValue()); assertTrue(Iterators.size(snapshot.iterator()) == 100); List<Integer> keys = new ArrayList<>(); KeyValueIterator<byte[], byte[]> iter = snapshot.iterator(); while (iter.hasNext()) { Entry<byte[], byte[]> entry = iter.next(); int key = Ints.fromByteArray(Arrays.copyOfRange(entry.getKey(), prefix.getBytes().length, entry.getKey().length)); keys.add(key); } assertEquals(keys, IntStream.rangeClosed(0, 99).boxed().collect(Collectors.toList())); outputStream.close(); store.close(); }
/** * Asynchronously store the table {@code records} with specified {@code keys}. This method must be thread-safe. * The default implementation calls putAsync for each entry and return a combined future. * @param records table records to be written * @return CompletableFuture for the put request */ default CompletableFuture<Void> putAllAsync(Collection<Entry<K, V>> records) { List<CompletableFuture<Void>> putFutures = records.stream().map(e -> putAsync(e.getKey(), e.getValue())).collect(Collectors.toList()); return CompletableFuture.allOf(Iterables.toArray(putFutures, CompletableFuture.class)); }
@Override public CompletableFuture<Map<K, V>> getAllAsync(List<K> keys) { readMetrics.numGetAlls.inc(); // Make a copy of entries which might be immutable Map<K, V> getAllResult = new HashMap<>(); List<K> missingKeys = lookupCache(keys, getAllResult); if (missingKeys.isEmpty()) { return CompletableFuture.completedFuture(getAllResult); } long startNs = System.nanoTime(); return rdTable.getAllAsync(missingKeys).handle((records, e) -> { if (e != null) { throw new SamzaException("Failed to get records for " + keys, e); } else { if (records != null) { cache.putAll(records.entrySet().stream() .map(r -> new Entry<>(r.getKey(), r.getValue())) .collect(Collectors.toList())); getAllResult.putAll(records); } readMetrics.getAllNs.update(System.nanoTime() - startNs); return getAllResult; } }); }