HADOOP-11740. Combine erasure encoder and decoder interfaces. Contributed by Zhe Zhang.

This commit is contained in:
Zhe Zhang 2015-04-03 15:22:50 -07:00 committed by Zhe Zhang
parent 1af8c14862
commit e54a74b566
7 changed files with 41 additions and 99 deletions

View File

@ -23,13 +23,12 @@ import org.apache.hadoop.io.erasurecode.ECBlockGroup;
/** /**
* An abstract erasure decoder that's to be inherited by new decoders. * An abstract erasure decoder that's to be inherited by new decoders.
* *
* It implements the {@link ErasureDecoder} interface. * It implements the {@link ErasureCoder} interface.
*/ */
public abstract class AbstractErasureDecoder extends AbstractErasureCoder public abstract class AbstractErasureDecoder extends AbstractErasureCoder {
implements ErasureDecoder {
@Override @Override
public ErasureCodingStep decode(ECBlockGroup blockGroup) { public ErasureCodingStep calculateCoding(ECBlockGroup blockGroup) {
// We may have more than this when considering complicate cases. HADOOP-11550 // We may have more than this when considering complicate cases. HADOOP-11550
return prepareDecodingStep(blockGroup); return prepareDecodingStep(blockGroup);
} }

View File

@ -23,13 +23,12 @@ import org.apache.hadoop.io.erasurecode.ECBlockGroup;
/** /**
* An abstract erasure encoder that's to be inherited by new encoders. * An abstract erasure encoder that's to be inherited by new encoders.
* *
* It implements the {@link ErasureEncoder} interface. * It implements the {@link ErasureCoder} interface.
*/ */
public abstract class AbstractErasureEncoder extends AbstractErasureCoder public abstract class AbstractErasureEncoder extends AbstractErasureCoder {
implements ErasureEncoder {
@Override @Override
public ErasureCodingStep encode(ECBlockGroup blockGroup) { public ErasureCodingStep calculateCoding(ECBlockGroup blockGroup) {
// We may have more than this when considering complicate cases. HADOOP-11550 // We may have more than this when considering complicate cases. HADOOP-11550
return prepareEncodingStep(blockGroup); return prepareEncodingStep(blockGroup);
} }

View File

@ -18,6 +18,7 @@
package org.apache.hadoop.io.erasurecode.coder; package org.apache.hadoop.io.erasurecode.coder;
import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.io.erasurecode.ECBlockGroup;
/** /**
* An erasure coder to perform encoding or decoding given a group. Generally it * An erasure coder to perform encoding or decoding given a group. Generally it
@ -63,6 +64,17 @@ public interface ErasureCoder extends Configurable {
*/ */
public int getChunkSize(); public int getChunkSize();
/**
* Calculate the encoding or decoding steps given a block blockGroup.
*
* Note, currently only one coding step is supported. Will support complex
* cases of multiple coding steps.
*
* @param blockGroup the erasure coding block group containing all necessary
* information for codec calculation
*/
public ErasureCodingStep calculateCoding(ECBlockGroup blockGroup);
/** /**
* Tell if native or off-heap buffer is preferred or not. It's for callers to * Tell if native or off-heap buffer is preferred or not. It's for callers to
* decide how to allocate coding chunk buffers, either on heap or off heap. * decide how to allocate coding chunk buffers, either on heap or off heap.

View File

@ -1,41 +0,0 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.io.erasurecode.coder;
import org.apache.hadoop.io.erasurecode.ECBlockGroup;
/**
* Erasure decoder interface to perform decoding given a block group.
*
* It extends {@link ErasureCoder}.
*/
public interface ErasureDecoder extends ErasureCoder {
/**
* Perform the decoding given a blockGroup. By default it will try the best to
* attempt to recover all the missing blocks according to the codec logic.
*
* Note, currently only one coding step is supported. Will support complex
* cases of multiple coding steps.
*
* @param blockGroup
*/
public ErasureCodingStep decode(ECBlockGroup blockGroup);
}

View File

@ -1,39 +0,0 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.io.erasurecode.coder;
import org.apache.hadoop.io.erasurecode.ECBlockGroup;
/**
* Erasure encoder interface to perform encoding given a block group.
*
* It extends {@link ErasureCoder}.
*/
public interface ErasureEncoder extends ErasureCoder {
/**
* Calculate the encoding steps given a block blockGroup.
*
* Note, currently only one coding step is supported. Will support complex
* cases of multiple coding steps.
*
* @param blockGroup
*/
public ErasureCodingStep encode(ECBlockGroup blockGroup);
}

View File

@ -26,8 +26,8 @@ import org.apache.hadoop.io.erasurecode.TestCoderBase;
* Erasure coder test base with utilities. * Erasure coder test base with utilities.
*/ */
public abstract class TestErasureCoderBase extends TestCoderBase { public abstract class TestErasureCoderBase extends TestCoderBase {
protected Class<? extends ErasureEncoder> encoderClass; protected Class<? extends ErasureCoder> encoderClass;
protected Class<? extends ErasureDecoder> decoderClass; protected Class<? extends ErasureCoder> decoderClass;
protected int numChunksInBlock = 16; protected int numChunksInBlock = 16;
@ -55,7 +55,7 @@ public abstract class TestErasureCoderBase extends TestCoderBase {
protected void testCoding(boolean usingDirectBuffer) { protected void testCoding(boolean usingDirectBuffer) {
this.usingDirectBuffer = usingDirectBuffer; this.usingDirectBuffer = usingDirectBuffer;
ErasureEncoder encoder = createEncoder(); ErasureCoder encoder = createEncoder();
// Generate data and encode // Generate data and encode
ECBlockGroup blockGroup = prepareBlockGroupForEncoding(); ECBlockGroup blockGroup = prepareBlockGroupForEncoding();
@ -68,7 +68,7 @@ public abstract class TestErasureCoderBase extends TestCoderBase {
ErasureCodingStep codingStep; ErasureCodingStep codingStep;
try { try {
codingStep = encoder.encode(blockGroup); codingStep = encoder.calculateCoding(blockGroup);
performCodingStep(codingStep); performCodingStep(codingStep);
} finally { } finally {
encoder.release(); encoder.release();
@ -78,9 +78,9 @@ public abstract class TestErasureCoderBase extends TestCoderBase {
//Decode //Decode
blockGroup = new ECBlockGroup(clonedDataBlocks, blockGroup.getParityBlocks()); blockGroup = new ECBlockGroup(clonedDataBlocks, blockGroup.getParityBlocks());
ErasureDecoder decoder = createDecoder(); ErasureCoder decoder = createDecoder();
try { try {
codingStep = decoder.decode(blockGroup); codingStep = decoder.calculateCoding(blockGroup);
performCodingStep(codingStep); performCodingStep(codingStep);
} finally { } finally {
decoder.release(); decoder.release();
@ -138,8 +138,8 @@ public abstract class TestErasureCoderBase extends TestCoderBase {
* Create erasure encoder for test. * Create erasure encoder for test.
* @return * @return
*/ */
private ErasureEncoder createEncoder() { private ErasureCoder createEncoder() {
ErasureEncoder encoder; ErasureCoder encoder;
try { try {
encoder = encoderClass.newInstance(); encoder = encoderClass.newInstance();
} catch (Exception e) { } catch (Exception e) {
@ -155,8 +155,8 @@ public abstract class TestErasureCoderBase extends TestCoderBase {
* Create the erasure decoder for the test. * Create the erasure decoder for the test.
* @return * @return
*/ */
private ErasureDecoder createDecoder() { private ErasureCoder createDecoder() {
ErasureDecoder decoder; ErasureCoder decoder;
try { try {
decoder = decoderClass.newInstance(); decoder = decoderClass.newInstance();
} catch (Exception e) { } catch (Exception e) {

View File

@ -44,3 +44,15 @@
HDFS-8005. Erasure Coding: simplify striped block recovery work computation HDFS-8005. Erasure Coding: simplify striped block recovery work computation
and add tests (Jing Zhao) and add tests (Jing Zhao)
HDFS-7617. Add unit tests for editlog transactions for EC
(Hui Zheng via Zhe Zhang)
HADOOP-11782. Correct two thrown messages in ECSchema class
(Xinwei Qin via Kai Zheng)
HDFS-7839. Erasure coding: implement facilities in NameNode to create and
manage EC zones (Zhe Zhang)
HADOOP-11740. Combine erasure encoder and decoder interfaces (Zhe Zhang)