Remove the iterable interface from KeyValueSnapshot
authorxinyuiscool <xiliu@linkedin.com>
Thu, 10 May 2018 21:19:08 +0000 (14:19 -0700)
committerxiliu <xiliu@linkedin.com>
Thu, 10 May 2018 21:19:08 +0000 (14:19 -0700)
The iterable interface makes it hard for the users to close it after using.

Author: xinyuiscool <xiliu@linkedin.com>

Reviewers: Prateek M <prateekm@apache.org>

Closes #516 from xinyuiscool/kv-snapshot

samza-api/src/main/java/org/apache/samza/storage/kv/KeyValueSnapshot.java
samza-kv-inmemory/src/test/java/org/apache/samza/storage/kv/inmemory/TestInMemoryKeyValueStore.java

index 52cb7fa..850d1d9 100644 (file)
@@ -26,7 +26,7 @@ package org.apache.samza.storage.kv;
  * @param <K> key type
  * @param <V> value type
  */
-public interface KeyValueSnapshot<K, V> extends Iterable<Entry<K, V>> {
+public interface KeyValueSnapshot<K, V> {
   /**
    * Creates a new iterator for this snapshot. The iterator MUST be
    * closed after its execution by invoking {@link KeyValueIterator#close}.
index 7ee588c..5919690 100644 (file)
@@ -23,6 +23,7 @@ import com.google.common.collect.Iterators;
 import com.google.common.primitives.Ints;
 import org.apache.samza.metrics.MetricsRegistryMap;
 import org.apache.samza.storage.kv.Entry;
+import org.apache.samza.storage.kv.KeyValueIterator;
 import org.apache.samza.storage.kv.KeyValueSnapshot;
 import org.apache.samza.storage.kv.KeyValueStoreMetrics;
 import org.junit.Test;
@@ -57,7 +58,9 @@ public class TestInMemoryKeyValueStore {
     assertTrue(Iterators.size(snapshot.iterator()) == 100);
 
     List<Integer> keys = new ArrayList<>();
-    for (Entry<byte[], byte[]> entry : snapshot) {
+    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);
     }