aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/erasure_coding/ec_test.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2019-05-15 01:02:00 -0700
committerChris Lu <chris.lu@gmail.com>2019-05-15 01:02:00 -0700
commit0a36f628c67df0db27151d40b0c41dc6b87b8da1 (patch)
treeee77ab0d9503fcb3b5ae46c3e025924806868413 /weed/storage/erasure_coding/ec_test.go
parent017d0957c3af96506dc9ab47b52c9f10db367c58 (diff)
downloadseaweedfs-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.go77
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
+}