diff options
| author | Chris Lu <chris.lu@gmail.com> | 2019-05-15 01:02:00 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2019-05-15 01:02:00 -0700 |
| commit | 0a36f628c67df0db27151d40b0c41dc6b87b8da1 (patch) | |
| tree | ee77ab0d9503fcb3b5ae46c3e025924806868413 /weed/storage/erasure_coding/ec_test.go | |
| parent | 017d0957c3af96506dc9ab47b52c9f10db367c58 (diff) | |
| download | seaweedfs-0a36f628c67df0db27151d40b0c41dc6b87b8da1.tar.xz seaweedfs-0a36f628c67df0db27151d40b0c41dc6b87b8da1.zip | |
testing RS coding
Diffstat (limited to 'weed/storage/erasure_coding/ec_test.go')
| -rw-r--r-- | weed/storage/erasure_coding/ec_test.go | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/weed/storage/erasure_coding/ec_test.go b/weed/storage/erasure_coding/ec_test.go new file mode 100644 index 000000000..8f75384c0 --- /dev/null +++ b/weed/storage/erasure_coding/ec_test.go @@ -0,0 +1,77 @@ +package erasure_coding + +import ( + "io" + "os" + "testing" + + "github.com/klauspost/reedsolomon" +) + +func TestEncodingDecoding(t *testing.T) { + largeBlockSize := int64(10000) + smallBlockSize := int64(100) + bufferSize := 50 + + file, err := os.OpenFile("1.dat", os.O_RDONLY, 0) + if err != nil { + t.Logf("failed to open dat file: %v", err) + } + + fi, err := file.Stat() + if err != nil { + t.Logf("failed to stat dat file: %v", err) + } + + remainingSize := fi.Size() + var processedSize int64 + + enc, err := reedsolomon.New(DataShardsCount, ParityShardsCount) + if err != nil { + t.Logf("failed to create encoder: %v", err) + } + + buffers := make([][]byte, DataShardsCount+ParityShardsCount) + + for i, _ := range buffers { + buffers[i] = make([]byte, bufferSize) + } + + for remainingSize > largeBlockSize*DataShardsCount { + encodeData(file, enc, processedSize, largeBlockSize, buffers) + remainingSize -= largeBlockSize * DataShardsCount + processedSize += largeBlockSize * DataShardsCount + } + + for remainingSize > 0 { + encodeData(file, enc, processedSize, smallBlockSize, buffers) + remainingSize -= smallBlockSize * DataShardsCount + processedSize += smallBlockSize * DataShardsCount + } + +} + +func encodeData(file *os.File, enc reedsolomon.Encoder, startOffset, blockSize int64, buffers [][]byte) error { + + // read data into buffers + for i := 0; i < DataShardsCount; i++ { + n, err := file.ReadAt(buffers[i], startOffset+blockSize*int64(i)) + if err != nil { + if err != io.EOF { + return err + } + } + if n < len(buffers[i]) { + for t := len(buffers[i]) - 1; t >= n; t-- { + buffers[i][t] = 0 + } + } + } + + err := enc.Encode(buffers) + if err != nil { + return err + } + + return nil +} |
