Browse Source

HDDS-405. User/volume mapping is not cleaned up during the deletion of the last volume.
Contributed by Elek, Marton.

Anu Engineer 6 years ago
parent
commit
fa2945e7a9

+ 22 - 4
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManager.java

@@ -276,10 +276,28 @@ public class TestOzoneManager {
     Assert.assertTrue(volumeInfo.getVolumeName().equals(volumeName2));
 
     // Make sure volume with _A suffix is successfully deleted.
-    exception.expect(IOException.class);
-    exception.expectMessage("Info Volume failed, error:VOLUME_NOT_FOUND");
-    volumeArgs = new VolumeArgs(volumeName1, userArgs);
-    storageHandler.getVolumeInfo(volumeArgs);
+    try {
+      volumeArgs = new VolumeArgs(volumeName1, userArgs);
+      storageHandler.getVolumeInfo(volumeArgs);
+      Assert.fail("Volume is not deleted");
+    } catch (IOException ex) {
+      Assert.assertEquals("Info Volume failed, error:VOLUME_NOT_FOUND",
+          ex.getMessage());
+    }
+    //delete the _AA volume, too
+    storageHandler.deleteVolume(new VolumeArgs(volumeName2, userArgs));
+
+    //Make sure there is no volume information for the specific user
+    OMMetadataManager metadataManager =
+        cluster.getOzoneManager().getMetadataManager();
+
+    byte[] userKey = metadataManager.getUserKey(userName);
+    byte[] volumes = metadataManager.getUserTable().get(userKey);
+
+    //that was the last volume of the user, shouldn't be any record here
+    Assert.assertNull(volumes);
+
+
   }
 
   // Create a volume and a bucket inside the volume,

+ 1 - 1
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/VolumeManagerImpl.java

@@ -110,7 +110,7 @@ public class VolumeManagerImpl implements VolumeManager {
     // Remove the volume from the list
     prevVolList.remove(volume);
     if (prevVolList.size() == 0) {
-      batch.delete(dbUserKey);
+      batch.delete(metadataManager.getUserTable().getHandle(), dbUserKey);
     } else {
       VolumeList newVolList = VolumeList.newBuilder()
           .addAllVolumeNames(prevVolList).build();