From 1ea91d2fa21e8eaaac5106b9a5fdac3356db0957 Mon Sep 17 00:00:00 2001 From: Krishna Srinivas Date: Tue, 28 Jul 2015 16:51:57 +0530 Subject: [PATCH] Use missingEncodedBlocksCount directly instead of "-1" workaround in missingEncodedBlocks[] Makes Code more readable --- pkg/erasure/ctypes.go | 3 +++ pkg/erasure/ec_minio_decode.c | 6 +++--- pkg/erasure/erasure_decode.go | 10 ++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pkg/erasure/ctypes.go b/pkg/erasure/ctypes.go index c3c043657..60ef6482b 100644 --- a/pkg/erasure/ctypes.go +++ b/pkg/erasure/ctypes.go @@ -25,6 +25,9 @@ import ( // intSlice2CIntArray converts Go int slice to C int array func intSlice2CIntArray(srcErrList []int) *C.int32_t { + if len(srcErrList) == 0 { + return (*C.int32_t)(unsafe.Pointer(nil)) + } var sizeErrInt = int(unsafe.Sizeof(srcErrList[0])) switch sizeInt { case sizeErrInt: diff --git a/pkg/erasure/ec_minio_decode.c b/pkg/erasure/ec_minio_decode.c index c00464702..08f5a41aa 100644 --- a/pkg/erasure/ec_minio_decode.c +++ b/pkg/erasure/ec_minio_decode.c @@ -22,10 +22,10 @@ #include "ec_minio_common.h" static -int32_t _minio_src_index_in_error (int r, int32_t *error_index) +int32_t _minio_src_index_in_error (int r, int32_t *error_index, int errs) { int i; - for (i = 0; error_index[i] != -1; i++) { + for (i = 0; i < errs; i++) { if (error_index[i] == r) { // true return 1; @@ -88,7 +88,7 @@ int minio_init_decoder (int32_t *error_index, uint32_t tmp_decode_index[k]; for (i = 0, r = 0; i < k; i++, r++) { - while (_minio_src_index_in_error(r, error_index)) + while (_minio_src_index_in_error(r, error_index, errs)) r++; for (j = 0; j < k; j++) { input_matrix[k * i + j] = encode_matrix[k * r + j]; diff --git a/pkg/erasure/erasure_decode.go b/pkg/erasure/erasure_decode.go index f0f0ae78f..23ea31520 100644 --- a/pkg/erasure/erasure_decode.go +++ b/pkg/erasure/erasure_decode.go @@ -63,11 +63,9 @@ func (e *Erasure) Decode(encodedDataBlocks [][]byte, dataLen int) (decodedData [ missingEncodedBlocksCount++ } } - missingEncodedBlocks[missingEncodedBlocksCount] = -1 - missingEncodedBlocksCount++ // Cannot reconstruct original data. Need at least M number of data or parity blocks. - if missingEncodedBlocksCount-1 > m { + if missingEncodedBlocksCount > m { return nil, fmt.Errorf("Cannot reconstruct original data. Need at least [%d] data or parity blocks", m) } @@ -86,7 +84,7 @@ func (e *Erasure) Decode(encodedDataBlocks [][]byte, dataLen int) (decodedData [ var decodeMatrix, decodeTbls *C.uchar var decodeIndex *C.uint32_t - C.minio_init_decoder(missingEncodedBlocksC, C.int(k), C.int(n), C.int(missingEncodedBlocksCount-1), + C.minio_init_decoder(missingEncodedBlocksC, C.int(k), C.int(n), C.int(missingEncodedBlocksCount), e.encodeMatrix, &decodeMatrix, &decodeTbls, &decodeIndex) // cache this for future needs @@ -102,14 +100,14 @@ func (e *Erasure) Decode(encodedDataBlocks [][]byte, dataLen int) (decodedData [ } // Get pointers to source "data" and target "parity" blocks from the output byte array. - ret := C.minio_get_source_target(C.int(missingEncodedBlocksCount-1), C.int(k), C.int(m), missingEncodedBlocksC, + ret := C.minio_get_source_target(C.int(missingEncodedBlocksCount), C.int(k), C.int(m), missingEncodedBlocksC, e.decodeIndex, (**C.uchar)(unsafe.Pointer(&pointers[0])), &source, &target) if int(ret) == -1 { return nil, errors.New("Unable to decode data") } // Decode data - C.ec_encode_data(C.int(encodedBlockLen), C.int(k), C.int(missingEncodedBlocksCount-1), e.decodeTbls, + C.ec_encode_data(C.int(encodedBlockLen), C.int(k), C.int(missingEncodedBlocksCount), e.decodeTbls, source, target) // Allocate buffer to output buffer