@Override public CompletableFuture<Void> deleteAllAsync(List<K> keys) { Preconditions.checkNotNull(writeFn, "null write function"); Preconditions.checkNotNull(keys, "null keys"); if (keys.isEmpty()) { return CompletableFuture.completedFuture(null); } return instrument(() -> asyncTable.deleteAllAsync(keys), metrics.numDeleteAlls, metrics.deleteAllNs) .exceptionally(e -> { throw new SamzaException(String.format("Failed to delete records for " + keys), (Throwable) e); }); }
@Override public CompletableFuture<Void> deleteAsync(K key) { Preconditions.checkNotNull(writeFn, "null write function"); Preconditions.checkNotNull(key, "null key"); return instrument(() -> asyncTable.deleteAsync(key), metrics.numDeletes, metrics.deleteNs) .exceptionally(e -> { throw new SamzaException(String.format("Failed to delete the record for " + key), (Throwable) e); }); }
@Override public CompletableFuture<Map<K, V>> getAllAsync(List<K> keys) { Preconditions.checkNotNull(keys, "null keys"); if (keys.isEmpty()) { return CompletableFuture.completedFuture(Collections.EMPTY_MAP); } return instrument(() -> asyncTable.getAllAsync(keys), metrics.numGetAlls, metrics.getAllNs) .handle((result, e) -> { if (e != null) { throw new SamzaException("Failed to get the records for " + keys, e); } result.values().stream().filter(Objects::isNull).forEach(v -> incCounter(metrics.numMissedLookups)); return result; }); }
@Override public CompletableFuture<Void> putAsync(K key, V value) { Preconditions.checkNotNull(writeFn, "null write function"); Preconditions.checkNotNull(key, "null key"); if (value == null) { return deleteAsync(key); } return instrument(() -> asyncTable.putAsync(key, value), metrics.numPuts, metrics.putNs) .exceptionally(e -> { throw new SamzaException("Failed to put a record with key=" + key, (Throwable) e); }); }
@Override public CompletableFuture<V> getAsync(K key) { Preconditions.checkNotNull(key, "null key"); return instrument(() -> asyncTable.getAsync(key), metrics.numGets, metrics.getNs) .handle((result, e) -> { if (e != null) { throw new SamzaException("Failed to get the records for " + key, e); } if (result == null) { incCounter(metrics.numMissedLookups); } return result; }); }
@Override public CompletableFuture<Void> putAllAsync(List<Entry<K, V>> records) { Preconditions.checkNotNull(writeFn, "null write function"); Preconditions.checkNotNull(records, "null records"); if (records.isEmpty()) { return CompletableFuture.completedFuture(null); } List<K> deleteKeys = records.stream() .filter(e -> e.getValue() == null).map(Entry::getKey).collect(Collectors.toList()); List<Entry<K, V>> putRecords = records.stream() .filter(e -> e.getValue() != null).collect(Collectors.toList()); CompletableFuture<Void> deleteFuture = deleteKeys.isEmpty() ? CompletableFuture.completedFuture(null) : deleteAllAsync(deleteKeys); // Return the combined future return CompletableFuture.allOf( deleteFuture, instrument(() -> asyncTable.putAllAsync(putRecords), metrics.numPutAlls, metrics.putAllNs)) .exceptionally(e -> { String strKeys = records.stream().map(r -> r.getKey().toString()).collect(Collectors.joining(",")); throw new SamzaException(String.format("Failed to put records with keys=" + strKeys), e); }); }