Browse Source

HDFS-12610. Ozone: OzoneClient: RpcClient list calls throw NPE when iterating over empty list. Contributed by Nandakumar.

Nandakumar 7 năm trước cách đây
mục cha
commit
a5adb271ef

+ 2 - 1
hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java

@@ -174,7 +174,8 @@ public class ObjectStore {
     public boolean hasNext() {
       if(!currentIterator.hasNext()) {
         currentIterator = getNextListOfVolumes(
-            currentValue.getName()).iterator();
+            currentValue != null ? currentValue.getName() : null)
+            .iterator();
       }
       return currentIterator.hasNext();
     }

+ 2 - 1
hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java

@@ -277,7 +277,8 @@ public class OzoneBucket {
     public boolean hasNext() {
       if(!currentIterator.hasNext()) {
         currentIterator = getNextListOfKeys(
-            currentValue.getName()).iterator();
+            currentValue != null ? currentValue.getName() : null)
+            .iterator();
       }
       return currentIterator.hasNext();
     }

+ 2 - 1
hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/client/OzoneVolume.java

@@ -247,7 +247,8 @@ public class OzoneVolume {
     public boolean hasNext() {
       if(!currentIterator.hasNext()) {
         currentIterator = getNextListOfBuckets(
-            currentValue.getName()).iterator();
+            currentValue != null ? currentValue.getName() : null)
+            .iterator();
       }
       return currentIterator.hasNext();
     }

+ 30 - 3
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/client/rpc/TestOzoneRpcClient.java

@@ -409,7 +409,7 @@ public class TestOzoneRpcClient {
   }
 
   @Test
-  public void listVolumeTest() throws IOException, OzoneException {
+  public void testListVolume() throws IOException, OzoneException {
     String volBase = "vol-" + RandomStringUtils.randomNumeric(3);
     //Create 10 volume vol-<random>-a-0-<random> to vol-<random>-a-9-<random>
     String volBaseNameA = volBase + "-a-";
@@ -448,7 +448,7 @@ public class TestOzoneRpcClient {
   }
 
   @Test
-  public void listBucketTest()
+  public void testListBucket()
       throws IOException, OzoneException {
     String volumeA = "vol-a-" + RandomStringUtils.randomNumeric(5);
     String volumeB = "vol-b-" + RandomStringUtils.randomNumeric(5);
@@ -522,7 +522,19 @@ public class TestOzoneRpcClient {
   }
 
   @Test
-  public void listKeyTest()
+  public void testListBucketsOnEmptyVolume()
+      throws IOException, OzoneException {
+    String volume = "vol-" + RandomStringUtils.randomNumeric(5);
+    store.createVolume(volume);
+    OzoneVolume vol = store.getVolume(volume);
+    Iterator<OzoneBucket> buckets = vol.listBuckets("");
+    while(buckets.hasNext()) {
+      Assert.fail();
+    }
+  }
+
+  @Test
+  public void testListKey()
       throws IOException, OzoneException {
     String volumeA = "vol-a-" + RandomStringUtils.randomNumeric(5);
     String volumeB = "vol-b-" + RandomStringUtils.randomNumeric(5);
@@ -656,6 +668,21 @@ public class TestOzoneRpcClient {
     Assert.assertFalse(volABucketBIter.hasNext());
   }
 
+  @Test
+  public void testListKeyOnEmptyBucket()
+      throws IOException, OzoneException {
+    String volume = "vol-" + RandomStringUtils.randomNumeric(5);
+    String bucket = "buc-" + RandomStringUtils.randomNumeric(5);
+    store.createVolume(volume);
+    OzoneVolume vol = store.getVolume(volume);
+    vol.createBucket(bucket);
+    OzoneBucket buc = vol.getBucket(bucket);
+    Iterator<OzoneKey> keys = buc.listKeys("");
+    while(keys.hasNext()) {
+      Assert.fail();
+    }
+  }
+
   /**
    * Close OzoneClient and shutdown MiniOzoneCluster.
    */