From 01c0e45b5cd1d5e4c06060c1f978e23a928d5a0c Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 10 Dec 2014 00:58:12 -0800 Subject: [PATCH] Add crc32c checksum support for erasure chunks Now upon conditions - if checksum '.cksum' file is missing - or corrupted chunk (mismatching chunk) - or missing chunk entirely Decoding works consistently --- cmd/erasure-demo/decode.go | 17 +++++++++++++++++ cmd/erasure-demo/encode.go | 15 ++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/cmd/erasure-demo/decode.go b/cmd/erasure-demo/decode.go index 69d697b7b..a5bf57677 100644 --- a/cmd/erasure-demo/decode.go +++ b/cmd/erasure-demo/decode.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/codegangsta/cli" + "github.com/minio-io/minio/pkgs/checksum/crc32c" "github.com/minio-io/minio/pkgs/erasure" ) @@ -58,8 +59,23 @@ func decode(c *cli.Context) { for _, inputFile := range inputFiles { // get chunks chunks := make([][]byte, k+m) + // get checksum + cksums := make([][]byte, k+m) for i := 0; i < k+m; i++ { chunks[i], _ = ioutil.ReadFile(inputFile + "." + strconv.Itoa(i)) + cksums[i], _ = ioutil.ReadFile(inputFile + "." + strconv.Itoa(i) + ".cksum") + } + + for i := 0; i < k+m; i++ { + crcChunk, err := crc32c.Crc32c(chunks[i]) + if err != nil { + chunks[i] = nil + continue + } + crcChunkStr := strconv.Itoa(int(crcChunk)) + if string(cksums[i]) != crcChunkStr { + chunks[i] = nil + } } // get length @@ -67,6 +83,7 @@ func decode(c *cli.Context) { if err != nil { log.Fatal(err) } + lengthString := string(lengthBytes) length, err := strconv.Atoi(lengthString) if err != nil { diff --git a/cmd/erasure-demo/encode.go b/cmd/erasure-demo/encode.go index 46214f0bc..e799447f0 100644 --- a/cmd/erasure-demo/encode.go +++ b/cmd/erasure-demo/encode.go @@ -8,6 +8,7 @@ import ( "strconv" "github.com/codegangsta/cli" + "github.com/minio-io/minio/pkgs/checksum/crc32c" "github.com/minio-io/minio/pkgs/erasure" "github.com/minio-io/minio/pkgs/split" ) @@ -47,6 +48,12 @@ func encode(c *cli.Context) { if config.blockSize == 0 { encodedData, length := encoder.Encode(input) for key, data := range encodedData { + crc, err := crc32c.Crc32c(data) + if err != nil { + log.Fatal(err) + } + crcString := strconv.Itoa(int(crc)) + ioutil.WriteFile(config.output+"."+strconv.Itoa(key)+".cksum", []byte(crcString), 0600) ioutil.WriteFile(config.output+"."+strconv.Itoa(key), data, 0600) ioutil.WriteFile(config.output+".length", []byte(strconv.Itoa(length)), 0600) } @@ -61,9 +68,15 @@ func encode(c *cli.Context) { } encodedData, length := encoder.Encode(chunk.Data) for key, data := range encodedData { + crc, err := crc32c.Crc32c(data) + if err != nil { + log.Fatal(err) + } + crcString := strconv.Itoa(int(crc)) + ioutil.WriteFile(config.output+"."+strconv.Itoa(chunkCount)+"."+strconv.Itoa(key)+".cksum", []byte(crcString), 0600) ioutil.WriteFile(config.output+"."+strconv.Itoa(chunkCount)+"."+strconv.Itoa(key), data, 0600) - ioutil.WriteFile(config.output+"."+strconv.Itoa(chunkCount)+".length", []byte(strconv.Itoa(length)), 0600) } + ioutil.WriteFile(config.output+"."+strconv.Itoa(chunkCount)+".length", []byte(strconv.Itoa(length)), 0600) chunkCount += 1 } }