HDDS-847. TestBlockDeletion is failing.
Contributed by Lokesh Jain.
This commit is contained in:
parent
5a7ca6ac3e
commit
93666087bc
|
@ -23,11 +23,11 @@ import org.apache.hadoop.hdds.scm.container.ContainerID;
|
||||||
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
|
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
|
||||||
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo;
|
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo;
|
||||||
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup;
|
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup;
|
||||||
|
import org.apache.ratis.util.CheckedConsumer;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class for Tests.
|
* Helper class for Tests.
|
||||||
|
@ -48,23 +48,27 @@ public final class OzoneTestUtils {
|
||||||
* @return true if close containers is successful.
|
* @return true if close containers is successful.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public static boolean closeContainers(
|
public static void closeContainers(
|
||||||
List<OmKeyLocationInfoGroup> omKeyLocationInfoGroups,
|
List<OmKeyLocationInfoGroup> omKeyLocationInfoGroups,
|
||||||
StorageContainerManager scm) throws IOException {
|
StorageContainerManager scm) throws Exception {
|
||||||
return performOperationOnKeyContainers((blockID) -> {
|
performOperationOnKeyContainers((blockID) -> {
|
||||||
try {
|
if (scm.getContainerManager()
|
||||||
|
.getContainer(ContainerID.valueof(blockID.getContainerID()))
|
||||||
|
.getState() == HddsProtos.LifeCycleState.OPEN) {
|
||||||
scm.getContainerManager()
|
scm.getContainerManager()
|
||||||
.updateContainerState(ContainerID.valueof(blockID.getContainerID()),
|
.updateContainerState(ContainerID.valueof(blockID.getContainerID()),
|
||||||
HddsProtos.LifeCycleEvent.FINALIZE);
|
HddsProtos.LifeCycleEvent.FINALIZE);
|
||||||
|
}
|
||||||
|
if (scm.getContainerManager()
|
||||||
|
.getContainer(ContainerID.valueof(blockID.getContainerID()))
|
||||||
|
.getState() == HddsProtos.LifeCycleState.CLOSING) {
|
||||||
scm.getContainerManager()
|
scm.getContainerManager()
|
||||||
.updateContainerState(ContainerID.valueof(blockID.getContainerID()),
|
.updateContainerState(ContainerID.valueof(blockID.getContainerID()),
|
||||||
HddsProtos.LifeCycleEvent.CLOSE);
|
HddsProtos.LifeCycleEvent.CLOSE);
|
||||||
Assert.assertFalse(scm.getContainerManager()
|
|
||||||
.getContainer(ContainerID.valueof(
|
|
||||||
blockID.getContainerID())).isOpen());
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new AssertionError("Failed to close the container", e);
|
|
||||||
}
|
}
|
||||||
|
Assert.assertFalse(scm.getContainerManager()
|
||||||
|
.getContainer(ContainerID.valueof(blockID.getContainerID()))
|
||||||
|
.isOpen());
|
||||||
}, omKeyLocationInfoGroups);
|
}, omKeyLocationInfoGroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,16 +78,13 @@ public final class OzoneTestUtils {
|
||||||
*
|
*
|
||||||
* @param consumer Consumer which accepts BlockID as argument.
|
* @param consumer Consumer which accepts BlockID as argument.
|
||||||
* @param omKeyLocationInfoGroups locationInfos for a key.
|
* @param omKeyLocationInfoGroups locationInfos for a key.
|
||||||
* @return true if consumer is successful.
|
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public static boolean performOperationOnKeyContainers(
|
public static void performOperationOnKeyContainers(
|
||||||
Consumer<BlockID> consumer,
|
CheckedConsumer<BlockID, Exception> consumer,
|
||||||
List<OmKeyLocationInfoGroup> omKeyLocationInfoGroups) throws IOException {
|
List<OmKeyLocationInfoGroup> omKeyLocationInfoGroups) throws Exception {
|
||||||
|
|
||||||
try {
|
for (OmKeyLocationInfoGroup omKeyLocationInfoGroup : omKeyLocationInfoGroups) {
|
||||||
for (OmKeyLocationInfoGroup omKeyLocationInfoGroup :
|
|
||||||
omKeyLocationInfoGroups) {
|
|
||||||
List<OmKeyLocationInfo> omKeyLocationInfos =
|
List<OmKeyLocationInfo> omKeyLocationInfos =
|
||||||
omKeyLocationInfoGroup.getLocationList();
|
omKeyLocationInfoGroup.getLocationList();
|
||||||
for (OmKeyLocationInfo omKeyLocationInfo : omKeyLocationInfos) {
|
for (OmKeyLocationInfo omKeyLocationInfo : omKeyLocationInfos) {
|
||||||
|
@ -91,11 +92,6 @@ public final class OzoneTestUtils {
|
||||||
consumer.accept(blockID);
|
consumer.accept(blockID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Error e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,8 +120,7 @@ public class TestBlockDeletion {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBlockDeletion()
|
public void testBlockDeletion() throws Exception {
|
||||||
throws IOException, InterruptedException, TimeoutException {
|
|
||||||
String volumeName = UUID.randomUUID().toString();
|
String volumeName = UUID.randomUUID().toString();
|
||||||
String bucketName = UUID.randomUUID().toString();
|
String bucketName = UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
@ -148,7 +147,7 @@ public class TestBlockDeletion {
|
||||||
om.lookupKey(keyArgs).getKeyLocationVersions();
|
om.lookupKey(keyArgs).getKeyLocationVersions();
|
||||||
|
|
||||||
// verify key blocks were created in DN.
|
// verify key blocks were created in DN.
|
||||||
Assert.assertTrue(verifyBlocksCreated(omKeyLocationInfoGroupList));
|
verifyBlocksCreated(omKeyLocationInfoGroupList);
|
||||||
// No containers with deleted blocks
|
// No containers with deleted blocks
|
||||||
Assert.assertTrue(containerIdsWithDeletedBlocks.isEmpty());
|
Assert.assertTrue(containerIdsWithDeletedBlocks.isEmpty());
|
||||||
// Delete transactionIds for the containers should be 0.
|
// Delete transactionIds for the containers should be 0.
|
||||||
|
@ -158,17 +157,21 @@ public class TestBlockDeletion {
|
||||||
om.deleteKey(keyArgs);
|
om.deleteKey(keyArgs);
|
||||||
Thread.sleep(5000);
|
Thread.sleep(5000);
|
||||||
// The blocks should not be deleted in the DN as the container is open
|
// The blocks should not be deleted in the DN as the container is open
|
||||||
Assert.assertTrue(!verifyBlocksDeleted(omKeyLocationInfoGroupList));
|
try {
|
||||||
|
verifyBlocksDeleted(omKeyLocationInfoGroupList);
|
||||||
|
Assert.fail("Blocks should not have been deleted");
|
||||||
|
} catch (Throwable e) {
|
||||||
|
Assert.assertTrue(e.getMessage().contains("expected null, but was"));
|
||||||
|
Assert.assertEquals(e.getClass(), AssertionError.class);
|
||||||
|
}
|
||||||
|
|
||||||
// close the containers which hold the blocks for the key
|
// close the containers which hold the blocks for the key
|
||||||
Assert
|
OzoneTestUtils.closeContainers(omKeyLocationInfoGroupList, scm);
|
||||||
.assertTrue(
|
|
||||||
OzoneTestUtils.closeContainers(omKeyLocationInfoGroupList, scm));
|
|
||||||
|
|
||||||
waitForDatanodeCommandRetry();
|
waitForDatanodeCommandRetry();
|
||||||
waitForDatanodeBlockDeletionStart();
|
waitForDatanodeBlockDeletionStart();
|
||||||
// The blocks should be deleted in the DN.
|
// The blocks should be deleted in the DN.
|
||||||
Assert.assertTrue(verifyBlocksDeleted(omKeyLocationInfoGroupList));
|
verifyBlocksDeleted(omKeyLocationInfoGroupList);
|
||||||
|
|
||||||
// Few containers with deleted blocks
|
// Few containers with deleted blocks
|
||||||
Assert.assertTrue(!containerIdsWithDeletedBlocks.isEmpty());
|
Assert.assertTrue(!containerIdsWithDeletedBlocks.isEmpty());
|
||||||
|
@ -288,44 +291,32 @@ public class TestBlockDeletion {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean verifyBlocksCreated(
|
private void verifyBlocksCreated(
|
||||||
List<OmKeyLocationInfoGroup> omKeyLocationInfoGroups)
|
List<OmKeyLocationInfoGroup> omKeyLocationInfoGroups) throws Exception {
|
||||||
throws IOException {
|
|
||||||
ContainerSet dnContainerSet =
|
ContainerSet dnContainerSet =
|
||||||
cluster.getHddsDatanodes().get(0).getDatanodeStateMachine()
|
cluster.getHddsDatanodes().get(0).getDatanodeStateMachine()
|
||||||
.getContainer().getContainerSet();
|
.getContainer().getContainerSet();
|
||||||
return OzoneTestUtils.performOperationOnKeyContainers((blockID) -> {
|
OzoneTestUtils.performOperationOnKeyContainers((blockID) -> {
|
||||||
try {
|
MetadataStore db = BlockUtils.getDB((KeyValueContainerData) dnContainerSet
|
||||||
MetadataStore db = BlockUtils.getDB((KeyValueContainerData)
|
.getContainer(blockID.getContainerID()).getContainerData(), conf);
|
||||||
dnContainerSet.getContainer(blockID.getContainerID())
|
|
||||||
.getContainerData(), conf);
|
|
||||||
Assert.assertNotNull(db.get(Longs.toByteArray(blockID.getLocalID())));
|
Assert.assertNotNull(db.get(Longs.toByteArray(blockID.getLocalID())));
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}, omKeyLocationInfoGroups);
|
}, omKeyLocationInfoGroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean verifyBlocksDeleted(
|
private void verifyBlocksDeleted(
|
||||||
List<OmKeyLocationInfoGroup> omKeyLocationInfoGroups)
|
List<OmKeyLocationInfoGroup> omKeyLocationInfoGroups) throws Exception {
|
||||||
throws IOException {
|
|
||||||
ContainerSet dnContainerSet =
|
ContainerSet dnContainerSet =
|
||||||
cluster.getHddsDatanodes().get(0).getDatanodeStateMachine()
|
cluster.getHddsDatanodes().get(0).getDatanodeStateMachine()
|
||||||
.getContainer().getContainerSet();
|
.getContainer().getContainerSet();
|
||||||
return OzoneTestUtils.performOperationOnKeyContainers((blockID) -> {
|
OzoneTestUtils.performOperationOnKeyContainers((blockID) -> {
|
||||||
try {
|
MetadataStore db = BlockUtils.getDB((KeyValueContainerData) dnContainerSet
|
||||||
MetadataStore db = BlockUtils.getDB((KeyValueContainerData)
|
.getContainer(blockID.getContainerID()).getContainerData(), conf);
|
||||||
dnContainerSet.getContainer(blockID.getContainerID())
|
|
||||||
.getContainerData(), conf);
|
|
||||||
Assert.assertNull(db.get(Longs.toByteArray(blockID.getLocalID())));
|
Assert.assertNull(db.get(Longs.toByteArray(blockID.getLocalID())));
|
||||||
Assert.assertNull(db.get(DFSUtil.string2Bytes(
|
Assert.assertNull(db.get(DFSUtil.string2Bytes(
|
||||||
OzoneConsts.DELETING_KEY_PREFIX + blockID.getLocalID())));
|
OzoneConsts.DELETING_KEY_PREFIX + blockID.getLocalID())));
|
||||||
Assert.assertNotNull(DFSUtil.string2Bytes(
|
Assert.assertNotNull(DFSUtil
|
||||||
OzoneConsts.DELETED_KEY_PREFIX + blockID.getLocalID()));
|
.string2Bytes(OzoneConsts.DELETED_KEY_PREFIX + blockID.getLocalID()));
|
||||||
containerIdsWithDeletedBlocks.add(blockID.getContainerID());
|
containerIdsWithDeletedBlocks.add(blockID.getContainerID());
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}, omKeyLocationInfoGroups);
|
}, omKeyLocationInfoGroups);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue