HDFS-11594. Ozone: close container should call compactDB. Contributed by Anu Engineer.

This commit is contained in:
Anu Engineer 2017-03-30 16:53:28 -07:00 committed by Owen O'Malley
parent bc9c313907
commit 7c59add3da
5 changed files with 36 additions and 14 deletions

View File

@ -125,6 +125,7 @@ enum Result {
GET_SMALL_FILE_ERROR = 21; GET_SMALL_FILE_ERROR = 21;
CLOSED_CONTAINER_IO = 22; CLOSED_CONTAINER_IO = 22;
ERROR_CONTAINER_NOT_EMPTY = 23; ERROR_CONTAINER_NOT_EMPTY = 23;
ERROR_IN_COMPACT_DB = 24;
} }
message ContainerCommandRequestProto { message ContainerCommandRequestProto {

View File

@ -24,9 +24,9 @@ import org.apache.commons.codec.digest.DigestUtils;
import org.apache.hadoop.hdfs.ozone.protocol.proto.ContainerProtos; import org.apache.hadoop.hdfs.ozone.protocol.proto.ContainerProtos;
import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.scm.container.common.helpers.StorageContainerException;
import org.apache.hadoop.ozone.container.common.impl.ChunkManagerImpl; import org.apache.hadoop.ozone.container.common.impl.ChunkManagerImpl;
import org.apache.hadoop.scm.container.common.helpers.Pipeline; import org.apache.hadoop.scm.container.common.helpers.Pipeline;
import org.apache.hadoop.scm.container.common.helpers.StorageContainerException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -217,7 +217,12 @@ public final class ChunkUtils {
} }
} }
if (file != null) { if (file != null) {
IOUtils.closeStream(file); try {
file.close();
} catch (IOException e) {
throw new StorageContainerException("Error closing chunk file",
e, CONTAINER_INTERNAL_ERROR);
}
} }
} }
} }
@ -250,9 +255,7 @@ public final class ChunkUtils {
* *
* @param chunkFile - file where data lives. * @param chunkFile - file where data lives.
* @param data - chunk definition. * @param data - chunk definition.
*
* @return ByteBuffer * @return ByteBuffer
*
* @throws StorageContainerException * @throws StorageContainerException
* @throws ExecutionException * @throws ExecutionException
* @throws InterruptedException * @throws InterruptedException

View File

@ -156,4 +156,16 @@ public class LevelDBStore implements Closeable {
public void destroy() throws IOException { public void destroy() throws IOException {
JniDBFactory.factory.destroy(dbFile, dbOptions); JniDBFactory.factory.destroy(dbFile, dbOptions);
} }
/**
* Compacts the DB by removing deleted keys etc.
* @throws IOException if there is an error.
*/
public void compactDB() throws IOException {
if(db != null) {
// From LevelDB docs : begin == null and end == null means the whole DB.
db.compactRange(null, null);
}
}
} }

View File

@ -276,7 +276,8 @@ public class TestOzoneContainer {
} }
} }
private void testCloseContainer() throws Exception { @Test
public void testCloseContainer() throws Exception {
MiniOzoneCluster cluster = null; MiniOzoneCluster cluster = null;
XceiverClient client = null; XceiverClient client = null;
try { try {
@ -307,17 +308,19 @@ public class TestOzoneContainer {
client.connect(); client.connect();
// Create container
ContainerProtos.ContainerCommandRequestProto request =
ContainerTestHelper.getCreateContainerRequest(containerName);
ContainerProtos.ContainerCommandResponseProto response =
client.sendCommand(request);
Assert.assertNotNull(response);
Assert.assertTrue(request.getTraceID().equals(response.getTraceID()));
ContainerProtos.ContainerCommandRequestProto writeChunkRequest = ContainerProtos.ContainerCommandRequestProto writeChunkRequest =
ContainerTestHelper.getWriteChunkRequest(pipeline, containerName, ContainerTestHelper.getWriteChunkRequest(pipeline, containerName,
keyName, 1024); keyName, 1024);
ContainerProtos.ContainerCommandRequestProto request;
ContainerProtos.ContainerCommandResponseProto response;
ContainerProtos.ContainerCommandRequestProto putKeyRequest =
ContainerTestHelper.getPutKeyRequest(writeChunkRequest
.getWriteChunk());
// Write Chunk before closing // Write Chunk before closing
response = client.sendCommand(writeChunkRequest); response = client.sendCommand(writeChunkRequest);
Assert.assertNotNull(response); Assert.assertNotNull(response);
@ -327,6 +330,9 @@ public class TestOzoneContainer {
.getTraceID())); .getTraceID()));
ContainerProtos.ContainerCommandRequestProto putKeyRequest =
ContainerTestHelper.getPutKeyRequest(writeChunkRequest
.getWriteChunk());
// Put key before closing. // Put key before closing.
response = client.sendCommand(putKeyRequest); response = client.sendCommand(putKeyRequest);
Assert.assertNotNull(response); Assert.assertNotNull(response);

View File

@ -866,7 +866,7 @@ public class TestNodeManager {
} }
@Test @Test
public void testScmEnterAndExistChillMode() throws IOException, public void testScmEnterAndExitChillMode() throws IOException,
InterruptedException { InterruptedException {
OzoneConfiguration conf = getConf(); OzoneConfiguration conf = getConf();
conf.setInt(OZONE_SCM_HEARTBEAT_PROCESS_INTERVAL_MS, 100); conf.setInt(OZONE_SCM_HEARTBEAT_PROCESS_INTERVAL_MS, 100);
@ -879,7 +879,7 @@ public class TestNodeManager {
Assert.assertThat(status, CoreMatchers.containsString("Still in chill " + Assert.assertThat(status, CoreMatchers.containsString("Still in chill " +
"mode. Waiting on nodes to report in.")); "mode. Waiting on nodes to report in."));
// Should not exist chill mode since 10 nodes have not heartbeat yet. // Should not exit chill mode since 10 nodes have not heartbeat yet.
assertFalse(nodeManager.isOutOfNodeChillMode()); assertFalse(nodeManager.isOutOfNodeChillMode());
assertFalse((nodeManager.isInManualChillMode())); assertFalse((nodeManager.isInManualChillMode()));